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