1+ package com.example.util.simpletimetracker.feature_widget.grid
2+
3+ import android.app.PendingIntent
4+ import android.appwidget.AppWidgetManager
5+ import android.appwidget.AppWidgetProvider
6+ import android.content.Context
7+ import android.content.Intent
8+ import android.os.Bundle
9+ import android.widget.RemoteViews
10+ import com.example.util.simpletimetracker.core.extension.allowDiskRead
11+ import com.example.util.simpletimetracker.core.utils.PendingIntents
12+ import com.example.util.simpletimetracker.domain.widget.interactor.WidgetInteractor
13+ import com.example.util.simpletimetracker.domain.widget.model.WidgetType
14+ import com.example.util.simpletimetracker.feature_widget.R
15+ import com.example.util.simpletimetracker.feature_widget.common.WidgetTypeClickManager
16+ import dagger.hilt.android.AndroidEntryPoint
17+ import kotlinx.coroutines.MainScope
18+ import kotlinx.coroutines.launch
19+ import javax.inject.Inject
20+
21+
22+ @AndroidEntryPoint
23+ class WidgetGridProvider : AppWidgetProvider () {
24+
25+ @Inject
26+ lateinit var widgetTypeClickManager: WidgetTypeClickManager
27+
28+ @Inject
29+ lateinit var widgetInteractor: WidgetInteractor
30+
31+ // TODO WIDGET use WidgetViewsHolder
32+ // TODO WIDGET add preview
33+ // TODO WIDGET translate strings
34+ // TODO WIDGET show tag selection
35+ // TODO Lunch activity is not ticking
36+
37+ override fun onReceive (context : Context ? , intent : Intent ? ) {
38+ super .onReceive(context, intent)
39+ if (intent?.action == ITEM_CLICK_ACTION ) onClick(context, intent)
40+ }
41+
42+ override fun onUpdate (
43+ context : Context ? ,
44+ appWidgetManager : AppWidgetManager ? ,
45+ appWidgetIds : IntArray? ,
46+ ) {
47+ appWidgetIds?.forEach { widgetId ->
48+ updateAppWidget(context, appWidgetManager, widgetId)
49+ }
50+ }
51+
52+ override fun onAppWidgetOptionsChanged (
53+ context : Context ? ,
54+ appWidgetManager : AppWidgetManager ? ,
55+ appWidgetId : Int ,
56+ newOptions : Bundle ? ,
57+ ) {
58+ super .onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions)
59+ updateAppWidget(context, appWidgetManager, appWidgetId)
60+ }
61+
62+ private fun updateAppWidget (
63+ context : Context ? ,
64+ appWidgetManager : AppWidgetManager ? ,
65+ appWidgetId : Int ,
66+ ) {
67+ if (context == null || appWidgetManager == null ) return
68+
69+ val serviceIntent = Intent (context, WidgetGridRemoteViewsService ::class .java)
70+ serviceIntent.putExtra(AppWidgetManager .EXTRA_APPWIDGET_ID , appWidgetId)
71+
72+ val views = RemoteViews (context.packageName, R .layout.widgets_layout)
73+ views.setRemoteAdapter(R .id.listWidgets, serviceIntent)
74+ // TODO WIDGET set empty view
75+
76+ // TODO WIDGET fillInIntent not working
77+ // val clickIntent = Intent(context, WidgetGridProvider::class.java)
78+ // clickIntent.action = ITEM_CLICK_ACTION
79+ // val clickPendingIntent = PendingIntent.getBroadcast(
80+ // context,
81+ // 0,
82+ // clickIntent,
83+ // PendingIntents.getFlags()
84+ // )
85+ // views.setPendingIntentTemplate(R.id.listWidgets, clickPendingIntent)
86+
87+ appWidgetManager.updateAppWidget(appWidgetId, views)
88+ // TODO WIDGET
89+ appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R .id.listWidgets)
90+ }
91+
92+ private fun onClick (
93+ context : Context ? ,
94+ intent : Intent ,
95+ ) {
96+ allowDiskRead { MainScope () }.launch {
97+ widgetTypeClickManager.onClick(
98+ context = context,
99+ recordTypeId = intent.getLongExtra(TYPE_ID_EXTRA , 0 ),
100+ onWidgetUpdate = { widgetInteractor.updateWidgets(WidgetType .GRID ) }
101+ )
102+ }
103+ }
104+
105+ companion object {
106+ // TODO WIDGET
107+ const val TYPE_ID_EXTRA =
108+ " com.example.util.simpletimetracker.feature_widget.grid.typeIdExtra"
109+ const val ITEM_CLICK_ACTION =
110+ " com.yourdomain.app.ITEM_CLICK_ACTION"
111+ }
112+ }
0 commit comments