blob: 7d22c527d1705c9a751fbda472841b3480d1cfe2 [file] [edit]
package com.android.quickstep
import android.app.backup.BackupManager
import android.app.backup.BackupRestoreEventLogger
import android.app.backup.BackupRestoreEventLogger.BackupRestoreDataType
import android.app.backup.BackupRestoreEventLogger.BackupRestoreError
import android.content.Context
import androidx.annotation.VisibleForTesting
import com.android.launcher3.Flags.enableLauncherBrMetricsFixed
import com.android.launcher3.LauncherSettings.Favorites
import com.android.launcher3.backuprestore.LauncherRestoreEventLogger
/**
* Concrete implementation for wrapper to log Restore event metrics for both success and failure to
* restore Launcher workspace from a backup. This implementation accesses SystemApis so is only
* available to QuickStep/NexusLauncher.
*/
class LauncherRestoreEventLoggerImpl(val context: Context) : LauncherRestoreEventLogger() {
companion object {
const val TAG = "LauncherRestoreEventLoggerImpl"
// Generic type for any possible workspace items, when specific type is not known.
@BackupRestoreDataType private const val DATA_TYPE_LAUNCHER_ITEM = "launcher_item"
// Specific workspace item types, based off of Favorites Table.
@BackupRestoreDataType private const val DATA_TYPE_APPLICATION = "application"
@BackupRestoreDataType private const val DATA_TYPE_FOLDER = "folder"
@BackupRestoreDataType private const val DATA_TYPE_APPWIDGET = "widget"
@BackupRestoreDataType private const val DATA_TYPE_CUSTOM_APPWIDGET = "custom_widget"
@BackupRestoreDataType private const val DATA_TYPE_DEEP_SHORTCUT = "deep_shortcut"
@BackupRestoreDataType private const val DATA_TYPE_APP_PAIR = "app_pair"
}
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
val restoreEventLogger: BackupRestoreEventLogger = BackupManager(context).delayedRestoreLogger
/**
* For logging when multiple items of a given data type failed to restore.
*
* @param dataType The data type that was not restored.
* @param count the number of data items that were not restored.
* @param error error type for why the data was not restored.
*/
override fun logLauncherItemsRestoreFailed(
@BackupRestoreDataType dataType: String,
count: Int,
@BackupRestoreError error: String?
) {
if (enableLauncherBrMetricsFixed()) {
restoreEventLogger.logItemsRestoreFailed(dataType, count, error)
}
}
/**
* For logging when multiple items of a given data type were successfully restored.
*
* @param dataType The data type that was restored.
* @param count the number of data items restored.
*/
override fun logLauncherItemsRestored(@BackupRestoreDataType dataType: String, count: Int) {
if (enableLauncherBrMetricsFixed()) {
restoreEventLogger.logItemsRestored(dataType, count)
}
}
/**
* Helper to log successfully restoring a single item from the Favorites table.
*
* @param favoritesId The id of the item type from [Favorites] that was restored.
*/
override fun logSingleFavoritesItemRestored(favoritesId: Int) {
if (enableLauncherBrMetricsFixed()) {
restoreEventLogger.logItemsRestored(favoritesIdToDataType(favoritesId), 1)
}
}
/**
* Helper to log successfully restoring multiple items from the Favorites table.
*
* @param favoritesId The id of the item type from [Favorites] that was restored.
* @param count number of items that restored.
*/
override fun logFavoritesItemsRestored(favoritesId: Int, count: Int) {
if (enableLauncherBrMetricsFixed()) {
restoreEventLogger.logItemsRestored(favoritesIdToDataType(favoritesId), count)
}
}
/**
* Helper to log a failure to restore a single item from the Favorites table.
*
* @param favoritesId The id of the item type from [Favorites] that was not restored.
* @param error error type for why the data was not restored.
*/
override fun logSingleFavoritesItemRestoreFailed(
favoritesId: Int,
@BackupRestoreError error: String?
) {
if (enableLauncherBrMetricsFixed()) {
restoreEventLogger.logItemsRestoreFailed(favoritesIdToDataType(favoritesId), 1, error)
}
}
/**
* Helper to log a failure to restore items from the Favorites table.
*
* @param favoritesId The id of the item type from [Favorites] that was not restored.
* @param count number of items that failed to restore.
* @param error error type for why the data was not restored.
*/
override fun logFavoritesItemsRestoreFailed(
favoritesId: Int,
count: Int,
@BackupRestoreError error: String?
) {
if (enableLauncherBrMetricsFixed()) {
restoreEventLogger.logItemsRestoreFailed(
favoritesIdToDataType(favoritesId),
count,
error
)
}
}
/**
* Uses the current [restoreEventLogger] to report its results to the [backupManager]. Use when
* done restoring items for Launcher.
*/
override fun reportLauncherRestoreResults() {
if (enableLauncherBrMetricsFixed()) {
BackupManager(context).reportDelayedRestoreResult(restoreEventLogger)
}
}
/**
* Helper method to convert item types from [Favorites] to B&R data types for logging. Also to
* avoid direct usage of @BackupRestoreDataType which is protected under @SystemApi.
*/
@BackupRestoreDataType
private fun favoritesIdToDataType(favoritesId: Int): String =
when (favoritesId) {
Favorites.ITEM_TYPE_APPLICATION -> DATA_TYPE_APPLICATION
Favorites.ITEM_TYPE_FOLDER -> DATA_TYPE_FOLDER
Favorites.ITEM_TYPE_APPWIDGET -> DATA_TYPE_APPWIDGET
Favorites.ITEM_TYPE_CUSTOM_APPWIDGET -> DATA_TYPE_CUSTOM_APPWIDGET
Favorites.ITEM_TYPE_DEEP_SHORTCUT -> DATA_TYPE_DEEP_SHORTCUT
Favorites.ITEM_TYPE_APP_PAIR -> DATA_TYPE_APP_PAIR
else -> DATA_TYPE_LAUNCHER_ITEM
}
}