Skip to content

Commit 885085a

Browse files
authored
Merge branch 'main' into 24-issue
2 parents 98f41eb + 5cd602c commit 885085a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+2517
-1271
lines changed

android/app/src/main/AndroidManifest.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
<action android:name="android.intent.action.MAIN"/>
3131
<category android:name="android.intent.category.LAUNCHER"/>
3232
</intent-filter>
33+
<intent-filter>
34+
<action android:name="es.antonborri.home_widget.action.LAUNCH" />
35+
</intent-filter>
3336
</activity>
3437
<receiver android:name="TaskWarriorWidgetProvider"
3538
android:exported="true">
@@ -49,7 +52,9 @@
4952
</receiver>
5053
<service android:name="es.antonborri.home_widget.HomeWidgetBackgroundService"
5154
android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true"/>
52-
55+
<service
56+
android:name=".ListViewRemoteViewsService"
57+
android:permission="android.permission.BIND_REMOTEVIEWS" />
5358
<!-- Don't delete the meta-data below.
5459
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
5560
<meta-data
Lines changed: 120 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package com.ccextractor.taskwarriorflutter
2-
2+
import android.util.Log
33
import android.appwidget.AppWidgetManager
44
import android.content.Context
55
import android.content.SharedPreferences
@@ -10,62 +10,138 @@ import android.widget.RemoteViews
1010
import es.antonborri.home_widget.HomeWidgetBackgroundIntent
1111
import es.antonborri.home_widget.HomeWidgetLaunchIntent
1212
import 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
1420
import com.ccextractor.taskwarriorflutter.MainActivity
1521
import 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
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<!-- list_item_layout.xml -->
2+
3+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
4+
android:id="@+id/list_item_container"
5+
android:layout_width="match_parent"
6+
android:layout_height="wrap_content"
7+
android:background="@drawable/border_style"
8+
android:orientation="vertical"
9+
android:padding="16dp">
10+
11+
<!-- Title TextView -->
12+
<TextView
13+
android:id="@+id/title_textview"
14+
android:layout_width="match_parent"
15+
android:layout_height="wrap_content"
16+
android:text="Task Title"
17+
android:textColor="#666666"
18+
android:textSize="18sp"
19+
android:textStyle="bold"/>
20+
21+
<!-- Urgency Level TextView -->
22+
<TextView
23+
android:id="@+id/urgency_textview"
24+
android:layout_width="match_parent"
25+
android:layout_height="wrap_content"
26+
27+
android:text="Urgency Level"
28+
android:textSize="14sp"
29+
android:textColor="#666666"/>
30+
31+
</LinearLayout>

0 commit comments

Comments
 (0)