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))      } |