1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <future>
17 #include <optional>
18 #include <utility>
19 #include <vector>
20
21 #include <unistd.h>
22
23 #include "accesstoken_kit.h"
24 #include "display_manager.h"
25 #include "display_info.h"
26 #include <gtest/gtest.h>
27 #include "input_device.h"
28 #include "input_manager.h"
29 #include "parcel.h"
30 #include "pointer_event.h"
31 #include "securec.h"
32
33 #include "coordination_message.h"
34 #include "devicestatus_define.h"
35 #include "devicestatus_errors.h"
36 #include "drag_data_util.h"
37 #include "interaction_manager.h"
38 #include "nativetoken_kit.h"
39 #include "token_setproc.h"
40
41 #undef LOG_TAG
42 #define LOG_TAG "InteractionManagerTest"
43
44 namespace OHOS {
45 namespace Msdp {
46 namespace DeviceStatus {
47 using namespace testing::ext;
48 namespace {
49 constexpr int32_t TIME_WAIT_FOR_OP_MS { 20 };
50 constexpr int32_t TIME_WAIT_FOR_INJECT_MS { 80 };
51 constexpr int32_t TIME_WAIT_FOR_TOUCH_DOWN_MS { 1000 };
52 constexpr int32_t PROMISE_WAIT_SPAN_MS { 2000 };
53 constexpr int32_t TEST_PIXEL_MAP_WIDTH { 200 };
54 constexpr int32_t TEST_PIXEL_MAP_HEIGHT { 200 };
55 constexpr int32_t MAX_PIXEL_MAP_WIDTH { 600 };
56 constexpr int32_t MAX_PIXEL_MAP_HEIGHT { 600 };
57 constexpr int32_t MOUSE_POINTER_ID { 0 };
58 constexpr int32_t TOUCH_POINTER_ID { 1 };
59 constexpr int32_t TOUCH_POINTER_ID_INJECT { 20001 };
60 constexpr int32_t DISPLAY_ID { 0 };
61 constexpr int32_t DRAG_SRC_X { 0 };
62 constexpr int32_t DRAG_SRC_Y { 0 };
63 constexpr int32_t DRAG_DST_X { 500 };
64 constexpr int32_t DRAG_DST_Y { 500 };
65 constexpr int32_t DRAG_NUM { 1 };
66 constexpr int32_t INT32_BYTE { 4 };
67 constexpr int32_t SUBSTR_UDKEY_LEN { 6 };
68 constexpr int32_t WINDOW_ID { -1 };
69 constexpr int32_t HOT_AREA_COOR { 220 };
70 constexpr int32_t HOT_AREA_STEP { 150 };
71 constexpr int32_t HOT_AREA_SPAN { 70 };
72 constexpr uint32_t RECIVE_LOOP_COUNT { 5 };
73 constexpr uint32_t DEFAULT_ICON_COLOR { 0xFF };
74 constexpr bool HAS_CANCELED_ANIMATION { true };
75 constexpr bool HAS_CUSTOM_ANIMATION { true };
76 constexpr int32_t MOVE_STEP { 10 };
77 constexpr int32_t FOREGROUND_COLOR_IN { 0x33FF0000 };
78 constexpr int32_t FOREGROUND_COLOR_OUT { 0x00000000 };
79 constexpr int32_t ANIMATION_DURATION { 500 };
80 constexpr int32_t SRC_MAIN_WINDOW { 0 };
81 constexpr int32_t TARGET_MAIN_WINDOW { 0 };
82 constexpr int64_t DOWN_TIME { 1 };
83 const std::string UD_KEY { "Unified data key" };
84 const std::string SYSTEM_CORE { "system_core" };
85 const std::string SYSTEM_BASIC { "system_basic" };
86 const std::string CURVE_NAME { "cubic-bezier" };
87 const std::string EXTRA_INFO { "{ \"drag_corner_radius\": 20, \"drag_allow_distributed\": false }" };
88 const std::string FILTER_INFO { "{ \"dip_scale\": 3.5 }" };
89 int32_t g_deviceMouseId { -1 };
90 int32_t g_deviceTouchId { -1 };
91 int32_t g_screenWidth { 720 };
92 int32_t g_screenHeight { 1280 };
93 uint64_t g_tokenID { 0 };
94 const char* g_cores[] = { "ohos.permission.INPUT_MONITORING" };
95 const char* g_basics[] = { "ohos.permission.COOPERATE_MANAGER" };
96 const char* g_coresInject[] = { "ohos.permission.INJECT_INPUT_EVENT" };
97 std::shared_ptr<MMI::KeyEvent> g_keyEvent = MMI::KeyEvent::Create();
98 } // namespace
99
100 class InteractionManagerTest : public testing::Test {
101 public:
102 void SetUp();
103 void TearDown();
104 static void SetUpTestCase();
105 static std::vector<int32_t> GetInputDeviceIds();
106 static std::shared_ptr<MMI::InputDevice> GetDevice(int32_t deviceId);
107 static std::pair<int32_t, int32_t> GetMouseAndTouch();
108 static std::shared_ptr<Media::PixelMap> CreatePixelMap(int32_t width, int32_t height);
109 static std::optional<DragData> CreateDragData(const std::pair<int32_t, int32_t> &pixelMapSize, int32_t sourceType,
110 int32_t pointerId, int32_t displayId, const std::pair<int32_t, int32_t> &location);
111 static MMI::PointerEvent::PointerItem CreatePointerItem(int32_t pointerId,
112 int32_t deviceId, const std::pair<int32_t, int32_t> &displayLocation, bool isPressed);
113 static std::shared_ptr<MMI::PointerEvent> SetupPointerEvent(const std::pair<int32_t, int32_t> &displayLocation,
114 int32_t action, int32_t sourceType, int32_t pointerId, bool isPressed);
115 static void SimulateDownPointerEvent(
116 const std::pair<int32_t, int32_t> &location, int32_t sourceType, int32_t pointerId);
117 static void SimulateUpPointerEvent(
118 const std::pair<int32_t, int32_t> &location, int32_t sourceType, int32_t pointerId);
119 static void SimulateMovePointerEvent(const std::pair<int32_t, int32_t> &srcLocation,
120 const std::pair<int32_t, int32_t> &dstLocation, int32_t sourceType, int32_t pointerId, bool isPressed);
121 static int32_t TestAddMonitor(std::shared_ptr<MMI::IInputEventConsumer> consumer);
122 static void TestRemoveMonitor(int32_t monitorId);
123 static void PrintDragData(const DragData &dragData);
124 static void SetPermission(const std::string &level, const char** perms, size_t permAmount);
125 static void RemovePermission();
126 static void SetupKeyEvent(int32_t action, int32_t key, bool isPressed);
127 static void ClearUpKeyEvent();
128 static void SimulateDownKeyEvent(int32_t key);
129 static void SimulateUpKeyEvent(int32_t key);
130 static void PrintDragAction(DragAction dragAction);
131 static void AssignToAnimation(PreviewAnimation &animation);
132 static void EnableCooperate();
133 };
134
SetPermission(const std::string & level,const char ** perms,size_t permAmount)135 void InteractionManagerTest::SetPermission(const std::string &level, const char** perms, size_t permAmount)
136 {
137 CALL_DEBUG_ENTER;
138 if (perms == nullptr || permAmount == 0) {
139 FI_HILOGE("The perms is empty");
140 return;
141 }
142
143 NativeTokenInfoParams infoInstance = {
144 .dcapsNum = 0,
145 .permsNum = permAmount,
146 .aclsNum = 0,
147 .dcaps = nullptr,
148 .perms = perms,
149 .acls = nullptr,
150 .processName = "InteractionManagerTest",
151 .aplStr = level.c_str(),
152 };
153 g_tokenID = GetAccessTokenId(&infoInstance);
154 SetSelfTokenID(g_tokenID);
155 OHOS::Security::AccessToken::AccessTokenKit::AccessTokenKit::ReloadNativeTokenInfo();
156 }
157
RemovePermission()158 void InteractionManagerTest::RemovePermission()
159 {
160 CALL_DEBUG_ENTER;
161 int32_t ret = OHOS::Security::AccessToken::AccessTokenKit::DeleteToken(g_tokenID);
162 if (ret != RET_OK) {
163 FI_HILOGE("Failed to remove permission");
164 return;
165 }
166 }
167
168 class DragListenerTest : public IDragListener {
169 public:
DragListenerTest()170 DragListenerTest() {}
DragListenerTest(const std::string & name)171 explicit DragListenerTest(const std::string& name) : moduleName_(name) {}
OnDragMessage(DragState state)172 void OnDragMessage(DragState state) override
173 {
174 if (moduleName_.empty()) {
175 moduleName_ = std::string("DragListenerTest");
176 }
177 FI_HILOGD("%{public}s, state:%{public}s", moduleName_.c_str(), PrintDragMessage(state).c_str());
178 }
179 private:
PrintDragMessage(DragState state)180 std::string PrintDragMessage(DragState state)
181 {
182 std::string type = "unknow";
183 const std::map<DragState, std::string> stateType = {
184 { DragState::ERROR, "error"},
185 { DragState::START, "start"},
186 { DragState::STOP, "stop"},
187 { DragState::CANCEL, "cancel"}
188 };
189 auto item = stateType.find(state);
190 if (item != stateType.end()) {
191 type = item->second;
192 }
193 return type;
194 }
195 private:
196 std::string moduleName_;
197 };
198
199 class SubscriptListenerTest : public ISubscriptListener {
200 public:
SubscriptListenerTest()201 SubscriptListenerTest() {}
SubscriptListenerTest(const std::string & name)202 explicit SubscriptListenerTest(const std::string& name) : moduleName_(name) {}
OnMessage(DragCursorStyle style)203 void OnMessage(DragCursorStyle style) override
204 {
205 SetDragSyle(style);
206 if (moduleName_.empty()) {
207 moduleName_ = std::string("SubscriptListenerTest");
208 }
209 FI_HILOGD("Received notification event for subscriptListener, %{public}s, state:%{public}s",
210 moduleName_.c_str(), PrintStyleMessage(style).c_str());
211 }
212
GetDragStyle()213 DragCursorStyle GetDragStyle()
214 {
215 return dragStyle_;
216 }
217
218 private:
SetDragSyle(DragCursorStyle style)219 void SetDragSyle(DragCursorStyle style)
220 {
221 dragStyle_ = style;
222 }
223
PrintStyleMessage(DragCursorStyle style)224 std::string PrintStyleMessage(DragCursorStyle style)
225 {
226 std::string type = "unknow";
227 const std::map<DragCursorStyle, std::string> cursorStyles = {
228 { DragCursorStyle::DEFAULT, "default"},
229 { DragCursorStyle::FORBIDDEN, "forbidden"},
230 { DragCursorStyle::COPY, "copy"},
231 { DragCursorStyle::MOVE, "move"}
232 };
233 auto item = cursorStyles.find(style);
234 if (item != cursorStyles.end()) {
235 type = item->second;
236 }
237 return type;
238 }
239
240 private:
241 DragCursorStyle dragStyle_ { DragCursorStyle::DEFAULT };
242 std::string moduleName_;
243 };
244
245 class UnitTestStartDragListener : public IStartDragListener {
246 public:
UnitTestStartDragListener(std::function<void (const DragNotifyMsg &)> function)247 explicit UnitTestStartDragListener(std::function<void(const DragNotifyMsg&)> function) : function_(function) { }
OnDragEndMessage(const DragNotifyMsg & msg)248 void OnDragEndMessage(const DragNotifyMsg &msg) override
249 {
250 FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, targetPid:%{public}d, result:%{public}d",
251 msg.displayX, msg.displayY, msg.targetPid, static_cast<int32_t>(msg.result));
252 if (function_ != nullptr) {
253 function_(msg);
254 }
255 FI_HILOGD("Unit test OnDragEndMessage");
256 }
257
OnHideIconMessage()258 void OnHideIconMessage() override
259 {
260 FI_HILOGI("Unit test OnHideIconMessage");
261 }
262 private:
263 std::function<void(const DragNotifyMsg&)> function_;
264 };
265
GetInputDeviceIds()266 std::vector<int32_t> InteractionManagerTest::GetInputDeviceIds()
267 {
268 std::vector<int32_t> realDeviceIds;
269 auto callback = [&realDeviceIds](std::vector<int32_t>& deviceIds) {
270 realDeviceIds = deviceIds;
271 };
272 int32_t ret = MMI::InputManager::GetInstance()->GetDeviceIds(callback);
273 if (ret != RET_OK) {
274 FI_HILOGE("Get device ids failed");
275 return {};
276 }
277 return realDeviceIds;
278 }
279
GetDevice(int32_t deviceId)280 std::shared_ptr<MMI::InputDevice> InteractionManagerTest::GetDevice(int32_t deviceId)
281 {
282 std::shared_ptr<MMI::InputDevice> inputDevice;
283 auto callback = [&inputDevice](std::shared_ptr<MMI::InputDevice> device) {
284 inputDevice = device;
285 };
286 int32_t ret = MMI::InputManager::GetInstance()->GetDevice(deviceId, callback);
287 if (ret != RET_OK || inputDevice == nullptr) {
288 FI_HILOGE("Get device failed");
289 return nullptr;
290 }
291 return inputDevice;
292 }
293
GetMouseAndTouch()294 std::pair<int32_t, int32_t> InteractionManagerTest::GetMouseAndTouch()
295 {
296 std::vector<int32_t> deviceIds = GetInputDeviceIds();
297 std::pair<int32_t, int32_t> mouseAndTouch { -1, -1 };
298 for (const auto& id : deviceIds) {
299 std::shared_ptr<MMI::InputDevice> device = GetDevice(id);
300 CHKPC(device);
301 if (device->HasCapability(MMI::InputDeviceCapability::INPUT_DEV_CAP_POINTER)) {
302 mouseAndTouch.first = device->GetId();
303 }
304 if (device->HasCapability(MMI::InputDeviceCapability::INPUT_DEV_CAP_TOUCH)) {
305 mouseAndTouch.second = device->GetId();
306 }
307 }
308 return mouseAndTouch;
309 }
310
SetUpTestCase()311 void InteractionManagerTest::SetUpTestCase()
312 {
313 auto mouseAndTouch = GetMouseAndTouch();
314 g_deviceMouseId = mouseAndTouch.first;
315 g_deviceTouchId = mouseAndTouch.second;
316 }
317
SetUp()318 void InteractionManagerTest::SetUp()
319 {
320 EnableCooperate();
321 }
322
TearDown()323 void InteractionManagerTest::TearDown()
324 {
325 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_OP_MS));
326 }
327
EnableCooperate()328 void InteractionManagerTest::EnableCooperate()
329 {
330 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
331 std::promise<bool> promiseFlag;
332 std::future<bool> futureFlag = promiseFlag.get_future();
333 auto fun = [&promiseFlag](const std::string &listener, const CoordinationMsgInfo &coordinationMessages) {
334 FI_HILOGD("Prepare coordination success, listener:%{public}s", listener.c_str());
335 promiseFlag.set_value(true);
336 };
337 bool isCompatible = true;
338 int32_t ret = InteractionManager::GetInstance()->PrepareCoordination(fun, isCompatible);
339 #ifdef OHOS_BUILD_ENABLE_COORDINATION
340 if (ret == RET_OK) {
341 FI_HILOGI("PrepareCoordination successfully");
342 } else {
343 FI_HILOGE("PrepareCoordination failed");
344 }
345 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) != std::future_status::timeout);
346 #else
347 ASSERT_EQ(ret, ERROR_UNSUPPORT);
348 #endif // OHOS_BUILD_ENABLE_COORDINATION
349 RemovePermission();
350 }
351
CreatePixelMap(int32_t width,int32_t height)352 std::shared_ptr<Media::PixelMap> InteractionManagerTest::CreatePixelMap(int32_t width, int32_t height)
353 {
354 CALL_DEBUG_ENTER;
355 OHOS::Media::InitializationOptions opts;
356 opts.size.width = width;
357 opts.size.height = height;
358 opts.pixelFormat = Media::PixelFormat::BGRA_8888;
359 opts.alphaType = Media::AlphaType::IMAGE_ALPHA_TYPE_OPAQUE;
360 opts.scaleMode = Media::ScaleMode::FIT_TARGET_SIZE;
361
362 int32_t colorLen = width * height;
363 uint32_t* colors = new (std::nothrow) uint32_t[colorLen];
364 CHKPP(colors);
365 int32_t colorByteCount = colorLen * INT32_BYTE;
366 if (memset_s(colors, colorByteCount, DEFAULT_ICON_COLOR, colorByteCount) != EOK) {
367 delete[] colors;
368 FI_HILOGE("memset_s failed");
369 return nullptr;
370 }
371 std::shared_ptr<Media::PixelMap> pixelMap = Media::PixelMap::Create(colors, colorLen, opts);
372 if (pixelMap == nullptr) {
373 delete[] colors;
374 FI_HILOGE("Create pixelMap failed");
375 return nullptr;
376 }
377 delete[] colors;
378 return pixelMap;
379 }
380
CreateDragData(const std::pair<int32_t,int32_t> & pixelMapSize,int32_t sourceType,int32_t pointerId,int32_t displayId,const std::pair<int32_t,int32_t> & location)381 std::optional<DragData> InteractionManagerTest::CreateDragData(const std::pair<int32_t, int32_t> &pixelMapSize,
382 int32_t sourceType, int32_t pointerId, int32_t displayId, const std::pair<int32_t, int32_t> &location)
383 {
384 CALL_DEBUG_ENTER;
385 std::shared_ptr<Media::PixelMap> pixelMap = CreatePixelMap(pixelMapSize.first, pixelMapSize.second);
386 if (pixelMap == nullptr) {
387 FI_HILOGE("Create pixelmap failed");
388 return std::nullopt;
389 }
390 ShadowInfo shadowInfo { pixelMap, 0, 0 };
391 DragData dragData;
392 dragData.shadowInfos.push_back(shadowInfo);
393 dragData.buffer = std::vector<uint8_t>(MAX_BUFFER_SIZE, 0);
394 dragData.udKey = UD_KEY;
395 dragData.sourceType = sourceType;
396 dragData.pointerId = pointerId;
397 dragData.dragNum = DRAG_NUM;
398 dragData.displayX = location.first;
399 dragData.displayY = location.second;
400 dragData.displayId = displayId;
401 dragData.hasCanceledAnimation = HAS_CANCELED_ANIMATION;
402 dragData.extraInfo = EXTRA_INFO;
403 dragData.filterInfo = FILTER_INFO;
404 dragData.mainWindow = SRC_MAIN_WINDOW;
405 return dragData;
406 }
407
CreatePointerItem(int32_t pointerId,int32_t deviceId,const std::pair<int32_t,int32_t> & displayLocation,bool isPressed)408 MMI::PointerEvent::PointerItem InteractionManagerTest::CreatePointerItem(int32_t pointerId, int32_t deviceId,
409 const std::pair<int32_t, int32_t> &displayLocation, bool isPressed)
410 {
411 MMI::PointerEvent::PointerItem item;
412 item.SetPointerId(pointerId);
413 item.SetDeviceId(deviceId);
414 item.SetDisplayX(displayLocation.first);
415 item.SetDisplayY(displayLocation.second);
416 item.SetPressed(isPressed);
417 return item;
418 }
419
SetupPointerEvent(const std::pair<int32_t,int32_t> & displayLocation,int32_t action,int32_t sourceType,int32_t pointerId,bool isPressed)420 std::shared_ptr<MMI::PointerEvent> InteractionManagerTest::SetupPointerEvent(const std::pair<int32_t, int32_t>
421 &displayLocation, int32_t action, int32_t sourceType, int32_t pointerId, bool isPressed)
422 {
423 CALL_DEBUG_ENTER;
424 auto pointerEvent = MMI::PointerEvent::Create();
425 CHKPP(pointerEvent);
426 pointerEvent->SetPointerAction(action);
427 pointerEvent->SetSourceType(sourceType);
428 pointerEvent->SetPointerId(pointerId);
429 MMI::PointerEvent::PointerItem curPointerItem;
430 if (sourceType == MMI::PointerEvent::SOURCE_TYPE_MOUSE) {
431 curPointerItem = CreatePointerItem(pointerId, g_deviceMouseId, displayLocation, isPressed);
432 } else if (sourceType == MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
433 curPointerItem = CreatePointerItem(pointerId, g_deviceTouchId, displayLocation, isPressed);
434 } else {
435 FI_HILOGE("Unknow sourceType:%{public}d", sourceType);
436 return nullptr;
437 }
438 pointerEvent->AddPointerItem(curPointerItem);
439 return pointerEvent;
440 }
441
SimulateDownPointerEvent(const std::pair<int32_t,int32_t> & location,int32_t sourceType,int32_t pointerId)442 void InteractionManagerTest::SimulateDownPointerEvent(const std::pair<int32_t, int32_t> &location, int32_t sourceType,
443 int32_t pointerId)
444 {
445 CALL_DEBUG_ENTER;
446 SetPermission(SYSTEM_CORE, g_coresInject, sizeof(g_coresInject) / sizeof(g_coresInject[0]));
447 std::shared_ptr<MMI::PointerEvent> pointerEvent =
448 SetupPointerEvent(location, MMI::PointerEvent::POINTER_ACTION_DOWN, sourceType, pointerId, true);
449 CHKPV(pointerEvent);
450 FI_HILOGD("TEST:sourceType:%{public}d, pointerId:%{public}d, pointerAction:%{public}d",
451 pointerEvent->GetSourceType(), pointerEvent->GetPointerId(), pointerEvent->GetPointerAction());
452 MMI::InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
453 RemovePermission();
454 }
455
SimulateUpPointerEvent(const std::pair<int32_t,int32_t> & location,int32_t sourceType,int32_t pointerId)456 void InteractionManagerTest::SimulateUpPointerEvent(const std::pair<int32_t, int32_t> &location, int32_t sourceType,
457 int32_t pointerId)
458 {
459 CALL_DEBUG_ENTER;
460 SetPermission(SYSTEM_CORE, g_coresInject, sizeof(g_coresInject) / sizeof(g_coresInject[0]));
461 std::shared_ptr<MMI::PointerEvent> pointerEvent = SetupPointerEvent(location,
462 MMI::PointerEvent::POINTER_ACTION_UP, sourceType, pointerId, false);
463 CHKPV(pointerEvent);
464 FI_HILOGD("TEST:sourceType:%{public}d, pointerId:%{public}d, pointerAction:%{public}d",
465 pointerEvent->GetSourceType(), pointerEvent->GetPointerId(), pointerEvent->GetPointerAction());
466 MMI::InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
467 RemovePermission();
468 }
469
SimulateMovePointerEvent(const std::pair<int32_t,int32_t> & srcLocation,const std::pair<int32_t,int32_t> & dstLocation,int32_t sourceType,int32_t pointerId,bool isPressed)470 void InteractionManagerTest::SimulateMovePointerEvent(const std::pair<int32_t, int32_t> &srcLocation,
471 const std::pair<int32_t, int32_t> &dstLocation, int32_t sourceType, int32_t pointerId, bool isPressed)
472 {
473 CALL_DEBUG_ENTER;
474 SetPermission(SYSTEM_CORE, g_coresInject, sizeof(g_coresInject) / sizeof(g_coresInject[0]));
475 int32_t srcX = srcLocation.first;
476 int32_t srcY = srcLocation.second;
477 int32_t dstX = dstLocation.first;
478 int32_t dstY = dstLocation.second;
479 std::vector<std::pair<int32_t, int32_t>> coordinates;
480 if (dstX == srcX) {
481 for (int32_t y = srcY; y <= dstY; y += MOVE_STEP) {
482 coordinates.push_back({srcX, y});
483 }
484 for (int32_t y = srcY; y > dstY; y -= MOVE_STEP) {
485 coordinates.push_back({srcX, y});
486 }
487 } else {
488 double ratio = (dstY - srcY) * 1.0 / (dstX - srcX);
489 for (int32_t x = srcX; x < dstX; x += MOVE_STEP) {
490 coordinates.push_back({x, srcY + static_cast<int32_t>(ratio * (x - srcX))});
491 }
492 for (int32_t x = srcX; x >= dstX; x -= MOVE_STEP) {
493 coordinates.push_back({x, srcY + static_cast<int32_t>(ratio * (x - srcX))});
494 }
495 coordinates.push_back({dstX, dstY});
496 }
497 for (const auto& pointer : coordinates) {
498 std::shared_ptr<MMI::PointerEvent> pointerEvent =
499 SetupPointerEvent(pointer, MMI::PointerEvent::POINTER_ACTION_MOVE, sourceType, pointerId, isPressed);
500 CHKPC(pointerEvent);
501 FI_HILOGD("TEST:sourceType:%{public}d, pointerId:%{public}d, pointerAction:%{public}d",
502 pointerEvent->GetSourceType(), pointerEvent->GetPointerId(), pointerEvent->GetPointerAction());
503 MMI::InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
504 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
505 }
506 RemovePermission();
507 }
508
TestAddMonitor(std::shared_ptr<MMI::IInputEventConsumer> consumer)509 int32_t InteractionManagerTest::TestAddMonitor(std::shared_ptr<MMI::IInputEventConsumer> consumer)
510 {
511 CHKPR(consumer, RET_ERR);
512 return MMI::InputManager::GetInstance()->AddMonitor(consumer);
513 }
514
TestRemoveMonitor(int32_t monitorId)515 void InteractionManagerTest::TestRemoveMonitor(int32_t monitorId)
516 {
517 MMI::InputManager::GetInstance()->RemoveMonitor(monitorId);
518 }
519
PrintDragData(const DragData & dragData)520 void InteractionManagerTest::PrintDragData(const DragData &dragData)
521 {
522 CALL_DEBUG_ENTER;
523 for (const auto &shadowInfo : dragData.shadowInfos) {
524 CHKPV(shadowInfo.pixelMap);
525 FI_HILOGD("PixelFormat:%{public}d, PixelAlphaType:%{public}d, PixelAllocatorType:%{public}d,"
526 " PixelWidth:%{public}d, PixelHeight:%{public}d, shadowX:%{public}d, shadowY:%{public}d",
527 static_cast<int32_t>(shadowInfo.pixelMap->GetPixelFormat()),
528 static_cast<int32_t>(shadowInfo.pixelMap->GetAlphaType()),
529 static_cast<int32_t>(shadowInfo.pixelMap->GetAllocatorType()),
530 shadowInfo.pixelMap->GetWidth(), shadowInfo.pixelMap->GetHeight(), shadowInfo.x, shadowInfo.y);
531 }
532 FI_HILOGD("SourceType:%{public}d, pointerId:%{public}d, displayId:%{public}d, displayX:%{public}d,"
533 " displayY:%{public}d, dragNum:%{public}d, hasCanceledAnimation:%{public}d, udKey:%{public}s",
534 dragData.sourceType, dragData.pointerId, dragData.displayId, dragData.displayX, dragData.displayY,
535 dragData.dragNum, dragData.hasCanceledAnimation, dragData.udKey.substr(0, SUBSTR_UDKEY_LEN).c_str());
536 }
537
SetupKeyEvent(int32_t action,int32_t key,bool isPressed)538 void InteractionManagerTest::SetupKeyEvent(
539 int32_t action, int32_t key, bool isPressed)
540 {
541 CALL_DEBUG_ENTER;
542 CHKPV(g_keyEvent);
543 MMI::KeyEvent::KeyItem keyItem;
544 keyItem.SetKeyCode(key);
545 keyItem.SetDeviceId(1);
546 keyItem.SetDownTime(DOWN_TIME);
547 g_keyEvent->SetKeyAction(action);
548 g_keyEvent->SetKeyCode(key);
549 if (action == MMI::KeyEvent::KEY_ACTION_DOWN) {
550 keyItem.SetPressed(isPressed);
551 } else if (action == MMI::KeyEvent::KEY_ACTION_UP) {
552 g_keyEvent->RemoveReleasedKeyItems(keyItem);
553 }
554 g_keyEvent->AddPressedKeyItems(keyItem);
555 }
556
ClearUpKeyEvent()557 void InteractionManagerTest::ClearUpKeyEvent()
558 {
559 CALL_DEBUG_ENTER;
560 CHKPV(g_keyEvent);
561 for (const auto& iter : g_keyEvent->GetKeyItems()) {
562 if (!iter.IsPressed()) {
563 FI_HILOGD("TEST:Clean keyItem, keyCode:%{public}d", iter.GetKeyCode());
564 g_keyEvent->RemoveReleasedKeyItems(iter);
565 return;
566 }
567 }
568 }
569
SimulateDownKeyEvent(int32_t key)570 void InteractionManagerTest::SimulateDownKeyEvent(int32_t key)
571 {
572 CALL_DEBUG_ENTER;
573 SetPermission(SYSTEM_CORE, g_coresInject, sizeof(g_coresInject) / sizeof(g_coresInject[0]));
574 SetupKeyEvent(MMI::KeyEvent::KEY_ACTION_DOWN, key, true);
575 FI_HILOGD("TEST:keyCode:%{public}d, keyAction: KEY_ACTION_DOWN", key);
576 MMI::InputManager::GetInstance()->SimulateInputEvent(g_keyEvent);
577 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
578 RemovePermission();
579 }
580
SimulateUpKeyEvent(int32_t key)581 void InteractionManagerTest::SimulateUpKeyEvent(int32_t key)
582 {
583 CALL_DEBUG_ENTER;
584 SetPermission(SYSTEM_CORE, g_coresInject, sizeof(g_coresInject) / sizeof(g_coresInject[0]));
585 SetupKeyEvent(MMI::KeyEvent::KEY_ACTION_UP, key, false);
586 FI_HILOGD("TEST:keyCode:%{public}d, keyAction: KEY_ACTION_UP", key);
587 MMI::InputManager::GetInstance()->SimulateInputEvent(g_keyEvent);
588 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
589 RemovePermission();
590 }
591
PrintDragAction(DragAction dragAction)592 void InteractionManagerTest::PrintDragAction(DragAction dragAction)
593 {
594 switch (dragAction) {
595 case DragAction::MOVE:{
596 FI_HILOGD("drag action: MOVE");
597 break;
598 }
599 case DragAction::COPY:{
600 FI_HILOGD("drag action: COPY");
601 break;
602 }
603 default:{
604 FI_HILOGD("drag action: UNKNOWN");
605 break;
606 }
607 }
608 }
609
AssignToAnimation(PreviewAnimation & animation)610 void InteractionManagerTest::AssignToAnimation(PreviewAnimation &animation)
611 {
612 animation.duration = ANIMATION_DURATION;
613 animation.curveName = CURVE_NAME;
614 animation.curve = { 0.33, 0, 0.67, 1 };
615 }
616
617 class InputEventCallbackTest : public MMI::IInputEventConsumer {
618 public:
InputEventCallbackTest()619 InputEventCallbackTest() {}
InputEventCallbackTest(std::function<void ()> callback)620 explicit InputEventCallbackTest(std::function<void()> callback) : callback_(callback) {}
OnInputEvent(std::shared_ptr<MMI::KeyEvent> keyEvent) const621 void OnInputEvent(std::shared_ptr<MMI::KeyEvent> keyEvent) const override {};
622 void OnInputEvent(std::shared_ptr<MMI::PointerEvent> pointerEvent) const override;
OnInputEvent(std::shared_ptr<MMI::AxisEvent> axisEvent) const623 void OnInputEvent(std::shared_ptr<MMI::AxisEvent> axisEvent) const override {};
624 private:
625 std::function<void()> callback_ { nullptr };
626 };
627
OnInputEvent(std::shared_ptr<MMI::PointerEvent> pointerEvent) const628 void InputEventCallbackTest::OnInputEvent(std::shared_ptr<MMI::PointerEvent> pointerEvent) const
629 {
630 CALL_DEBUG_ENTER;
631 ASSERT_TRUE(pointerEvent != nullptr);
632 auto pointerAction = pointerEvent->GetPointerAction();
633 ASSERT_TRUE(pointerAction == MMI::PointerEvent::POINTER_ACTION_PULL_MOVE ||
634 pointerAction == MMI::PointerEvent::POINTER_ACTION_PULL_UP ||
635 pointerAction == MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW ||
636 pointerAction == MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW);
637 ASSERT_TRUE(!pointerEvent->GetBuffer().empty());
638 MMI::PointerEvent::PointerItem pointerItem;
639 pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem);
640 if (callback_ != nullptr && pointerItem.GetDisplayX() == DRAG_DST_X && pointerItem.GetDisplayY() == DRAG_DST_Y) {
641 callback_();
642 }
643 }
644
645 /**
646 * @tc.name: InteractionManagerTest_PrepareCoordination
647 * @tc.desc: Prepare coordination
648 * @tc.type: FUNC
649 * @tc.require:
650 */
651 HWTEST_F(InteractionManagerTest, InteractionManagerTest_PrepareCoordination, TestSize.Level1)
652 {
653 CALL_TEST_DEBUG;
654 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
655 std::promise<bool> promiseFlag;
656 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a70502(const std::string &listener, const CoordinationMsgInfo &coordinationMessages) 657 auto fun = [&promiseFlag](const std::string &listener, const CoordinationMsgInfo &coordinationMessages) {
658 FI_HILOGD("Prepare coordination success, listener:%{public}s", listener.c_str());
659 promiseFlag.set_value(true);
660 };
661 bool isCompatible = true;
662 int32_t ret = InteractionManager::GetInstance()->PrepareCoordination(fun, isCompatible);
663 #ifdef OHOS_BUILD_ENABLE_COORDINATION
664 ASSERT_EQ(ret, RET_OK);
665 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) != std::future_status::timeout);
666 #else
667 ASSERT_EQ(ret, ERROR_UNSUPPORT);
668 #endif // OHOS_BUILD_ENABLE_COORDINATION
669 RemovePermission();
670 }
671
672 /**
673 * @tc.name: InteractionManagerTest_RegisterCoordinationListener_001
674 * @tc.desc: Register coordination listener
675 * @tc.type: FUNC
676 * @tc.require:
677 */
678 HWTEST_F(InteractionManagerTest, InteractionManagerTest_RegisterCoordinationListener_001, TestSize.Level1)
679 {
680 CALL_TEST_DEBUG;
681 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
682 std::shared_ptr<ICoordinationListener> consumer = nullptr;
683 bool isCompatible = true;
684 int32_t ret = InteractionManager::GetInstance()->RegisterCoordinationListener(consumer, isCompatible);
685 #ifdef OHOS_BUILD_ENABLE_COORDINATION
686 ASSERT_EQ(ret, RET_ERR);
687 #else
688 ASSERT_EQ(ret, ERROR_UNSUPPORT);
689 #endif // OHOS_BUILD_ENABLE_COORDINATION
690 RemovePermission();
691 }
692
693 /**
694 * @tc.name: InteractionManagerTest_RegisterCoordinationListener_002
695 * @tc.desc: Register coordination listener
696 * @tc.type: FUNC
697 * @tc.require:
698 */
699 HWTEST_F(InteractionManagerTest, InteractionManagerTest_RegisterCoordinationListener_002, TestSize.Level1)
700 {
701 CALL_DEBUG_ENTER;
702 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
703 class CoordinationListenerTest : public ICoordinationListener {
704 public:
CoordinationListenerTest()705 CoordinationListenerTest() : ICoordinationListener() {}
OnCoordinationMessage(const std::string & networkId,CoordinationMessage msg)706 void OnCoordinationMessage(const std::string &networkId, CoordinationMessage msg) override
707 {
708 FI_HILOGD("Register coordination listener test");
709 (void) networkId;
710 };
711 };
712 std::shared_ptr<CoordinationListenerTest> consumer =
713 std::make_shared<CoordinationListenerTest>();
714 bool isCompatible = true;
715 int32_t ret = InteractionManager::GetInstance()->RegisterCoordinationListener(consumer, isCompatible);
716 #ifdef OHOS_BUILD_ENABLE_COORDINATION
717 ASSERT_EQ(ret, RET_OK);
718 #else
719 ASSERT_EQ(ret, ERROR_UNSUPPORT);
720 #endif // OHOS_BUILD_ENABLE_COORDINATION
721 ret = InteractionManager::GetInstance()->UnregisterCoordinationListener(consumer, isCompatible);
722 #ifdef OHOS_BUILD_ENABLE_COORDINATION
723 ASSERT_EQ(ret, RET_OK);
724 #else
725 ASSERT_EQ(ret, ERROR_UNSUPPORT);
726 #endif // OHOS_BUILD_ENABLE_COORDINATION
727 RemovePermission();
728 }
729
730 /**
731 * @tc.name: InteractionManagerTest_RegisterCoordinationListener_003
732 * @tc.desc: Register coordination listener
733 * @tc.type: FUNC
734 * @tc.require:
735 */
736 HWTEST_F(InteractionManagerTest, InteractionManagerTest_RegisterCoordinationListener_003, TestSize.Level1)
737 {
738 CALL_TEST_DEBUG;
739 FI_HILOGD("InteractionManagerTest_RegisterCoordinationListener_003 enter");
740 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
741 class CoordinationListenerTest : public ICoordinationListener {
742 public:
CoordinationListenerTest()743 CoordinationListenerTest() : ICoordinationListener() {}
OnCoordinationMessage(const std::string & networkId,CoordinationMessage msg)744 void OnCoordinationMessage(const std::string &networkId, CoordinationMessage msg) override
745 {
746 FI_HILOGD("Register coordination listener test");
747 (void) networkId;
748 };
749 };
750 std::shared_ptr<CoordinationListenerTest> consumer =
751 std::make_shared<CoordinationListenerTest>();
752 bool isCompatible = true;
753 int32_t ret = InteractionManager::GetInstance()->RegisterCoordinationListener(consumer, isCompatible);
754 #ifdef OHOS_BUILD_ENABLE_COORDINATION
755 ASSERT_EQ(ret, RET_OK);
756 #else
757 ASSERT_EQ(ret, ERROR_UNSUPPORT);
758 #endif // OHOS_BUILD_ENABLE_COORDINATION
759 ret = InteractionManager::GetInstance()->RegisterCoordinationListener(consumer, isCompatible);
760 #ifdef OHOS_BUILD_ENABLE_COORDINATION
761 ASSERT_EQ(ret, RET_ERR);
762 #else
763 ASSERT_EQ(ret, ERROR_UNSUPPORT);
764 #endif // OHOS_BUILD_ENABLE_COORDINATION
765 ret = InteractionManager::GetInstance()->UnregisterCoordinationListener(consumer, isCompatible);
766 #ifdef OHOS_BUILD_ENABLE_COORDINATION
767 ASSERT_EQ(ret, RET_OK);
768 #else
769 ASSERT_EQ(ret, ERROR_UNSUPPORT);
770 #endif // OHOS_BUILD_ENABLE_COORDINATION
771 RemovePermission();
772 FI_HILOGD("InteractionManagerTest_RegisterCoordinationListener_003 finish");
773 }
774
775 /**
776 * @tc.name: InteractionManagerTest_ActivateCoordination
777 * @tc.desc: Activate coordination
778 * @tc.type: FUNC
779 * @tc.require:
780 */
781 HWTEST_F(InteractionManagerTest, InteractionManagerTest_ActivateCoordination, TestSize.Level1)
782 {
783 CALL_TEST_DEBUG;
784 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
785 std::string remoteNetworkId("");
786 int32_t startDeviceId = -1;
__anond638f0a70602(const std::string &listener, const CoordinationMsgInfo &coordinationMessages) 787 auto fun = [](const std::string &listener, const CoordinationMsgInfo &coordinationMessages) {
788 FI_HILOGD("Start coordination success");
789 (void) listener;
790 };
791 bool isCompatible = true;
792 int32_t ret = InteractionManager::GetInstance()->ActivateCoordination(remoteNetworkId, startDeviceId,
793 fun, isCompatible);
794 #ifdef OHOS_BUILD_ENABLE_COORDINATION
795 ASSERT_TRUE((ret == RET_OK || ret == COMMON_PERMISSION_CHECK_ERROR || ret == COMMON_NOT_ALLOWED_DISTRIBUTED));
796 #else
797 ASSERT_EQ(ret, ERROR_UNSUPPORT);
798 #endif // OHOS_BUILD_ENABLE_COORDINATION
799 RemovePermission();
800 }
801
802 /**
803 * @tc.name: InteractionManagerTest_DeactivateCoordination
804 * @tc.desc: Deactivate coordination
805 * @tc.type: FUNC
806 * @tc.require:
807 */
808 HWTEST_F(InteractionManagerTest, InteractionManagerTest_DeactivateCoordination, TestSize.Level1)
809 {
810 CALL_TEST_DEBUG;
811 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
__anond638f0a70702(const std::string &listener, const CoordinationMsgInfo &coordinationMessages) 812 auto fun = [](const std::string &listener, const CoordinationMsgInfo &coordinationMessages) {
813 FI_HILOGD("Stop coordination success");
814 (void) listener;
815 };
816 bool isCompatible = true;
817 int32_t ret = InteractionManager::GetInstance()->DeactivateCoordination(false, fun, isCompatible);
818 #ifdef OHOS_BUILD_ENABLE_COORDINATION
819 ASSERT_EQ(ret, RET_OK);
820 #else
821 ASSERT_EQ(ret, ERROR_UNSUPPORT);
822 ret = InteractionManager::GetInstance()->DeactivateCoordination(true, fun, isCompatible);
823 ASSERT_EQ(ret, ERROR_UNSUPPORT);
824 #endif // OHOS_BUILD_ENABLE_COORDINATION
825 RemovePermission();
826 }
827
828 /**
829 * @tc.name: InteractionManagerTest_GetCoordinationState_Abnormal
830 * @tc.desc: Get coordination state
831 * @tc.type: FUNC
832 * @tc.require:
833 */
834 HWTEST_F(InteractionManagerTest, InteractionManagerTest_GetCoordinationState_Abnormal, TestSize.Level1)
835 {
836 CALL_TEST_DEBUG;
837 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
838 const std::string networkId("");
__anond638f0a70802(bool state) 839 auto fun = [](bool state) {
840 FI_HILOGD("Get coordination state failed, state:%{public}d", state);
841 };
842 bool isCompatible = true;
843 int32_t ret = InteractionManager::GetInstance()->GetCoordinationState(networkId, fun, isCompatible);
844 #ifdef OHOS_BUILD_ENABLE_COORDINATION
845 ASSERT_EQ(ret, RET_OK);
846 #else
847 ASSERT_EQ(ret, ERROR_UNSUPPORT);
848 #endif // OHOS_BUILD_ENABLE_COORDINATION
849 RemovePermission();
850 }
851
852 /**
853 * @tc.name: InteractionManagerTest_GetCoordinationState_Normal
854 * @tc.desc: Get coordination state
855 * @tc.type: FUNC
856 * @tc.require:
857 */
858 HWTEST_F(InteractionManagerTest, InteractionManagerTest_GetCoordinationState_Normal, TestSize.Level1)
859 {
860 CALL_TEST_DEBUG;
861 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
862 std::promise<bool> promiseFlag;
863 std::future<bool> futureFlag = promiseFlag.get_future();
864 const std::string networkId("networkId");
__anond638f0a70902(bool state) 865 auto fun = [&promiseFlag](bool state) {
866 FI_HILOGD("Get coordination state success, state:%{public}d", state);
867 promiseFlag.set_value(true);
868 };
869 bool isCompatible = true;
870 int32_t ret = InteractionManager::GetInstance()->GetCoordinationState(networkId, fun, isCompatible);
871 #ifdef OHOS_BUILD_ENABLE_COORDINATION
872 ASSERT_EQ(ret, RET_OK);
873 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) != std::future_status::timeout);
874 #else
875 ASSERT_EQ(ret, ERROR_UNSUPPORT);
876 #endif // OHOS_BUILD_ENABLE_COORDINATION
877 RemovePermission();
878 }
879
880 /**
881 * @tc.name: InteractionManagerTest_GetCoordinationState_Sync
882 * @tc.desc: Get coordination state
883 * @tc.type: FUNC
884 * @tc.require:
885 */
886 HWTEST_F(InteractionManagerTest, InteractionManagerTest_GetCoordinationState_Sync, TestSize.Level1)
887 {
888 CALL_TEST_DEBUG;
889 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
890 const std::string udId("Default");
891 bool state { false };
892 int32_t ret = InteractionManager::GetInstance()->GetCoordinationState(udId, state);
893 #ifdef OHOS_BUILD_ENABLE_COORDINATION
894 ASSERT_EQ(ret, RET_OK);
895 #else
896 ASSERT_EQ(ret, ERROR_UNSUPPORT);
897 #endif // OHOS_BUILD_ENABLE_COORDINATION
898 RemovePermission();
899 }
900
901 /**
902 * @tc.name: InteractionManagerTest_UnregisterCoordinationListener
903 * @tc.desc: Unregister coordination listener
904 * @tc.type: FUNC
905 * @tc.require:
906 */
907 HWTEST_F(InteractionManagerTest, InteractionManagerTest_UnregisterCoordinationListener, TestSize.Level1)
908 {
909 CALL_TEST_DEBUG;
910 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
911 std::shared_ptr<ICoordinationListener> consumer = nullptr;
912 bool isCompatible = true;
913 int32_t ret = InteractionManager::GetInstance()->UnregisterCoordinationListener(consumer, isCompatible);
914 #ifdef OHOS_BUILD_ENABLE_COORDINATION
915 ASSERT_EQ(ret, RET_OK);
916 #else
917 ASSERT_EQ(ret, ERROR_UNSUPPORT);
918 #endif // OHOS_BUILD_ENABLE_COORDINATION
919 RemovePermission();
920 }
921
922 /**
923 * @tc.name: InteractionManagerTest_UnprepareCoordination
924 * @tc.desc: Prepare coordination
925 * @tc.type: FUNC
926 * @tc.require:
927 */
928 HWTEST_F(InteractionManagerTest, InteractionManagerTest_UnprepareCoordination, TestSize.Level1)
929 {
930 CALL_TEST_DEBUG;
931 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
932 std::promise<bool> promiseFlag;
933 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a70a02(const std::string &listener, const CoordinationMsgInfo &coordinationMessages) 934 auto fun = [&promiseFlag](const std::string &listener, const CoordinationMsgInfo &coordinationMessages) {
935 FI_HILOGD("Prepare coordination success, listener:%{public}s", listener.c_str());
936 promiseFlag.set_value(true);
937 };
938 bool isCompatible = true;
939 int32_t ret = InteractionManager::GetInstance()->UnprepareCoordination(fun, isCompatible);
940 #ifdef OHOS_BUILD_ENABLE_COORDINATION
941 ASSERT_EQ(ret, RET_OK);
942 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) != std::future_status::timeout);
943 #else
944 ASSERT_EQ(ret, ERROR_UNSUPPORT);
945 #endif // OHOS_BUILD_ENABLE_COORDINATION
946 RemovePermission();
947 }
948
949
950 class HotAreaListenerTest : public IHotAreaListener {
951 public:
HotAreaListenerTest()952 HotAreaListenerTest() {}
HotAreaListenerTest(std::string name)953 explicit HotAreaListenerTest(std::string name) : testName_(name) {}
OnHotAreaMessage(int32_t displayX,int32_t displayY,HotAreaType msg,bool isEdge)954 void OnHotAreaMessage(int32_t displayX, int32_t displayY, HotAreaType msg, bool isEdge) override
955 {
956 if (testName_.empty()) {
957 testName_ = std::string("HOT_AREA");
958 }
959 FI_HILOGD("%{public}s, type:%{public}s, isEdge:%{public}d, displayX:%{public}d, displayY:%{public}d",
960 testName_.c_str(), ShowMessage(msg).c_str(), isEdge, displayX, displayY);
961 };
962
963 private:
ShowMessage(HotAreaType msg)964 std::string ShowMessage(HotAreaType msg)
965 {
966 std::string type = "none-area";
967 const std::map<HotAreaType, std::string> areaType = {
968 { HotAreaType::AREA_LEFT, "left-area"},
969 { HotAreaType::AREA_RIGHT, "right-area"},
970 { HotAreaType::AREA_TOP, "top-area"},
971 { HotAreaType::AREA_BOTTOM, "bottom-area"}
972 };
973 auto item = areaType.find(msg);
974 if (item != areaType.end()) {
975 type = item->second;
976 }
977 return type;
978 }
979
980 private:
981 std::string testName_;
982 };
983
984 /**
985 * @tc.name: AddHotAreaListener_001
986 * @tc.desc: Add hot area listener
987 * @tc.type: FUNC
988 * @tc.require:
989 */
990 HWTEST_F(InteractionManagerTest, AddHotAreaListener_001, TestSize.Level1)
991 {
992 CALL_TEST_DEBUG;
993 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
994 auto listener = std::make_shared<HotAreaListenerTest>(std::string("HOT_AREA"));
995 int32_t ret = InteractionManager::GetInstance()->AddHotAreaListener(listener);
996 #ifdef OHOS_BUILD_ENABLE_COORDINATION
997 ASSERT_EQ(ret, RET_OK);
998 #else
999 ASSERT_EQ(ret, ERROR_UNSUPPORT);
1000 #endif // OHOS_BUILD_ENABLE_COORDINATION
1001 ret = InteractionManager::GetInstance()->RemoveHotAreaListener(listener);
1002 #ifdef OHOS_BUILD_ENABLE_COORDINATION
1003 ASSERT_EQ(ret, RET_OK);
1004 #else
1005 ASSERT_EQ(ret, ERROR_UNSUPPORT);
1006 #endif // OHOS_BUILD_ENABLE_COORDINATION
1007 RemovePermission();
1008 }
1009
1010 /**
1011 * @tc.name: AddHotAreaListener_002
1012 * @tc.desc: Add hot area listener
1013 * @tc.type: FUNC
1014 * @tc.require:
1015 */
1016 HWTEST_F(InteractionManagerTest, AddHotAreaListener_002, TestSize.Level1)
1017 {
1018 CALL_DEBUG_ENTER;
1019 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
1020 #ifndef OHOS_BUILD_PC_PRODUCT
1021 sptr<Rosen::Display> display = Rosen::DisplayManager::GetInstance().GetDisplayById(0);
1022 #else
1023 sptr<Rosen::DisplayInfo> display = Rosen::DisplayManager::GetInstance().GetVisibleAreaDisplayInfoById(0);
1024 #endif // OHOS_BUILD_PC_PRODUCT
1025 CHKPV(display);
1026 g_screenWidth = display->GetWidth();
1027 g_screenHeight = display->GetHeight();
1028 auto listener = std::make_shared<HotAreaListenerTest>(std::string("HOT_AREA"));
1029 int32_t ret = InteractionManager::GetInstance()->AddHotAreaListener(listener);
1030 #ifdef OHOS_BUILD_ENABLE_COORDINATION
1031 ASSERT_EQ(ret, RET_OK);
1032 #else
1033 ASSERT_EQ(ret, ERROR_UNSUPPORT);
1034 #endif // OHOS_BUILD_ENABLE_COORDINATION
1035 SimulateMovePointerEvent({ HOT_AREA_STEP, HOT_AREA_COOR }, { HOT_AREA_STEP - HOT_AREA_SPAN, HOT_AREA_COOR },
1036 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
1037 SimulateMovePointerEvent({ HOT_AREA_COOR, HOT_AREA_STEP }, { HOT_AREA_COOR, HOT_AREA_STEP - HOT_AREA_SPAN },
1038 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
1039 SimulateMovePointerEvent({ g_screenWidth - HOT_AREA_STEP, HOT_AREA_COOR },
1040 { g_screenWidth - HOT_AREA_SPAN, HOT_AREA_COOR },
1041 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
1042 SimulateMovePointerEvent({ HOT_AREA_COOR, g_screenHeight - HOT_AREA_STEP },
1043 { HOT_AREA_COOR, g_screenHeight - HOT_AREA_SPAN },
1044 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
1045 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_TOUCH_DOWN_MS));
1046 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
1047 ret = InteractionManager::GetInstance()->RemoveHotAreaListener(listener);
1048 #ifdef OHOS_BUILD_ENABLE_COORDINATION
1049 ASSERT_EQ(ret, RET_OK);
1050 #else
1051 ASSERT_EQ(ret, ERROR_UNSUPPORT);
1052 #endif // OHOS_BUILD_ENABLE_COORDINATION
1053 RemovePermission();
1054 }
1055
1056 /**
1057 * @tc.name: Set
1058 * @tc.desc: Set dampling coefficient.
1059 * @tc.type: FUNC
1060 * @tc.require:
1061 */
1062 HWTEST_F(InteractionManagerTest, InteractionManagerTest_SetDamplingCoefficient, TestSize.Level1)
1063 {
1064 CALL_TEST_DEBUG;
1065 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
1066 constexpr double damplingCoefficient { 0.1 };
1067 auto ret = InteractionManager::GetInstance()->SetDamplingCoefficient(
1068 COORDINATION_DAMPLING_RIGHT, damplingCoefficient);
1069 ASSERT_NE(ret, RET_OK);
1070 }
1071
1072 /**
1073 * @tc.name: InteractionManagerTest_Draglistener_Mouse
1074 * @tc.desc: Drag listener
1075 * @tc.type: FUNC
1076 * @tc.require:
1077 */
1078 HWTEST_F(InteractionManagerTest, InteractionManagerTest_Draglistener_Mouse, TestSize.Level1)
1079 {
1080 CALL_TEST_DEBUG;
1081 if (g_deviceMouseId < 0) {
1082 ASSERT_TRUE(g_deviceMouseId < 0);
1083 } else {
1084 auto listener = std::make_shared<DragListenerTest>(std::string("Draglistener_Mouse"));
1085 int32_t ret = InteractionManager::GetInstance()->AddDraglistener(listener);
1086 ASSERT_EQ(ret, RET_OK);
1087 SimulateDownPointerEvent(
1088 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, 0);
1089 std::promise<bool> promiseFlag;
1090 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a70b02(const DragNotifyMsg& notifyMessage) 1091 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1092 FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1093 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1094 promiseFlag.set_value(true);
1095 };
1096 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
1097 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1098 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID,
1099 { DRAG_SRC_X, DRAG_SRC_Y });
1100 ASSERT_TRUE(dragData);
1101 ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1102 std::make_shared<UnitTestStartDragListener>(callback));
1103 ASSERT_EQ(ret, RET_OK);
1104 ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1105 EXPECT_EQ(ret, RET_OK);
1106 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
1107 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
1108 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1109 InteractionManager::GetInstance()->StopDrag(dropResult);
1110 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1111 std::future_status::timeout);
1112 ret = InteractionManager::GetInstance()->RemoveDraglistener(listener);
1113 ASSERT_EQ(ret, RET_OK);
1114 }
1115 }
1116
1117 /**
1118 * @tc.name: InteractionManagerTest_Draglistener_Touch
1119 * @tc.desc: Drag listener
1120 * @tc.type: FUNC
1121 * @tc.require:
1122 */
1123 HWTEST_F(InteractionManagerTest, InteractionManagerTest_Draglistener_Touch, TestSize.Level1)
1124 {
1125 CALL_TEST_DEBUG;
1126 if (g_deviceTouchId < 0) {
1127 ASSERT_TRUE(g_deviceTouchId < 0);
1128 } else {
1129 auto dragListener = std::make_shared<DragListenerTest>(std::string("Draglistener_Touch"));
1130 int32_t ret = InteractionManager::GetInstance()->AddDraglistener(dragListener);
1131 ASSERT_EQ(ret, RET_OK);
1132 std::promise<bool> promiseFlag;
1133 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a70c02(const DragNotifyMsg& notifyMessage) 1134 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1135 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, target:%{public}d, result:%{public}d",
1136 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.targetPid, notifyMessage.result);
1137 promiseFlag.set_value(true);
1138 };
1139 SimulateDownPointerEvent(
1140 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1141 std::optional<DragData> dragData = CreateDragData({ MAX_PIXEL_MAP_WIDTH, MAX_PIXEL_MAP_HEIGHT },
1142 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1143 ASSERT_TRUE(dragData);
1144 ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1145 std::make_shared<UnitTestStartDragListener>(callback));
1146 ASSERT_EQ(ret, RET_OK);
1147 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
1148 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1149 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1150 InteractionManager::GetInstance()->StopDrag(dropResult);
1151 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1152 std::future_status::timeout);
1153 ret = InteractionManager::GetInstance()->RemoveDraglistener(dragListener);
1154 ASSERT_EQ(ret, RET_OK);
1155 }
1156 }
1157
1158 /**
1159 * @tc.name: InteractionManagerTest_Draglistener
1160 * @tc.desc: Drag listener
1161 * @tc.type: FUNC
1162 * @tc.require:
1163 */
1164 HWTEST_F(InteractionManagerTest, InteractionManagerTest_Draglistener, TestSize.Level1)
1165 {
1166 CALL_TEST_DEBUG;
1167 if (g_deviceTouchId < 0) {
1168 ASSERT_TRUE(g_deviceTouchId < 0);
1169 } else {
1170 int32_t ret = RET_ERR;
1171 std::vector<std::shared_ptr<DragListenerTest>> dragListeners;
1172 constexpr size_t listenerCount = 5;
1173 for (size_t i = 0; i < listenerCount; ++i) {
1174 std::string moduleName = "Draglistener_" + std::to_string(i);
1175 auto listener = std::make_shared<DragListenerTest>(moduleName);
1176 ret = InteractionManager::GetInstance()->AddDraglistener(listener);
1177 if (ret == RET_OK) {
1178 dragListeners.push_back(listener);
1179 }
1180 }
1181 SimulateDownPointerEvent(
1182 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1183 std::optional<DragData> dragData = CreateDragData({ MAX_PIXEL_MAP_WIDTH, MAX_PIXEL_MAP_HEIGHT },
1184 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1185 ASSERT_TRUE(dragData);
1186 std::promise<bool> promiseFlag;
1187 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a70d02(const DragNotifyMsg& notifyMessage) 1188 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1189 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1190 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1191 promiseFlag.set_value(true);
1192 };
1193 ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1194 std::make_shared<UnitTestStartDragListener>(callback));
1195 ASSERT_EQ(ret, RET_OK);
1196 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
1197 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1198 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1199 InteractionManager::GetInstance()->StopDrag(dropResult);
1200 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1201 std::future_status::timeout);
1202 for (const auto &listener : dragListeners) {
1203 ret = InteractionManager::GetInstance()->RemoveDraglistener(listener);
1204 EXPECT_EQ(ret, RET_OK);
1205 }
1206 }
1207 }
1208
1209 /**
1210 * @tc.name: InteractionManagerTest_SubscriptListener_001
1211 * @tc.desc: SubscriptListener
1212 * @tc.type: FUNC
1213 * @tc.require:
1214 */
1215 HWTEST_F(InteractionManagerTest, InteractionManagerTest_SubscriptListener_001, TestSize.Level1)
1216 {
1217 CALL_TEST_DEBUG;
1218 if (g_deviceTouchId < 0) {
1219 ASSERT_TRUE(g_deviceTouchId < 0);
1220 } else {
1221 int32_t ret = RET_ERR;
1222 std::vector<std::shared_ptr<SubscriptListenerTest>> subscriptListeners;
1223 for (size_t i = 0; i < RECIVE_LOOP_COUNT; ++i) {
1224 std::string moduleName = "SubscriptListener_" + std::to_string(i);
1225 auto listener = std::make_shared<SubscriptListenerTest>(moduleName);
1226 ret = InteractionManager::GetInstance()->AddSubscriptListener(listener);
1227 EXPECT_EQ(ret, RET_OK);
1228 subscriptListeners.push_back(listener);
1229 }
1230 std::promise<bool> promiseFlag;
1231 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a70e02(const DragNotifyMsg& notifyMessage) 1232 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1233 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1234 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1235 promiseFlag.set_value(true);
1236 };
1237 std::optional<DragData> dragData = CreateDragData({ MAX_PIXEL_MAP_WIDTH, MAX_PIXEL_MAP_HEIGHT },
1238 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1239 ASSERT_TRUE(dragData);
1240 ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1241 std::make_shared<UnitTestStartDragListener>(callback));
1242 ASSERT_EQ(ret, RET_OK);
1243 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
1244 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1245 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1246 InteractionManager::GetInstance()->StopDrag(dropResult);
1247 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1248 std::future_status::timeout);
1249 for (auto listener : subscriptListeners) {
1250 ret = InteractionManager::GetInstance()->RemoveSubscriptListener(listener);
1251 EXPECT_EQ(ret, RET_OK);
1252 }
1253 }
1254 }
1255
1256 /**
1257 * @tc.name: InteractionManagerTest_SubscriptListener_002
1258 * @tc.desc: SubscriptListener
1259 * @tc.type: FUNC
1260 * @tc.require:
1261 */
1262 HWTEST_F(InteractionManagerTest, InteractionManagerTest_SubscriptListener_002, TestSize.Level1)
1263 {
1264 CALL_TEST_DEBUG;
1265 if (g_deviceTouchId < 0) {
1266 ASSERT_TRUE(g_deviceTouchId < 0);
1267 } else {
1268 int32_t ret = RET_ERR;
1269 auto listener = std::make_shared<SubscriptListenerTest>("SubscriptListener");
1270 ret = InteractionManager::GetInstance()->AddSubscriptListener(listener);
1271 ASSERT_EQ(ret, RET_OK);
1272 std::promise<bool> promiseFlag;
1273 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a70f02(const DragNotifyMsg& notifyMessage) 1274 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1275 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1276 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1277 promiseFlag.set_value(true);
1278 };
1279 std::optional<DragData> dragData = CreateDragData({ MAX_PIXEL_MAP_WIDTH, MAX_PIXEL_MAP_HEIGHT },
1280 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1281 ASSERT_TRUE(dragData);
1282 ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1283 std::make_shared<UnitTestStartDragListener>(callback));
1284 ASSERT_EQ(ret, RET_OK);
1285 ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1286 ASSERT_EQ(ret, RET_OK);
1287 DragCursorStyle style = DragCursorStyle::COPY;
1288 ret = InteractionManager::GetInstance()->UpdateDragStyle(style);
1289 ASSERT_EQ(ret, RET_OK);
1290 style = DragCursorStyle::MOVE;
1291 ret = InteractionManager::GetInstance()->UpdateDragStyle(style);
1292 ASSERT_EQ(ret, RET_OK);
1293 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
1294 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1295 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1296 InteractionManager::GetInstance()->StopDrag(dropResult);
1297 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1298 std::future_status::timeout);
1299 DragCursorStyle recvStyle = listener->GetDragStyle();
1300 FI_HILOGD("Recived style:%{public}d, expected style:%{public}d", static_cast<int32_t>(recvStyle),
1301 static_cast<int32_t>(style));
1302 ret = InteractionManager::GetInstance()->RemoveSubscriptListener(listener);
1303 ASSERT_EQ(ret, RET_OK);
1304 }
1305 }
1306
1307 /**
1308 * @tc.name: InteractionManagerTest_StartDrag_Mouse
1309 * @tc.desc: Start Drag
1310 * @tc.type: FUNC
1311 * @tc.require:
1312 */
1313 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_Mouse, TestSize.Level1)
1314 {
1315 CALL_TEST_DEBUG;
1316 if (g_deviceMouseId < 0) {
1317 ASSERT_TRUE(g_deviceMouseId < 0);
1318 } else {
1319 SimulateDownPointerEvent(
1320 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, 0);
1321 std::promise<bool> promiseFlag;
1322 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71002(const DragNotifyMsg& notifyMessage) 1323 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1324 FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1325 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1326 promiseFlag.set_value(true);
1327 };
1328 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
1329 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1330 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID,
1331 { DRAG_SRC_X, DRAG_SRC_Y });
1332 ASSERT_TRUE(dragData);
1333 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1334 std::make_shared<UnitTestStartDragListener>(callback));
1335 ASSERT_EQ(ret, RET_OK);
1336 ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1337 InteractionManager::GetInstance()->SetDragWindowScreenId(TOUCH_POINTER_ID, TOUCH_POINTER_ID);
1338 EXPECT_EQ(ret, RET_OK);
1339 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
1340 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
1341 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1342 InteractionManager::GetInstance()->StopDrag(dropResult);
1343 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1344 std::future_status::timeout);
1345 }
1346 }
1347
1348 /**
1349 * @tc.name: InteractionManagerTest_StartDrag_Failed_Mouse
1350 * @tc.desc: Start Drag
1351 * @tc.type: FUNC
1352 * @tc.require:
1353 */
1354 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_Failed_Mouse, TestSize.Level1)
1355 {
1356 CALL_TEST_DEBUG;
1357 if (g_deviceMouseId < 0) {
1358 ASSERT_TRUE(g_deviceMouseId < 0);
1359 } else {
1360 std::promise<bool> promiseFlag;
1361 std::future<bool> futureFlag = promiseFlag.get_future();
1362 SimulateDownPointerEvent(
1363 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
__anond638f0a71102(const DragNotifyMsg& notifyMessage) 1364 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1365 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1366 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1367 promiseFlag.set_value(true);
1368 };
1369 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1370 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1371 ASSERT_TRUE(dragData);
1372
1373 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(), nullptr);
1374 ASSERT_EQ(ret, RET_ERR);
1375 dragData->shadowInfos = {};
1376 ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1377 std::make_shared<UnitTestStartDragListener>(callback));
1378 ASSERT_EQ(ret, ERR_INVALID_VALUE);
1379 }
1380 }
1381
1382 /**
1383 * @tc.name: InteractionManagerTest_StopDrag_Mouse
1384 * @tc.desc: Stop drag
1385 * @tc.type: FUNC
1386 * @tc.require:
1387 */
1388 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StopDrag_Mouse, TestSize.Level1)
1389 {
1390 CALL_TEST_DEBUG;
1391 if (g_deviceMouseId < 0) {
1392 ASSERT_TRUE(g_deviceMouseId < 0);
1393 } else {
1394 SimulateDownPointerEvent(
1395 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, 0);
1396 std::promise<bool> promiseFlag;
1397 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71202(const DragNotifyMsg& notifyMessage) 1398 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1399 FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1400 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1401 promiseFlag.set_value(true);
1402 };
1403 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
1404 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1405 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID,
1406 { DRAG_SRC_X, DRAG_SRC_Y });
1407 ASSERT_TRUE(dragData);
1408 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1409 std::make_shared<UnitTestStartDragListener>(callback));
1410 ASSERT_EQ(ret, RET_OK);
1411 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1412 InteractionManager::GetInstance()->StopDrag(dropResult);
1413 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1414 std::future_status::timeout);
1415 }
1416 }
1417
1418 /**
1419 * @tc.name: InteractionManagerTest_StopDrag_Failed_Mouse
1420 * @tc.desc: Stop drag
1421 * @tc.type: FUNC
1422 * @tc.require:
1423 */
1424 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StopDrag_Failed_Mouse, TestSize.Level1)
1425 {
1426 CALL_TEST_DEBUG;
1427 if (g_deviceMouseId < 0) {
1428 ASSERT_TRUE(g_deviceMouseId < 0);
1429 } else {
1430 SimulateDownPointerEvent(
1431 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
1432 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1433 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1434 ASSERT_TRUE(dragData);
1435 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(), nullptr);
1436 ASSERT_EQ(ret, RET_ERR);
1437 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1438 ret = InteractionManager::GetInstance()->StopDrag(dropResult);
1439 ASSERT_EQ(ret, RET_ERR);
1440 }
1441 }
1442
1443 /**
1444 * @tc.name: InteractionManagerTest_StartDrag_Touch
1445 * @tc.desc: Start Drag
1446 * @tc.type: FUNC
1447 * @tc.require:
1448 */
1449 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_Touch, TestSize.Level1)
1450 {
1451 CALL_TEST_DEBUG;
1452 if (g_deviceTouchId < 0) {
1453 ASSERT_TRUE(g_deviceTouchId < 0);
1454 } else {
1455 SimulateDownPointerEvent(
1456 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1457 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_TOUCH_DOWN_MS));
1458 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1459 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1460 ASSERT_TRUE(dragData);
1461 std::promise<bool> promiseFlag;
1462 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71302(const DragNotifyMsg& notifyMessage) 1463 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1464 FI_HILOGD("Start drag, displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1465 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1466 promiseFlag.set_value(true);
1467 };
1468 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1469 std::make_shared<UnitTestStartDragListener>(callback));
1470 ASSERT_EQ(ret, RET_OK);
1471 ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1472 EXPECT_EQ(ret, RET_OK);
1473 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
1474 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1475 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1476 InteractionManager::GetInstance()->StopDrag(dropResult);
1477 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1478 std::future_status::timeout);
1479 }
1480 }
1481
1482 /**
1483 * @tc.name: InteractionManagerTest_StopDrag_Touch
1484 * @tc.desc: Stop drag
1485 * @tc.type: FUNC
1486 * @tc.require:
1487 */
1488 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StopDrag_Touch, TestSize.Level1)
1489 {
1490 CALL_TEST_DEBUG;
1491 if (g_deviceTouchId < 0) {
1492 ASSERT_TRUE(g_deviceTouchId < 0);
1493 } else {
1494 std::promise<bool> promiseFlag;
1495 std::future<bool> future = promiseFlag.get_future();
__anond638f0a71402(const DragNotifyMsg& notifyMessage) 1496 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1497 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1498 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1499 promiseFlag.set_value(true);
1500 };
1501 SimulateDownPointerEvent(
1502 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1503 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_TOUCH_DOWN_MS));
1504 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1505 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1506 ASSERT_TRUE(dragData);
1507 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1508 std::make_shared<UnitTestStartDragListener>(callback));
1509 ASSERT_EQ(ret, RET_OK);
1510 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1511 InteractionManager::GetInstance()->StopDrag(dropResult);
1512 ASSERT_TRUE(future.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1513 std::future_status::timeout);
1514 }
1515 }
1516
1517 /**
1518 * @tc.name: GetDragTargetPid_Mouse
1519 * @tc.desc: Get the target pid dragged by the mouse
1520 * @tc.type: FUNC
1521 * @tc.require:
1522 */
1523 HWTEST_F(InteractionManagerTest, GetDragTargetPid_Mouse, TestSize.Level1)
1524 {
1525 CALL_TEST_DEBUG;
1526 if (g_deviceMouseId < 0) {
1527 ASSERT_TRUE(g_deviceMouseId < 0);
1528 } else {
1529 SimulateDownPointerEvent(
1530 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, 0);
1531 std::promise<bool> promiseFlag;
1532 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71502(const DragNotifyMsg& notifyMessage) 1533 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1534 FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1535 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1536 promiseFlag.set_value(true);
1537 };
1538 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
1539 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1540 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID,
1541 { DRAG_SRC_X, DRAG_SRC_Y });
1542 ASSERT_TRUE(dragData);
1543 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1544 std::make_shared<UnitTestStartDragListener>(callback));
1545 ASSERT_EQ(ret, RET_OK);
1546 ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1547 EXPECT_EQ(ret, RET_OK);
1548 ret = InteractionManager::GetInstance()->UpdateDragStyle(DragCursorStyle::DEFAULT);
1549 ASSERT_EQ(ret, RET_OK);
1550 int32_t pid = InteractionManager::GetInstance()->GetDragTargetPid();
1551 FI_HILOGI("Target pid:%{public}d", pid);
1552 ASSERT_TRUE(pid > 0);
1553 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1554 InteractionManager::GetInstance()->StopDrag(dropResult);
1555 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1556 std::future_status::timeout);
1557 }
1558 }
1559
1560 /**
1561 * @tc.name: GetDragTargetPid_Touch
1562 * @tc.desc: Get the target pid dragged by the touchscreen
1563 * @tc.type: FUNC
1564 * @tc.require:
1565 */
1566 HWTEST_F(InteractionManagerTest, GetDragTargetPid_Touch, TestSize.Level1)
1567 {
1568 CALL_TEST_DEBUG;
1569 if (g_deviceTouchId < 0) {
1570 ASSERT_TRUE(g_deviceTouchId < 0);
1571 } else {
1572 std::promise<bool> promiseStopFlag;
1573 std::future<bool> futureStopFlag = promiseStopFlag.get_future();
__anond638f0a71602(const DragNotifyMsg& notifyMessage) 1574 auto callback = [&promiseStopFlag](const DragNotifyMsg& notifyMessage) {
1575 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1576 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1577 promiseStopFlag.set_value(true);
1578 };
1579 SimulateDownPointerEvent(
1580 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1581 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_TOUCH_DOWN_MS));
1582 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1583 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1584 ASSERT_TRUE(dragData);
1585 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1586 std::make_shared<UnitTestStartDragListener>(callback));
1587 ASSERT_EQ(ret, RET_OK);
1588 ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1589 EXPECT_EQ(ret, RET_OK);
1590 ret = InteractionManager::GetInstance()->UpdateDragStyle(DragCursorStyle::COPY);
1591 ASSERT_EQ(ret, RET_OK);
1592 int32_t pid = InteractionManager::GetInstance()->GetDragTargetPid();
1593 FI_HILOGI("Target pid:%{public}d", pid);
1594 ASSERT_TRUE(pid > 0);
1595 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1596 InteractionManager::GetInstance()->StopDrag(dropResult);
1597 ASSERT_TRUE(futureStopFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1598 std::future_status::timeout);
1599 }
1600 }
1601
1602 /**
1603 * @tc.name: TouchEventDispatch
1604 * @tc.desc: Dispatch the touchscreen events
1605 * @tc.type: FUNC
1606 * @tc.require:
1607 */
1608 HWTEST_F(InteractionManagerTest, TouchEventDispatch, TestSize.Level1)
1609 {
1610 CALL_TEST_DEBUG;
1611 if (g_deviceTouchId < 0) {
1612 ASSERT_TRUE(g_deviceTouchId < 0);
1613 } else {
1614 std::promise<bool> promiseFlag;
1615 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71702(const DragNotifyMsg& notifyMessage) 1616 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1617 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1618 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1619 promiseFlag.set_value(true);
1620 };
1621 SimulateDownPointerEvent(
1622 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1623 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_TOUCH_DOWN_MS));
1624 std::optional<DragData> dragDataInfo = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1625 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID,
1626 { DRAG_SRC_X, DRAG_SRC_Y });
1627 ASSERT_TRUE(dragDataInfo);
1628 int32_t result = InteractionManager::GetInstance()->StartDrag(dragDataInfo.value(),
1629 std::make_shared<UnitTestStartDragListener>(callback));
1630 ASSERT_EQ(result, RET_OK);
1631 result = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1632 EXPECT_EQ(result, RET_OK);
1633 SetPermission(SYSTEM_CORE, g_cores, sizeof(g_cores) / sizeof(g_cores[0]));
1634 std::promise<bool> promiseEventFlag;
1635 std::future<bool> futureEventFlag = promiseEventFlag.get_future();
1636 auto callbackPtr = std::make_shared<InputEventCallbackTest>(
__anond638f0a71802null1637 [&promiseEventFlag]{promiseEventFlag.set_value(true);});
1638 int32_t monitorId = TestAddMonitor(callbackPtr);
1639 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
1640 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1641 ASSERT_TRUE(futureEventFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1642 std::future_status::timeout);
1643 SetPermission(SYSTEM_CORE, g_cores, sizeof(g_cores) / sizeof(g_cores[0]));
1644 TestRemoveMonitor(monitorId);
1645 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1646 result = InteractionManager::GetInstance()->StopDrag(dropResult);
1647 ASSERT_EQ(result, RET_OK);
1648 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1649 std::future_status::timeout);
1650 RemovePermission();
1651 }
1652 }
1653
1654 /**
1655 * @tc.name: InteractionManagerTest_SetDragWindowVisible
1656 * @tc.desc: Set Drag Window Visible
1657 * @tc.type: FUNC
1658 * @tc.require:
1659 */
1660 HWTEST_F(InteractionManagerTest, InteractionManagerTest_SetDragWindowVisible, TestSize.Level1)
1661 {
1662 CALL_TEST_DEBUG;
1663 int32_t ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1664 FI_HILOGD("ret:%{public}d", ret);
1665 ASSERT_EQ(ret, RET_ERR);
1666 ret = InteractionManager::GetInstance()->SetDragWindowVisible(false);
1667 FI_HILOGD("ret:%{public}d", ret);
1668 ASSERT_EQ(ret, RET_ERR);
1669 }
1670
1671 /**
1672 * @tc.name: InteractionManagerTest_GetShadowOffset
1673 * @tc.desc: Get Shadow Offset
1674 * @tc.type: FUNC
1675 * @tc.require:
1676 */
1677 HWTEST_F(InteractionManagerTest, InteractionManagerTest_GetShadowOffset, TestSize.Level1)
1678 {
1679 CALL_TEST_DEBUG;
1680 int32_t offsetX = 0;
1681 int32_t offsetY = 0;
1682 int32_t width = 0;
1683 int32_t height = 0;
1684 std::promise<bool> promise;
1685 std::future<bool> futureFlag = promise.get_future();
__anond638f0a71902(const DragNotifyMsg& notifyMessage) 1686 auto callback = [&promise](const DragNotifyMsg& notifyMessage) {
1687 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1688 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1689 promise.set_value(true);
1690 };
1691 SimulateDownPointerEvent(
1692 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1693 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_TOUCH_DOWN_MS));
1694 std::optional<DragData> dragDataInfo = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1695 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1696 ASSERT_TRUE(dragDataInfo);
1697 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragDataInfo.value(),
1698 std::make_shared<UnitTestStartDragListener>(callback));
1699 ASSERT_EQ(ret, RET_OK);
1700 ret = InteractionManager::GetInstance()->GetShadowOffset(offsetX, offsetY, width, height);
1701 FI_HILOGD("offsetX:%{public}d, offsetY:%{public}d, width:%{public}d, height:%{public}d",
1702 offsetX, offsetY, width, height);
1703 ASSERT_EQ(ret, RET_OK);
1704 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1705 ret = InteractionManager::GetInstance()->StopDrag(dropResult);
1706 ASSERT_EQ(ret, RET_OK);
1707 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) != std::future_status::timeout);
1708 }
1709
1710 /**
1711 * @tc.name: GetUdKey_Mouse
1712 * @tc.desc: Get the udKey dragged by the mouse
1713 * @tc.type: FUNC
1714 * @tc.require:
1715 */
1716 HWTEST_F(InteractionManagerTest, GetUdKey_Mouse, TestSize.Level1)
1717 {
1718 CALL_TEST_DEBUG;
1719 if (g_deviceMouseId < 0) {
1720 ASSERT_TRUE(g_deviceMouseId < 0);
1721 } else {
1722 SimulateDownPointerEvent(
1723 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
1724 std::promise<bool> promiseFlag;
1725 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71a02(const DragNotifyMsg& notifyMessage) 1726 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1727 FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1728 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1729 promiseFlag.set_value(true);
1730 };
1731 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
1732 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1733 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID,
1734 { DRAG_SRC_X, DRAG_SRC_Y });
1735 ASSERT_TRUE(dragData);
1736 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1737 std::make_shared<UnitTestStartDragListener>(callback));
1738 ASSERT_EQ(ret, RET_OK);
1739 std::string udKey;
1740 ret = InteractionManager::GetInstance()->GetUdKey(udKey);
1741 ASSERT_EQ(ret, RET_OK);
1742 ASSERT_EQ(udKey, UD_KEY);
1743 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1744 ret = InteractionManager::GetInstance()->StopDrag(dropResult);
1745 ASSERT_EQ(ret, RET_OK);
1746 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1747 std::future_status::timeout);
1748 }
1749 }
1750
1751 /**
1752 * @tc.name: GetUdKey_Touch
1753 * @tc.desc: Get the udKey dragged by the touchscreen
1754 * @tc.type: FUNC
1755 * @tc.require:
1756 */
1757 HWTEST_F(InteractionManagerTest, GetUdKey_Touch, TestSize.Level1)
1758 {
1759 CALL_TEST_DEBUG;
1760 if (g_deviceTouchId < 0) {
1761 ASSERT_TRUE(g_deviceTouchId < 0);
1762 } else {
1763 std::promise<bool> promiseFlag;
1764 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71b02(const DragNotifyMsg& notifyMessage) 1765 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1766 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, target:%{public}d, result:%{public}d",
1767 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.targetPid, notifyMessage.result);
1768 promiseFlag.set_value(true);
1769 };
1770 SimulateDownPointerEvent(
1771 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1772 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_TOUCH_DOWN_MS));
1773 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1774 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1775 ASSERT_TRUE(dragData);
1776 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1777 std::make_shared<UnitTestStartDragListener>(callback));
1778 ASSERT_EQ(ret, RET_OK);
1779 std::string udKey;
1780 ret = InteractionManager::GetInstance()->GetUdKey(udKey);
1781 ASSERT_EQ(ret, RET_OK);
1782 ASSERT_EQ(udKey, UD_KEY);
1783 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1784 ret = InteractionManager::GetInstance()->StopDrag(dropResult);
1785 ASSERT_EQ(ret, RET_OK);
1786 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1787 std::future_status::timeout);
1788 }
1789 }
1790
1791 /**
1792 * @tc.name: GetDragData_Success
1793 * @tc.desc: Get the dragData from interface successfully
1794 * @tc.type: FUNC
1795 * @tc.require:
1796 */
1797 HWTEST_F(InteractionManagerTest, GetDragData_Success, TestSize.Level1)
1798 {
1799 CALL_TEST_DEBUG;
1800 if (g_deviceTouchId < 0) {
1801 ASSERT_TRUE(g_deviceTouchId < 0);
1802 } else {
1803 std::promise<bool> promiseFlag;
1804 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71c02(const DragNotifyMsg& notifyMessage) 1805 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1806 FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1807 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1808 promiseFlag.set_value(true);
1809 };
1810 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
1811 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1812 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID,
1813 { DRAG_SRC_X, DRAG_SRC_Y });
1814 ASSERT_TRUE(dragData);
1815 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1816 std::make_shared<UnitTestStartDragListener>(callback));
1817 ASSERT_EQ(ret, RET_OK);
1818
1819 DragData replyDragData;
1820 ret = InteractionManager::GetInstance()->GetDragData(replyDragData);
1821 ASSERT_EQ(ret, RET_OK);
1822 ASSERT_EQ(replyDragData, dragData.value());
1823 PrintDragData(replyDragData);
1824 SimulateUpPointerEvent(
1825 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
1826 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1827 InteractionManager::GetInstance()->StopDrag(dropResult);
1828 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1829 std::future_status::timeout);
1830 }
1831 }
1832
1833 /**
1834 * @tc.name: GetDragData_Failed
1835 * @tc.desc: Get the dragData from interface failed
1836 * @tc.type: FUNC
1837 * @tc.require:
1838 */
1839 HWTEST_F(InteractionManagerTest, GetDragData_Failed, TestSize.Level1)
1840 {
1841 CALL_TEST_DEBUG;
1842 if (g_deviceTouchId < 0) {
1843 ASSERT_TRUE(g_deviceTouchId < 0);
1844 } else {
1845 SimulateDownPointerEvent(
1846 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1847 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_TOUCH_DOWN_MS));
1848 DragData dragData;
1849 int32_t ret = InteractionManager::GetInstance()->GetDragData(dragData);
1850 SimulateUpPointerEvent(
1851 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1852 ASSERT_EQ(ret, RET_ERR);
1853 }
1854 }
1855
1856 /**
1857 * @tc.name: GetDragState
1858 * @tc.desc: Get the dragState from interface
1859 * @tc.type: FUNC
1860 * @tc.require:
1861 */
1862 HWTEST_F(InteractionManagerTest, GetDragState, TestSize.Level1)
1863 {
1864 CALL_TEST_DEBUG;
1865 std::promise<bool> promiseFlag;
1866 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71d02(const DragNotifyMsg& notifyMessage) 1867 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1868 FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1869 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1870 promiseFlag.set_value(true);
1871 };
1872 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
1873 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1874 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1875 ASSERT_TRUE(dragData);
1876 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1877 std::make_shared<UnitTestStartDragListener>(callback));
1878 ASSERT_EQ(ret, RET_OK);
1879
1880 DragState dragState;
1881 ret = InteractionManager::GetInstance()->GetDragState(dragState);
1882 FI_HILOGD("InteractionManager::dragState:%{public}d", dragState);
1883 EXPECT_EQ(ret, RET_OK);
1884 EXPECT_EQ(dragState, DragState::START);
1885
1886 SimulateUpPointerEvent(
1887 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID);
1888 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1889 ret = InteractionManager::GetInstance()->StopDrag(dropResult);
1890 ASSERT_EQ(ret, RET_OK);
1891 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1892 std::future_status::timeout);
1893 ret = InteractionManager::GetInstance()->GetDragState(dragState);
1894 FI_HILOGD("dragState:%{public}d", dragState);
1895 EXPECT_EQ(ret, RET_OK);
1896 EXPECT_EQ(dragState, DragState::STOP);
1897 }
1898
1899 /**
1900 * @tc.name: InteractionManagerTest_GetDragSummary
1901 * @tc.desc: Get drag summarys
1902 * @tc.type: FUNC
1903 * @tc.require:
1904 */
1905 HWTEST_F(InteractionManagerTest, InteractionManagerTest_GetDragSummary, TestSize.Level1)
1906 {
1907 CALL_TEST_DEBUG;
1908 std::promise<bool> promiseFlag;
1909 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71e02(const DragNotifyMsg& notifyMessage) 1910 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1911 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1912 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1913 promiseFlag.set_value(true);
1914 };
1915 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1916 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1917 ASSERT_TRUE(dragData);
1918 const std::string udType = "general.message";
1919 constexpr int64_t recordSize = 20;
1920 std::map<std::string, int64_t> summarys = { { udType, recordSize } };
1921 dragData.value().summarys = summarys;
1922 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1923 std::make_shared<UnitTestStartDragListener>(callback));
1924 ASSERT_EQ(ret, RET_OK);
1925 summarys.clear();
1926 ret = InteractionManager::GetInstance()->GetDragSummary(summarys);
1927 EXPECT_EQ(ret, RET_OK);
1928 EXPECT_EQ(summarys[udType], recordSize);
1929 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1930 InteractionManager::GetInstance()->StopDrag(dropResult);
1931 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1932 std::future_status::timeout);
1933 }
1934
1935 /**
1936 * @tc.name: InteractionManagerTest_UpdatePreviewStyle
1937 * @tc.desc: Update drag item style
1938 * @tc.type: FUNC
1939 * @tc.require:
1940 */
1941 HWTEST_F(InteractionManagerTest, InteractionManagerTest_UpdatePreviewStyle, TestSize.Level1)
1942 {
1943 CALL_TEST_DEBUG;
1944 std::promise<bool> promiseFlag;
1945 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a71f02(const DragNotifyMsg& notifyMessage) 1946 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1947 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1948 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
1949 promiseFlag.set_value(true);
1950 };
1951 SimulateDownPointerEvent(
1952 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
1953 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
1954 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
1955 ASSERT_TRUE(dragData);
1956 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
1957 std::make_shared<UnitTestStartDragListener>(callback));
1958 ASSERT_EQ(ret, RET_OK);
1959 ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
1960 EXPECT_EQ(ret, RET_OK);
1961 std::pair<int32_t, int32_t> enterPos { 500, 50 };
1962 std::pair<int32_t, int32_t> leavePos { 500, 200 };
1963 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { enterPos.first, enterPos.second },
1964 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1965 PreviewStyle previewStyleIn;
1966 previewStyleIn.types = { PreviewType::FOREGROUND_COLOR };
1967 previewStyleIn.foregroundColor = FOREGROUND_COLOR_IN;
1968 ret = InteractionManager::GetInstance()->UpdatePreviewStyle(previewStyleIn);
1969 EXPECT_EQ(ret, RET_OK);
1970 SimulateMovePointerEvent({ enterPos.first, enterPos.second }, { leavePos.first, leavePos.second },
1971 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1972 PreviewStyle previewStyleOut;
1973 previewStyleOut.types = { PreviewType::FOREGROUND_COLOR };
1974 previewStyleOut.foregroundColor = FOREGROUND_COLOR_OUT;
1975 ret = InteractionManager::GetInstance()->UpdatePreviewStyle(previewStyleOut);
1976 EXPECT_EQ(ret, RET_OK);
1977 SimulateMovePointerEvent({ leavePos.first, leavePos.second }, { DRAG_DST_X, DRAG_DST_Y },
1978 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
1979 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
1980 InteractionManager::GetInstance()->StopDrag(dropResult);
1981 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
1982 std::future_status::timeout);
1983 }
1984
1985
1986 /**
1987 * @tc.name: InteractionManagerTest_UpdatePreviewStyleWithAnimation
1988 * @tc.desc: Update drag item style with animation
1989 * @tc.type: FUNC
1990 * @tc.require:
1991 */
1992 HWTEST_F(InteractionManagerTest, InteractionManagerTest_UpdatePreviewStyleWithAnimation, TestSize.Level1)
1993 {
1994 CALL_TEST_DEBUG;
1995 std::promise<bool> promiseFlag;
1996 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72002(const DragNotifyMsg& notifyMessage) 1997 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
1998 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
1999 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2000 promiseFlag.set_value(true);
2001 };
2002 SimulateDownPointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2003 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2004 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2005 ASSERT_TRUE(dragData);
2006 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2007 std::make_shared<UnitTestStartDragListener>(callback));
2008 ASSERT_EQ(ret, RET_OK);
2009 ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2010 EXPECT_EQ(ret, RET_OK);
2011 std::pair<int32_t, int32_t> enterPos { 500, 50 };
2012 std::pair<int32_t, int32_t> leavePos { 500, 200 };
2013 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { enterPos.first, enterPos.second },
2014 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
2015 PreviewStyle previewStyleIn;
2016 previewStyleIn.types = { PreviewType::FOREGROUND_COLOR };
2017 previewStyleIn.foregroundColor = FOREGROUND_COLOR_IN;
2018 PreviewAnimation animationIn;
2019 AssignToAnimation(animationIn);
2020 ret = InteractionManager::GetInstance()->UpdatePreviewStyleWithAnimation(previewStyleIn, animationIn);
2021 EXPECT_EQ(ret, RET_OK);
2022 SimulateMovePointerEvent({ enterPos.first, enterPos.second }, { leavePos.first, leavePos.second },
2023 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
2024 PreviewStyle previewStyleOut;
2025 previewStyleOut.types = { PreviewType::FOREGROUND_COLOR };
2026 previewStyleOut.foregroundColor = FOREGROUND_COLOR_OUT;
2027 PreviewAnimation animationOut;
2028 AssignToAnimation(animationOut);
2029 ret = InteractionManager::GetInstance()->UpdatePreviewStyleWithAnimation(previewStyleOut, animationOut);
2030 EXPECT_EQ(ret, RET_OK);
2031 SimulateMovePointerEvent({ leavePos.first, leavePos.second }, { DRAG_DST_X, DRAG_DST_Y },
2032 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
2033 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2034 InteractionManager::GetInstance()->StopDrag(dropResult);
2035 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2036 std::future_status::timeout);
2037 }
2038
2039 /**
2040 * @tc.name: InteractionManagerTest_GetExtraInfo
2041 * @tc.desc: Get extraInfo
2042 * @tc.type: FUNC
2043 * @tc.require:
2044 */
2045 HWTEST_F(InteractionManagerTest, InteractionManagerTest_GetExtraInfo, TestSize.Level1)
2046 {
2047 CALL_TEST_DEBUG;
2048 if (g_deviceMouseId >= 0) {
2049 SimulateDownPointerEvent(
2050 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2051 std::promise<bool> promiseFlag;
2052 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72102(const DragNotifyMsg& notifyMessage) 2053 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2054 FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2055 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2056 promiseFlag.set_value(true);
2057 };
2058 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
2059 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2060 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID,
2061 { DRAG_SRC_X, DRAG_SRC_Y });
2062 ASSERT_TRUE(dragData);
2063 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2064 std::make_shared<UnitTestStartDragListener>(callback));
2065 ASSERT_EQ(ret, RET_OK);
2066 std::string extraInfo;
2067 ret = InteractionManager::GetInstance()->GetExtraInfo(extraInfo);
2068 ASSERT_EQ(ret, RET_OK);
2069 ASSERT_EQ(extraInfo, EXTRA_INFO);
2070 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2071 ret = InteractionManager::GetInstance()->StopDrag(dropResult);
2072 ASSERT_EQ(ret, RET_OK);
2073 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2074 std::future_status::timeout);
2075 }
2076 }
2077
2078 /**
2079 * @tc.name: TestDragDataUtil_Packer
2080 * @tc.desc: Pack up dragData
2081 * @tc.type: FUNC
2082 * @tc.require:
2083 */
2084 HWTEST_F(InteractionManagerTest, TestDragDataUtil_Packer, TestSize.Level1)
2085 {
2086 CALL_TEST_DEBUG;
2087 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2088 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2089 ASSERT_TRUE(dragData);
2090 Parcel parcel;
2091 int32_t ret = DragDataUtil::Marshalling(dragData.value(), parcel, false);
2092 ASSERT_EQ(ret, RET_OK);
2093 DragData dragDataFromParcel;
2094 ret = DragDataUtil::UnMarshalling(parcel, dragDataFromParcel, false);
2095 ASSERT_EQ(ret, RET_OK);
2096 ASSERT_EQ(dragData.value(), dragDataFromParcel);
2097 }
2098
2099 /**
2100 * @tc.name: TestDragDataUtil_Packer_Cross
2101 * @tc.desc: Pack up dragData
2102 * @tc.type: FUNC
2103 * @tc.require:
2104 */
2105 HWTEST_F(InteractionManagerTest, TestDragDataUtil_Packer_Cross, TestSize.Level1)
2106 {
2107 CALL_TEST_DEBUG;
2108 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2109 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2110 ASSERT_TRUE(dragData);
2111 Parcel parcel;
2112 int32_t ret = DragDataUtil::Marshalling(dragData.value(), parcel, true);
2113 ASSERT_EQ(ret, RET_OK);
2114 DragData dragDataFromParcel;
2115 ret = DragDataUtil::UnMarshalling(parcel, dragDataFromParcel, true);
2116 ASSERT_EQ(ret, RET_OK);
2117 ASSERT_EQ(dragData.value(), dragDataFromParcel);
2118 }
2119
2120 /**
2121 * @tc.name: InteractionManagerTest_GetDragAction_001
2122 * @tc.desc: Get drag action with no keyboard events of keys in dragging
2123 * @tc.type: FUNC
2124 * @tc.require:
2125 */
2126 HWTEST_F(InteractionManagerTest, GetDragAction_001, TestSize.Level1)
2127 {
2128 CALL_TEST_DEBUG;
2129 std::promise<bool> promiseFlag;
2130 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72202(const DragNotifyMsg& notifyMessage) 2131 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2132 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2133 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2134 promiseFlag.set_value(true);
2135 };
2136 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2137 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2138 ASSERT_TRUE(dragData);
2139 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2140 std::make_shared<UnitTestStartDragListener>(callback));
2141 ASSERT_EQ(ret, RET_OK);
2142 DragAction dragAction { DragAction::INVALID };
2143 ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2144 EXPECT_EQ(ret, RET_OK);
2145 EXPECT_EQ(dragAction, DragAction::MOVE);
2146 PrintDragAction(dragAction);
2147 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2148 InteractionManager::GetInstance()->StopDrag(dropResult);
2149 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2150 std::future_status::timeout);
2151 ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2152 EXPECT_EQ(ret, RET_ERR);
2153 }
2154
2155 /**
2156 * @tc.name: InteractionManagerTest_GetDragAction_002
2157 * @tc.desc: Get drag action with simple press and release keyboard events of keys in dragging
2158 * @tc.type: FUNC
2159 * @tc.require:
2160 */
2161 HWTEST_F(InteractionManagerTest, GetDragAction_002, TestSize.Level1)
2162 {
2163 CALL_TEST_DEBUG;
2164 std::promise<bool> promiseFlag;
2165 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72302(const DragNotifyMsg& notifyMessage) 2166 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2167 FI_HILOGD("DisplayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2168 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2169 promiseFlag.set_value(true);
2170 };
2171 std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_INJECT_MS));
2172 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2173 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2174 ASSERT_TRUE(dragData);
2175 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2176 std::make_shared<UnitTestStartDragListener>(callback));
2177 ASSERT_EQ(ret, RET_OK);
2178 ret = InteractionManager::GetInstance()->UpdateDragStyle(DragCursorStyle::MOVE);
2179 ASSERT_EQ(ret, RET_OK);
2180 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2181 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
2182 SimulateDownKeyEvent(MMI::KeyEvent::KEYCODE_CTRL_LEFT);
2183 DragAction dragAction { DragAction::INVALID };
2184 ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2185 EXPECT_EQ(ret, RET_OK);
2186 EXPECT_EQ(dragAction, DragAction::COPY);
2187 PrintDragAction(dragAction);
2188 SimulateUpKeyEvent(MMI::KeyEvent::KEYCODE_CTRL_LEFT);
2189 ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2190 EXPECT_EQ(ret, RET_OK);
2191 EXPECT_EQ(dragAction, DragAction::MOVE);
2192 PrintDragAction(dragAction);
2193 ClearUpKeyEvent();
2194 SimulateDownKeyEvent(MMI::KeyEvent::KEYCODE_A);
2195 ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2196 EXPECT_EQ(ret, RET_OK);
2197 EXPECT_EQ(dragAction, DragAction::MOVE);
2198 PrintDragAction(dragAction);
2199 SimulateUpKeyEvent(MMI::KeyEvent::KEYCODE_A);
2200 ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2201 EXPECT_EQ(ret, RET_OK);
2202 EXPECT_EQ(dragAction, DragAction::MOVE);
2203 PrintDragAction(dragAction);
2204 ClearUpKeyEvent();
2205 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2206 InteractionManager::GetInstance()->StopDrag(dropResult);
2207 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2208 std::future_status::timeout);
2209 ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2210 EXPECT_EQ(ret, RET_ERR);
2211 }
2212
2213 /**
2214 * @tc.name: InteractionManagerTest_GetDragAction_003
2215 * @tc.desc: Get drag action with simple press and release keyboard events of keys in start drag
2216 * @tc.type: FUNC
2217 * @tc.require:
2218 */
2219 HWTEST_F(InteractionManagerTest, GetDragAction_003, TestSize.Level1)
2220 {
2221 CALL_TEST_DEBUG;
2222 if (g_deviceMouseId < 0) {
2223 ASSERT_TRUE(g_deviceMouseId < 0);
2224 } else {
2225 int32_t ret = RET_ERR;
2226 std::promise<bool> promiseFlag;
2227 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72402(const DragNotifyMsg& notifyMessage) 2228 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2229 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2230 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2231 promiseFlag.set_value(true);
2232 };
2233 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2234 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2235 ASSERT_TRUE(dragData);
2236 ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2237 std::make_shared<UnitTestStartDragListener>(callback));
2238 ASSERT_EQ(ret, RET_OK);
2239 ret = InteractionManager::GetInstance()->UpdateDragStyle(DragCursorStyle::MOVE);
2240 ASSERT_EQ(ret, RET_OK);
2241 DragAction dragAction { DragAction::INVALID };
2242 ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2243 EXPECT_EQ(ret, RET_OK);
2244 EXPECT_EQ(dragAction, DragAction::MOVE);
2245 PrintDragAction(dragAction);
2246 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2247 InteractionManager::GetInstance()->StopDrag(dropResult);
2248 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2249 std::future_status::timeout);
2250 ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2251 EXPECT_EQ(ret, RET_ERR);
2252 }
2253 }
2254
2255 /**
2256 * @tc.name: InteractionManagerTest_GetDragAction_004
2257 * @tc.desc: Get drag action with multiple press and release keyboard events of keys in dragging
2258 * @tc.type: FUNC
2259 * @tc.require:
2260 */
2261 HWTEST_F(InteractionManagerTest, GetDragAction_004, TestSize.Level1)
2262 {
2263 CALL_TEST_DEBUG;
2264 std::promise<bool> promiseFlag;
2265 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72502(const DragNotifyMsg& notifyMessage) 2266 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2267 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2268 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2269 promiseFlag.set_value(true);
2270 };
2271 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2272 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2273 ASSERT_TRUE(dragData);
2274 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2275 std::make_shared<UnitTestStartDragListener>(callback));
2276 ASSERT_EQ(ret, RET_OK);
2277 ret = InteractionManager::GetInstance()->UpdateDragStyle(DragCursorStyle::MOVE);
2278 ASSERT_EQ(ret, RET_OK);
2279 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2280 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
2281 SimulateDownKeyEvent(MMI::KeyEvent::KEYCODE_CTRL_LEFT);
2282 SimulateDownKeyEvent(MMI::KeyEvent::KEYCODE_A);
2283 DragAction dragAction { DragAction::INVALID };
2284 ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2285 EXPECT_EQ(ret, RET_OK);
2286 EXPECT_EQ(dragAction, DragAction::COPY);
2287 SimulateUpKeyEvent(MMI::KeyEvent::KEYCODE_A);
2288 ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2289 EXPECT_EQ(ret, RET_OK);
2290 EXPECT_EQ(dragAction, DragAction::COPY);
2291 ClearUpKeyEvent();
2292 SimulateDownKeyEvent(MMI::KeyEvent::KEYCODE_B);
2293 ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2294 EXPECT_EQ(ret, RET_OK);
2295 EXPECT_EQ(dragAction, DragAction::COPY);
2296 SimulateUpKeyEvent(MMI::KeyEvent::KEYCODE_CTRL_LEFT);
2297 ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2298 EXPECT_EQ(ret, RET_OK);
2299 EXPECT_EQ(dragAction, DragAction::MOVE);
2300 ClearUpKeyEvent();
2301 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2302 InteractionManager::GetInstance()->StopDrag(dropResult);
2303 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2304 std::future_status::timeout);
2305 ret = InteractionManager::GetInstance()->GetDragAction(dragAction);
2306 EXPECT_EQ(ret, RET_ERR);
2307 }
2308
2309 /**
2310 * @tc.name: InteractionManagerTest_GetDragAction_005
2311 * @tc.desc: Get style notification with multiple press and release keyboard events of keys in dragging
2312 * @tc.type: FUNC
2313 * @tc.require:
2314 */
2315 HWTEST_F(InteractionManagerTest, GetDragAction_005, TestSize.Level1)
2316 {
2317 CALL_TEST_DEBUG;
2318 auto listener = std::make_shared<SubscriptListenerTest>("SubscriptListener");
2319 int32_t ret = InteractionManager::GetInstance()->AddSubscriptListener(listener);
2320 ASSERT_EQ(ret, RET_OK);
2321 std::promise<bool> promiseFlag;
2322 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72602(const DragNotifyMsg& notifyMessage) 2323 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2324 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2325 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2326 promiseFlag.set_value(true);
2327 };
2328 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2329 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID_INJECT, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2330 ASSERT_TRUE(dragData);
2331 ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2332 std::make_shared<UnitTestStartDragListener>(callback));
2333 ASSERT_EQ(ret, RET_OK);
2334 ret = InteractionManager::GetInstance()->UpdateDragStyle(DragCursorStyle::MOVE);
2335 ASSERT_EQ(ret, RET_OK);
2336 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2337 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, true);
2338 DragCursorStyle recvStyle = listener->GetDragStyle();
2339 EXPECT_EQ(recvStyle, DragCursorStyle::MOVE);
2340 SimulateDownKeyEvent(MMI::KeyEvent::KEYCODE_CTRL_LEFT);
2341 SimulateDownKeyEvent(MMI::KeyEvent::KEYCODE_B);
2342 recvStyle = listener->GetDragStyle();
2343 EXPECT_EQ(recvStyle, DragCursorStyle::COPY);
2344 SimulateUpKeyEvent(MMI::KeyEvent::KEYCODE_CTRL_LEFT);
2345 ClearUpKeyEvent();
2346 recvStyle = listener->GetDragStyle();
2347 EXPECT_EQ(recvStyle, DragCursorStyle::MOVE);
2348 SimulateDownKeyEvent(MMI::KeyEvent::KEYCODE_CTRL_RIGHT);
2349 recvStyle = listener->GetDragStyle();
2350 EXPECT_EQ(recvStyle, DragCursorStyle::COPY);
2351 SimulateUpKeyEvent(MMI::KeyEvent::KEYCODE_B);
2352 ClearUpKeyEvent();
2353 recvStyle = listener->GetDragStyle();
2354 EXPECT_EQ(recvStyle, DragCursorStyle::COPY);
2355 SimulateUpKeyEvent(MMI::KeyEvent::KEYCODE_CTRL_RIGHT);
2356 ClearUpKeyEvent();
2357 recvStyle = listener->GetDragStyle();
2358 EXPECT_EQ(recvStyle, DragCursorStyle::MOVE);
2359 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2360 InteractionManager::GetInstance()->StopDrag(dropResult);
2361 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2362 std::future_status::timeout);
2363 ret = InteractionManager::GetInstance()->RemoveSubscriptListener(listener);
2364 ASSERT_EQ(ret, RET_OK);
2365 }
2366
2367 /**
2368 * @tc.name: InteractionManagerTest_CheckDragBehavior_001
2369 * @tc.desc: Check drag behavior
2370 * @tc.type: FUNC
2371 * @tc.require:
2372 */
2373 HWTEST_F(InteractionManagerTest, CheckDragBehavior_001, TestSize.Level1)
2374 {
2375 CALL_TEST_DEBUG;
2376 std::promise<bool> promiseFlag;
2377 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72702(const DragNotifyMsg& notifyMessage) 2378 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2379 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, dragBehavior:%{public}d",
2380 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.dragBehavior);
2381 ASSERT_EQ(notifyMessage.dragBehavior, DragBehavior::COPY);
2382 promiseFlag.set_value(true);
2383 };
2384 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2385 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2386 ASSERT_TRUE(dragData);
2387 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2388 std::make_shared<UnitTestStartDragListener>(callback));
2389 ASSERT_EQ(ret, RET_OK);
2390 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION,
2391 TARGET_MAIN_WINDOW, DragBehavior::COPY };
2392 InteractionManager::GetInstance()->StopDrag(dropResult);
2393 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2394 std::future_status::timeout);
2395 }
2396
2397 /**
2398 * @tc.name: InteractionManagerTest_CheckDragBehavior_002
2399 * @tc.desc: Check drag behavior
2400 * @tc.type: FUNC
2401 * @tc.require:
2402 */
2403 HWTEST_F(InteractionManagerTest, CheckDragBehavior_002, TestSize.Level1)
2404 {
2405 CALL_TEST_DEBUG;
2406 std::promise<bool> promiseFlag;
2407 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72802(const DragNotifyMsg& notifyMessage) 2408 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2409 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, dragBehavior:%{public}d",
2410 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.dragBehavior);
2411 ASSERT_EQ(notifyMessage.dragBehavior, DragBehavior::MOVE);
2412 promiseFlag.set_value(true);
2413 };
2414 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2415 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2416 ASSERT_TRUE(dragData);
2417 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2418 std::make_shared<UnitTestStartDragListener>(callback));
2419 ASSERT_EQ(ret, RET_OK);
2420 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION,
2421 TARGET_MAIN_WINDOW, DragBehavior::MOVE };
2422 InteractionManager::GetInstance()->StopDrag(dropResult);
2423 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2424 std::future_status::timeout);
2425 }
2426
2427 /**
2428 * @tc.name: InteractionManagerTest_CheckDragBehavior_003
2429 * @tc.desc: Check drag behavior
2430 * @tc.type: FUNC
2431 * @tc.require:
2432 */
2433 HWTEST_F(InteractionManagerTest, CheckDragBehavior_003, TestSize.Level1)
2434 {
2435 CALL_TEST_DEBUG;
2436 std::promise<bool> promiseFlag;
2437 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72902(const DragNotifyMsg& notifyMessage) 2438 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2439 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, dragBehavior:%{public}d",
2440 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.dragBehavior);
2441 ASSERT_EQ(notifyMessage.dragBehavior, DragBehavior::COPY);
2442 promiseFlag.set_value(true);
2443 };
2444 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2445 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2446 ASSERT_TRUE(dragData);
2447 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2448 std::make_shared<UnitTestStartDragListener>(callback));
2449 ASSERT_EQ(ret, RET_OK);
2450 ret = InteractionManager::GetInstance()->UpdateDragStyle(DragCursorStyle::COPY);
2451 ASSERT_EQ(ret, RET_OK);
2452 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, TARGET_MAIN_WINDOW };
2453 InteractionManager::GetInstance()->StopDrag(dropResult);
2454 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2455 std::future_status::timeout);
2456 }
2457
2458 /**
2459 * @tc.name: InteractionManagerTest_CheckDragBehavior_004
2460 * @tc.desc: Check drag behavior
2461 * @tc.type: FUNC
2462 * @tc.require:
2463 */
2464 HWTEST_F(InteractionManagerTest, CheckDragBehavior_004, TestSize.Level1)
2465 {
2466 CALL_TEST_DEBUG;
2467 std::promise<bool> promiseFlag;
2468 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72a02(const DragNotifyMsg& notifyMessage) 2469 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2470 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, dragBehavior:%{public}d",
2471 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.dragBehavior);
2472 ASSERT_EQ(notifyMessage.dragBehavior, DragBehavior::MOVE);
2473 promiseFlag.set_value(true);
2474 };
2475 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2476 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2477 ASSERT_TRUE(dragData);
2478 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2479 std::make_shared<UnitTestStartDragListener>(callback));
2480 ASSERT_EQ(ret, RET_OK);
2481 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, TARGET_MAIN_WINDOW };
2482 InteractionManager::GetInstance()->StopDrag(dropResult);
2483 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2484 std::future_status::timeout);
2485 }
2486
2487 /**
2488 * @tc.name: InteractionManagerTest_CheckDragBehavior_005
2489 * @tc.desc: Check drag behavior
2490 * @tc.type: FUNC
2491 * @tc.require:
2492 */
2493 HWTEST_F(InteractionManagerTest, CheckDragBehavior_005, TestSize.Level1)
2494 {
2495 CALL_TEST_DEBUG;
2496 std::promise<bool> promiseFlag;
2497 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72b02(const DragNotifyMsg& notifyMessage) 2498 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2499 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, dragBehavior:%{public}d",
2500 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.dragBehavior);
2501 ASSERT_EQ(notifyMessage.dragBehavior, DragBehavior::COPY);
2502 promiseFlag.set_value(true);
2503 };
2504 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2505 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2506 ASSERT_TRUE(dragData);
2507 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2508 std::make_shared<UnitTestStartDragListener>(callback));
2509 ASSERT_EQ(ret, RET_OK);
2510 int32_t targetMainWindow = 1;
2511 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, targetMainWindow };
2512 InteractionManager::GetInstance()->StopDrag(dropResult);
2513 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2514 std::future_status::timeout);
2515 }
2516
2517 /**
2518 * @tc.name: InteractionManagerTest_CheckDragBehavior_006
2519 * @tc.desc: Check drag behavior
2520 * @tc.type: FUNC
2521 * @tc.require:
2522 */
2523 HWTEST_F(InteractionManagerTest, CheckDragBehavior_006, TestSize.Level1)
2524 {
2525 CALL_TEST_DEBUG;
2526 std::promise<bool> promiseFlag;
2527 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72c02(const DragNotifyMsg& notifyMessage) 2528 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2529 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, dragBehavior:%{public}d",
2530 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.dragBehavior);
2531 ASSERT_EQ(notifyMessage.dragBehavior, DragBehavior::UNKNOWN);
2532 promiseFlag.set_value(true);
2533 };
2534 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2535 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2536 ASSERT_TRUE(dragData);
2537 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2538 std::make_shared<UnitTestStartDragListener>(callback));
2539 ASSERT_EQ(ret, RET_OK);
2540 DragDropResult dropResult { DragResult::DRAG_FAIL, HAS_CUSTOM_ANIMATION, TARGET_MAIN_WINDOW };
2541 InteractionManager::GetInstance()->StopDrag(dropResult);
2542 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2543 std::future_status::timeout);
2544 }
2545
2546 /**
2547 * @tc.name: InteractionManagerTest_StartDrag_Shadow
2548 * @tc.desc: Check drag shadow
2549 * @tc.type: FUNC
2550 * @tc.require:
2551 */
2552 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_Shadow, TestSize.Level1)
2553 {
2554 CALL_TEST_DEBUG;
2555 std::promise<bool> promiseFlag;
2556 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72d02(const DragNotifyMsg& notifyMessage) 2557 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2558 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2559 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2560 promiseFlag.set_value(true);
2561 };
2562 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2563 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2564 SimulateDownPointerEvent(
2565 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2566 ASSERT_TRUE(dragData);
2567 dragData->filterInfo = "{ \"dip_scale\": 3.5, \"drag_shadow_offsetX\": 50, \"drag_shadow_offsetY\": 50, "
2568 "\"drag_shadow_argb\": 872415231, "
2569 "\"shadow_color_strategy\": 0, \"shadow_is_hardwareacceleration\": true, \"shadow_elevation\": 120, "
2570 "\"drag_type\": \"non-text\", \"shadow_enable\": true }";
2571 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2572 std::make_shared<UnitTestStartDragListener>(callback));
2573 ASSERT_EQ(ret, RET_OK);
2574 ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2575 EXPECT_EQ(ret, RET_OK);
2576 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2577 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
2578 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2579 InteractionManager::GetInstance()->StopDrag(dropResult);
2580 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2581 std::future_status::timeout);
2582 }
2583
2584 /**
2585 * @tc.name: InteractionManagerTest_StartDrag_ShadowAlpha
2586 * @tc.desc: Check drag shadow alpha
2587 * @tc.type: FUNC
2588 * @tc.require:
2589 */
2590 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_ShadowAlpha, TestSize.Level1)
2591 {
2592 CALL_TEST_DEBUG;
2593 std::promise<bool> promiseFlag;
2594 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72e02(const DragNotifyMsg& notifyMessage) 2595 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2596 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2597 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2598 promiseFlag.set_value(true);
2599 };
2600 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2601 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2602 SimulateDownPointerEvent(
2603 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2604 ASSERT_TRUE(dragData);
2605 dragData->filterInfo = "{ \"dip_scale\": 3.5, \"drag_shadow_offsetX\": 50, \"drag_shadow_offsetY\": 50, "
2606 "\"drag_shadow_argb\": 872415231, "
2607 "\"shadow_color_strategy\": 0, \"shadow_is_hardwareacceleration\": true, \"shadow_elevation\": 120, "
2608 "\"drag_type\": \"non-text\", \"shadow_enable\": true }";
2609 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2610 std::make_shared<UnitTestStartDragListener>(callback));
2611 ASSERT_EQ(ret, RET_OK);
2612 ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2613 EXPECT_EQ(ret, RET_OK);
2614 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2615 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
2616 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2617 InteractionManager::GetInstance()->StopDrag(dropResult);
2618 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2619 std::future_status::timeout);
2620 }
2621
2622 /**
2623 * @tc.name: InteractionManagerTest_StartDrag_ShadowColor
2624 * @tc.desc: Check drag shadow color
2625 * @tc.type: FUNC
2626 * @tc.require:
2627 */
2628 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_ShadowColor, TestSize.Level1)
2629 {
2630 CALL_TEST_DEBUG;
2631 std::promise<bool> promiseFlag;
2632 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a72f02(const DragNotifyMsg& notifyMessage) 2633 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2634 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2635 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2636 promiseFlag.set_value(true);
2637 };
2638 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2639 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2640 SimulateDownPointerEvent(
2641 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2642 ASSERT_TRUE(dragData);
2643 dragData->filterInfo = "{ \"dip_scale\": 3.5, \"drag_shadow_offsetX\": 50, \"drag_shadow_offsetY\": 50, "
2644 "\"drag_shadow_argb\": 872415231, "
2645 "\"shadow_color_strategy\": 0, \"shadow_is_hardwareacceleration\": true, \"shadow_elevation\": 120, "
2646 "\"drag_type\": \"non-text\", \"shadow_enable\": true }";
2647 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2648 std::make_shared<UnitTestStartDragListener>(callback));
2649 ASSERT_EQ(ret, RET_OK);
2650 ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2651 EXPECT_EQ(ret, RET_OK);
2652 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2653 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
2654 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2655 InteractionManager::GetInstance()->StopDrag(dropResult);
2656 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2657 std::future_status::timeout);
2658 }
2659
2660 /**
2661 * @tc.name: InteractionManagerTest_StartDrag_ShadowOffset
2662 * @tc.desc: Check drag shadow offset
2663 * @tc.type: FUNC
2664 * @tc.require:
2665 */
2666 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_ShadowOffset, TestSize.Level1)
2667 {
2668 CALL_TEST_DEBUG;
2669 std::promise<bool> promiseFlag;
2670 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a73002(const DragNotifyMsg& notifyMessage) 2671 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2672 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2673 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2674 promiseFlag.set_value(true);
2675 };
2676 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2677 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2678 SimulateDownPointerEvent(
2679 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2680 ASSERT_TRUE(dragData);
2681 dragData->filterInfo = "{ \"dip_scale\": 3.5, \"drag_shadow_offsetX\": 50, \"drag_shadow_offsetY\": 50, "
2682 "\"drag_shadow_argb\": 872415231, "
2683 "\"shadow_color_strategy\": 0, \"shadow_is_hardwareacceleration\": true, \"shadow_elevation\": 120, "
2684 "\"drag_type\": \"non-text\", \"shadow_enable\": true }";
2685 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2686 std::make_shared<UnitTestStartDragListener>(callback));
2687 ASSERT_EQ(ret, RET_OK);
2688 ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2689 EXPECT_EQ(ret, RET_OK);
2690 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2691 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
2692 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2693 InteractionManager::GetInstance()->StopDrag(dropResult);
2694 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2695 std::future_status::timeout);
2696 }
2697
2698 /**
2699 * @tc.name: InteractionManagerTest_StartDrag_ShadowCornerRadius
2700 * @tc.desc: Check drag shadow corner radius
2701 * @tc.type: FUNC
2702 * @tc.require:
2703 */
2704 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_ShadowCornerRadius, TestSize.Level1)
2705 {
2706 CALL_TEST_DEBUG;
2707 std::promise<bool> promiseFlag;
2708 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a73102(const DragNotifyMsg& notifyMessage) 2709 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2710 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2711 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2712 promiseFlag.set_value(true);
2713 };
2714 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2715 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2716 SimulateDownPointerEvent(
2717 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2718 ASSERT_TRUE(dragData);
2719 dragData->filterInfo = "{ \"dip_scale\": 3.5, \"drag_shadow_offsetX\": 50, \"drag_shadow_offsetY\": 50, "
2720 "\"drag_shadow_argb\": 872415231, "
2721 "\"shadow_color_strategy\": 0, \"shadow_is_hardwareacceleration\": true, \"shadow_elevation\": 120, "
2722 "\"drag_type\": \"non-text\", \"shadow_enable\": true }";
2723 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2724 std::make_shared<UnitTestStartDragListener>(callback));
2725 ASSERT_EQ(ret, RET_OK);
2726 ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2727 EXPECT_EQ(ret, RET_OK);
2728 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2729 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
2730 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2731 InteractionManager::GetInstance()->StopDrag(dropResult);
2732 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2733 std::future_status::timeout);
2734 }
2735
2736 /**
2737 * @tc.name: InteractionManagerTest_StartDrag_ShadowPath001
2738 * @tc.desc: Check drag shadow path
2739 * @tc.type: FUNC
2740 * @tc.require:
2741 */
2742 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_ShadowPath001, TestSize.Level1)
2743 {
2744 CALL_TEST_DEBUG;
2745 std::promise<bool> promiseFlag;
2746 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a73202(const DragNotifyMsg& notifyMessage) 2747 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2748 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2749 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2750 promiseFlag.set_value(true);
2751 };
2752 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2753 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2754 SimulateDownPointerEvent(
2755 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2756 ASSERT_TRUE(dragData);
2757 dragData->filterInfo = "{ \"dip_scale\": 3.5, \"drag_shadow_offsetX\": 50, \"drag_shadow_offsetY\": 50, "
2758 "\"drag_shadow_argb\": 872415231, "
2759 "\"shadow_color_strategy\": 0, \"shadow_is_hardwareacceleration\": true, \"shadow_elevation\": 120, "
2760 "\"drag_type\": \"non-text\", \"shadow_enable\": true }";
2761 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2762 std::make_shared<UnitTestStartDragListener>(callback));
2763 ASSERT_EQ(ret, RET_OK);
2764 ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2765 EXPECT_EQ(ret, RET_OK);
2766 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2767 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
2768 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2769 InteractionManager::GetInstance()->StopDrag(dropResult);
2770 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2771 std::future_status::timeout);
2772 }
2773
2774 /**
2775 * @tc.name: InteractionManagerTest_StartDrag_ShadowPath002
2776 * @tc.desc: Check drag shadow path
2777 * @tc.type: FUNC
2778 * @tc.require:
2779 */
2780 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_ShadowPath002, TestSize.Level1)
2781 {
2782 CALL_TEST_DEBUG;
2783 std::promise<bool> promiseFlag;
2784 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a73302(const DragNotifyMsg& notifyMessage) 2785 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2786 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2787 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2788 promiseFlag.set_value(true);
2789 };
2790 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2791 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2792 SimulateDownPointerEvent(
2793 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2794 ASSERT_TRUE(dragData);
2795 dragData->filterInfo = "{ \"dip_scale\": 3.5, \"drag_shadow_offsetX\": 50, \"drag_shadow_offsetY\": 50, "
2796 "\"drag_shadow_argb\": 872415231, "
2797 "\"shadow_color_strategy\": 0, \"shadow_is_hardwareacceleration\": true, \"shadow_elevation\": 120, "
2798 "\"drag_type\": \"non-text\", \"shadow_enable\": true }";
2799 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2800 std::make_shared<UnitTestStartDragListener>(callback));
2801 ASSERT_EQ(ret, RET_OK);
2802 ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2803 EXPECT_EQ(ret, RET_OK);
2804 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2805 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
2806 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2807 InteractionManager::GetInstance()->StopDrag(dropResult);
2808 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2809 std::future_status::timeout);
2810 }
2811
2812 /**
2813 * @tc.name: InteractionManagerTest_StartDrag_NonTextShadow
2814 * @tc.desc: Check non-text drag shadow
2815 * @tc.type: FUNC
2816 * @tc.require:
2817 */
2818 HWTEST_F(InteractionManagerTest, InteractionManagerTest_StartDrag_NonTextShadow, TestSize.Level1)
2819 {
2820 CALL_TEST_DEBUG;
2821 std::promise<bool> promiseFlag;
2822 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a73402(const DragNotifyMsg& notifyMessage) 2823 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2824 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2825 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2826 promiseFlag.set_value(true);
2827 };
2828 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2829 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2830 SimulateDownPointerEvent(
2831 { DRAG_SRC_X, DRAG_SRC_Y }, MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID);
2832 ASSERT_TRUE(dragData);
2833 dragData->filterInfo = "{ \"dip_scale\": 3.5, \"drag_shadow_offsetX\": 50, \"drag_shadow_offsetY\": 50, "
2834 "\"drag_shadow_argb\": 872415231, "
2835 "\"shadow_color_strategy\": 0, \"shadow_is_hardwareacceleration\": true, \"shadow_elevation\": 120, "
2836 "\"drag_type\": \"non-text\", \"shadow_enable\": true }";
2837 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2838 std::make_shared<UnitTestStartDragListener>(callback));
2839 ASSERT_EQ(ret, RET_OK);
2840 ret = InteractionManager::GetInstance()->SetDragWindowVisible(true);
2841 EXPECT_EQ(ret, RET_OK);
2842 SimulateMovePointerEvent({ DRAG_SRC_X, DRAG_SRC_Y }, { DRAG_DST_X, DRAG_DST_Y },
2843 MMI::PointerEvent::SOURCE_TYPE_MOUSE, MOUSE_POINTER_ID, true);
2844 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2845 InteractionManager::GetInstance()->StopDrag(dropResult);
2846 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2847 std::future_status::timeout);
2848 ret = InteractionManager::GetInstance()->EraseMouseIcon();
2849 EXPECT_NE(ret, RET_OK);
2850 ret = InteractionManager::GetInstance()->SetMouseDragMonitorState(0);
2851 EXPECT_EQ(ret, RET_OK);
2852 }
2853
2854 /**
2855 * @tc.name: InteractionManagerTest_SetDragSwitchState
2856 * @tc.desc: Get drag summarys
2857 * @tc.type: FUNC
2858 * @tc.require:
2859 */
2860 HWTEST_F(InteractionManagerTest, InteractionManagerTest_SetDragSwitchState, TestSize.Level1)
2861 {
2862 CALL_TEST_DEBUG;
2863 std::promise<bool> promiseFlag;
2864 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a73502(const DragNotifyMsg& notifyMessage) 2865 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2866 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2867 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2868 promiseFlag.set_value(true);
2869 };
2870 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2871 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2872 ASSERT_TRUE(dragData);
2873 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2874 std::make_shared<UnitTestStartDragListener>(callback));
2875 ASSERT_EQ(ret, RET_OK);
2876 ret = InteractionManager::GetInstance()->SetDragSwitchState(true, true);
2877 EXPECT_EQ(ret, RET_OK);
2878 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2879 InteractionManager::GetInstance()->StopDrag(dropResult);
2880 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2881 std::future_status::timeout);
2882 }
2883
2884 /**
2885 * @tc.name: InteractionManagerTest_SetDraggableState
2886 * @tc.desc: Get drag summarys
2887 * @tc.type: FUNC
2888 * @tc.require:
2889 */
2890 HWTEST_F(InteractionManagerTest, InteractionManagerTest_SetDraggableState, TestSize.Level1)
2891 {
2892 CALL_TEST_DEBUG;
2893 std::promise<bool> promiseFlag;
2894 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a73602(const DragNotifyMsg& notifyMessage) 2895 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2896 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2897 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2898 promiseFlag.set_value(true);
2899 };
2900 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2901 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2902 ASSERT_TRUE(dragData);
2903 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2904 std::make_shared<UnitTestStartDragListener>(callback));
2905 ASSERT_EQ(ret, RET_OK);
2906
2907 ret = InteractionManager::GetInstance()->SetDraggableState(true);
2908 EXPECT_EQ(ret, RET_OK);
2909 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2910 InteractionManager::GetInstance()->StopDrag(dropResult);
2911 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2912 std::future_status::timeout);
2913 }
2914
2915 /**
2916 * @tc.name: InteractionManagerTest_SetAppDragSwitchState
2917 * @tc.desc: Get drag summarys
2918 * @tc.type: FUNC
2919 * @tc.require:
2920 */
2921 HWTEST_F(InteractionManagerTest, InteractionManagerTest_SetAppDragSwitchState, TestSize.Level1)
2922 {
2923 CALL_TEST_DEBUG;
2924 std::promise<bool> promiseFlag;
2925 std::future<bool> futureFlag = promiseFlag.get_future();
__anond638f0a73702(const DragNotifyMsg& notifyMessage) 2926 auto callback = [&promiseFlag](const DragNotifyMsg& notifyMessage) {
2927 FI_HILOGD("displayX:%{public}d, displayY:%{public}d, result:%{public}d, target:%{public}d",
2928 notifyMessage.displayX, notifyMessage.displayY, notifyMessage.result, notifyMessage.targetPid);
2929 promiseFlag.set_value(true);
2930 };
2931 std::optional<DragData> dragData = CreateDragData({ TEST_PIXEL_MAP_WIDTH, TEST_PIXEL_MAP_HEIGHT },
2932 MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN, TOUCH_POINTER_ID, DISPLAY_ID, { DRAG_SRC_X, DRAG_SRC_Y });
2933 ASSERT_TRUE(dragData);
2934 int32_t ret = InteractionManager::GetInstance()->StartDrag(dragData.value(),
2935 std::make_shared<UnitTestStartDragListener>(callback));
2936 ASSERT_EQ(ret, RET_OK);
2937 const std::string pkgName = "testpkgName";
2938 ret = InteractionManager::GetInstance()->SetAppDragSwitchState(true, pkgName, true);
2939 EXPECT_EQ(ret, RET_OK);
2940 DragDropResult dropResult { DragResult::DRAG_SUCCESS, HAS_CUSTOM_ANIMATION, WINDOW_ID };
2941 InteractionManager::GetInstance()->StopDrag(dropResult);
2942 ASSERT_TRUE(futureFlag.wait_for(std::chrono::milliseconds(PROMISE_WAIT_SPAN_MS)) !=
2943 std::future_status::timeout);
2944 }
2945
2946 /**
2947 * @tc.name: InteractionManagerTest_ActivateCooperateWithOptions
2948 * @tc.desc: Activate coordination
2949 * @tc.type: FUNC
2950 * @tc.require:
2951 */
2952 HWTEST_F(InteractionManagerTest, InteractionManagerTest_ActivateCooperateWithOptions, TestSize.Level1)
2953 {
2954 CALL_TEST_DEBUG;
2955 SetPermission(SYSTEM_BASIC, g_basics, sizeof(g_basics) / sizeof(g_basics[0]));
2956 std::string remoteNetworkId("");
2957 int32_t startDeviceId = -1;
__anond638f0a73802(const std::string &listener, const CoordinationMsgInfo &coordinationMessages) 2958 auto fun = [](const std::string &listener, const CoordinationMsgInfo &coordinationMessages) {
2959 FI_HILOGD("Start coordination success");
2960 (void) listener;
2961 };
2962 CooperateOptions withOptions;
2963 withOptions.displayX = 500;
2964 withOptions.displayY = 500;
2965 withOptions.displayId = 0;
2966 int32_t ret = InteractionManager::GetInstance()->ActivateCooperateWithOptions(remoteNetworkId, startDeviceId,
2967 fun, withOptions);
2968 #ifdef OHOS_BUILD_ENABLE_COORDINATION
2969 ASSERT_TRUE((ret == RET_OK || ret == COMMON_PERMISSION_CHECK_ERROR || ret == COMMON_NOT_ALLOWED_DISTRIBUTED));
2970 #else
2971 ASSERT_EQ(ret, ERROR_UNSUPPORT);
2972 #endif // OHOS_BUILD_ENABLE_COORDINATION
2973 RemovePermission();
2974 }
2975 } // namespace DeviceStatus
2976 } // namespace Msdp
2977 } // namespace OHOS
2978