11package com.ccextractor.taskwarriorflutter
2-
2+ import android.util.Log
33import android.appwidget.AppWidgetManager
44import android.content.Context
55import android.content.SharedPreferences
@@ -10,62 +10,138 @@ import android.widget.RemoteViews
1010import es.antonborri.home_widget.HomeWidgetBackgroundIntent
1111import es.antonborri.home_widget.HomeWidgetLaunchIntent
1212import es.antonborri.home_widget.HomeWidgetProvider
13-
13+ import es.antonborri.home_widget.HomeWidgetPlugin
14+ import android.content.BroadcastReceiver
15+ import org.json.JSONException
16+ import android.content.Intent
17+ import android.widget.RemoteViewsService
18+ import org.json.JSONObject
19+ import org.json.JSONArray as OrgJSONArray
1420import com.ccextractor.taskwarriorflutter.MainActivity
1521import com.ccextractor.taskwarriorflutter.R
22+ import android.os.Bundle
23+ import android.app.PendingIntent
24+ import android.appwidget.AppWidgetProvider
1625
1726
18- class TaskWarriorWidgetProvider : HomeWidgetProvider () {
19-
20- override fun onUpdate (context : Context , appWidgetManager : AppWidgetManager , appWidgetIds : IntArray , widgetData : SharedPreferences ) {
27+ class TaskWarriorWidgetProvider : AppWidgetProvider () {
28+
29+ override fun onReceive (context : Context , intent : Intent ) {
30+ // val myaction = intent.action
31+ if (intent.action == " TASK_ACTION" ) {
32+ val extras = intent.extras
33+ if (extras!= null ){
34+ val uuid = extras.getString(" uuid" )? : " "
35+ val launchIntent = Intent (context, MainActivity ::class .java).apply {
36+ action = context.getString(R .string.app_widget_launch_action)
37+ data = Uri .parse(" ${context.getString(R .string.app_widget_card_clicked_uri)} ?uuid=$uuid " )
38+ flags = Intent . FLAG_ACTIVITY_NEW_TASK
39+ context?.startActivity(this )
40+ }
41+ // HomeWidgetLaunchIntent.getActivity(context, MainActivity::class.java, Uri.parse("TaskWarrior://taskView?taskId=$uuid"))
42+ }
43+ }
44+ super .onReceive(context, intent)
45+ }
46+ override fun onUpdate (context : Context , appWidgetManager : AppWidgetManager , appWidgetIds : IntArray ) {
2147 appWidgetIds.forEach { widgetId ->
48+ val sharedPrefs = HomeWidgetPlugin .getData(context)
49+ val tasks = sharedPrefs.getString(" tasks" , " " )
50+ val intent = Intent (context,ListViewRemoteViewsService ::class .java).apply {
51+ putExtra(" tasksJsonString" , tasks)
52+ data = Uri .parse(toUri(Intent .URI_INTENT_SCHEME ))
53+ }
2254 val views = RemoteViews (context.packageName, R .layout.taskwarrior_layout).apply {
23- // Open App on Widget Click
55+
2456 val pendingIntent = HomeWidgetLaunchIntent .getActivity(
2557 context,
2658 MainActivity ::class .java)
27- setOnClickPendingIntent(R .id.cardItem, pendingIntent)
59+ setOnClickPendingIntent(R .id.container_layout, pendingIntent)
60+ setRemoteAdapter(R .id.list_view, intent)
61+
62+ }
63+
64+ val clickPendingIntent: PendingIntent = Intent (
65+ context,
66+ TaskWarriorWidgetProvider ::class .java).run {
67+ setAction(" TASK_ACTION" )
68+ setIdentifier(" uuid" )
69+ data = Uri .parse(toUri(Intent .URI_INTENT_SCHEME ))
70+
71+ PendingIntent .getBroadcast(context,0 ,this ,PendingIntent .FLAG_MUTABLE or PendingIntent .FLAG_UPDATE_CURRENT or Intent .FILL_IN_COMPONENT )
72+ }
73+ views.setPendingIntentTemplate(R .id.list_view,clickPendingIntent)
74+ appWidgetManager.updateAppWidget(widgetId, views)
75+ }
76+ super .onUpdate(context, appWidgetManager, appWidgetIds)
77+ }
78+ }
79+ class ListViewRemoteViewsFactory (
80+ private val context : Context ,
81+ private val tasksJsonString : String?
82+ ) : RemoteViewsService.RemoteViewsFactory {
2883
29- // Swap Title Text by calling Dart Code in the Background
30- setTextViewText(R .id.idTvTitle, widgetData.getString(" title1" , null )
31- ? : " No Pending Task" )
32- setTextViewText(R .id.idTvDate, widgetData.getString(" subtitle1" , null )
33- ? : " " )
34- setTextViewText(R .id.idTvTitle2, widgetData.getString(" title2" , null )
35- ? : " No Pending Task" )
36- setTextViewText(R .id.idTvDate2, widgetData.getString(" subtitle2" , null )
37- ? : " " )
38- setTextViewText(R .id.idTvTitle3, widgetData.getString(" title3" , null )
39- ? : " No Pending Task" )
40- setTextViewText(R .id.idTvDate3, widgetData.getString(" subtitle3" , null )
41- ? : " " )
42- val backgroundIntent = HomeWidgetBackgroundIntent .getBroadcast(
43- context,
44- Uri .parse(" homeWidgetExample://titleClicked" )
45- )
46- setOnClickPendingIntent(R .id.idTvTitle, backgroundIntent)
84+ private val tasks = mutableListOf<Task >()
4785
48- // val message = widgetData.getString("message", null)
49- // setTextViewText(R.id.widget_message, message
50- // ?: "No Message Set")
51- // // Show Images saved with `renderFlutterWidget`
52- // val image = widgetData.getString("dashIcon", null)
53- // if (image != null) {
54- // setImageViewBitmap(R.id.widget_img, BitmapFactory.decodeFile(image))
55- // setViewVisibility(R.id.widget_img, View.VISIBLE)
56- // } else {
57- // setViewVisibility(R.id.widget_img, View.GONE)
58- // }
86+ override fun onCreate () {}
5987
60- // // Detect App opened via Click inside Flutter
61- // val pendingIntentWithData = HomeWidgetLaunchIntent.getActivity(
62- // context,
63- // MainActivity::class.java,
64- // Uri.parse("homeWidgetExample://message?message=$message"))
65- // setOnClickPendingIntent(R.id.widget_message, pendingIntentWithData)
88+ override fun onDataSetChanged () {
89+ if (tasksJsonString != null ) {
90+ try {
91+ val jsonArray = OrgJSONArray (tasksJsonString as String )
92+ for (i in 0 until jsonArray.length()) {
93+ tasks.add(Task .fromJson(jsonArray.getJSONObject(i)))
94+ }
95+ } catch (e: JSONException ) {
96+ e.printStackTrace()
6697 }
67-
68- appWidgetManager.updateAppWidget(widgetId, views)
6998 }
7099 }
100+
101+ override fun onDestroy () {}
102+
103+ override fun getCount (): Int = tasks.size
104+
105+ override fun getViewAt (position : Int ): RemoteViews {
106+ val task = tasks[position]
107+ return RemoteViews (context.packageName, R .layout.listitem_layout).apply {
108+ setTextViewText(R .id.title_textview, task.title)
109+ setTextViewText(R .id.urgency_textview, task.urgencyLevel)
110+ val a = Intent ().apply {
111+
112+ Bundle ().also { extras ->
113+ extras.putString(" uuid" , " ${tasks[position].uuid} " )
114+ putExtras(extras)
115+ }
116+
117+ }
118+ setOnClickFillInIntent(R .id.list_item_container,a)
119+
120+ }
121+
122+ }
123+ override fun getLoadingView (): RemoteViews ? = null
124+
125+ override fun getViewTypeCount (): Int = 1
126+
127+ override fun getItemId (position : Int ): Long = position.toLong()
128+
129+ override fun hasStableIds (): Boolean = true
130+ }
131+ class ListViewRemoteViewsService : RemoteViewsService () {
132+
133+ override fun onGetViewFactory (intent : Intent ): RemoteViewsFactory {
134+ val tasksJsonString = intent.getStringExtra(" tasksJsonString" )
135+ return ListViewRemoteViewsFactory (applicationContext, tasksJsonString)
136+ }
137+ }
138+ data class Task (val title : String , val urgencyLevel : String ,val uuid : String ) {
139+ companion object {
140+ fun fromJson (json : JSONObject ): Task {
141+ val title = json.optString(" description" , " " )
142+ val urgencyLevel = json.optString(" urgency" , " " )
143+ val uuid = json.optString(" uuid" ," " )
144+ return Task (title, urgencyLevel,uuid)
145+ }
146+ }
71147}
0 commit comments