Skip to content

Commit 5174c19

Browse files
authored
Merge pull request #295 from JangamRuthvik/dev
implemeted scroll view of home widget
2 parents 13d9a6b + 2b0b222 commit 5174c19

File tree

8 files changed

+185
-225
lines changed

8 files changed

+185
-225
lines changed

android/app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@
4949
</receiver>
5050
<service android:name="es.antonborri.home_widget.HomeWidgetBackgroundService"
5151
android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true"/>
52-
52+
<service
53+
android:name=".ListViewRemoteViewsService"
54+
android:permission="android.permission.BIND_REMOTEVIEWS" />
5355
<!-- Don't delete the meta-data below.
5456
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
5557
<meta-data
Lines changed: 80 additions & 41 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,7 +10,11 @@ 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 org.json.JSONException
14+
import android.content.Intent
15+
import android.widget.RemoteViewsService
16+
import org.json.JSONObject
17+
import org.json.JSONArray as OrgJSONArray
1418
import com.ccextractor.taskwarriorflutter.MainActivity
1519
import com.ccextractor.taskwarriorflutter.R
1620

@@ -24,48 +28,83 @@ class TaskWarriorWidgetProvider : HomeWidgetProvider() {
2428
val pendingIntent = HomeWidgetLaunchIntent.getActivity(
2529
context,
2630
MainActivity::class.java)
27-
setOnClickPendingIntent(R.id.cardItem, pendingIntent)
28-
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)
47-
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-
// }
59-
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)
31+
setOnClickPendingIntent(R.id.container_layout, pendingIntent)
32+
33+
// setOnClickPendingIntent(R.id.idTvTitle, backgroundIntent)
34+
35+
val tasksJsonString = widgetData.getString("tasks", null)
36+
37+
val intent = Intent(context,ListViewRemoteViewsService::class.java).apply {
38+
putExtra("tasksJsonString", tasksJsonString)
39+
data = Uri.parse(toUri(Intent.URI_INTENT_SCHEME))
40+
}
41+
setRemoteAdapter(R.id.list_view, intent)
42+
val listViewPendingIntentTemplate = HomeWidgetLaunchIntent.getActivity(context, MainActivity::class.java, Uri.parse("examplehomewidget://mainactivity"))
43+
44+
setPendingIntentTemplate(R.id.list_view, listViewPendingIntentTemplate)
6645
}
6746

