diff options
4 files changed, 91 insertions, 9 deletions
diff --git a/docklib/Android.bp b/docklib/Android.bp index 777b8b9e..79137d0a 100644 --- a/docklib/Android.bp +++ b/docklib/Android.bp @@ -35,7 +35,10 @@ android_library { "androidx.lifecycle_lifecycle-extensions", "com.google.android.material_material", "CarDockUtilLib", + "SystemUISharedLib" ], + platform_apis: true, + manifest: "AndroidManifest.xml", } diff --git a/docklib/src/com/android/car/docklib/DockViewController.kt b/docklib/src/com/android/car/docklib/DockViewController.kt index fd5ed6af..82852533 100644 --- a/docklib/src/com/android/car/docklib/DockViewController.kt +++ b/docklib/src/com/android/car/docklib/DockViewController.kt @@ -21,9 +21,13 @@ import android.car.content.pm.CarPackageManager import android.content.ComponentName import android.content.Context import android.content.Intent +import android.os.Build +import android.util.Log import com.android.car.docklib.events.DockEventsReceiver +import com.android.car.docklib.task.DockTaskStackChangeListener import com.android.car.docklib.view.DockAdapter import com.android.car.docklib.view.DockView +import com.android.systemui.shared.system.TaskStackChangeListeners import java.lang.ref.WeakReference import java.util.function.Consumer @@ -40,13 +44,19 @@ class DockViewController( dockView: DockView, intentDelegate: Consumer<Intent> ) : DockInterface { + private companion object { + private const val TAG = "DockViewController" + private val DEBUG = Build.isDebuggable() + } private val numItems: Int private val car: Car private val dockViewWeakReference: WeakReference<DockView> private val dockViewModel: DockViewModel - private lateinit var dockHelper: DockHelper + private var dockHelper: DockHelper? = null private val dockEventsReceiver: DockEventsReceiver + private val taskStackChangeListeners: TaskStackChangeListeners + private val dockTaskStackChangeListener: DockTaskStackChangeListener init { numItems = userContext.resources.getInteger(R.integer.config_numDockApps) @@ -68,20 +78,26 @@ class DockViewController( val carPackageManager = car.getCarManager(CarPackageManager::class.java) carPackageManager?.let { carPM -> adapter.setCarPackageManager(carPM) + // todo(b/314859963): create the DockHelper without depending on carPM dockHelper = DockHelper(userContext, carPM) - dockViewModel.updateDefaultApps(dockHelper.defaultApps) + dockHelper?.let { dockViewModel.updateDefaultApps(it.defaultApps) } } } } } dockEventsReceiver = DockEventsReceiver.registerDockReceiver(userContext, this) + dockTaskStackChangeListener = DockTaskStackChangeListener { appLaunched(it) } + taskStackChangeListeners = TaskStackChangeListeners.getInstance() + taskStackChangeListeners.registerTaskStackListener(dockTaskStackChangeListener) } /** Method to stop the dock. Call this upon View being destroyed. */ fun destroy() { + if (DEBUG) Log.d(TAG, "Destroy called") car.disconnect() userContext.unregisterReceiver(dockEventsReceiver) dockViewModel.destroy() + taskStackChangeListeners.unregisterTaskStackListener(dockTaskStackChangeListener) } override fun appPinned(componentName: ComponentName) { @@ -89,11 +105,15 @@ class DockViewController( } override fun appLaunched(componentName: ComponentName) { - if (dockHelper.excludedPackages.contains(componentName.packageName)) return - if (dockHelper.excludedComponents.contains(componentName.flattenToString())) return + if (DEBUG) Log.d(TAG, "App launched: $componentName") + dockHelper?.let { + if (it.excludedPackages.contains(componentName.packageName)) return + if (it.excludedComponents.contains(componentName.flattenToString())) return - val appItem = dockHelper.toDockAppItem(componentName) - dockViewModel.addDynamicItem(appItem) + val appItem = it.toDockAppItem(componentName) + if (DEBUG) Log.d(TAG, "Dynamic app add to dock: $appItem") + dockViewModel.addDynamicItem(appItem) + } } override fun appUnpinned(componentName: ComponentName) { diff --git a/docklib/src/com/android/car/docklib/data/DockAppItem.kt b/docklib/src/com/android/car/docklib/data/DockAppItem.kt index 96a6fcf9..90097287 100644 --- a/docklib/src/com/android/car/docklib/data/DockAppItem.kt +++ b/docklib/src/com/android/car/docklib/data/DockAppItem.kt @@ -27,9 +27,13 @@ data class DockAppItem( val icon: Drawable, val isDistractionOptimized: Boolean, ) { - enum class Type { - DYNAMIC, - STATIC + enum class Type(val value: String) { + DYNAMIC("DYNAMIC"), + STATIC("STATIC"); + + override fun toString(): String { + return value + } } override fun equals(other: Any?): Boolean { @@ -44,4 +48,9 @@ data class DockAppItem( return true } + + override fun toString(): String { + return ("DockAppItem#${hashCode()}{name: $name, component: $component, type: $type, " + + "isDistractionOptimized: $isDistractionOptimized, icon: $icon}") + } } diff --git a/docklib/src/com/android/car/docklib/task/DockTaskStackChangeListener.java b/docklib/src/com/android/car/docklib/task/DockTaskStackChangeListener.java new file mode 100644 index 00000000..d23a98c3 --- /dev/null +++ b/docklib/src/com/android/car/docklib/task/DockTaskStackChangeListener.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.car.docklib.task; + +import android.app.ActivityManager; +import android.content.ComponentName; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.android.systemui.shared.system.TaskStackChangeListener; + +import java.util.function.Consumer; + +public class DockTaskStackChangeListener implements TaskStackChangeListener { + Consumer<ComponentName> mTaskLaunchDelegate; + public DockTaskStackChangeListener(Consumer<ComponentName> taskLaunchDelegate) { + mTaskLaunchDelegate = taskLaunchDelegate; + } + + @Override + public void onTaskMovedToFront(ActivityManager.RunningTaskInfo taskInfo) { + ComponentName component = getComponentName(taskInfo); + mTaskLaunchDelegate.accept(component); + } + + @Nullable + private ComponentName getComponentName(@NonNull ActivityManager.RunningTaskInfo taskInfo) { + if (taskInfo.baseActivity == null && taskInfo.baseIntent.getComponent() == null) { + return null; + } + return taskInfo.baseActivity != null ? taskInfo.baseActivity + : taskInfo.baseIntent.getComponent(); + } + + +} |