1/*
2 * Copyright (c) 2024 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/**
17 * @addtogroup ArkUI_NativeModule
18 * @{
19 *
20 * @brief Provides drag and drop APIs of ArkUI on the native side.
21 *
22 * @since 12
23 */
24
25/**
26 * @file drag_and_drop.h
27 *
28 * @brief Defines the native drag and drop APIs.
29 *
30 * @library libace_ndk.z.so
31 * @kit ArkUI
32 * @syscap SystemCapability.ArkUI.ArkUI.Full
33 * @since 12
34 */
35
36#ifndef ARKUI_NATIVE_DRAG_AND_DROP_H
37#define ARKUI_NATIVE_DRAG_AND_DROP_H
38
39#include <stdint.h>
40
41#include "native_type.h"
42#include "database/udmf/udmf.h"
43#include "multimedia/image_framework/image/pixelmap_native.h"
44
45#ifdef __cplusplus
46extern "C" {
47#endif
48
49/**
50 * @brief Defines an enum for drag results, which are set by the data receiver and transferred by the system to the
51 *        drag source so that the drag source is aware of the data processing result of the receiver.
52 *
53 * @since 12
54 */
55typedef enum {
56    /** The drag and drop operation succeeded. */
57    ARKUI_DRAG_RESULT_SUCCESSFUL = 0,
58    /** The drag and drop operation failed. */
59    ARKUI_DRAG_RESULT_FAILED,
60    /** The drag and drop operation was canceled. */
61    ARKUI_DRAG_RESULT_CANCELED,
62} ArkUI_DragResult;
63
64/**
65 * @brief Defines an enum for data processing modes used when data is dropped, which affects the display of the badge.
66 *
67 * @since 12
68 */
69typedef enum {
70    /** Copy. */
71    ARKUI_DROP_OPERATION_COPY = 0,
72    /** Cut. */
73    ARKUI_DROP_OPERATION_MOVE,
74} ArkUI_DropOperation;
75
76/**
77 * @brief Defines an enum for interaction states prior to a drop and drop operation.
78 *
79 * @since 12
80 */
81typedef enum {
82    /** Unknown. */
83    ARKUI_PRE_DRAG_STATUS_UNKNOWN = -1,
84    /** A drag gesture is being detected. */
85    ARKUI_PRE_DRAG_STATUS_ACTION_DETECTING,
86    /** The component is ready to be dragged. */
87    ARKUI_PRE_DRAG_STATUS_READY_TO_TRIGGER_DRAG,
88    /** A lift animation is started. */
89    ARKUI_PRE_DRAG_STATUS_PREVIEW_LIFT_STARTED,
90    /** A lift animation is finished. */
91    ARKUI_PRE_DRAG_STATUS_PREVIEW_LIFT_FINISHED,
92    /** A drop animation is started. */
93    ARKUI_PRE_DRAG_STATUS_PREVIEW_LANDING_STARTED,
94    /** A drop animation is finished. */
95    ARKUI_PRE_DRAG_STATUS_PREVIEW_LANDING_FINISHED,
96    /** A drop animation is terminated. */
97    ARKUI_PRE_DRAG_STATUS_CANCELED_BEFORE_DRAG,
98} ArkUI_PreDragStatus;
99
100/**
101 * @brief Defines an enum for drag preview scale modes.
102 *
103 * @since 12
104 */
105typedef enum {
106    /**
107     * The system automatically changes the position of the dragged point based on the scenario and
108     * scales the drag preview based on set rules.
109     */
110    ARKUI_DRAG_PREVIEW_SCALE_AUTO = 0,
111    /** The system does not scale the drag preview. */
112    ARKUI_DRAG_PREVIEW_SCALE_DISABLED,
113} ArkUI_DragPreviewScaleMode;
114
115/**
116 * @brief Defines an enum for drag states.
117 *
118 * @since 12
119 */
120typedef enum {
121    /** Unknown. */
122    ARKUI_DRAG_STATUS_UNKNOWN = -1,
123    /** Started. */
124    ARKUI_DRAG_STATUS_STARTED,
125    /** Ended. */
126    ARKUI_DRAG_STATUS_ENDED,
127} ArkUI_DragStatus;
128
129/**
130 * @brief Defines a struct for a component event.
131 *
132 * @since 12
133 */
134typedef struct ArkUI_NodeEvent ArkUI_NodeEvent;
135
136/**
137 * @brief Defines a struct for a UI context object.
138 *
139 * @since 12
140 */
141typedef struct ArkUI_Context ArkUI_Context;
142
143/**
144 * @brief Defines a struct for a UI context object pointer.
145 *
146 * @since 12
147 */
148typedef struct ArkUI_Context* ArkUI_ContextHandle;
149
150/**
151 * @brief Defines a struct for a drag event.
152 *
153 * @since 12
154 */
155typedef struct ArkUI_DragEvent ArkUI_DragEvent;
156
157/**
158 * @brief Defines a struct for custom drag preview options.
159 *
160 * @since 12
161 */
162typedef struct ArkUI_DragPreviewOption ArkUI_DragPreviewOption;
163
164/**
165 * @brief Defines a struct for a drag action.
166 *
167 * @since 12
168 */
169typedef struct ArkUI_DragAction ArkUI_DragAction;
170
171/**
172 * @brief Defines a struct for drag and drop information returned through a drag status listener.
173 *
174 * @since 12
175 */
176typedef struct ArkUI_DragAndDropInfo ArkUI_DragAndDropInfo;
177
178/**
179 * @brief Obtains a <b>ArkUI_DragEvent</b> object from the specified <b>ArkUI_NodeEvent</b> object.
180 *
181 * @param nodeEvent Indicates the pointer to an <b>ArkUI_NodeEvent</b> object.
182 * @return Returns the pointer to an <b>ArkUI_DragEvent</b> object.
183 *         Returns <b>null</b> if the parameter passed in is invalid or is not a drag-related event.
184 * @since 12
185 */
186ArkUI_DragEvent* OH_ArkUI_NodeEvent_GetDragEvent(ArkUI_NodeEvent* nodeEvent);
187
188/**
189 * @brief Obtains the interaction state prior to a drop and drop operation.
190 *
191 * @param nodeEvent Indicates the pointer to an <b>ArkUI_NodeEvent</b> object.
192 * @return Returns the interaction state prior to the drop and drop operation.
193 * @since 12
194 */
195ArkUI_PreDragStatus OH_ArkUI_NodeEvent_GetPreDragStatus(ArkUI_NodeEvent* nodeEvent);
196
197/**
198 * @brief Sets whether to disable the default drop animation.
199 * The default drop animation is enabled by default and can be disabled to apply a custom drop animation.
200 *
201 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
202 * @param disable Indicates whether to disable the default drop animation.
203 * The value <b>true</b> means to disable the default drop animation, and <b>false</b> means the opposite.
204 * @return Returns the result code.
205 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
206 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
207 * @since 12
208 */
209int32_t OH_ArkUI_DragEvent_DisableDefaultDropAnimation(ArkUI_DragEvent* event, bool disable);
210
211/**
212 * @brief Sets the data processing mode.
213 *
214 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
215 * @param dropOperation Indicates the data processing mode.
216 * @return Returns the result code.
217 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
218 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
219 * @since 12
220 */
221int32_t OH_ArkUI_DragEvent_SetSuggestedDropOperation(ArkUI_DragEvent* event, ArkUI_DropOperation dropOperation);
222
223/**
224 * @brief Sets the result for a drag event.
225 *
226 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
227 * @param result Indicates the drag result.
228 * @return Returns the result code.
229 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
230 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
231 * @since 12
232 */
233int32_t OH_ArkUI_DragEvent_SetDragResult(ArkUI_DragEvent* event, ArkUI_DragResult result);
234
235/**
236 * @brief Set drag data for a drag event.
237 *
238 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
239 * @param data Indicates the drag data.
240 * @return Returns the result code.
241 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
242 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
243 * @since 12
244 */
245int32_t OH_ArkUI_DragEvent_SetData(ArkUI_DragEvent* event, OH_UdmfData* data);
246
247/**
248 * @brief Obtains the default drag data from a drag event.
249 *
250 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
251 * @param data Indicates the pointer to an <b>OH_UdmfData</b> object. The application needs to create a pointer
252 *             for receiving data by using the {@link OH_UdmfData_Create} method.
253 * @return Returns the result code.
254 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
255 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
256 * @since 12
257 */
258int32_t OH_ArkUI_DragEvent_GetUdmfData(ArkUI_DragEvent* event, OH_UdmfData *data);
259
260/**
261 * @brief Obtains the number of drag data types from a drag event.
262 *
263 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
264 * @param count Indicates the number of drag data types returned.
265 * @return Returns the result code.
266 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
267 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
268 * @since 12
269 */
270int32_t OH_ArkUI_DragEvent_GetDataTypeCount(ArkUI_DragEvent* event, int32_t* count);
271
272/**
273 * @brief Obtains the list of drag data types from a drag event.
274 *
275 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
276 * @param eventTypeArray Indicates the list of the drag data types. You need to create a string array first.
277 * @param length Indicates the total length of the list array. It must be greater than or equal to the number obtained
278 *        by using {@link OH_ArkUI_DragEvent_GetDataTypeCount}.
279 * @param maxStrLen Indicates the max string length of drag data types.
280 * @return Returns the result code.
281 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
282 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
283 *         Returns {@link ARKUI_ERROR_CODE_BUFFER_SIZE_ERROR} if the giving buffer is not enough for string copy.
284 * @since 12
285 */
286int32_t OH_ArkUI_DragEvent_GetDataTypes(
287    ArkUI_DragEvent *event, char *eventTypeArray[], int32_t length, int32_t maxStrLen);
288
289/**
290 * @brief Obtains the drag result from a drag event.
291 *
292 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
293 * @param result Indicates the drag result returned.
294 * @return Returns the result code.
295 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
296 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
297 * @since 12
298 */
299int32_t OH_ArkUI_DragEvent_GetDragResult(ArkUI_DragEvent* event, ArkUI_DragResult* result);
300
301/**
302 * @brief Obtains the drop operation from a drag event.
303 *
304 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
305 * @param operation Indicates the drop operation which the data receiver set.
306 * @return Returns the result code.
307 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
308 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
309 *                 Possible causes: 1. The given parameters are null or the given event is not a valid DragEvent.
310 * @since 12
311 */
312int32_t OH_ArkUI_DragEvent_GetDropOperation(ArkUI_DragEvent* event, ArkUI_DropOperation* operation);
313
314/**
315 * @brief Obtains the X coordinate of the touch point for a drag preview from a drag event.
316 *
317 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
318 * @return Returns the X coordinate of the touch point, in px.
319 *         Returns the default value <b>0</b> if the input parameter is invalid.
320 * @since 12
321 */
322float OH_ArkUI_DragEvent_GetPreviewTouchPointX(ArkUI_DragEvent* event);
323
324/**
325 * @brief Obtains the Y coordinate of the touch point for a drag preview from a drag event.
326 *
327 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
328 * @return Returns the Y coordinate of the touch point, in px.
329 *         Returns the default value <b>0</b> if the input parameter is invalid.
330 * @since 12
331 */
332float OH_ArkUI_DragEvent_GetPreviewTouchPointY(ArkUI_DragEvent* event);
333
334/**
335 * @brief Obtains the width of a drag preview from a drag event.
336 *
337 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
338 * @return Returns the width of the drag preview, in px.
339 *         Returns the default value <b>0</b> if the input parameter is invalid.
340 * @since 12
341 */
342float OH_ArkUI_DragEvent_GetPreviewRectWidth(ArkUI_DragEvent* event);
343
344/**
345 * @brief Obtains the height of a drag preview from a drag event.
346 *
347 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
348 * @return Returns the height of the drag preview, in px.
349 *         Returns the default value <b>0</b> if the input parameter is invalid.
350 * @since 12
351 */
352float OH_ArkUI_DragEvent_GetPreviewRectHeight(ArkUI_DragEvent* event);
353
354/**
355 * @brief Obtains the X coordinate of the touch point relative to the window from a drag event.
356 *
357 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
358 * @return Returns the X coordinate of the touch point relative to the window, in px.
359 *         Returns the default value <b>0</b> if the input parameter is invalid.
360 * @since 12
361 */
362float OH_ArkUI_DragEvent_GetTouchPointXToWindow(ArkUI_DragEvent* event);
363
364/**
365 * @brief Obtains the Y coordinate of the touch point relative to the window from a drag event.
366 *
367 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
368 * @return Returns the Y coordinate of the touch point relative to the window, in px.
369 *         Returns the default value <b>0</b> if the input parameter is invalid.
370 * @since 12
371 */
372float OH_ArkUI_DragEvent_GetTouchPointYToWindow(ArkUI_DragEvent* event);
373
374/**
375 * @brief Obtains the X coordinate of the touch point relative to the current display from a drag event.
376 *
377 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
378 * @return Returns the X coordinate of the touch point relative to the current display, in px.
379 *         Returns the default value <b>0</b> if the input parameter is invalid.
380 * @since 12
381 */
382float OH_ArkUI_DragEvent_GetTouchPointXToDisplay(ArkUI_DragEvent* event);
383
384/**
385 * @brief Obtains the Y coordinate of the touch point relative to the current display from a drag event.
386 *
387 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
388 * @return Returns the Y coordinate of the touch point relative to the current display, in px.
389 *         Returns the default value <b>0</b> if the input parameter is invalid.
390 * @since 12
391 */
392float OH_ArkUI_DragEvent_GetTouchPointYToDisplay(ArkUI_DragEvent* event);
393
394/**
395 * @brief Obtains the dragging velocity along the x-axis.
396 *
397 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
398 * @return Returns the dragging velocity along the x-axis, in px.
399 *         Returns the default value <b>0</b> if the input parameter is invalid.
400 * @since 12
401 */
402float OH_ArkUI_DragEvent_GetVelocityX(ArkUI_DragEvent* event);
403
404/**
405 * @brief Obtains the dragging velocity along the y-axis.
406 *
407 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
408 * @return Returns the dragging velocity along the y-axis, in px.
409 *         Returns the default value <b>0</b> if the input parameter is invalid.
410 * @since 12
411 */
412float OH_ArkUI_DragEvent_GetVelocityY(ArkUI_DragEvent* event);
413
414/**
415 * @brief Obtains the dragging velocity along the main axis.
416 *
417 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
418 * @return Returns the dragging velocity along the main axis, in px.
419 *         Returns the default value <b>0</b> if the input parameter is invalid.
420 * @since 12
421 */
422float OH_ArkUI_DragEvent_GetVelocity(ArkUI_DragEvent* event);
423
424/**
425 * @brief Obtains the pressed status of modifier keys from a drag event.
426 *
427 * @param event Indicates the pointer to an <b>ArkUI_DragEvent</b> object.
428 * @param keys Indicates the returned combination of modifier keys that are currently pressed.
429 *             The application can determine the pressed modifier keys through bitwise operations.
430 * @return Returns the result code.
431 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
432 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
433 * @since 12
434 */
435int32_t OH_ArkUI_DragEvent_GetModifierKeyStates(ArkUI_DragEvent* event, uint64_t* keys);
436
437/**
438 * @brief Sets whether to enable strict reporting on drag events.
439 *        This feature is disabled by default, and you are advised to enable it.
440 *        If this feature is disabled, the parent component is not notified when an item in it is dragged over its child
441 *        component. If this feature is enabled, the component is notified of the dragged item's leaving, and the chil
442 *        component to which the dragged item is dropped is notified of the item's entering. This configuration is
443 *        related to a specific UI instance. You can pass in a specific component node on the current UI instance
444 *        for association.
445 *
446 * @param node Indicates the pointer to a component node.
447 * @param enabled Indicates whether to enable strict reporting on drag events.
448 * @return Returns the result code.
449 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
450 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
451 * @since 12
452 */
453int32_t OH_ArkUI_SetDragEventStrictReportWithNode(ArkUI_NodeHandle node, bool enabled);
454
455/**
456 * @brief Sets whether to enable strict reporting on drag events.
457 *        This feature is disabled by default, and you are advised to enable it.
458 *        If this feature is disabled, the parent component is not notified when an item in it is dragged over its child
459 *        component. If this feature is enabled, the component is notified of the dragged item's leaving, and the child
460 *        component to which the dragged item is dropped is notified of the item's entering. This configuration is
461 *        related to a specific UI instance. You can pass in a specific UI instance for association.
462 *
463 * @param uiContext Indicates the pointer to a UI instance.
464 * @param enabled Indicates whether to enable strict reporting on drag events.
465 * @return Returns the result code.
466 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
467 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
468 * @since 12
469 */
470int32_t OH_ArkUI_SetDragEventStrictReportWithContext(ArkUI_ContextHandle uiContext, bool enabled);
471
472/**
473 * @brief Sets the types of data that can be dropped to the specified component. This API resets the settings configured
474 *        through {@link OH_ArkUI_DisallowNodeAnyDropDataTypes} and {@link OH_ArkUI_AllowNodeAllDropDataTypes}.
475 *
476 * @param node Indicates the pointer to a component node.
477 * @param typesArray Indicates the array of types of data that can be dropped.
478 * @param count Indicates length of an array.
479 * @return Returns the result code.
480 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
481 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
482 * @since 12
483 */
484int32_t OH_ArkUI_SetNodeAllowedDropDataTypes(ArkUI_NodeHandle node, const char* typesArray[], int32_t count);
485
486/**
487 * @brief Configures the specified component to disallow any data types. This API resets the settings configured through
488 *        {@link OH_ArkUI_SetNodeAllowedDropDataTypes}.
489 *
490 * @param node Indicates the pointer to a component node.
491 * @return Returns the result code.
492 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
493 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
494 * @since 12
495 */
496int32_t OH_ArkUI_DisallowNodeAnyDropDataTypes(ArkUI_NodeHandle node);
497
498/**
499 * @brief Configures the specified component to allow any data types. This API resets the settings configured through
500 *        {@link OH_ArkUI_SetNodeAllowedDropDataTypes}.
501 *
502 * @param node Indicates the pointer to a component node.
503 * @return Returns the result code.
504 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
505 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
506 * @since 12
507 */
508int32_t OH_ArkUI_AllowNodeAllDropDataTypes(ArkUI_NodeHandle node);
509
510/**
511 * @brief Sets whether the specified component is draggable.
512 *
513 * @param node Indicates the pointer to a component node.
514 * @param bool Indicates whether the component is draggable.
515 * @return Returns the result code.
516 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
517 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
518 * @since 12
519 */
520int32_t OH_ArkUI_SetNodeDraggable(ArkUI_NodeHandle node, bool enabled);
521
522/**
523 * @brief Sets a custom drag preview for the specified component.
524 *
525 * @param node Indicates the pointer to a component node.
526 * @param preview Indicates the custom drag preview, which is a pixel map.
527 * @return Returns the result code.
528 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
529 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
530 * @since 12
531 */
532int32_t OH_ArkUI_SetNodeDragPreview(ArkUI_NodeHandle node, OH_PixelmapNative* preview);
533
534/**
535 * @brief Creates an <b>ArkUI_DragPreviewOption</b> object.
536 *
537 * @return Returns the created <b>ArkUI_DragPreviewOption</b> object.
538 * @since 12
539 */
540ArkUI_DragPreviewOption* OH_ArkUI_CreateDragPreviewOption(void);
541
542/**
543 * @brief Disposes of a <b>ArkUI_DragPreviewOption</b> object.
544 *
545 * @param option Indicates the pointer to an <b>ArkUI_DragPreviewOption</b> object.
546 * @since 12
547 */
548void OH_ArkUI_DragPreviewOption_Dispose(ArkUI_DragPreviewOption* option);
549
550/**
551 * @brief Sets the scale mode for an <b>ArkUI_DragPreviewOption</b> object.
552 *
553 * @param option Indicates the pointer to an <b>ArkUI_DragPreviewOption</b> object.
554 * @param scaleMode Indicates the scale mode.
555 * @return Returns the result code.
556 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
557 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
558 * @since 12
559 */
560int32_t OH_ArkUI_DragPreviewOption_SetScaleMode(ArkUI_DragPreviewOption* option, ArkUI_DragPreviewScaleMode scaleMode);
561
562/**
563 * @brief Sets whether to enable the shadow effect for an <b>ArkUI_DragPreviewOption</b> object.
564 *        The shadow effect is enabled by default.
565 *
566 * @param option Indicates the pointer to an <b>ArkUI_DragPreviewOption</b> object.
567 * @param enabled Indicates whether to enable the shadow effect.
568 * @return Returns the result code.
569 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
570 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
571 * @since 12
572 */
573int32_t OH_ArkUI_DragPreviewOption_SetDefaultShadowEnabled(ArkUI_DragPreviewOption* option, bool enabled);
574
575/**
576 * @brief Sets whether to enable the rounded corner effect for an <b>ArkUI_DragPreviewOption</b> object.
577 *        The rounded corner effect is enabled by default.
578 *
579 * @param option Indicates the pointer to an <b>ArkUI_DragPreviewOption</b> object.
580 * @param enabled Indicates whether to enable the rounded corner effect.
581 * @return Returns the result code.
582 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
583 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
584 * @since 12
585 */
586int32_t OH_ArkUI_DragPreviewOption_SetDefaultRadiusEnabled(ArkUI_DragPreviewOption* option, bool enabled);
587
588/**
589 * @brief Sets whether to enable the badge for an <b>ArkUI_DragPreviewOption</b> object.
590 *        If this feature is enabled, a badge that contains the number of dragged items is displayed.
591 *
592 * @param option Indicates the pointer to an <b>ArkUI_DragPreviewOption</b> object.
593 * @param enabled Indicates whether to enable badge.
594 * @return Returns the result code.
595 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
596 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
597 * @since 12
598 */
599int32_t OH_ArkUI_DragPreviewOption_SetNumberBadgeEnabled(ArkUI_DragPreviewOption* option, bool enabled);
600
601/**
602 * @brief Sets the count on the badge.
603 *        The settings will overwrite the value in the <b>SetDragPreviewNumberBadgeEnabled</b> API.
604 *
605 * @param option Indicates the pointer to an <b>ArkUI_DragPreviewOption</b> object.
606 * @param forcedNumber Indicates the count on the badge.
607 * @return Returns the result code.
608 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
609 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
610 * @since 12
611 */
612int32_t OH_ArkUI_DragPreviewOption_SetBadgeNumber(ArkUI_DragPreviewOption* option, uint32_t forcedNumber);
613
614/**
615 * @brief Sets whether to enable the default animation on a click or touch, it's not used in drag action.
616 *
617 * @param option Indicates the pointer to an <b>ArkUI_DragPreviewOption</b> object.
618 * @param enabled Indicates whether to enable the default animation on a click or touch.
619 * @return Returns the result code.
620 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
621 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
622 * @since 12
623 */
624int32_t OH_ArkUI_DragPreviewOption_SetDefaultAnimationBeforeLiftingEnabled(
625    ArkUI_DragPreviewOption* option, bool enabled);
626/**
627 * @brief Sets an <b>ArkUI_DragPreviewOption</b> object for the specified component.
628 *
629 * @param node Indicates the pointer to a component node.
630 * @param option Indicates the pointer to an <b>ArkUI_DragPreviewOption</b> object.
631 * @return Returns the result code.
632 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
633 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
634 * @since 12
635 */
636int32_t OH_ArkUI_SetNodeDragPreviewOption(ArkUI_NodeHandle node, ArkUI_DragPreviewOption* option);
637
638/**
639 * @brief Creates a drag action object for a UI instance based on the specified component node of the current
640 *        UI instance.
641 *
642 * @param node Indicates the pointer to a component node.
643 * @return Returns the pointer to the created drag action object; returns null if the operation fails.
644 * @since 12
645 */
646ArkUI_DragAction* OH_ArkUI_CreateDragActionWithNode(ArkUI_NodeHandle node);
647
648/**
649 * @brief Creates a drag action object for the specified UI instance.
650 *
651 * @param uiContext Indicates the pointer to a UI instance.
652 * @return Returns the pointer to the created drag action object; returns null if the operation fails.
653 * @since 12
654 */
655ArkUI_DragAction* OH_ArkUI_CreateDragActionWithContext(ArkUI_ContextHandle uiContext);
656
657/**
658 * @brief Disposes of a drag action object.
659 *
660 * @param dragAction Indicates the pointer to the target drag action object.
661 * @since 12
662 */
663void OH_ArkUI_DragAction_Dispose(ArkUI_DragAction* dragAction);
664
665/**
666 * @brief Sets the pointer ID. If only one finger is operating on the screen, the pointer ID is 0.
667 *        In general cases, you can set the pointer ID to 0.
668 *
669 * @param dragAction Indicates the pointer to the target drag action object.
670 * @param pointer Indicates the pointer ID. The value ranges from 0 to 9.
671 * @return Returns the result code.
672 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
673 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
674 * @since 12
675 */
676int32_t OH_ArkUI_DragAction_SetPointerId(ArkUI_DragAction* dragAction, int32_t pointer);
677
678/**
679 * @brief Sets the drag previews for a drag action.
680 *
681 * @param dragAction Indicates the pointer to the target drag action object.
682 * @param pixelmapArray Indicates the array of the drag previews to set, which must be pixel maps.
683 * @param size Indicates the size of the drag preview array.
684 * @return Returns the result code.
685 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
686 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
687 * @since 12
688 */
689int32_t OH_ArkUI_DragAction_SetPixelMaps(
690    ArkUI_DragAction* dragAction, OH_PixelmapNative* pixelmapArray[], int32_t size);
691
692/**
693 * @brief Sets the touch point relative to the upper left corner of the first drag preview (pixel map).
694 *
695 * @param dragAction Indicates the pointer to the target drag action object.
696 * @param x Indicates the X coordinate of the touch point.
697 * @return Returns the result code.
698 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
699 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
700 * @since 12
701 */
702int32_t OH_ArkUI_DragAction_SetTouchPointX(ArkUI_DragAction* dragAction, float x);
703
704/**
705 * @brief Sets the touch point relative to the upper left corner of the first drag preview (pixel map).
706 *
707 * @param dragAction Indicates the pointer to the target drag action object.
708 * @param y Indicates the Y coordinate of the touch point.
709 * @return Returns the result code.
710 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
711 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
712 * @since 12
713 */
714int32_t OH_ArkUI_DragAction_SetTouchPointY(ArkUI_DragAction* dragAction, float y);
715
716/**
717 * @brief Sets the drag data.
718 *
719 * @param dragAction Indicates the pointer to the target drag action object.
720 * @param data Indicates the drag data.
721 * @return Returns the result code.
722 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
723 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
724 * @since 12
725 */
726int32_t OH_ArkUI_DragAction_SetData(ArkUI_DragAction* dragAction, OH_UdmfData* data);
727
728/**
729 * @brief Sets an <b>ArkUI_DragPreviewOption</b> object for the specified drag action object.
730 *
731 * @param dragAction Indicates the pointer to the target drag action object.
732 * @param option Indicates the pointer to an <b>ArkUI_DragPreviewOption</b> object.
733 * @return Returns the result code.
734 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
735 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
736 * @since 12
737 */
738int32_t OH_ArkUI_DragAction_SetDragPreviewOption(ArkUI_DragAction* dragAction, ArkUI_DragPreviewOption* option);
739
740/**
741 * @brief Registers a drag status listener.
742 *        This listener can be used to check whether the data is successfully  received and processed.
743 *
744 * @param dragAction Indicates the pointer to the target drag action object.
745 * @param userData Indicates the custom user data.
746 * @param listener
747 * Indicates the listener to register. When the callback is invoked, the system returns a pointer to the drag status
748 * object. The pointer is destroyed after the callback is complete and the application should not hold it anymore.
749 * @return Returns the result code.
750 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
751 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
752 * @since 12
753 */
754int32_t OH_ArkUI_DragAction_RegisterStatusListener(ArkUI_DragAction* dragAction, void* userData,
755    void(*listener)(ArkUI_DragAndDropInfo* dragAndDropInfo, void* userData));
756
757/**
758 * @brief Unregisters a drag status listener.
759 *
760 * @param dragAction Indicates the pointer to the target drag action object.
761 * @since 12
762 */
763void OH_ArkUI_DragAction_UnregisterStatusListener(ArkUI_DragAction* dragAction);
764
765/**
766 * @brief Obtains the drag status of a drag action.
767 *
768 * @param dragAndDropInfo Indicates the drag and drop information returned by the drag status listener.
769 * @return Returns an <b>ArkUI_DragStatus</b> object; returns <b>ArkUI_DRAG_STATUS_UNKNOWN</b> if an error occurs.
770 * @since 12
771 */
772ArkUI_DragStatus OH_ArkUI_DragAndDropInfo_GetDragStatus(ArkUI_DragAndDropInfo* dragAndDropInfo);
773
774/**
775 * @brief Obtains a drag event based on the specified drag and drop information.
776 *        The drag event can then be used to obtain the drag result and the drag behavior, please note
777 *        other info is not included in such a drag event.
778 *
779 * @param dragAndDropInfo Indicates the drag and drop information returned by the drag status listener.
780 * @return Returns an <b>ArkUI_DragEvent</b> object; returns null if an error occurs.
781 * @since 12
782 */
783ArkUI_DragEvent* OH_ArkUI_DragAndDropInfo_GetDragEvent(ArkUI_DragAndDropInfo* dragAndDropInfo);
784
785/**
786 * @brief Initiates a drag action through the specified drag action object.
787 *
788 * @param dragAction Indicates a drag action object.
789 * @return Returns the result code.
790 *         Returns {@link ARKUI_ERROR_CODE_NO_ERROR} if the operation is successful.
791 *         Returns {@link ARKUI_ERROR_CODE_PARAM_INVALID} if a parameter error occurs.
792 * @since 12
793 */
794int32_t OH_ArkUI_StartDrag(ArkUI_DragAction* dragAction);
795
796#ifdef __cplusplus
797};
798#endif
799
800#endif // ARKUI_NATIVE_DRAG_AND_DROP_H
801/** @} */