6847
appWidgetManager.updateAppWidget(widgetId, views)
48+
}
49+
}
50+
}
51+
class ListViewRemoteViewsFactory(
52+
private val context: Context,
53+
private val tasksJsonString: String?
54+
) : RemoteViewsService.RemoteViewsFactory {
55+
56+
private val tasks = mutableListOf<Task>()
57+
58+
override fun onCreate() {}
59+
60+
override fun onDataSetChanged() {
61+
if (tasksJsonString != null) {
62+
try {
63+
val jsonArray = OrgJSONArray(tasksJsonString as String)
64+
for (i in 0 until jsonArray.length()) {
65+
tasks.add(Task.fromJson(jsonArray.getJSONObject(i)))
66+
}
67+
} catch (e: JSONException) {
68+
e.printStackTrace()
69+
}
6970
}
7071
}
72+
73+
override fun onDestroy() {}
74+
75+
override fun getCount(): Int = tasks.size
76+
77+
override fun getViewAt(position: Int): RemoteViews {
78+
val task = tasks[position]
79+
80+
val taskView = RemoteViews(context.packageName, R.layout.listitem_layout)
81+
taskView.setTextViewText(R.id.title_textview, task.title)
82+
taskView.setTextViewText(R.id.urgency_textview, task.urgencyLevel)
83+
84+
return taskView
85+
}
86+
87+
override fun getLoadingView(): RemoteViews? = null
88+
89+
override fun getViewTypeCount(): Int = 1
90+
91+
override fun getItemId(position: Int): Long = position.toLong()
92+
93+
override fun hasStableIds(): Boolean = true
94+
}
95+
class ListViewRemoteViewsService : RemoteViewsService() {
96+
97+
override fun onGetViewFactory(intent: Intent): RemoteViewsFactory {
98+
val tasksJsonString = intent.getStringExtra("tasksJsonString")
99+
return ListViewRemoteViewsFactory(applicationContext, tasksJsonString)
100+
}
101+
}
102+
data class Task(val title: String, val urgencyLevel: String) {
103+
companion object {
104+
fun fromJson(json: JSONObject): Task {
105+
val title = json.optString("description", "")
106+
val urgencyLevel = json.optString("urgency", "")
107+
return Task(title, urgencyLevel)
108+
}
109+
}
71110
}
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>
Lines changed: 41 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -1,128 +1,43 @@
1-
<?xml version="1.0" encoding="utf-8"?>
2-
<RelativeLayout
3-
xmlns:android="http://schemas.android.com/apk/res/android"
4-
android:id="@+id/cardItem"
5-
android:layout_width="match_parent"
6-
android:layout_height="wrap_content"
7-
style="@style/Widget.Android.AppWidget.Container"
8-
android:theme="@style/Theme.Android.AppWidgetContainer"
9-
android:background="@drawable/app_widget_item_layout_bg"
10-
android:paddingLeft="10dp"
11-
android:paddingRight="10dp"
12-
android:paddingTop="10dp"
13-
android:paddingBottom="10dp">
14-
15-
<TextView
16-
android:id="@+id/taskWarriorText"
17-
android:layout_width="wrap_content"
18-
android:layout_height="wrap_content"
19-
android:text="TaskWarrior"
20-
android:textSize="20sp"
21-
android:textStyle="bold"
22-
android:layout_alignParentTop="true"
23-
android:layout_centerHorizontal="true"
24-
android:layout_marginTop="12dp"/>
25-
26-
<!-- Pending Task TextView -->
27-
<TextView
28-
android:id="@+id/pendingTaskText"
29-
android:layout_width="wrap_content"
30-
android:layout_height="wrap_content"
31-
android:text="Pending Tasks"
32-
android:textSize="18sp"
33-
android:textStyle="bold"
34-
android:layout_below="@id/taskWarriorText"
35-
android:layout_centerHorizontal="true"
36-
android:layout_marginTop="8dp"/>
37-
<LinearLayout
38-
android:id="@+id/firstLayout"
39-
android:layout_width="match_parent"
40-
android:layout_height="wrap_content"
41-
android:layout_below="@id/pendingTaskText"
42-
android:layout_marginTop="8dp"
43-
android:background="@drawable/border_style"
44-
android:layout_marginLeft="8dp"
45-
android:layout_marginRight="8dp"
46-
android:orientation="vertical"
47-
android:padding="8dp">
48-
49-
<TextView
50-
android:id="@+id/idTvTitle"
51-
android:layout_width="wrap_content"
52-
android:layout_height="wrap_content"
53-
android:text="Title"
54-
android:textSize="16sp"
55-
android:textStyle="bold" />
56-
57-
<TextView
58-
android:id="@+id/idTvDate"
59-
android:layout_width="wrap_content"
60-
android:layout_height="wrap_content"
61-
android:layout_marginTop="4dp"
62-
android:text="Subtitle"
63-
android:textColor="#666666"
64-
android:textSize="14sp" />
65-
</LinearLayout>
66-
67-
<LinearLayout
68-
android:id="@+id/secondLayout"
69-
android:layout_width="match_parent"
70-
android:layout_height="wrap_content"
71-
android:layout_below="@id/firstLayout"
72-
android:layout_marginTop="8dp"
73-
android:background="@drawable/border_style"
74-
android:orientation="vertical"
75-
android:layout_marginLeft="8dp"
76-
android:layout_marginRight="8dp"
77-
android:padding="8dp">
1+
<!-- container_layout.xml -->
782

