Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 65672477 authored by Alex Stetson's avatar Alex Stetson
Browse files

Make AppWidgetManager provider optional

AppWidgetManager can be null on systems that don't support that feature.
Therefore, the provider must be optional to avoid returning null.

Bug: 318589068
Test: presubmit
Flag: NONE

Change-Id: I5c1e99e70a89852dcbfce74b279bcbdc612822dc
parent 13627b32
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import com.android.systemui.util.mockito.kotlinArgumentCaptor
import com.android.systemui.util.mockito.nullable
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
import java.util.Optional
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flowOf
@@ -63,6 +64,8 @@ import org.mockito.MockitoAnnotations
@SmallTest
@RunWith(AndroidJUnit4::class)
class CommunalWidgetRepositoryImplTest : SysuiTestCase() {
    @Mock private lateinit var appWidgetManagerOptional: Optional<AppWidgetManager>

    @Mock private lateinit var appWidgetManager: AppWidgetManager

    @Mock private lateinit var appWidgetHost: AppWidgetHost
@@ -113,6 +116,8 @@ class CommunalWidgetRepositoryImplTest : SysuiTestCase() {
        whenever(stopwatchProviderInfo.loadLabel(any())).thenReturn("Stopwatch")
        whenever(userTracker.userHandle).thenReturn(userHandle)
        whenever(communalWidgetDao.getWidgets()).thenReturn(flowOf(emptyMap()))
        whenever(appWidgetManagerOptional.isPresent).thenReturn(true)
        whenever(appWidgetManagerOptional.get()).thenReturn(appWidgetManager)
    }

    @Test
@@ -296,7 +301,7 @@ class CommunalWidgetRepositoryImplTest : SysuiTestCase() {

    private fun initCommunalWidgetRepository(): CommunalWidgetRepositoryImpl {
        return CommunalWidgetRepositoryImpl(
            appWidgetManager,
            appWidgetManagerOptional,
            appWidgetHost,
            testScope.backgroundScope,
            testDispatcher,
+4 −3
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import com.android.systemui.log.LogBuffer
import com.android.systemui.log.core.Logger
import com.android.systemui.log.dagger.CommunalLog
import com.android.systemui.settings.UserTracker
import java.util.Optional
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
@@ -75,7 +76,7 @@ interface CommunalWidgetRepository {
class CommunalWidgetRepositoryImpl
@Inject
constructor(
    private val appWidgetManager: AppWidgetManager,
    private val appWidgetManager: Optional<AppWidgetManager>,
    private val appWidgetHost: AppWidgetHost,
    @Application private val applicationScope: CoroutineScope,
    @Background private val bgDispatcher: CoroutineDispatcher,
@@ -144,7 +145,7 @@ constructor(

    override val communalWidgets: Flow<List<CommunalWidgetContentModel>> =
        isHostActive.flatMapLatest { isHostActive ->
            if (!isHostActive) {
            if (!isHostActive || !appWidgetManager.isPresent) {
                return@flatMapLatest flowOf(emptyList())
            }
            communalWidgetDao.getWidgets().map { it.map(::mapToContentModel) }
@@ -187,7 +188,7 @@ constructor(
        val (_, widgetId) = entry.value
        return CommunalWidgetContentModel(
            appWidgetId = widgetId,
            providerInfo = appWidgetManager.getAppWidgetInfo(widgetId),
            providerInfo = appWidgetManager.get().getAppWidgetInfo(widgetId),
            priority = entry.key.rank,
        )
    }
+4 −3
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import com.android.systemui.res.R
import dagger.Binds
import dagger.Module
import dagger.Provides
import java.util.Optional
import javax.inject.Named

@Module
@@ -41,8 +42,8 @@ interface CommunalWidgetRepositoryModule {

        @SysUISingleton
        @Provides
        fun provideAppWidgetManager(@Application context: Context): AppWidgetManager {
            return AppWidgetManager.getInstance(context)
        fun provideAppWidgetManager(@Application context: Context): Optional<AppWidgetManager> {
            return Optional.ofNullable(AppWidgetManager.getInstance(context))
        }

        @SysUISingleton
@@ -54,7 +55,7 @@ interface CommunalWidgetRepositoryModule {
        @SysUISingleton
        @Provides
        fun provideCommunalWidgetHost(
            appWidgetManager: AppWidgetManager,
            appWidgetManager: Optional<AppWidgetManager>,
            appWidgetHost: AppWidgetHost,
            @CommunalLog logBuffer: LogBuffer,
        ): CommunalWidgetHost {
+8 −3
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.content.ComponentName
import com.android.systemui.log.LogBuffer
import com.android.systemui.log.core.Logger
import com.android.systemui.log.dagger.CommunalLog
import java.util.Optional
import javax.inject.Inject

/**
@@ -31,7 +32,7 @@ import javax.inject.Inject
class CommunalWidgetHost
@Inject
constructor(
    private val appWidgetManager: AppWidgetManager,
    private val appWidgetManager: Optional<AppWidgetManager>,
    private val appWidgetHost: AppWidgetHost,
    @CommunalLog logBuffer: LogBuffer,
) {
@@ -56,6 +57,10 @@ constructor(
        return null
    }

    private fun bindWidget(widgetId: Int, provider: ComponentName): Boolean =
        appWidgetManager.bindAppWidgetIdIfAllowed(widgetId, provider)
    private fun bindWidget(widgetId: Int, provider: ComponentName): Boolean {
        if (appWidgetManager.isPresent) {
            return appWidgetManager.get().bindAppWidgetIdIfAllowed(widgetId, provider)
        }
        return false
    }
}