Update corner radius calculation in TaskView
TaskThumbnailView
- Set cornerRadius directly from TaskView instead of calulating and listening from ViewModel
- Use onSizeChagned/width/height for OutlineProvider bounds, to be consistent with DesktopTaskContentView
DesktopTaskView
- Moved backgroundView inside DesktopTaskContentView, so its outline can be determiend by OutlineProvider in DesktopTaskContentView
- Update DesktopTaskContentView's cornerRadius when it changes in TaskView
Model/Data chagnes
- Removed TaskViewModel/TaskViewData and scale from RecentsViewData
TaskView
- Add a onBind method to be called after bind, for common post bind handling (e.g. update cornerRadius)
TaskViewSimualtor
- Use DesktopFullscreenDrawParams for desktop task, and moved setIsDesktopTask to CTOR so related fields can be final
Bug: 372237039
Flag: com.android.launcher3.enable_refactor_task_thumbnail
Flag: com.android.window.flags.enable_desktop_windowing_mode
Test: TaskThumbnailViewScreenshotTest, OverviewDesktopTaskImageTest
Test: DesktopFullscreenDrawParamsTest, FullscreenDrawParamsTest, TaskThumbnailViewModelImplTest
Change-Id: If3d195ef6596aa28fce4d4875cf45423cb71811c
diff --git a/quickstep/res/layout/task_desktop.xml b/quickstep/res/layout/task_desktop.xml
index 0472007..5270284 100644
--- a/quickstep/res/layout/task_desktop.xml
+++ b/quickstep/res/layout/task_desktop.xml
@@ -24,10 +24,6 @@
android:focusable="true"
launcher:focusBorderColor="?attr/materialColorOutline"
launcher:hoverBorderColor="?attr/materialColorPrimary">
- <View
- android:id="@+id/background"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
<ViewStub
android:id="@+id/icon"
@@ -38,6 +34,13 @@
<com.android.quickstep.views.DesktopTaskContentView
android:id="@+id/desktop_content"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="match_parent">
+
+ <View
+ android:id="@+id/background"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ </com.android.quickstep.views.DesktopTaskContentView>
</com.android.quickstep.views.DesktopTaskView>
diff --git a/quickstep/src/com/android/quickstep/DesktopFullscreenDrawParams.kt b/quickstep/src/com/android/quickstep/DesktopFullscreenDrawParams.kt
new file mode 100644
index 0000000..bafb0b2
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/DesktopFullscreenDrawParams.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2024 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.quickstep
+
+import android.content.Context
+import com.android.systemui.shared.system.QuickStepContract
+
+// DesktopTaskView thumbnail's corner radius is independent of fullscreenProgress.
+open class DesktopFullscreenDrawParams
+@JvmOverloads
+constructor(context: Context, cornerRadiusProvider: (Context) -> Float = ::computeCornerRadius) :
+ FullscreenDrawParams(context, cornerRadiusProvider, cornerRadiusProvider) {
+ companion object {
+ // computeCornerRadius is used as cornerRadiusProvider, so
+ // QuickStepContract::getWindowCornerRadius can be mocked properly.
+ private fun computeCornerRadius(context: Context): Float =
+ QuickStepContract.getWindowCornerRadius(context)
+ }
+}
diff --git a/quickstep/src/com/android/quickstep/FullscreenDrawParams.kt b/quickstep/src/com/android/quickstep/FullscreenDrawParams.kt
new file mode 100644
index 0000000..a5ba52a
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/FullscreenDrawParams.kt
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2024 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.quickstep
+
+import android.content.Context
+import com.android.launcher3.R
+import com.android.launcher3.Utilities
+import com.android.launcher3.util.DisplayController
+import com.android.launcher3.util.SafeCloseable
+import com.android.launcher3.views.ActivityContext
+import com.android.quickstep.util.TaskCornerRadius
+import com.android.systemui.shared.system.QuickStepContract
+
+/**
+ * Class for computing corner radius by interpolating between overview and fullscreen corner radius
+ * with fullscreenProgress set in [setProgress].
+ */
+open class FullscreenDrawParams
+@JvmOverloads
+constructor(
+ context: Context,
+ private val taskCornerRadiusProvider: (Context) -> Float = ::computeTaskCornerRadius,
+ private val windowCornerRadiusProvider: (Context) -> Float = ::computeWindowCornerRadius,
+) : SafeCloseable {
+ private var taskCornerRadius = 0f
+ private var windowCornerRadius = 0f
+ var currentCornerRadius = 0f
+
+ init {
+ updateCornerRadius(context)
+ }
+
+ /** Recomputes the start and end corner radius for the given Context. */
+ fun updateCornerRadius(context: Context) {
+ taskCornerRadius = taskCornerRadiusProvider(context)
+ windowCornerRadius = windowCornerRadiusProvider(context)
+ }
+
+ /** Sets the progress in range [0, 1] */
+ fun setProgress(fullscreenProgress: Float, parentScale: Float, taskViewScale: Float) {
+ currentCornerRadius =
+ Utilities.mapRange(fullscreenProgress, taskCornerRadius, windowCornerRadius) /
+ parentScale /
+ taskViewScale
+ }
+
+ override fun close() {}
+
+ companion object {
+ private fun computeTaskCornerRadius(context: Context): Float = TaskCornerRadius.get(context)
+
+ private fun computeWindowCornerRadius(context: Context): Float {
+ val activityContext: ActivityContext? = ActivityContext.lookupContextNoThrow(context)
+ return if (
+ activityContext?.deviceProfile?.isTaskbarPresent == true &&
+ DisplayController.isTransientTaskbar(context)
+ ) {
+ context.resources
+ .getDimensionPixelSize(R.dimen.persistent_taskbar_corner_radius)
+ .toFloat()
+ } else {
+ // The corner radius is fixed to match when Taskbar is persistent mode
+ QuickStepContract.getWindowCornerRadius(context)
+ }
+ }
+ }
+}
diff --git a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
index 06b2972..91d0776 100644
--- a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
+++ b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
@@ -93,8 +93,7 @@
BaseContainerInterface sizingStrategy, int numHandles, boolean forDesktop) {
RemoteTargetHandle[] handles = new RemoteTargetHandle[numHandles];
for (int i = 0; i < numHandles; i++) {
- TaskViewSimulator tvs = new TaskViewSimulator(context, sizingStrategy);
- tvs.setIsDesktopTask(forDesktop , i);
+ TaskViewSimulator tvs = new TaskViewSimulator(context, sizingStrategy, forDesktop , i);
TransformParams transformParams = new TransformParams();
handles[i] = new RemoteTargetHandle(tvs, transformParams);
}
diff --git a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
index 0dbdcb7..fef4c30 100644
--- a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
+++ b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
@@ -348,7 +348,7 @@
}
/** Called when the snapshot has updated its full screen drawing parameters. */
- public void setFullscreenParams(TaskView.FullscreenDrawParams fullscreenParams) {}
+ public void setFullscreenParams(FullscreenDrawParams fullscreenParams) {}
/** Sets visibility for the overlay associated elements. */
public void setVisibility(int visibility) {}
diff --git a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
index dd11d48..b78e214 100644
--- a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
+++ b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
@@ -36,9 +36,6 @@
import com.android.quickstep.task.viewmodel.TaskOverlayViewModel
import com.android.quickstep.task.viewmodel.TaskThumbnailViewModel
import com.android.quickstep.task.viewmodel.TaskThumbnailViewModelImpl
-import com.android.quickstep.task.viewmodel.TaskViewData
-import com.android.quickstep.task.viewmodel.TaskViewModel
-import com.android.quickstep.views.TaskViewType
import com.android.systemui.shared.recents.model.Task
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
@@ -186,17 +183,11 @@
}
}
RecentsViewData::class.java -> RecentsViewData()
- TaskViewModel::class.java -> TaskViewModel(taskViewData = inject(scopeId, extras))
- TaskViewData::class.java -> {
- val taskViewType = extras["TaskViewType"] as TaskViewType
- TaskViewData(taskViewType)
- }
TaskContainerData::class.java -> TaskContainerData()
TaskThumbnailViewData::class.java -> TaskThumbnailViewData()
TaskThumbnailViewModel::class.java ->
TaskThumbnailViewModelImpl(
recentsViewData = inject(),
- taskViewData = inject(scopeId, extras),
taskContainerData = inject(scopeId),
dispatcherProvider = inject(),
getThumbnailPositionUseCase = inject(),
diff --git a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt
index 87446b0..6ccf372 100644
--- a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt
+++ b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt
@@ -22,9 +22,6 @@
class RecentsViewData {
val fullscreenProgress = MutableStateFlow(1f)
- // This is typically a View concern but it is used to invalidate rendering in other Views
- val scale = MutableStateFlow(1f)
-
// Whether the current RecentsView state supports task overlays.
// TODO(b/331753115): Derive from RecentsView state flow once migrated to MVVM.
val overlayEnabled = MutableStateFlow(false)
diff --git a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt
index c511005..cfebb81 100644
--- a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt
+++ b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt
@@ -34,10 +34,6 @@
recentsTasksRepository.setVisibleTasks(visibleTaskIdList.toSet())
}
- fun updateScale(scale: Float) {
- recentsViewData.scale.value = scale
- }
-
fun updateFullscreenProgress(fullscreenProgress: Float) {
recentsViewData.fullscreenProgress.value = fullscreenProgress
}
diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
index a8c8659..0c783d3 100644
--- a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
+++ b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
@@ -17,7 +17,6 @@
package com.android.quickstep.task.thumbnail
import android.content.Context
-import android.content.res.Configuration
import android.graphics.Color
import android.graphics.Outline
import android.graphics.Rect
@@ -29,7 +28,6 @@
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isInvisible
import com.android.launcher3.R
-import com.android.launcher3.Utilities
import com.android.launcher3.util.ViewPool
import com.android.quickstep.recents.di.RecentsDependencies
import com.android.quickstep.recents.di.get
@@ -39,9 +37,7 @@
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.SnapshotSplash
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Uninitialized
import com.android.quickstep.task.viewmodel.TaskThumbnailViewModel
-import com.android.quickstep.util.TaskCornerRadius
import com.android.quickstep.views.FixedSizeImageView
-import com.android.systemui.shared.system.QuickStepContract
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -63,18 +59,15 @@
private val splashIcon: FixedSizeImageView by lazy { findViewById(R.id.splash_icon) }
private var uiState: TaskThumbnailUiState = Uninitialized
- private var inheritedScale: Float = 1f
- private val _measuredBounds = Rect()
- private val measuredBounds: Rect
- get() {
- _measuredBounds.set(0, 0, measuredWidth, measuredHeight)
- return _measuredBounds
+ private val bounds = Rect()
+
+ var cornerRadius: Float = 0f
+ set(value) {
+ field = value
+ invalidateOutline()
}
- private var overviewCornerRadius: Float = TaskCornerRadius.get(context)
- private var fullscreenCornerRadius: Float = QuickStepContract.getWindowCornerRadius(context)
-
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
@@ -114,19 +107,12 @@
splashIcon.alpha = splashAlpha
}
.launchIn(viewAttachedScope)
- viewModel.cornerRadiusProgress.onEach { invalidateOutline() }.launchIn(viewAttachedScope)
- viewModel.inheritedScale
- .onEach { viewModelInheritedScale ->
- inheritedScale = viewModelInheritedScale
- invalidateOutline()
- }
- .launchIn(viewAttachedScope)
clipToOutline = true
outlineProvider =
object : ViewOutlineProvider() {
override fun getOutline(view: View, outline: Outline) {
- outline.setRoundRect(measuredBounds, getCurrentCornerRadius())
+ outline.setRoundRect(bounds, cornerRadius)
}
}
}
@@ -157,6 +143,8 @@
if (uiState is SnapshotSplash) {
setImageMatrix()
}
+ bounds.set(0, 0, w, h)
+ invalidateOutline()
}
override fun setScaleX(scaleX: Float) {
@@ -171,14 +159,6 @@
splashIcon.scaleY = 1 / scaleY
}
- override fun onConfigurationChanged(newConfig: Configuration?) {
- super.onConfigurationChanged(newConfig)
-
- overviewCornerRadius = TaskCornerRadius.get(context)
- fullscreenCornerRadius = QuickStepContract.getWindowCornerRadius(context)
- invalidateOutline()
- }
-
private fun resetViews() {
liveTileView.isInvisible = true
thumbnailView.isInvisible = true
@@ -214,13 +194,6 @@
thumbnailView.imageMatrix = viewModel.getThumbnailPositionState(width, height, isLayoutRtl)
}
- private fun getCurrentCornerRadius() =
- Utilities.mapRange(
- viewModel.cornerRadiusProgress.value,
- overviewCornerRadius,
- fullscreenCornerRadius,
- ) / inheritedScale
-
private companion object {
const val TAG = "TaskThumbnailView"
}
diff --git a/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModel.kt b/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModel.kt
index f55462a..a048a1d 100644
--- a/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModel.kt
+++ b/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModel.kt
@@ -19,19 +19,9 @@
import android.graphics.Matrix
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.StateFlow
/** ViewModel for representing TaskThumbnails */
interface TaskThumbnailViewModel {
- /**
- * Progress for changes in corner radius. progress: 0 = overview corner radius; 1 = fullscreen
- * corner radius.
- */
- val cornerRadiusProgress: StateFlow<Float>
-
- /** The accumulated View.scale value for parent Views up to and including RecentsView */
- val inheritedScale: Flow<Float>
-
/** Provides the level of dimming that the View should have */
val dimProgress: Flow<Float>
diff --git a/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModelImpl.kt b/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModelImpl.kt
index 8b15a82..b6cb984 100644
--- a/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModelImpl.kt
+++ b/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModelImpl.kt
@@ -38,7 +38,6 @@
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flatMapLatest
@@ -50,7 +49,6 @@
@OptIn(ExperimentalCoroutinesApi::class)
class TaskThumbnailViewModelImpl(
recentsViewData: RecentsViewData,
- taskViewData: TaskViewData,
taskContainerData: TaskContainerData,
dispatcherProvider: DispatcherProvider,
private val tasksRepository: RecentTasksRepository,
@@ -61,15 +59,6 @@
private val splashProgress = MutableStateFlow(flowOf(0f))
private var taskId: Int = INVALID_TASK_ID
- override val cornerRadiusProgress =
- if (taskViewData.isOutlineFormedByThumbnailView) recentsViewData.fullscreenProgress
- else MutableStateFlow(1f).asStateFlow()
-
- override val inheritedScale =
- combine(recentsViewData.scale, taskViewData.scale) { recentsScale, taskScale ->
- recentsScale * taskScale
- }
-
override val dimProgress: Flow<Float> =
combine(taskContainerData.taskMenuOpenProgress, recentsViewData.tintAmount) {
taskMenuOpenProgress,
diff --git a/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewData.kt b/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewData.kt
deleted file mode 100644
index 7a9ecf2..0000000
--- a/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewData.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2024 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.quickstep.task.viewmodel
-
-import com.android.quickstep.views.TaskViewType
-import kotlinx.coroutines.flow.MutableStateFlow
-
-class TaskViewData(taskViewType: TaskViewType) {
- // This is typically a View concern but it is used to invalidate rendering in other Views
- val scale = MutableStateFlow(1f)
-
- // TODO(b/331753115): This property should not be in TaskViewData once TaskView is MVVM.
- /** Whether outline of TaskView is formed by outline thumbnail view(s). */
- val isOutlineFormedByThumbnailView: Boolean = taskViewType != TaskViewType.DESKTOP
-}
diff --git a/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewModel.kt b/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewModel.kt
deleted file mode 100644
index ec75d59..0000000
--- a/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewModel.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2024 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.quickstep.task.viewmodel
-
-import androidx.lifecycle.ViewModel
-
-class TaskViewModel(private val taskViewData: TaskViewData) : ViewModel() {
- fun updateScale(scale: Float) {
- taskViewData.scale.value = scale
- }
-}
diff --git a/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java b/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java
index a4b8fec..706cfe4 100644
--- a/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java
+++ b/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java
@@ -50,9 +50,10 @@
import com.android.launcher3.util.TraceHelper;
import com.android.quickstep.BaseActivityInterface;
import com.android.quickstep.BaseContainerInterface;
+import com.android.quickstep.DesktopFullscreenDrawParams;
+import com.android.quickstep.FullscreenDrawParams;
import com.android.quickstep.TaskAnimationManager;
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
-import com.android.quickstep.views.TaskView.FullscreenDrawParams;
import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.recents.utilities.PreviewPositionHelper;
@@ -116,20 +117,25 @@
private SplitBounds mSplitBounds;
private Boolean mDrawsBelowRecents = null;
private boolean mIsGridTask;
- private boolean mIsDesktopTask;
+ private final boolean mIsDesktopTask;
private boolean mScaleToCarouselTaskSize = false;
private int mTaskRectTranslationX;
private int mTaskRectTranslationY;
private int mDesktopTaskIndex = 0;
- public TaskViewSimulator(Context context, BaseContainerInterface sizeStrategy) {
+ public TaskViewSimulator(Context context, BaseContainerInterface sizeStrategy,
+ boolean isDesktop, int desktopTaskIndex) {
mContext = context;
mSizeStrategy = sizeStrategy;
+ mIsDesktopTask = isDesktop;
+ mDesktopTaskIndex = desktopTaskIndex;
mOrientationState = TraceHelper.allowIpcs("TaskViewSimulator.init",
() -> new RecentsOrientedState(context, sizeStrategy, i -> { }));
mOrientationState.setGestureActive(true);
- mCurrentFullscreenParams = new FullscreenDrawParams(context);
+ mCurrentFullscreenParams = mIsDesktopTask
+ ? new DesktopFullscreenDrawParams(context)
+ : new FullscreenDrawParams(context);
mOrientationStateId = mOrientationState.getStateId();
Resources resources = context.getResources();
mIsRecentsRtl = mOrientationState.getOrientationHandler().getRecentsRtlSetting(resources);
@@ -289,14 +295,6 @@
}
/**
- * Sets whether this task is part of desktop tasks in overview.
- */
- public void setIsDesktopTask(boolean desktop, int index) {
- mIsDesktopTask = desktop;
- mDesktopTaskIndex = index;
- }
-
- /**
* Apply translations on TaskRect's starting location.
*/
public void setTaskRectTranslation(int taskRectTranslationX, int taskRectTranslationY) {
@@ -558,7 +556,7 @@
* TaskView
*/
public float getCurrentCornerRadius() {
- float visibleRadius = mCurrentFullscreenParams.getCurrentDrawnCornerRadius();
+ float visibleRadius = mCurrentFullscreenParams.getCurrentCornerRadius();
mTempPoint[0] = visibleRadius;
mTempPoint[1] = 0;
mInversePositionMatrix.mapVectors(mTempPoint);
diff --git a/quickstep/src/com/android/quickstep/views/DesktopTaskContentView.kt b/quickstep/src/com/android/quickstep/views/DesktopTaskContentView.kt
index 481acac..ef044f4 100644
--- a/quickstep/src/com/android/quickstep/views/DesktopTaskContentView.kt
+++ b/quickstep/src/com/android/quickstep/views/DesktopTaskContentView.kt
@@ -23,14 +23,15 @@
import android.view.View
import android.view.ViewOutlineProvider
import android.widget.FrameLayout
-import com.android.quickstep.views.TaskView.FullscreenDrawParams
class DesktopTaskContentView
@JvmOverloads
constructor(context: Context, attrs: AttributeSet? = null) : FrameLayout(context, attrs) {
- private val currentFullscreenParams = FullscreenDrawParams(context)
- private val taskCornerRadius: Float
- get() = currentFullscreenParams.cornerRadius
+ var cornerRadius: Float = 0f
+ set(value) {
+ field = value
+ invalidateOutline()
+ }
private val bounds = Rect()
@@ -39,7 +40,7 @@
outlineProvider =
object : ViewOutlineProvider() {
override fun getOutline(view: View, outline: Outline) {
- outline.setRoundRect(bounds, taskCornerRadius)
+ outline.setRoundRect(bounds, cornerRadius)
}
}
}
diff --git a/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt b/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
index 5e842aa..576a56e 100644
--- a/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
@@ -20,13 +20,10 @@
import android.graphics.Point
import android.graphics.PointF
import android.graphics.Rect
-import android.graphics.drawable.ShapeDrawable
-import android.graphics.drawable.shapes.RoundRectShape
import android.util.AttributeSet
import android.util.Log
import android.view.Gravity
import android.view.View
-import android.widget.FrameLayout
import androidx.core.content.res.ResourcesCompat
import androidx.core.view.updateLayoutParams
import com.android.launcher3.Flags.enableRefactorTaskThumbnail
@@ -39,6 +36,8 @@
import com.android.launcher3.util.ViewPool
import com.android.launcher3.util.rects.set
import com.android.quickstep.BaseContainerInterface
+import com.android.quickstep.DesktopFullscreenDrawParams
+import com.android.quickstep.FullscreenDrawParams
import com.android.quickstep.TaskOverlayFactory
import com.android.quickstep.ViewUtils
import com.android.quickstep.task.thumbnail.TaskThumbnailView
@@ -47,14 +46,13 @@
/** TaskView that contains all tasks that are part of the desktop. */
class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
- TaskView(context, attrs, type = TaskViewType.DESKTOP) {
-
- private val snapshotDrawParams =
- object : FullscreenDrawParams(context) {
- // DesktopTaskView thumbnail's corner radius is independent of fullscreenProgress.
- override fun computeTaskCornerRadius(context: Context) =
- computeWindowCornerRadius(context)
- }
+ TaskView(
+ context,
+ attrs,
+ type = TaskViewType.DESKTOP,
+ thumbnailFullscreenParams = DesktopFullscreenDrawParams(context),
+ ) {
+ private val contentViewFullscreenParams = FullscreenDrawParams(context)
private val taskThumbnailViewDeprecatedPool =
if (!enableRefactorTaskThumbnail()) {
@@ -80,28 +78,12 @@
private val tempPointF = PointF()
private val tempRect = Rect()
- private lateinit var backgroundView: View
private lateinit var iconView: TaskViewIcon
- private lateinit var contentView: FrameLayout
+ private lateinit var contentView: DesktopTaskContentView
+ private lateinit var backgroundView: View
override fun onFinishInflate() {
super.onFinishInflate()
- backgroundView =
- findViewById<View>(R.id.background).apply {
- updateLayoutParams<LayoutParams> {
- topMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx
- }
- background =
- ShapeDrawable(RoundRectShape(FloatArray(8) { taskCornerRadius }, null, null))
- .apply {
- setTint(
- resources.getColor(
- android.R.color.system_neutral2_300,
- context.theme,
- )
- )
- }
- }
iconView =
getOrInflateIconView(R.id.icon).apply {
setIcon(
@@ -115,10 +97,15 @@
setText(resources.getText(R.string.recent_task_desktop))
}
contentView =
- findViewById<FrameLayout>(R.id.desktop_content).apply {
+ findViewById<DesktopTaskContentView>(R.id.desktop_content).apply {
updateLayoutParams<LayoutParams> {
topMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx
}
+ cornerRadius = contentViewFullscreenParams.currentCornerRadius
+ backgroundView = findViewById(R.id.background)
+ backgroundView.setBackgroundColor(
+ resources.getColor(android.R.color.system_neutral2_300, context.theme)
+ )
}
}
@@ -135,6 +122,7 @@
Log.d(TAG, sb.toString())
}
cancelPendingLoadTasks()
+ val backgroundViewIndex = contentView.indexOfChild(backgroundView)
taskContainers =
tasks.map { task ->
val snapshotView =
@@ -143,7 +131,7 @@
} else {
taskThumbnailViewDeprecatedPool!!.view
}
- contentView.addView(snapshotView, 0)
+ contentView.addView(snapshotView, backgroundViewIndex + 1)
TaskContainer(
this,
@@ -157,8 +145,7 @@
taskOverlayFactory,
)
}
- taskContainers.forEach { it.bind() }
- setOrientationState(orientedState)
+ onBind(orientedState)
}
override fun onRecycle() {
@@ -242,8 +229,12 @@
}
}
- override fun needsUpdate(dataChange: Int, flag: Int) =
- if (flag == FLAG_UPDATE_CORNER_RADIUS) false else super.needsUpdate(dataChange, flag)
+ override fun onTaskListVisibilityChanged(visible: Boolean, changes: Int) {
+ super.onTaskListVisibilityChanged(visible, changes)
+ if (needsUpdate(changes, FLAG_UPDATE_CORNER_RADIUS)) {
+ contentViewFullscreenParams.updateCornerRadius(context)
+ }
+ }
override fun onIconLoaded(taskContainer: TaskContainer) {
// Update contentDescription of snapshotView only, individual task icon is unused.
@@ -258,9 +249,9 @@
override fun getThumbnailBounds(bounds: Rect, relativeToDragLayer: Boolean) {
if (relativeToDragLayer) {
- container.dragLayer.getDescendantRectRelativeToSelf(backgroundView, bounds)
+ container.dragLayer.getDescendantRectRelativeToSelf(contentView, bounds)
} else {
- bounds.set(backgroundView)
+ bounds.set(contentView)
}
}
@@ -306,13 +297,12 @@
backgroundView.alpha = 1 - fullscreenProgress
}
- override fun updateCurrentFullscreenParams() {
- super.updateCurrentFullscreenParams()
- updateFullscreenParams(snapshotDrawParams)
+ override fun updateFullscreenParams() {
+ super.updateFullscreenParams()
+ updateFullscreenParams(contentViewFullscreenParams)
+ contentView.cornerRadius = contentViewFullscreenParams.currentCornerRadius
}
- override fun getThumbnailFullscreenParams() = snapshotDrawParams
-
override fun addChildrenForAccessibility(outChildren: ArrayList<View>) {
super.addChildrenForAccessibility(outChildren)
ViewUtils.addAccessibleChildToList(backgroundView, outChildren)
diff --git a/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt b/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
index 92c1e93..0d9583d 100644
--- a/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
@@ -104,7 +104,7 @@
R.id.show_windows,
R.id.digital_wellbeing_toast,
STAGE_POSITION_TOP_OR_LEFT,
- taskOverlayFactory
+ taskOverlayFactory,
),
createTaskContainer(
secondaryTask,
@@ -113,14 +113,12 @@
R.id.show_windows_right,
R.id.bottomRight_digital_wellbeing_toast,
STAGE_POSITION_BOTTOM_OR_RIGHT,
- taskOverlayFactory
- )
+ taskOverlayFactory,
+ ),
)
- taskContainers.forEach { it.bind() }
-
this.splitBoundsConfig = splitBoundsConfig
taskContainers.forEach { it.digitalWellBeingToast?.splitBounds = splitBoundsConfig }
- setOrientationState(orientedState)
+ onBind(orientedState)
}
override fun setOrientationState(orientationState: RecentsOrientedState) {
@@ -131,7 +129,7 @@
container.deviceProfile,
it,
layoutParams.width,
- layoutParams.height
+ layoutParams.height,
)
val iconViewMarginStart =
resources.getDimensionPixelSize(
@@ -168,7 +166,7 @@
container.deviceProfile,
splitBoundsConfig,
layoutParams.width,
- layoutParams.height
+ layoutParams.height,
)
pagedOrientationHandler.setSplitIconParams(
taskContainers[0].iconView.asView(),
@@ -181,7 +179,7 @@
isRtl,
container.deviceProfile,
splitBoundsConfig,
- inSplitSelection
+ inSplitSelection,
)
} else {
pagedOrientationHandler.setSplitIconParams(
@@ -195,7 +193,7 @@
isRtl,
container.deviceProfile,
splitBoundsConfig,
- inSplitSelection
+ inSplitSelection,
)
}
}
@@ -216,7 +214,7 @@
InteractionJankMonitorWrapper.begin(
this,
Cuj.CUJ_SPLIT_SCREEN_ENTER,
- "Enter form GroupedTaskView"
+ "Enter form GroupedTaskView",
)
launchTaskInternal(isQuickSwitch = false, launchingExistingTaskView = true) {
endCallback.executeAllAndDestroy()
@@ -230,7 +228,7 @@
override fun launchWithoutAnimation(
isQuickSwitch: Boolean,
- callback: (launched: Boolean) -> Unit
+ callback: (launched: Boolean) -> Unit,
) {
launchTaskInternal(isQuickSwitch, launchingExistingTaskView = false, callback)
}
@@ -244,7 +242,7 @@
private fun launchTaskInternal(
isQuickSwitch: Boolean,
launchingExistingTaskView: Boolean,
- callback: (launched: Boolean) -> Unit
+ callback: (launched: Boolean) -> Unit,
) {
recentsView?.let {
it.splitSelectController.launchExistingSplitPair(
@@ -254,11 +252,11 @@
STAGE_POSITION_TOP_OR_LEFT,
callback,
isQuickSwitch,
- snapPosition
+ snapPosition,
)
Log.d(
TAG,
- "launchTaskInternal - launchExistingSplitPair: ${taskIds.contentToString()}, launchingExistingTaskView: $launchingExistingTaskView"
+ "launchTaskInternal - launchExistingSplitPair: ${taskIds.contentToString()}, launchingExistingTaskView: $launchingExistingTaskView",
)
}
}
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 6ab3e28..aac97bb 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -417,9 +417,6 @@
public void setValue(RecentsView view, float scale) {
view.setScaleX(scale);
view.setScaleY(scale);
- if (enableRefactorTaskThumbnail()) {
- view.mRecentsViewModel.updateScale(scale);
- }
view.mLastComputedTaskStartPushOutDistance = null;
view.mLastComputedTaskEndPushOutDistance = null;
view.runActionOnRemoteHandles(new Consumer<RemoteTargetHandle>() {
@@ -5034,7 +5031,7 @@
private void updateTaskViewsSnapshotRadius() {
for (TaskView taskView : getTaskViews()) {
- taskView.updateSnapshotRadius();
+ taskView.updateFullscreenParams();
}
}
@@ -5167,7 +5164,7 @@
if (!enableRefactorTaskThumbnail()) {
taskContainer.getThumbnailViewDeprecated().refreshSplashView();
}
- mSplitHiddenTaskView.updateSnapshotRadius();
+ mSplitHiddenTaskView.updateFullscreenParams();
});
} else if (isInitiatingSplitFromTaskView) {
if (Flags.enableHoverOfChildElementsInTaskview()) {
diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java
index 5dbc2ef..9f2bb9a 100644
--- a/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java
+++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java
@@ -50,9 +50,9 @@
import com.android.launcher3.util.SystemUiController;
import com.android.launcher3.util.SystemUiController.SystemUiControllerFlags;
import com.android.launcher3.util.ViewPool;
+import com.android.quickstep.FullscreenDrawParams;
import com.android.quickstep.TaskOverlayFactory.TaskOverlay;
import com.android.quickstep.orientation.RecentsPagedOrientationHandler;
-import com.android.quickstep.views.TaskView.FullscreenDrawParams;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.recents.utilities.PreviewPositionHelper;
@@ -107,7 +107,7 @@
// Contains the portion of the thumbnail that is clipped when fullscreen progress = 0.
private final Rect mPreviewRect = new Rect();
private final PreviewPositionHelper mPreviewPositionHelper = new PreviewPositionHelper();
- private TaskView.FullscreenDrawParams mFullscreenParams;
+ private FullscreenDrawParams mFullscreenParams;
private ImageView mSplashView;
private Drawable mSplashViewDrawable;
private TaskView mTaskView;
@@ -279,7 +279,7 @@
canvas.save();
// Draw the insets if we're being drawn fullscreen (we do this for quick switch).
drawOnCanvas(canvas, 0, 0, getMeasuredWidth(), getMeasuredHeight(),
- mFullscreenParams.getCurrentDrawnCornerRadius());
+ mFullscreenParams.getCurrentCornerRadius());
canvas.restore();
}
@@ -287,7 +287,7 @@
return mPreviewPositionHelper;
}
- public void setFullscreenParams(TaskView.FullscreenDrawParams fullscreenParams) {
+ public void setFullscreenParams(FullscreenDrawParams fullscreenParams) {
mFullscreenParams = fullscreenParams;
invalidate();
}
@@ -473,7 +473,7 @@
mBitmapShader.setLocalMatrix(mPreviewPositionHelper.getMatrix());
mPaint.setShader(mBitmapShader);
}
- mTaskView.updateCurrentFullscreenParams();
+ mTaskView.updateFullscreenParams();
invalidate();
}
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.kt b/quickstep/src/com/android/quickstep/views/TaskView.kt
index b1cb407..819ab05 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskView.kt
@@ -59,13 +59,11 @@
import com.android.launcher3.testing.TestLogging
import com.android.launcher3.testing.shared.TestProtocol
import com.android.launcher3.util.CancellableTask
-import com.android.launcher3.util.DisplayController
import com.android.launcher3.util.Executors
import com.android.launcher3.util.MultiPropertyFactory
import com.android.launcher3.util.MultiPropertyFactory.MULTI_PROPERTY_VALUE
import com.android.launcher3.util.MultiValueAlpha
import com.android.launcher3.util.RunnableList
-import com.android.launcher3.util.SafeCloseable
import com.android.launcher3.util.SplitConfigurationOptions
import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_UNDEFINED
import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption
@@ -74,16 +72,13 @@
import com.android.launcher3.util.TransformingTouchDelegate
import com.android.launcher3.util.ViewPool
import com.android.launcher3.util.rects.set
-import com.android.launcher3.views.ActivityContext
+import com.android.quickstep.FullscreenDrawParams
import com.android.quickstep.RecentsModel
import com.android.quickstep.RemoteAnimationTargets
import com.android.quickstep.TaskOverlayFactory
import com.android.quickstep.TaskViewUtils
import com.android.quickstep.orientation.RecentsPagedOrientationHandler
-import com.android.quickstep.recents.di.RecentsDependencies
-import com.android.quickstep.recents.di.get
import com.android.quickstep.task.thumbnail.TaskThumbnailView
-import com.android.quickstep.task.viewmodel.TaskViewModel
import com.android.quickstep.util.ActiveGestureErrorDetector
import com.android.quickstep.util.ActiveGestureLog
import com.android.quickstep.util.BorderAnimator
@@ -95,7 +90,6 @@
import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.ThumbnailData
import com.android.systemui.shared.system.ActivityManagerWrapper
-import com.android.systemui.shared.system.QuickStepContract
/** A task in the Recents view. */
open class TaskView
@@ -108,6 +102,7 @@
focusBorderAnimator: BorderAnimator? = null,
hoverBorderAnimator: BorderAnimator? = null,
private val type: TaskViewType = TaskViewType.SINGLE,
+ protected val thumbnailFullscreenParams: FullscreenDrawParams = FullscreenDrawParams(context),
) : FrameLayout(context, attrs), ViewPool.Reusable {
/**
* Used in conjunction with [onTaskListVisibilityChanged], providing more granularity on which
@@ -117,8 +112,6 @@
@IntDef(FLAG_UPDATE_ALL, FLAG_UPDATE_ICON, FLAG_UPDATE_THUMBNAIL, FLAG_UPDATE_CORNER_RADIUS)
annotation class TaskDataChanges
- private lateinit var taskViewModel: TaskViewModel
-
val taskIds: IntArray
/** Returns a copy of integer array containing taskIds of all tasks in the TaskView. */
get() = taskContainers.map { it.task.key.id }.toIntArray()
@@ -142,9 +135,6 @@
this == recentsView?.focusedTaskView ||
(enableLargeDesktopWindowingTile() && type == TaskViewType.DESKTOP)
- val taskCornerRadius: Float
- get() = currentFullscreenParams.cornerRadius
-
val recentsView: RecentsView<*, *>?
get() = parent as? RecentsView<*, *>
@@ -165,7 +155,6 @@
val firstItemInfo: ItemInfo
get() = taskContainers[0].itemInfo
- private val currentFullscreenParams = FullscreenDrawParams(context)
protected val container: RecentsViewContainer =
RecentsViewContainer.containerFromContext(context)
protected val lastTouchDownPosition = PointF()
@@ -489,17 +478,13 @@
init {
setOnClickListener { _ -> onClick() }
- if (enableRefactorTaskThumbnail()) {
- taskViewModel = RecentsDependencies.get(this, "TaskViewType" to type)
- }
-
val cursorHoverStatesEnabled = enableCursorHoverStates()
setWillNotDraw(!cursorHoverStatesEnabled)
context.obtainStyledAttributes(attrs, R.styleable.TaskView, defStyleAttr, defStyleRes).use {
this.focusBorderAnimator =
focusBorderAnimator
?: createSimpleBorderAnimator(
- currentFullscreenParams.cornerRadius.toInt(),
+ TaskCornerRadius.get(context).toInt(),
context.resources.getDimensionPixelSize(
R.dimen.keyboard_quick_switch_border_width
),
@@ -514,7 +499,7 @@
hoverBorderAnimator
?: if (cursorHoverStatesEnabled)
createSimpleBorderAnimator(
- currentFullscreenParams.cornerRadius.toInt(),
+ TaskCornerRadius.get(context).toInt(),
context.resources.getDimensionPixelSize(
R.dimen.task_hover_border_width
),
@@ -716,7 +701,16 @@
taskOverlayFactory,
)
)
- taskContainers.forEach { it.bind() }
+ onBind(orientedState)
+ }
+
+ open fun onBind(orientedState: RecentsOrientedState) {
+ taskContainers.forEach {
+ it.bind()
+ if (enableRefactorTaskThumbnail()) {
+ it.thumbnailView.cornerRadius = thumbnailFullscreenParams.currentCornerRadius
+ }
+ }
setOrientationState(orientedState)
}
@@ -935,7 +929,7 @@
}
}
if (needsUpdate(changes, FLAG_UPDATE_CORNER_RADIUS)) {
- currentFullscreenParams.updateCornerRadius(context)
+ thumbnailFullscreenParams.updateCornerRadius(context)
}
}
@@ -1514,10 +1508,7 @@
val scale = persistentScale * dismissScale
scaleX = scale
scaleY = scale
- if (enableRefactorTaskThumbnail()) {
- taskViewModel.updateScale(scale)
- }
- updateSnapshotRadius()
+ updateFullscreenParams()
}
protected open fun applyThumbnailSplashAlpha() {
@@ -1560,30 +1551,25 @@
}
focusTransitionFullscreen.value =
FOCUS_TRANSITION_FAST_OUT_INTERPOLATOR.getInterpolation(1 - fullscreenProgress)
- updateSnapshotRadius()
+ updateFullscreenParams()
}
- protected open fun updateSnapshotRadius() {
- updateCurrentFullscreenParams()
+ protected open fun updateFullscreenParams() {
+ updateFullscreenParams(thumbnailFullscreenParams)
taskContainers.forEach {
- if (!enableRefactorTaskThumbnail()) {
- it.thumbnailViewDeprecated.setFullscreenParams(getThumbnailFullscreenParams())
+ if (enableRefactorTaskThumbnail()) {
+ it.thumbnailView.cornerRadius = thumbnailFullscreenParams.currentCornerRadius
+ } else {
+ it.thumbnailViewDeprecated.setFullscreenParams(thumbnailFullscreenParams)
}
- it.overlay.setFullscreenParams(getThumbnailFullscreenParams())
+ it.overlay.setFullscreenParams(thumbnailFullscreenParams)
}
}
- protected open fun updateCurrentFullscreenParams() {
- updateFullscreenParams(currentFullscreenParams)
- }
-
protected fun updateFullscreenParams(fullscreenParams: FullscreenDrawParams) {
recentsView?.let { fullscreenParams.setProgress(fullscreenProgress, it.scaleX, scaleX) }
}
- protected open fun getThumbnailFullscreenParams(): FullscreenDrawParams =
- currentFullscreenParams
-
private fun onModalnessUpdated(modalness: Float) {
taskContainers.forEach {
it.iconView.setModalAlpha(1 - modalness)
@@ -1630,56 +1616,6 @@
private fun getNonGridTrans(endTranslation: Float) =
endTranslation - getGridTrans(endTranslation)
- /** We update and subsequently draw these in [fullscreenProgress]. */
- open class FullscreenDrawParams(context: Context) : SafeCloseable {
- var cornerRadius = 0f
- private var windowCornerRadius = 0f
- var currentDrawnCornerRadius = 0f
-
- init {
- updateCornerRadius(context)
- }
-
- /** Recomputes the start and end corner radius for the given Context. */
- fun updateCornerRadius(context: Context) {
- cornerRadius = computeTaskCornerRadius(context)
- windowCornerRadius = computeWindowCornerRadius(context)
- }
-
- @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED)
- open fun computeTaskCornerRadius(context: Context): Float {
- return TaskCornerRadius.get(context)
- }
-
- @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED)
- open fun computeWindowCornerRadius(context: Context): Float {
- val activityContext: ActivityContext? = ActivityContext.lookupContextNoThrow(context)
-
- // The corner radius is fixed to match when Taskbar is persistent mode
- return if (
- activityContext != null &&
- activityContext.deviceProfile?.isTaskbarPresent == true &&
- DisplayController.isTransientTaskbar(context)
- ) {
- context.resources
- .getDimensionPixelSize(R.dimen.persistent_taskbar_corner_radius)
- .toFloat()
- } else {
- QuickStepContract.getWindowCornerRadius(context)
- }
- }
-
- /** Sets the progress in range [0, 1] */
- fun setProgress(fullscreenProgress: Float, parentScale: Float, taskViewScale: Float) {
- currentDrawnCornerRadius =
- Utilities.mapRange(fullscreenProgress, cornerRadius, windowCornerRadius) /
- parentScale /
- taskViewScale
- }
-
- override fun close() {}
- }
-
private fun MotionEvent.isWithinThumbnailBounds(): Boolean {
return thumbnailBounds.contains(x.toInt(), y.toInt())
}
diff --git a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/FakeTaskThumbnailViewModel.kt b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/FakeTaskThumbnailViewModel.kt
index ff5d8bd..47d2bfc 100644
--- a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/FakeTaskThumbnailViewModel.kt
+++ b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/FakeTaskThumbnailViewModel.kt
@@ -22,8 +22,6 @@
import kotlinx.coroutines.flow.MutableStateFlow
class FakeTaskThumbnailViewModel : TaskThumbnailViewModel {
- override val cornerRadiusProgress = MutableStateFlow(0f)
- override val inheritedScale = MutableStateFlow(1f)
override val dimProgress = MutableStateFlow(0f)
override val splashAlpha = MutableStateFlow(0f)
override val uiState = MutableStateFlow<TaskThumbnailUiState>(Uninitialized)
diff --git a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt
index 75769e9..49fe614 100644
--- a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt
+++ b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt
@@ -66,11 +66,13 @@
val di = RecentsDependencies.initialize(context)
val taskThumbnailView =
LayoutInflater.from(context).inflate(R.layout.task_thumbnail, null, false)
+ as TaskThumbnailView
+ taskThumbnailView.cornerRadius = CORNER_RADIUS
val ttvDiScopeId = di.getScope(taskThumbnailView).scopeId
di.provide(TaskThumbnailViewData::class.java, ttvDiScopeId) { TaskThumbnailViewData() }
di.provide(TaskThumbnailViewModel::class.java, ttvDiScopeId) { taskThumbnailViewModel }
- return taskThumbnailView as TaskThumbnailView
+ return taskThumbnailView
}
companion object {
@@ -82,5 +84,7 @@
isDarkTheme = false,
isLandscape = false,
)
+
+ const val CORNER_RADIUS = 56f
}
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/DesktopFullscreenDrawParamsTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/DesktopFullscreenDrawParamsTest.kt
new file mode 100644
index 0000000..e62455f
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/DesktopFullscreenDrawParamsTest.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2022 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.quickstep
+
+import android.content.Context
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.mock
+
+/** Test for [DesktopFullscreenDrawParams] class. */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DesktopFullscreenDrawParamsTest() {
+ private val params =
+ DesktopFullscreenDrawParams(mock<Context>(), cornerRadiusProvider = { CORNER_RADIUS })
+
+ @Test
+ fun setMiddleProgress_invariantCornerRadiusForDesktop() {
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(CORNER_RADIUS)
+
+ params.setProgress(fullscreenProgress = 0.67f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(CORNER_RADIUS)
+
+ params.setProgress(fullscreenProgress = 1f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(CORNER_RADIUS)
+ }
+
+ companion object {
+ const val CORNER_RADIUS = 32f
+ }
+}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/FullscreenDrawParamsTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/FullscreenDrawParamsTest.kt
index 5d62a4c..99b81e0 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/FullscreenDrawParamsTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/FullscreenDrawParamsTest.kt
@@ -20,21 +20,17 @@
import androidx.test.filters.SmallTest
import com.android.launcher3.FakeInvariantDeviceProfileTest
import com.android.quickstep.util.TaskCornerRadius
-import com.android.quickstep.views.TaskView.FullscreenDrawParams
import com.android.systemui.shared.system.QuickStepContract
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.Mockito.doReturn
-import org.mockito.Mockito.mock
-import org.mockito.Mockito.spy
+import org.mockito.kotlin.mock
-/** Test for FullscreenDrawParams class. */
+/** Test for [FullscreenDrawParams] class. */
@SmallTest
@RunWith(AndroidJUnit4::class)
class FullscreenDrawParamsTest : FakeInvariantDeviceProfileTest() {
-
private lateinit var params: FullscreenDrawParams
@Before
@@ -46,115 +42,108 @@
fun setStartProgress_correctCornerRadiusForTablet() {
initializeVarsForTablet()
- params.setProgress(
- /* fullscreenProgress= */ 0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1.0f, taskViewScale = 1.0f)
val expectedRadius = TaskCornerRadius.get(context)
- assertThat(params.currentDrawnCornerRadius).isEqualTo(expectedRadius)
+ assertThat(params.currentCornerRadius).isEqualTo(expectedRadius)
}
@Test
fun setFullProgress_correctCornerRadiusForTablet() {
initializeVarsForTablet()
- params.setProgress(
- /* fullscreenProgress= */ 1.0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
+ params.setProgress(fullscreenProgress = 1.0f, parentScale = 1f, taskViewScale = 1f)
val expectedRadius = QuickStepContract.getWindowCornerRadius(context)
- assertThat(params.currentDrawnCornerRadius).isEqualTo(expectedRadius)
+ assertThat(params.currentCornerRadius).isEqualTo(expectedRadius)
}
@Test
fun setStartProgress_correctCornerRadiusForPhone() {
initializeVarsForPhone()
- params.setProgress(
- /* fullscreenProgress= */ 0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1f, taskViewScale = 1f)
val expectedRadius = TaskCornerRadius.get(context)
- assertThat(params.currentDrawnCornerRadius).isEqualTo(expectedRadius)
+ assertThat(params.currentCornerRadius).isEqualTo(expectedRadius)
}
@Test
fun setFullProgress_correctCornerRadiusForPhone() {
initializeVarsForPhone()
- params.setProgress(
- /* fullscreenProgress= */ 1.0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
+ params.setProgress(fullscreenProgress = 1.0f, parentScale = 1f, taskViewScale = 1f)
val expectedRadius = QuickStepContract.getWindowCornerRadius(context)
- assertThat(params.currentDrawnCornerRadius).isEqualTo(expectedRadius)
+ assertThat(params.currentCornerRadius).isEqualTo(expectedRadius)
}
@Test
fun setStartProgress_correctCornerRadiusForMultiDisplay() {
- val display1Context = context
- val display2Context = mock(Context::class.java)
- val spyParams = spy(params)
+ val display1Context = mock<Context>()
+ val display2Context = mock<Context>()
+ val display1TaskRadius = TASK_CORNER_RADIUS + 1
+ val display2TaskRadius = TASK_CORNER_RADIUS + 2
- val display1TaskRadius = TaskCornerRadius.get(display1Context)
- val display1WindowRadius = QuickStepContract.getWindowCornerRadius(display1Context)
- val display2TaskRadius = display1TaskRadius * 2 + 1 // Arbitrarily different.
- val display2WindowRadius = display1WindowRadius * 2 + 1 // Arbitrarily different.
- doReturn(display2TaskRadius).`when`(spyParams).computeTaskCornerRadius(display2Context)
- doReturn(display2WindowRadius).`when`(spyParams).computeWindowCornerRadius(display2Context)
+ val params =
+ FullscreenDrawParams(
+ context,
+ taskCornerRadiusProvider = { context ->
+ when (context) {
+ display1Context -> display1TaskRadius
+ display2Context -> display2TaskRadius
+ else -> TASK_CORNER_RADIUS
+ }
+ },
+ windowCornerRadiusProvider = { 0f },
+ )
- spyParams.updateCornerRadius(display1Context)
- spyParams.setProgress(
- /* fullscreenProgress= */ 0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
- assertThat(spyParams.currentDrawnCornerRadius).isEqualTo(display1TaskRadius)
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(TASK_CORNER_RADIUS)
- spyParams.updateCornerRadius(display2Context)
- spyParams.setProgress(
- /* fullscreenProgress= */ 0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
- assertThat(spyParams.currentDrawnCornerRadius).isEqualTo(display2TaskRadius)
+ params.updateCornerRadius(display1Context)
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(display1TaskRadius)
+
+ params.updateCornerRadius(display2Context)
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(display2TaskRadius)
}
@Test
fun setFullProgress_correctCornerRadiusForMultiDisplay() {
- val display1Context = context
- val display2Context = mock(Context::class.java)
- val spyParams = spy(params)
+ val display1Context = mock<Context>()
+ val display2Context = mock<Context>()
+ val display1WindowRadius = WINDOW_CORNER_RADIUS + 1
+ val display2WindowRadius = WINDOW_CORNER_RADIUS + 2
- val display1TaskRadius = TaskCornerRadius.get(display1Context)
- val display1WindowRadius = QuickStepContract.getWindowCornerRadius(display1Context)
- val display2TaskRadius = display1TaskRadius * 2 + 1 // Arbitrarily different.
- val display2WindowRadius = display1WindowRadius * 2 + 1 // Arbitrarily different.
- doReturn(display2TaskRadius).`when`(spyParams).computeTaskCornerRadius(display2Context)
- doReturn(display2WindowRadius).`when`(spyParams).computeWindowCornerRadius(display2Context)
+ val params =
+ FullscreenDrawParams(
+ context,
+ taskCornerRadiusProvider = { 0f },
+ windowCornerRadiusProvider = { context ->
+ when (context) {
+ display1Context -> display1WindowRadius
+ display2Context -> display2WindowRadius
+ else -> WINDOW_CORNER_RADIUS
+ }
+ },
+ )
- spyParams.updateCornerRadius(display1Context)
- spyParams.setProgress(
- /* fullscreenProgress= */ 1.0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
- assertThat(spyParams.currentDrawnCornerRadius).isEqualTo(display1WindowRadius)
+ params.setProgress(fullscreenProgress = 1f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(WINDOW_CORNER_RADIUS)
- spyParams.updateCornerRadius(display2Context)
- spyParams.setProgress(
- /* fullscreenProgress= */ 1.0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f,
- )
- assertThat(spyParams.currentDrawnCornerRadius).isEqualTo(display2WindowRadius)
+ params.updateCornerRadius(display1Context)
+ params.setProgress(fullscreenProgress = 1f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(display1WindowRadius)
+
+ params.updateCornerRadius(display2Context)
+ params.setProgress(fullscreenProgress = 1f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(display2WindowRadius)
+ }
+
+ companion object {
+ const val TASK_CORNER_RADIUS = 56f
+ const val WINDOW_CORNER_RADIUS = 32f
}
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewModelImplTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewModelImplTest.kt
index e3a6adf..a777bd4 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewModelImplTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewModelImplTest.kt
@@ -37,8 +37,6 @@
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Uninitialized
import com.android.quickstep.task.viewmodel.TaskContainerData
import com.android.quickstep.task.viewmodel.TaskThumbnailViewModelImpl
-import com.android.quickstep.task.viewmodel.TaskViewData
-import com.android.quickstep.views.TaskViewType
import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.ThumbnailData
import com.google.common.truth.Truth.assertThat
@@ -57,9 +55,7 @@
private val dispatcher = StandardTestDispatcher()
private val testScope = TestScope(dispatcher)
- private var taskViewType = TaskViewType.SINGLE
private val recentsViewData = RecentsViewData()
- private val taskViewData by lazy { TaskViewData(taskViewType) }
private val taskContainerData = TaskContainerData()
private val dispatcherProvider = TestDispatcherProvider(dispatcher)
private val tasksRepository = FakeTasksRepository()
@@ -69,7 +65,6 @@
private val systemUnderTest by lazy {
TaskThumbnailViewModelImpl(
recentsViewData,
- taskViewData,
taskContainerData,
dispatcherProvider,
tasksRepository,
@@ -124,40 +119,6 @@
}
@Test
- fun setRecentsFullscreenProgress_thenCornerRadiusProgressIsPassedThrough() =
- testScope.runTest {
- recentsViewData.fullscreenProgress.value = 0.5f
-
- assertThat(systemUnderTest.cornerRadiusProgress.first()).isEqualTo(0.5f)
-
- recentsViewData.fullscreenProgress.value = 0.6f
-
- assertThat(systemUnderTest.cornerRadiusProgress.first()).isEqualTo(0.6f)
- }
-
- @Test
- fun setRecentsFullscreenProgress_thenCornerRadiusProgressIsConstantForDesktop() =
- testScope.runTest {
- taskViewType = TaskViewType.DESKTOP
- recentsViewData.fullscreenProgress.value = 0.5f
-
- assertThat(systemUnderTest.cornerRadiusProgress.first()).isEqualTo(1f)
-
- recentsViewData.fullscreenProgress.value = 0.6f
-
- assertThat(systemUnderTest.cornerRadiusProgress.first()).isEqualTo(1f)
- }
-
- @Test
- fun setAncestorScales_thenScaleIsCalculated() =
- testScope.runTest {
- recentsViewData.scale.value = 0.5f
- taskViewData.scale.value = 0.6f
-
- assertThat(systemUnderTest.inheritedScale.first()).isEqualTo(0.3f)
- }
-
- @Test
fun bindRunningTaskThenStoppedTaskWithoutThumbnail_thenStateChangesToBackgroundOnly() =
testScope.runTest {
val runningTaskId = 1
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java
index 72cfd92..fa81680 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java
@@ -202,7 +202,7 @@
mDeviceProfile.updateInsets(mLauncherInsets);
TaskViewSimulator tvs = new TaskViewSimulator(helper.sandboxContext,
- FallbackActivityInterface.INSTANCE);
+ FallbackActivityInterface.INSTANCE, false, 0);
tvs.setDp(mDeviceProfile);
int launcherRotation = info.rotation;