diff options
9 files changed, 107 insertions, 15 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt index c979ca63950a..475179dfdb72 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt @@ -198,13 +198,22 @@ class CommunalWidgetRepositoryImplTest : SysuiTestCase() { } @Test - fun deleteWidget_removeWidgetId_andDeleteFromDb() = + fun deleteWidgetFromDb() = testScope.runTest { val id = 1 - underTest.deleteWidget(id) + underTest.deleteWidgetFromDb(id) runCurrent() verify(communalWidgetDao).deleteWidgetById(id) + } + + @Test + fun deleteWidgetFromHost() = + testScope.runTest { + val id = 1 + underTest.deleteWidgetFromHost(id) + runCurrent() + verify(appWidgetHost).deleteAppWidgetId(id) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt index d864483d95da..cf727cf5e180 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt @@ -144,6 +144,49 @@ class CommunalEditModeViewModelTest : SysuiTestCase() { } @Test + fun deleteWidget() = + testScope.runTest { + tutorialRepository.setTutorialSettingState(Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED) + + // Widgets available. + val widgets = + listOf( + CommunalWidgetContentModel( + appWidgetId = 0, + priority = 30, + providerInfo = mock(), + ), + CommunalWidgetContentModel( + appWidgetId = 1, + priority = 20, + providerInfo = mock(), + ), + ) + widgetRepository.setCommunalWidgets(widgets) + + val communalContent by collectLastValue(underTest.communalContent) + + // Widgets and CTA tile are shown. + assertThat(communalContent?.size).isEqualTo(3) + assertThat(communalContent?.get(0)) + .isInstanceOf(CommunalContentModel.Widget::class.java) + assertThat(communalContent?.get(1)) + .isInstanceOf(CommunalContentModel.Widget::class.java) + assertThat(communalContent?.get(2)) + .isInstanceOf(CommunalContentModel.CtaTileInEditMode::class.java) + + underTest.onDeleteWidget(widgets.get(0).appWidgetId) + + // Only one widget and CTA tile remain. + assertThat(communalContent?.size).isEqualTo(2) + val item = communalContent?.get(0) + val appWidgetId = if (item is CommunalContentModel.Widget) item.appWidgetId else null + assertThat(appWidgetId).isEqualTo(widgets.get(1).appWidgetId) + assertThat(communalContent?.get(1)) + .isInstanceOf(CommunalContentModel.CtaTileInEditMode::class.java) + } + + @Test fun reorderWidget_uiEventLogging_start() { underTest.onReorderWidgetStart() verify(uiEventLogger).log(CommunalUiEvent.COMMUNAL_HUB_REORDER_WIDGET_START) diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalWidgetDao.kt b/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalWidgetDao.kt index 779446d3cd37..3b727d2a7ade 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalWidgetDao.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalWidgetDao.kt @@ -97,7 +97,7 @@ interface CommunalWidgetDao { fun getWidgets(): Flow<Map<CommunalItemRank, CommunalWidgetItem>> @Query("SELECT * FROM communal_widget_table WHERE widget_id = :id") - fun getWidgetByIdNow(id: Int): CommunalWidgetItem + fun getWidgetByIdNow(id: Int): CommunalWidgetItem? @Delete fun deleteWidgets(vararg widgets: CommunalWidgetItem) @@ -120,7 +120,9 @@ interface CommunalWidgetDao { fun updateWidgetOrder(widgetIdToPriorityMap: Map<Int, Int>) { widgetIdToPriorityMap.forEach { (id, priority) -> val widget = getWidgetByIdNow(id) - updateItemRank(widget.itemId, priority) + if (widget != null) { + updateItemRank(widget.itemId, priority) + } } } @@ -134,9 +136,13 @@ interface CommunalWidgetDao { } @Transaction - fun deleteWidgetById(widgetId: Int) { - val widget = getWidgetByIdNow(widgetId) + fun deleteWidgetById(widgetId: Int): Boolean { + val widget = + getWidgetByIdNow(widgetId) ?: // no entry to delete from db + return false + deleteItemRankById(widget.itemId) deleteWidgets(widget) + return true } } diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalWidgetRepository.kt b/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalWidgetRepository.kt index f36547b01802..2ac9d053f8d0 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalWidgetRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalWidgetRepository.kt @@ -54,8 +54,11 @@ interface CommunalWidgetRepository { configurator: WidgetConfigurator? = null ) {} - /** Delete a widget by id from app widget service and the database. */ - fun deleteWidget(widgetId: Int) {} + /** Delete a widget by id from the database. */ + fun deleteWidgetFromDb(widgetId: Int) {} + + /** Delete a widget by id from app widget host. */ + fun deleteWidgetFromHost(widgetId: Int) {} /** * Update the order of widgets in the database. @@ -143,9 +146,18 @@ constructor( } } - override fun deleteWidget(widgetId: Int) { + override fun deleteWidgetFromDb(widgetId: Int) { + bgScope.launch { + if (communalWidgetDao.deleteWidgetById(widgetId)) { + logger.i("Deleted widget with id $widgetId from DB .") + } else { + logger.w("Widget with id $widgetId cannot be deleted from DB.") + } + } + } + + override fun deleteWidgetFromHost(widgetId: Int) { bgScope.launch { - communalWidgetDao.deleteWidgetById(widgetId) appWidgetHost.deleteAppWidgetId(widgetId) logger.i("Deleted widget with id $widgetId.") } diff --git a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt index 9658401f462f..75a27a278116 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt @@ -237,9 +237,15 @@ constructor( configurator: WidgetConfigurator?, ) = widgetRepository.addWidget(componentName, priority, configurator) - /** Delete a widget by id. */ - fun deleteWidget(id: Int) = widgetRepository.deleteWidget(id) + /** + * Delete a widget by id from the database. [CommunalAppWidgetHostStartable] invokes this + * function to manage the deletion from the database for uninstalled or user-deleted widgets, + * following the removal of a widget from the host. + */ + fun deleteWidgetFromDb(id: Int) = widgetRepository.deleteWidgetFromDb(id) + /** Delete a widget by id from AppWidgetHost. Called when user deletes a widget from the hub */ + fun deleteWidgetFromHost(id: Int) = widgetRepository.deleteWidgetFromHost(id) /** * Reorder the widgets. * diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt index 0b355cc10db5..69d55815fe01 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt @@ -62,7 +62,7 @@ constructor( override val reorderingWidgets: StateFlow<Boolean> get() = _reorderingWidgets - override fun onDeleteWidget(id: Int) = communalInteractor.deleteWidget(id) + override fun onDeleteWidget(id: Int) = communalInteractor.deleteWidgetFromHost(id) override fun onReorderWidgets(widgetIdToPriorityMap: Map<Int, Int>) = communalInteractor.updateWidgetOrder(widgetIdToPriorityMap) diff --git a/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalAppWidgetHostStartable.kt b/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalAppWidgetHostStartable.kt index fb9abeb4fbcf..6fd0fbe80fd7 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalAppWidgetHostStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalAppWidgetHostStartable.kt @@ -50,7 +50,7 @@ constructor( .launchIn(bgScope) appWidgetHost.appWidgetIdToRemove - .onEach { appWidgetId -> communalInteractor.deleteWidget(appWidgetId) } + .onEach { appWidgetId -> communalInteractor.deleteWidgetFromDb(appWidgetId) } .launchIn(bgScope) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/communal/data/db/CommunalWidgetDaoTest.kt b/packages/SystemUI/tests/src/com/android/systemui/communal/data/db/CommunalWidgetDaoTest.kt index 9c5cd713dffb..20dd913550d3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/communal/data/db/CommunalWidgetDaoTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/communal/data/db/CommunalWidgetDaoTest.kt @@ -77,6 +77,18 @@ class CommunalWidgetDaoTest : SysuiTestCase() { } @Test + fun deleteWidget_notInDb_returnsFalse() = + testScope.runTest { + val (widgetId, provider, priority) = widgetInfo1 + communalWidgetDao.addWidget( + widgetId = widgetId, + provider = provider, + priority = priority, + ) + assertThat(communalWidgetDao.deleteWidgetById(widgetId = 123)).isFalse() + } + + @Test fun addWidget_emitsActiveWidgetsInDb(): Unit = testScope.runTest { val widgetsToAdd = listOf(widgetInfo1, widgetInfo2) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalWidgetRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalWidgetRepository.kt index fab64e38e1f8..7301404eada0 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalWidgetRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalWidgetRepository.kt @@ -36,7 +36,7 @@ class FakeCommunalWidgetRepository(private val coroutineScope: CoroutineScope) : } } - override fun deleteWidget(widgetId: Int) { + override fun deleteWidgetFromDb(widgetId: Int) { if (_communalWidgets.value.none { it.appWidgetId == widgetId }) { return } @@ -44,6 +44,10 @@ class FakeCommunalWidgetRepository(private val coroutineScope: CoroutineScope) : _communalWidgets.value = _communalWidgets.value.filter { it.appWidgetId != widgetId } } + override fun deleteWidgetFromHost(widgetId: Int) { + deleteWidgetFromDb(widgetId) + } + private fun onConfigured(id: Int, providerInfo: AppWidgetProviderInfo, priority: Int) { _communalWidgets.value += listOf(CommunalWidgetContentModel(id, providerInfo, priority)) } |