diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt index 599600d61976618e744310854172ca41e2d925d9..0fd05550dbe3f21dd82a9fdbda38413c51bebdae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt @@ -39,7 +39,6 @@ import android.view.ViewGroup import com.android.keyguard.KeyguardUpdateMonitor import com.android.settingslib.Utils import com.android.systemui.Dumpable -import com.android.systemui.res.R import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main @@ -54,6 +53,7 @@ import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceView import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.clocks.WeatherData import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.res.R import com.android.systemui.settings.UserTracker import com.android.systemui.shared.regionsampling.RegionSampler import com.android.systemui.smartspace.dagger.SmartspaceModule.Companion.DATE_SMARTSPACE_DATA_PLUGIN @@ -68,11 +68,14 @@ import com.android.systemui.util.settings.SecureSettings import com.android.systemui.util.time.SystemClock import java.io.PrintWriter import java.time.Instant +import java.util.Deque +import java.util.LinkedList import java.util.Optional import java.util.concurrent.Executor import javax.inject.Inject import javax.inject.Named + /** Controller for managing the smartspace view on the lockscreen */ @SysUISingleton class LockscreenSmartspaceController @@ -106,6 +109,8 @@ constructor( ) : Dumpable { companion object { private const val TAG = "LockscreenSmartspaceController" + + private const val MAX_RECENT_SMARTSPACE_DATA_FOR_DUMP = 5 } private var session: SmartspaceSession? = null @@ -114,6 +119,9 @@ constructor( private val plugin: BcSmartspaceDataPlugin? = optionalPlugin.orElse(null) private val configPlugin: BcSmartspaceConfigPlugin? = optionalConfigPlugin.orElse(null) + // This stores recently received Smartspace pushes to be included in dumpsys. + private val recentSmartspaceData: Deque<List<SmartspaceTarget>> = LinkedList() + // Smartspace can be used on multiple displays, such as when the user casts their screen private var smartspaceViews = mutableSetOf<SmartspaceView>() private var regionSamplers = @@ -173,6 +181,7 @@ constructor( // The weather data plugin takes unfiltered targets and performs the filtering internally. weatherPlugin?.onTargetsAvailable(targets) + val now = Instant.ofEpochMilli(systemClock.currentTimeMillis()) val weatherTarget = targets.find { t -> t.featureType == SmartspaceTarget.FEATURE_WEATHER && @@ -201,6 +210,14 @@ constructor( } val filteredTargets = targets.filter(::filterSmartspaceTarget) + + synchronized(recentSmartspaceData) { + recentSmartspaceData.offerLast(filteredTargets) + if (recentSmartspaceData.size > MAX_RECENT_SMARTSPACE_DATA_FOR_DUMP) { + recentSmartspaceData.pollFirst() + } + } + plugin?.onTargetsAvailable(filteredTargets) } @@ -588,9 +605,26 @@ constructor( return null } - override fun dump(pw: PrintWriter, args: Array<out String>) = pw.asIndenting().run { - printCollection("Region Samplers", regionSamplers.values) { - it.dump(this) + override fun dump(pw: PrintWriter, args: Array<out String>) { + pw.asIndenting().run { + printCollection("Region Samplers", regionSamplers.values) { + it.dump(this) + } + } + + pw.println("Recent BC Smartspace Targets (most recent first)") + synchronized(recentSmartspaceData) { + if (recentSmartspaceData.size === 0) { + pw.println(" No data\n") + return + } + recentSmartspaceData.descendingIterator().forEachRemaining { smartspaceTargets -> + pw.println(" Number of targets: ${smartspaceTargets.size}") + for (target in smartspaceTargets) { + pw.println(" $target") + } + pw.println() + } } } }