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

Commit 453b28ea authored by Kshitij Gupta's avatar Kshitij Gupta Committed by Android (Google) Code Review
Browse files

Merge "CommunalBackup: Drop usages of runBlocking" into main

parents 1a1b4098 99192e30
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -99,7 +99,7 @@ class CommunalWidgetRepositoryLocalImplTest(flags: FlagsParameterization) : Sysu
    private val Kosmos.backupManager by Kosmos.Fixture { mock<BackupManager>() }

    private val Kosmos.backupUtils: CommunalBackupUtils by
        Kosmos.Fixture { CommunalBackupUtils(applicationContext) }
        Kosmos.Fixture { CommunalBackupUtils(applicationContext, kosmos.testDispatcher) }

    private val Kosmos.logBuffer: LogBuffer by
        Kosmos.Fixture { logcatLogBuffer(name = "CommunalWidgetRepoLocalImplTest") }
+22 −1
Original line number Diff line number Diff line
@@ -35,12 +35,18 @@ import com.android.systemui.communal.data.backup.CommunalBackupUtils
import com.android.systemui.communal.domain.backup.CommunalPrefsBackupHelper
import com.android.systemui.controls.controller.AuxiliaryPersistenceWrapper
import com.android.systemui.controls.controller.ControlsFavoritePersistenceWrapper
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.inputdevice.tutorial.domain.backup.TutorialSchedulerBackupHelper
import com.android.systemui.keyguard.domain.backup.KeyguardQuickAffordanceBackupHelper
import com.android.systemui.people.widget.PeopleBackupHelper
import com.android.systemui.qs.panels.domain.backup.QSPreferencesBackupHelper
import com.android.systemui.res.R
import com.android.systemui.settings.UserFileManagerImpl
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import java.util.concurrent.Executor
import javax.inject.Inject


/**
 * Helper for backing up elements in SystemUI
@@ -54,6 +60,14 @@ import com.android.systemui.settings.UserFileManagerImpl
 */
open class BackupHelper : BackupAgentHelper() {

    @Inject
    @Background
    lateinit var backgroundDispatcher: CoroutineDispatcher

    @Inject
    @Background
    lateinit var bgScope: CoroutineScope

    companion object {
        const val TAG = "BackupHelper"
        internal const val CONTROLS = ControlsFavoritePersistenceWrapper.FILE_NAME
@@ -100,7 +114,14 @@ open class BackupHelper : BackupAgentHelper() {
            )
            addHelper(
                COMMUNAL_STATE_BACKUP_KEY,
                CommunalBackupHelper(userHandle, CommunalBackupUtils(context = this)),
                CommunalBackupHelper(
                    userHandle,
                    CommunalBackupUtils(
                        context = this,
                        backgroundDispatcher = backgroundDispatcher
                    ),
                    bgScope = bgScope
                ),
            )
        }
    }
+7 −2
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import com.android.systemui.communal.widgets.EditWidgetsActivityStarter
import com.android.systemui.communal.widgets.EditWidgetsActivityStarterImpl
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.res.R
import com.android.systemui.scene.shared.model.SceneContainerConfig
@@ -54,6 +55,7 @@ import dagger.Module
import dagger.Provides
import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap
import kotlinx.coroutines.CoroutineDispatcher
import javax.inject.Named
import kotlinx.coroutines.CoroutineScope

