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

Commit 45cabc2c authored by George Lin's avatar George Lin
Browse files

Handle crash when SecurityException

When the provider does not exists, return an empty flow for quick
affordacnes.

Test: NA
Bug: 336470991
Flag: EXEMPT bugfix
Change-Id: I6d9c18d346d228be51d33096a2905615178de3fe
parent 6eefe300
Loading
Loading
Loading
Loading
+27 −6
Original line number Original line Diff line number Diff line
@@ -34,6 +34,7 @@ import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.onStart
@@ -296,11 +297,21 @@ class CustomizationProviderClientImpl(
    }
    }


    override fun observeSlots(): Flow<List<CustomizationProviderClient.Slot>> {
    override fun observeSlots(): Flow<List<CustomizationProviderClient.Slot>> {
        return observeUri(Contract.LockScreenQuickAffordances.SlotTable.URI).map { querySlots() }
        return try {
            observeUri(Contract.LockScreenQuickAffordances.SlotTable.URI).map { querySlots() }
        } catch (e: SecurityException) {
            Log.e(TAG, "Failed to observe the slots", e)
            emptyFlow()
        }
    }
    }


    override fun observeFlags(): Flow<List<CustomizationProviderClient.Flag>> {
    override fun observeFlags(): Flow<List<CustomizationProviderClient.Flag>> {
        return observeUri(Contract.FlagsTable.URI).map { queryFlags() }
        return try {
            observeUri(Contract.FlagsTable.URI).map { queryFlags() }
        } catch (e: SecurityException) {
            Log.e(TAG, "Failed to observe the flags", e)
            emptyFlow()
        }
    }
    }


    override suspend fun queryAffordances(): List<CustomizationProviderClient.Affordance> {
    override suspend fun queryAffordances(): List<CustomizationProviderClient.Affordance> {
@@ -394,9 +405,14 @@ class CustomizationProviderClientImpl(
    }
    }


    override fun observeAffordances(): Flow<List<CustomizationProviderClient.Affordance>> {
    override fun observeAffordances(): Flow<List<CustomizationProviderClient.Affordance>> {
        return observeUri(Contract.LockScreenQuickAffordances.AffordanceTable.URI).map {
        return try {
            observeUri(Contract.LockScreenQuickAffordances.AffordanceTable.URI).map {
                queryAffordances()
                queryAffordances()
            }
            }
        } catch (e: SecurityException) {
            Log.e(TAG, "Failed to observe the affordances", e)
            emptyFlow()
        }
    }
    }


    override suspend fun querySelections(): List<CustomizationProviderClient.Selection> {
    override suspend fun querySelections(): List<CustomizationProviderClient.Selection> {
@@ -448,9 +464,14 @@ class CustomizationProviderClientImpl(
    }
    }


    override fun observeSelections(): Flow<List<CustomizationProviderClient.Selection>> {
    override fun observeSelections(): Flow<List<CustomizationProviderClient.Selection>> {
        return observeUri(Contract.LockScreenQuickAffordances.SelectionTable.URI).map {
        return try {
            observeUri(Contract.LockScreenQuickAffordances.SelectionTable.URI).map {
                querySelections()
                querySelections()
            }
            }
        } catch (e: SecurityException) {
            Log.e(TAG, "Failed to observe the selections", e)
            emptyFlow()
        }
    }
    }


    override suspend fun deleteSelection(slotId: String, affordanceId: String) {
    override suspend fun deleteSelection(slotId: String, affordanceId: String) {