Не обновляется виджет вне приложения
Всем привет. Помогите разобраться с виджетом. Есть виджет, отображающий список. ListView. Есть кнопка обновить. Список подтягивается из базы данных. Проблема в том, что когда я захожу в приложение, сворачиваю его и нажимаю обновить на виджете, то он не обновляется, ничего не меняется даже есть я в базе данных в списке меняю элементы. А если я выхожу из приложения полностью, чтобы по приложению отработал ондестрой, и нажимаю на виджете обновить, то он без проблем подтягивает актуальную версию списка из БД. Помогите решить эту проблему. Вот мой виджет:
const val ACTION_ON_CLICK = "itemonclick"
const val ITEM_POSITION = "item_position"
class FavoriteGatesWidgetProvider :
AppWidgetProvider(),
KoinComponent,
WidgetRepository.ResponseListener {
private val widgetRepository: WidgetRepository by lazy { WidgetRepository(this) }
private val remoteViews =
RemoteViews(TPSApplication.app.packageName, R.layout.favorite_gates_widget)
private var listResponse: Resource<List<FavoriteGate>>? = null
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray
) {
Log.e("FFFF", "onUpdate")
for (appWidgetId in appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId)
}
}
override fun onReceive(context: Context?, intent: Intent?) {
super.onReceive(context, intent)
Log.e("FFFF", "onreceive")
if (intent?.action.equals(ACTION_ON_CLICK, true)) {
val itemPos = intent?.getIntExtra(ITEM_POSITION, -1)
if (itemPos != -1) {
Toast.makeText(
context, "Открывается $itemPos",
Toast.LENGTH_SHORT
).show()
widgetRepository.openGate()
}
} else if (intent?.action.equals(ACTION_APPWIDGET_UPDATE, true)) {
getGatesList()
}
}
override fun onEnabled(context: Context) {
Log.e("FFFF", "enable")
getGatesList()
}
override fun onDisabled(context: Context) {
Log.e("FFFF", "disable")
// Enter relevant functionality for when the last widget is disabled
}
private fun updateAppWidget(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetId: Int
) {
//setList(remoteViews, context, appWidgetId, listResponse ?: Resource(Status.ERROR, null, null, null))
setUpdateButton(remoteViews, context, appWidgetId)
setListClick(remoteViews, context, appWidgetId)
appWidgetManager.updateAppWidget(appWidgetId, remoteViews)
//appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.listview_gate_list)
}
private fun setList(rv: RemoteViews, context: Context, appWidgetId: Int, listResponse: Resource<List<FavoriteGate>>) {
if (listResponse.status == Status.SUCCESS && listResponse.data != null) {
Intent(context, WidgetService::class.java).also { adapter ->
adapter.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
val data: Uri = Uri.parse(adapter.toUri(Intent.URI_INTENT_SCHEME))
adapter.data = data
// сюда помещать список
val bundle = Bundle().apply {
putParcelableArrayList("list", listResponse.data as ArrayList<out Parcelable>)
}
adapter.putExtra("list", bundle)
rv.setRemoteAdapter(R.id.listview_gate_list, adapter)
}
}
}
private fun setUpdateButton(rv: RemoteViews, context: Context, appWidgetId: Int) {
Intent(context, FavoriteGatesWidgetProvider::class.java).also { updIntent ->
updIntent.action = ACTION_APPWIDGET_UPDATE
updIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(appWidgetId))
PendingIntent.getBroadcast(context, appWidgetId, updIntent, 0).let { updatePending ->
rv.setOnClickPendingIntent(R.id.button_update, updatePending)
}
}
}
private fun setListClick(rv: RemoteViews, context: Context, appWidgetId: Int) {
val listClickIntent = Intent(context, FavoriteGatesWidgetProvider::class.java)
listClickIntent.action = ACTION_ON_CLICK
val listClickPIntent = PendingIntent.getBroadcast(
context, 0,
listClickIntent, 0
)
rv.setPendingIntentTemplate(R.id.listview_gate_list, listClickPIntent)
}
override fun onOpenGateResponseReceived(gateResponse: Resource<OpenGateResponse>) {
remoteViews.setTextViewText(R.id.textview_gate_status, "qweqwe")
val updIntent = Intent(TPSApplication.app, FavoriteGatesWidgetProvider::class.java)
updIntent.action = ACTION_APPWIDGET_UPDATE
val updPIntent = PendingIntent.getBroadcast(
TPSApplication.app,
1, updIntent, 0
)
Intent().also { clickIntent ->
remoteViews.setTextViewText(R.id.textview_gate_status, "asdasdasdasd")
remoteViews.setOnClickFillInIntent(R.id.textview_gate_status, clickIntent)
}
}
override fun onGatesListResponseReceived(listResponse: Resource<List<FavoriteGate>>) {
Log.e("FFFF", "listresponce" + listResponse?.data?.size.toString())
this.listResponse = listResponse
val componentName = ComponentName(TPSApplication.app, FavoriteGatesWidgetProvider::class.java)
val manager = AppWidgetManager.getInstance(TPSApplication.app)
setList(remoteViews, TPSApplication.app, manager.getAppWidgetIds(componentName)[0], listResponse)
manager.updateAppWidget(componentName, remoteViews)
}
fun getGatesList() { widgetRepository.getGatesList() }
}
WidgetFactory
class WidgetFactory(val context: Context, val intent: Intent) :
RemoteViewsService.RemoteViewsFactory, KoinComponent {
private var gatesArray = mutableListOf<FavoriteGate>()
override fun onCreate() {}
override fun onDataSetChanged() {
val bundle = intent.getBundleExtra("list")
val list = bundle?.getParcelableArrayList<FavoriteGate>("list")
gatesArray = list as MutableList<FavoriteGate>
}
override fun onDestroy() {}
override fun getCount() = gatesArray.size ?: 0
override fun getViewAt(position: Int): RemoteViews {
val rView = RemoteViews(
context.packageName,
R.layout.item_list_widget
)
try {
rView.setTextViewText(R.id.textview_gate_name, gatesArray[position].name)
} catch (e: IndexOutOfBoundsException) {
}
Intent().also { clickIntent ->
clickIntent.putExtra(ITEM_POSITION, position)
rView.setOnClickFillInIntent(R.id.button_gate, clickIntent)
}
return rView
}
override fun getLoadingView() = null
override fun getViewTypeCount() = 1
override fun getItemId(position: Int) = position.toLong()
override fun hasStableIds() = true
}
WidgetService
class WidgetService : RemoteViewsService() {
override fun onGetViewFactory(intent: Intent) = WidgetFactory(applicationContext, intent)
}