@@ -131,8 +133,11 @@ interface CommunalModule {

        @Provides
        @SysUISingleton
        fun providesCommunalBackupUtils(@Application context: Context): CommunalBackupUtils {
            return CommunalBackupUtils(context)
        fun providesCommunalBackupUtils(
            @Application context: Context,
            @Background backgroundDispatcher: CoroutineDispatcher
        ): CommunalBackupUtils {
            return CommunalBackupUtils(context, backgroundDispatcher)
        }

        /** The prefixes of widgets packages names that are considered loggable. */
+22 −2
Original line number Diff line number Diff line
@@ -22,14 +22,23 @@ import android.app.backup.BackupHelper
import android.os.ParcelFileDescriptor
import android.os.UserHandle
import android.util.Log
import com.android.systemui.Flags
import com.android.systemui.Flags.communalHub
import com.android.systemui.communal.nano.CommunalHubState
import com.android.systemui.communal.proto.toByteArray
import com.android.systemui.dagger.qualifiers.Background
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import java.io.IOException
import javax.inject.Inject

/** Helps with backup & restore of the communal hub widgets. */
class CommunalBackupHelper(
class CommunalBackupHelper
@Inject
constructor(
    private val userHandle: UserHandle,
    private val communalBackupUtils: CommunalBackupUtils,
    @Background private val bgScope: CoroutineScope,
) : BackupHelper {

    override fun performBackup(
@@ -52,7 +61,18 @@ class CommunalBackupHelper(
            return
        }

        if (Flags.doNotUseRunBlocking()) {
            bgScope.launch {
                val state = communalBackupUtils.getCommunalHubState()
                writeCommunalState(state, data)
            }
        } else {
            val state = communalBackupUtils.getCommunalHubStateBlocking()
            writeCommunalState(state, data)
        }
    }

    private fun writeCommunalState(state: CommunalHubState, data: BackupDataOutput) {
        Log.i(TAG, "Backing up communal state: $state")

        val bytes = state.toByteArray()
+35 −2
Original line number Diff line number Diff line
@@ -20,25 +20,58 @@ import android.content.Context
import androidx.annotation.WorkerThread
import com.android.app.tracing.coroutines.runBlockingTraced as runBlocking
import com.android.systemui.communal.data.db.CommunalDatabase
import com.android.systemui.communal.data.db.CommunalItemRank
import com.android.systemui.communal.data.db.CommunalWidgetItem
import com.android.systemui.communal.nano.CommunalHubState
import com.android.systemui.dagger.qualifiers.Background
import kotlinx.coroutines.CoroutineDispatcher
import java.io.File
import java.io.FileInputStream
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.io.IOException
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.withContext
import javax.inject.Inject

/** Utilities for communal backup and restore. */
class CommunalBackupUtils(private val context: Context) {
class CommunalBackupUtils
@Inject
constructor(
    private val context: Context,
    @Background private val backgroundDispatcher: CoroutineDispatcher,
) {

    /**
     * Retrieves a communal hub state protobuf that represents the current state of the communal
     * database.
     */
    @WorkerThread
    fun getCommunalHubState(): CommunalHubState {
    @Deprecated(
        message = "Avoid using runBlocking in production code. Consider asynchronous alternatives.",
        replaceWith = ReplaceWith("getCommunalHubState()")
    )
    fun getCommunalHubStateBlocking(): CommunalHubState {
        val database = CommunalDatabase.getInstance(context)
        val widgetsFromDb = runBlocking { database.communalWidgetDao().getWidgets().first() }
        return getCommunalHubStateInternal(widgetsFromDb)
    }

    /**
     * Retrieves a communal hub state protobuf that represents the current state of the communal
     * database. Suspending equivalent of {@link #getCommunalHubState()} for use within a coroutine
     */
    @WorkerThread
    suspend fun getCommunalHubState(): CommunalHubState {
        val database = CommunalDatabase.getInstance(context)
        val widgetsFromDb =
            withContext(backgroundDispatcher) { database.communalWidgetDao().getWidgets().first() }
        return getCommunalHubStateInternal(widgetsFromDb)
    }

    private fun getCommunalHubStateInternal(
        widgetsFromDb: Map<CommunalItemRank, CommunalWidgetItem>
    ): CommunalHubState {
        val widgetsState = mutableListOf<CommunalHubState.CommunalWidgetItem>()
        widgetsFromDb.keys.forEach { rankItem ->
            val widget = widgetsFromDb[rankItem]!!
Loading