Loading packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryLocalImplTest.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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") } Loading packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt +22 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 ), ) } } Loading packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt +7 −2 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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. */ Loading packages/SystemUI/src/com/android/systemui/communal/data/backup/CommunalBackupHelper.kt +22 −2 Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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() Loading packages/SystemUI/src/com/android/systemui/communal/data/backup/CommunalBackupUtils.kt +35 −2 Original line number Diff line number Diff line Loading @@ -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 Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryLocalImplTest.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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") } Loading
packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt +22 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 ), ) } } Loading
packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt +7 −2 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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. */ Loading
packages/SystemUI/src/com/android/systemui/communal/data/backup/CommunalBackupHelper.kt +22 −2 Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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() Loading
packages/SystemUI/src/com/android/systemui/communal/data/backup/CommunalBackupUtils.kt +35 −2 Original line number Diff line number Diff line Loading @@ -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