1818
1919package com.example.cahier.core.utils
2020
21+ import android.app.Activity
22+ import android.app.PendingIntent
23+ import android.content.ClipData
24+ import android.content.ClipDescription
25+ import android.content.Intent
2126import android.net.Uri
27+ import android.os.Build
2228import android.view.DragAndDropPermissions
29+ import android.view.View
2330import androidx.activity.ComponentActivity
31+ import androidx.annotation.RequiresApi
2432import androidx.compose.foundation.ExperimentalFoundationApi
33+ import androidx.compose.foundation.draganddrop.dragAndDropSource
34+ import androidx.compose.foundation.draganddrop.dragAndDropTarget
35+ import androidx.compose.ui.Modifier
2536import androidx.compose.ui.draganddrop.DragAndDropEvent
2637import androidx.compose.ui.draganddrop.DragAndDropTarget
38+ import androidx.compose.ui.draganddrop.DragAndDropTransferData
2739import androidx.compose.ui.draganddrop.toAndroidDragEvent
40+ import com.example.cahier.AppArgs
41+ import com.example.cahier.core.data.Note
2842
2943@OptIn(ExperimentalFoundationApi ::class )
3044fun createDropTarget (
@@ -43,3 +57,58 @@ fun createDropTarget(
4357 }
4458 }
4559}
60+
61+ fun Modifier.createDragAndDropSource (
62+ activity : Activity ? ,
63+ note : Note
64+ ): Modifier = if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .VANILLA_ICE_CREAM ) {
65+ dragAndDropSource { _ ->
66+ activity?.let {
67+ DragAndDropTransferData (
68+ clipData = getClipData(it, note),
69+ flags = View .DRAG_FLAG_GLOBAL_SAME_APPLICATION or View .DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG ,
70+ )
71+ }
72+ }
73+ } else {
74+ this
75+ }
76+
77+ fun Modifier.createDragAndDropTarget (
78+ activity : Activity
79+ ): Modifier = if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .VANILLA_ICE_CREAM ) {
80+ dragAndDropTarget(
81+ shouldStartDragAndDrop = { event ->
82+ event.toAndroidDragEvent().clipDescription?.hasMimeType(ClipDescription .MIMETYPE_TEXT_INTENT ) ? : false
83+ },
84+ target = object : DragAndDropTarget {
85+ override fun onDrop (event : DragAndDropEvent ): Boolean =
86+ event.toAndroidDragEvent().clipData?.getItemAt(0 )?.intent?.let {
87+ activity.startActivity(it)
88+ true
89+ } ? : false
90+ }
91+ )
92+ } else {
93+ this
94+ }
95+
96+
97+ @RequiresApi(Build .VERSION_CODES .VANILLA_ICE_CREAM )
98+ fun getClipData (activity : Activity , note : Note ): ClipData {
99+ val componentName = activity.componentName
100+ val intent = Intent .makeMainActivity(componentName).apply {
101+ putExtra(AppArgs .NOTE_ID_KEY , note.id)
102+ putExtra(AppArgs .NOTE_TYPE_KEY , note.type)
103+ flags = Intent .FLAG_ACTIVITY_NEW_TASK or
104+ Intent .FLAG_ACTIVITY_MULTIPLE_TASK or
105+ Intent .FLAG_ACTIVITY_LAUNCH_ADJACENT
106+ }
107+ val pendingIntent = PendingIntent .getActivity(
108+ activity, 0 , intent, PendingIntent .FLAG_IMMUTABLE
109+ )
110+ return ClipData (
111+ AppArgs .NOTE_ID_KEY , arrayOf(ClipDescription .MIMETYPE_TEXT_INTENT ),
112+ ClipData .Item .Builder ().setIntentSender(pendingIntent.intentSender).build()
113+ )
114+ }
0 commit comments