summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docklib/Android.bp3
-rw-r--r--docklib/src/com/android/car/docklib/DockViewController.kt32
-rw-r--r--docklib/src/com/android/car/docklib/data/DockAppItem.kt15
-rw-r--r--docklib/src/com/android/car/docklib/task/DockTaskStackChangeListener.java50
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();
+ }
+
+
+}