79-
<TextView
80-
android:id="@+id/idTvTitle2"
81-
android:layout_width="wrap_content"
82-
android:layout_height="wrap_content"
83-
android:text="Title"
84-
android:textSize="16sp"
85-
android:textStyle="bold" />
86-
87-
<TextView
88-
android:id="@+id/idTvDate2"
89-
android:layout_width="wrap_content"
90-
android:layout_height="wrap_content"
91-
android:layout_marginTop="4dp"
92-
android:text="Subtitle"
93-
android:textColor="#666666"
94-
android:textSize="14sp" />
95-
</LinearLayout>
96-
97-
<LinearLayout
98-
android:id="@+id/thirdLayout"
99-
android:layout_width="match_parent"
100-
android:layout_height="wrap_content"
101-
android:layout_below="@id/secondLayout"
102-
android:layout_marginTop="8dp"
103-
android:layout_marginBottom="8dp"
3+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
4+
android:id="@+id/container_layout"
5+
android:layout_width="match_parent"
6+
android:layout_height="match_parent"
7+
style="@style/Widget.Android.AppWidget.Container"
1048
android:background="@drawable/border_style"
105-
android:layout_marginLeft="8dp"
106-
android:layout_marginRight="8dp"
107-
android:orientation="vertical"
108-
android:padding="8dp">
109-
110-
<TextView
111-
android:id="@+id/idTvTitle3"
112-
android:layout_width="wrap_content"
113-
android:layout_height="wrap_content"
114-
android:text="Title"
115-
android:textSize="16sp"
116-
android:textStyle="bold" />
117-
118-
<TextView
119-
android:id="@+id/idTvDate3"
120-
android:layout_width="wrap_content"
121-
android:layout_height="wrap_content"
122-
android:layout_marginTop="4dp"
123-
android:text="Subtitle"
124-
android:textColor="#666666"
125-
android:textSize="14sp" />
126-
</LinearLayout>
127-
128-
</RelativeLayout>
9+
android:theme="@style/Theme.Android.AppWidgetContainer"
10+
android:orientation="vertical">
11+
12+
<!-- Title TextView -->
13+
<TextView
14+
android:id="@+id/title_textview"
15+
android:layout_width="wrap_content"
16+
android:layout_height="wrap_content"
17+
android:layout_gravity="center_horizontal"
18+
android:layout_marginTop="16dp"
19+
android:text="Task Warrior"
20+
android:textColor="#666666"
21+
android:textSize="24sp"
22+
android:textStyle="bold"/>
23+
24+
<!-- Subtitle TextView -->
25+
<TextView
26+
android:id="@+id/subtitle_textview"
27+
android:layout_width="wrap_content"
28+
android:layout_height="wrap_content"
29+
android:layout_gravity="center_horizontal"
30+
android:textColor="#666666"
31+
android:layout_marginTop="8dp"
32+
android:text="Pending Tasks"
33+
android:textSize="18sp"/>
34+
35+
<!-- ListView -->
36+
<ListView
37+
android:id="@+id/list_view"
38+
android:layout_width="match_parent"
39+
android:layout_height="0dp"
40+
android:layout_weight="1"
41+
android:scrollbars="vertical"/>
42+
43+
</LinearLayout>
Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
<?xml version="1.0" encoding="utf-8"?>
21
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
3-
android:minWidth="300dip"
4-
android:minHeight="150dip"
5-
2+
android:minWidth="300dip"
3+
android:minHeight="150dip"
64
android:updatePeriodMillis="86400000"
75
android:initialLayout="@layout/taskwarrior_layout"
86
android:resizeMode="horizontal|vertical"
97
android:previewImage="@drawable/preview"
10-
android:description="@string/my_widget_description">
11-
12-
android:widgetCategory="home_screen">
13-
</appwidget-provider>
8+
android:description="@string/my_widget_description"
9+
android:widgetCategory="home_screen" />

0 commit comments

Comments
 (0)