1
+ package com.ccextractor.taskwarriorflutter
2
+ import android.annotation.TargetApi
3
+ import android.appwidget.AppWidgetManager
4
+ import android.content.Context
5
+ import android.net.Uri
6
+ import android.widget.RemoteViews
7
+ import es.antonborri.home_widget.HomeWidgetBackgroundIntent
8
+ import es.antonborri.home_widget.HomeWidgetLaunchIntent
9
+ import es.antonborri.home_widget.HomeWidgetProvider
10
+ import es.antonborri.home_widget.HomeWidgetPlugin
11
+ import org.json.JSONException
12
+ import android.content.Intent
13
+ import android.widget.RemoteViewsService
14
+ import org.json.JSONObject
15
+ import org.json.JSONArray as OrgJSONArray
16
+ import android.os.Bundle
17
+ import android.app.PendingIntent
18
+ import android.appwidget.AppWidgetProvider
19
+ import android.os.Build
20
+
21
+
22
+ @TargetApi(Build .VERSION_CODES .CUPCAKE )
23
+ class TaskWarriorWidgetProvider : AppWidgetProvider () {
24
+
25
+ override fun onReceive (context : Context , intent : Intent ) {
26
+ // val myaction = intent.action
27
+ if (intent.action == " TASK_ACTION" ) {
28
+ val extras = intent.extras
29
+ if (extras!= null ){
30
+ val uuid = extras.getString(" uuid" )? : " "
31
+ val add_task = extras.getString(" launchedFor" )
32
+ val host = if (add_task == " ADD_TASK" ){context.getString(R .string.app_widget_add_clicked_uri)}else {context.getString(R .string.app_widget_card_clicked_uri)}
33
+ val launchIntent = Intent (context, MainActivity ::class .java).apply {
34
+ action = context.getString(R .string.app_widget_launch_action)
35
+ data = Uri .parse(" $host ?uuid=$uuid " )
36
+ flags = Intent . FLAG_ACTIVITY_NEW_TASK
37
+ context?.startActivity(this )
38
+ }
39
+ // HomeWidgetLaunchIntent.getActivity(context, MainActivity::class.java, Uri.parse("TaskWarrior://taskView?taskId=$uuid"))
40
+ }
41
+ }
42
+ super .onReceive(context, intent)
43
+ }
44
+ fun getLayoutId (context : Context ) : Int {
45
+ val sharedPrefs = HomeWidgetPlugin .getData(context)
46
+ val theme = sharedPrefs.getString(" themeMode" , " " )
47
+ val layoutId = if (theme.equals(" dark" )) {
48
+ R .layout.taskwarrior_layout_dark // Define a dark mode layout in your resources
49
+ } else {
50
+ R .layout.taskwarrior_layout
51
+ }
52
+ return layoutId
53
+ }
54
+ @TargetApi(Build .VERSION_CODES .DONUT )
55
+ override fun onUpdate (context : Context , appWidgetManager : AppWidgetManager , appWidgetIds : IntArray ) {
56
+ appWidgetIds.forEach { widgetId ->
57
+ val sharedPrefs = HomeWidgetPlugin .getData(context)
58
+ val tasks = sharedPrefs.getString(" tasks" , " " )
59
+ val intent = Intent (context, ListViewRemoteViewsService ::class .java).apply {
60
+ putExtra(" tasksJsonString" , tasks)
61
+ data = Uri .parse(toUri(Intent .URI_INTENT_SCHEME ))
62
+ }
63
+ val views = RemoteViews (context.packageName, getLayoutId(context)).apply {
64
+ val pendingIntent: PendingIntent = HomeWidgetLaunchIntent .getActivity(
65
+ context,
66
+ MainActivity ::class .java
67
+ )
68
+ setOnClickPendingIntent(R .id.logo, pendingIntent)
69
+ val intent_for_add = Intent (context, TaskWarriorWidgetProvider ::class .java).apply {
70
+ setAction(" TASK_ACTION" )
71
+ data= Uri .parse(toUri(Intent .URI_INTENT_SCHEME ))
72
+ putExtra(" launchedFor" , " ADD_TASK" )
73
+ }
74
+ val pendingIntentAdd: PendingIntent = PendingIntent .getBroadcast(
75
+ context,
76
+ 0 , // requestCode, can be any unique integer
77
+ intent_for_add,
78
+ PendingIntent .FLAG_MUTABLE or PendingIntent .FLAG_UPDATE_CURRENT or Intent .FILL_IN_COMPONENT // Use appropriate flags
79
+ )
80
+ setOnClickPendingIntent(R .id.add_btn, pendingIntentAdd)
81
+ setRemoteAdapter(R .id.list_view, intent)
82
+ }
83
+
84
+ val clickPendingIntent: PendingIntent = Intent (
85
+ context,
86
+ TaskWarriorWidgetProvider ::class .java
87
+ ).run {
88
+ setAction(" TASK_ACTION" )
89
+ setIdentifier(" uuid" )
90
+ data = Uri .parse(toUri(Intent .URI_INTENT_SCHEME ))
91
+
92
+ PendingIntent .getBroadcast(
93
+ context,
94
+ 0 ,
95
+ this ,
96
+ PendingIntent .FLAG_MUTABLE or PendingIntent .FLAG_UPDATE_CURRENT or Intent .FILL_IN_COMPONENT
97
+ )
98
+ }
99
+
100
+ views.setPendingIntentTemplate(R .id.list_view, clickPendingIntent)
101
+ appWidgetManager.updateAppWidget(widgetId, views)
102
+ }
103
+ super .onUpdate(context, appWidgetManager, appWidgetIds)
104
+ }
105
+ }
106
+ class ListViewRemoteViewsFactory (
107
+ private val context : Context ,
108
+ private val tasksJsonString : String?
109
+ ) : RemoteViewsService.RemoteViewsFactory {
110
+
111
+ private val tasks = mutableListOf<Task >()
112
+
113
+ override fun onCreate () {}
114
+
115
+ override fun onDataSetChanged () {
116
+ if (tasksJsonString != null ) {
117
+ try {
118
+ val jsonArray = OrgJSONArray (tasksJsonString as String )
119
+ for (i in 0 until jsonArray.length()) {
120
+ tasks.add(Task .fromJson(jsonArray.getJSONObject(i)))
121
+ }
122
+ } catch (e: JSONException ) {
123
+ e.printStackTrace()
124
+ }
125
+ }
126
+ }
127
+
128
+ override fun onDestroy () {}
129
+
130
+ override fun getCount (): Int = tasks.size
131
+
132
+ fun getListItemLayoutId (): Int {
133
+ val sharedPrefs = HomeWidgetPlugin .getData(context)
134
+ val theme = sharedPrefs.getString(" themeMode" , " " )
135
+ val layoutId = if (theme.equals(" dark" )) {
136
+ R .layout.listitem_layout_dark // Define a dark mode layout in your resources
137
+ } else {
138
+ R .layout.listitem_layout
139
+ }
140
+ return layoutId
141
+ }
142
+ fun getListItemLayoutIdForR1 (): Int {
143
+ val sharedPrefs = HomeWidgetPlugin .getData(context)
144
+ val theme = sharedPrefs.getString(" themeMode" , " " )
145
+ val layoutId = if (theme.equals(" dark" )) {
146
+ R .layout.no_tasks_found_li_dark // Define a dark mode layout in your resources
147
+ } else {
148
+ R .layout.no_tasks_found_li
149
+ }
150
+ return layoutId
151
+ }
152
+ fun getDotIdByPriority (p : String ) : Int {
153
+ println (" PRIORITY: " + p)
154
+ if (p.equals(" L" )) return R .drawable.low_priority_dot
155
+ if (p.equals(" M" )) return R .drawable.mid_priority_dot
156
+ if (p.equals(" H" )) return R .drawable.high_priority_dot
157
+ return R .drawable.no_priority_dot
158
+ }
159
+
160
+ override fun getViewAt (position : Int ): RemoteViews {
161
+ val task = tasks[position]
162
+ if (task.uuid.equals(" NO_TASK" ))
163
+ return RemoteViews (context.packageName, getListItemLayoutIdForR1()).apply {
164
+ if (task.priority.equals(" 1" ))
165
+ setTextViewText(R .id.tv, " No tasks added yet" )
166
+ if (task.priority.equals(" 2" ))
167
+ setTextViewText(R .id.tv, " Filters applied are hiding all tasks" )
168
+ }
169
+ return RemoteViews (context.packageName, getListItemLayoutId()).apply {
170
+ setTextViewText(R .id.todo__title, task.title)
171
+ setImageViewResource(R .id.dot, getDotIdByPriority(task.priority))
172
+ val a = Intent ().apply {
173
+
174
+ Bundle ().also { extras ->
175
+ extras.putString(" action" , " show_task" )
176
+ extras.putString(" uuid" , tasks[position].uuid)
177
+ putExtras(extras)
178
+ }
179
+
180
+ }
181
+ setOnClickFillInIntent(R .id.list_item_container,a)
182
+ }
183
+
184
+ }
185
+ override fun getLoadingView (): RemoteViews ? = null
186
+
187
+ override fun getViewTypeCount (): Int = 1
188
+
189
+ override fun getItemId (position : Int ): Long = position.toLong()
190
+
191
+ override fun hasStableIds (): Boolean = true
192
+ }
193
+ class ListViewRemoteViewsService : RemoteViewsService () {
194
+
195
+ override fun onGetViewFactory (intent : Intent ): RemoteViewsFactory {
196
+ val tasksJsonString = intent.getStringExtra(" tasksJsonString" )
197
+ return ListViewRemoteViewsFactory (applicationContext, tasksJsonString)
198
+ }
199
+ }
200
+ data class Task (val title : String , val urgencyLevel : String ,val uuid : String , val priority : String ) {
201
+ companion object {
202
+ fun fromJson (json : JSONObject ): Task {
203
+ val title = json.optString(" description" , " " )
204
+ val urgencyLevel = json.optString(" urgency" , " " )
205
+ val uuid = json.optString(" uuid" ," " )
206
+ val priority = json.optString(" priority" , " " )
207
+ return Task (title, urgencyLevel, uuid, priority)
208
+ }
209
+ }
210
+ }
0 commit comments