Skip to content

Commit a72f546

Browse files
author
Android Build Coastguard Worker
committed
Merge cherrypicks of ['googleplex-android-review.googlesource.com/26566289'] into 24Q2-release.
Change-Id: Ie5b177724fd43041dbe6c7fcf4d74e14f9887d44
2 parents fb79b46 + b24d4d5 commit a72f546

File tree

6 files changed

+121
-48
lines changed

6 files changed

+121
-48
lines changed

quickstep/res/layout-land/keyboard_quick_switch_taskview.xml

+18-16
Original file line numberDiff line numberDiff line change
@@ -36,51 +36,53 @@
3636
app:layout_constraintEnd_toEndOf="parent">
3737

3838
<include
39-
layout="@layout/keyboard_quick_switch_thumbnail"
40-
android:id="@+id/thumbnail1"
39+
layout="@layout/keyboard_quick_switch_taskview_thumbnail"
40+
android:id="@+id/thumbnail_1"
4141
android:layout_width="0dp"
4242
android:layout_height="match_parent"
4343

4444
app:layout_constraintTop_toTopOf="parent"
4545
app:layout_constraintBottom_toBottomOf="parent"
4646
app:layout_constraintStart_toStartOf="parent"
47-
app:layout_constraintEnd_toStartOf="@id/thumbnail2"/>
47+
app:layout_constraintEnd_toStartOf="@id/thumbnail_2"/>
4848

4949
<include
50-
layout="@layout/keyboard_quick_switch_thumbnail"
51-
android:id="@+id/thumbnail2"
50+
layout="@layout/keyboard_quick_switch_taskview_thumbnail"
51+
android:id="@+id/thumbnail_2"
5252
android:layout_width="0dp"
5353
android:layout_height="match_parent"
5454
android:visibility="gone"
5555
android:layout_marginStart="@dimen/keyboard_quick_switch_split_view_spacing"
5656

5757
app:layout_constraintTop_toTopOf="parent"
5858
app:layout_constraintBottom_toBottomOf="parent"
59-
app:layout_constraintStart_toEndOf="@id/thumbnail1"
59+
app:layout_constraintStart_toEndOf="@id/thumbnail_1"
6060
app:layout_constraintEnd_toEndOf="parent"/>
6161

6262
<ImageView
63-
android:id="@+id/icon1"
63+
android:id="@+id/icon_1"
6464
android:layout_width="@dimen/keyboard_quick_switch_taskview_icon_size"
6565
android:layout_height="@dimen/keyboard_quick_switch_taskview_icon_size"
66-
android:layout_marginTop="@dimen/keyboard_quick_switch_taskview_icon_margin"
67-
android:layout_marginStart="@dimen/keyboard_quick_switch_taskview_icon_margin"
6866
android:importantForAccessibility="no"
67+
android:scaleType="centerCrop"
6968

70-
app:layout_constraintTop_toTopOf="@id/thumbnail1"
71-
app:layout_constraintStart_toStartOf="@id/thumbnail1"/>
69+
app:layout_constraintTop_toTopOf="@id/thumbnail_1"
70+
app:layout_constraintBottom_toBottomOf="@id/thumbnail_1"
71+
app:layout_constraintStart_toStartOf="@id/thumbnail_1"
72+
app:layout_constraintEnd_toEndOf="@id/thumbnail_1"/>
7273

7374
<ImageView
74-
android:id="@+id/icon2"
75+
android:id="@+id/icon_2"
7576
android:layout_width="@dimen/keyboard_quick_switch_taskview_icon_size"
7677
android:layout_height="@dimen/keyboard_quick_switch_taskview_icon_size"
77-
android:layout_marginTop="@dimen/keyboard_quick_switch_taskview_icon_margin"
78-
android:layout_marginStart="@dimen/keyboard_quick_switch_taskview_icon_margin"
7978
android:importantForAccessibility="no"
8079
android:visibility="gone"
80+
android:scaleType="centerCrop"
8181

82-
app:layout_constraintTop_toTopOf="@id/thumbnail2"
83-
app:layout_constraintStart_toStartOf="@id/thumbnail2"/>
82+
app:layout_constraintTop_toTopOf="@id/thumbnail_2"
83+
app:layout_constraintBottom_toBottomOf="@id/thumbnail_2"
84+
app:layout_constraintStart_toStartOf="@id/thumbnail_2"
85+
app:layout_constraintEnd_toEndOf="@id/thumbnail_2"/>
8486

8587
</androidx.constraintlayout.widget.ConstraintLayout>
8688

quickstep/res/layout/keyboard_quick_switch_taskview.xml

+18-16
Original file line numberDiff line numberDiff line change
@@ -36,51 +36,53 @@
3636
app:layout_constraintEnd_toEndOf="parent">
3737

3838
<include
39-
layout="@layout/keyboard_quick_switch_thumbnail"
40-
android:id="@+id/thumbnail1"
39+
layout="@layout/keyboard_quick_switch_taskview_thumbnail"
40+
android:id="@+id/thumbnail_1"
4141
android:layout_width="match_parent"
4242
android:layout_height="0dp"
4343

4444
app:layout_constraintTop_toTopOf="parent"
45-
app:layout_constraintBottom_toTopOf="@id/thumbnail2"
45+
app:layout_constraintBottom_toTopOf="@id/thumbnail_2"
4646
app:layout_constraintStart_toStartOf="parent"
4747
app:layout_constraintEnd_toEndOf="parent"/>
4848

4949
<include
50-
layout="@layout/keyboard_quick_switch_thumbnail"
51-
android:id="@+id/thumbnail2"
50+
layout="@layout/keyboard_quick_switch_taskview_thumbnail"
51+
android:id="@+id/thumbnail_2"
5252
android:layout_width="match_parent"
5353
android:layout_height="0dp"
5454
android:visibility="gone"
5555
android:layout_marginTop="@dimen/keyboard_quick_switch_split_view_spacing"
5656

57-
app:layout_constraintTop_toBottomOf="@id/thumbnail1"
57+
app:layout_constraintTop_toBottomOf="@id/thumbnail_1"
5858
app:layout_constraintBottom_toBottomOf="parent"
5959
app:layout_constraintStart_toStartOf="parent"
6060
app:layout_constraintEnd_toEndOf="parent"/>
6161

6262
<ImageView
63-
android:id="@+id/icon1"
63+
android:id="@+id/icon_1"
6464
android:layout_width="@dimen/keyboard_quick_switch_taskview_icon_size"
6565
android:layout_height="@dimen/keyboard_quick_switch_taskview_icon_size"
66-
android:layout_marginTop="@dimen/keyboard_quick_switch_taskview_icon_margin"
67-
android:layout_marginStart="@dimen/keyboard_quick_switch_taskview_icon_margin"
6866
android:importantForAccessibility="no"
67+
android:scaleType="centerCrop"
6968

70-
app:layout_constraintTop_toTopOf="@id/thumbnail1"
71-
app:layout_constraintStart_toStartOf="@id/thumbnail1"/>
69+
app:layout_constraintTop_toTopOf="@id/thumbnail_1"
70+
app:layout_constraintBottom_toBottomOf="@id/thumbnail_1"
71+
app:layout_constraintStart_toStartOf="@id/thumbnail_1"
72+
app:layout_constraintEnd_toEndOf="@id/thumbnail_1"/>
7273

7374
<ImageView
74-
android:id="@+id/icon2"
75+
android:id="@+id/icon_2"
7576
android:layout_width="@dimen/keyboard_quick_switch_taskview_icon_size"
7677
android:layout_height="@dimen/keyboard_quick_switch_taskview_icon_size"
77-
android:layout_marginTop="@dimen/keyboard_quick_switch_taskview_icon_margin"
78-
android:layout_marginStart="@dimen/keyboard_quick_switch_taskview_icon_margin"
7978
android:importantForAccessibility="no"
8079
android:visibility="gone"
80+
android:scaleType="centerCrop"
8181

82-
app:layout_constraintTop_toTopOf="@id/thumbnail2"
83-
app:layout_constraintStart_toStartOf="@id/thumbnail2"/>
82+
app:layout_constraintTop_toTopOf="@id/thumbnail_2"
83+
app:layout_constraintBottom_toBottomOf="@id/thumbnail_2"
84+
app:layout_constraintStart_toStartOf="@id/thumbnail_2"
85+
app:layout_constraintEnd_toEndOf="@id/thumbnail_2"/>
8486

8587
</androidx.constraintlayout.widget.ConstraintLayout>
8688

quickstep/res/values/dimens.xml

+1-2
Original file line numberDiff line numberDiff line change
@@ -439,8 +439,7 @@
439439
<dimen name="keyboard_quick_switch_border_width">4dp</dimen>
440440
<dimen name="keyboard_quick_switch_taskview_width">104dp</dimen>
441441
<dimen name="keyboard_quick_switch_taskview_height">134dp</dimen>
442-
<dimen name="keyboard_quick_switch_taskview_icon_size">28dp</dimen>
443-
<dimen name="keyboard_quick_switch_taskview_icon_margin">4dp</dimen>
442+
<dimen name="keyboard_quick_switch_taskview_icon_size">52dp</dimen>
444443
<dimen name="keyboard_quick_switch_recents_icon_size">20dp</dimen>
445444
<dimen name="keyboard_quick_switch_margin_top">56dp</dimen>
446445
<dimen name="keyboard_quick_switch_margin_ends">16dp</dimen>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
* Copyright (C) 2024 The Android Open Source Project
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.android.launcher3.taskbar
17+
18+
import android.graphics.Bitmap
19+
import android.graphics.Canvas
20+
import android.graphics.PixelFormat
21+
import android.graphics.RenderEffect
22+
import android.graphics.RenderNode
23+
import android.graphics.Shader
24+
import android.graphics.drawable.BitmapDrawable
25+
import android.graphics.drawable.DrawableWrapper
26+
27+
/* BitmapDrawable that can blur the given bitmap. */
28+
class BlurredBitmapDrawable(bitmap: Bitmap?, radiusX: Float, radiusY: Float) :
29+
DrawableWrapper(BitmapDrawable(bitmap)) {
30+
private val mBlurRenderNode: RenderNode = RenderNode("BlurredConstraintLayoutBlurNode")
31+
32+
constructor(bitmap: Bitmap?, radius: Float) : this(bitmap, radius, radius)
33+
34+
init {
35+
mBlurRenderNode.setRenderEffect(
36+
RenderEffect.createBlurEffect(radiusX, radiusY, Shader.TileMode.CLAMP)
37+
)
38+
}
39+
40+
override fun draw(canvas: Canvas) {
41+
if (!canvas.isHardwareAccelerated) {
42+
super.draw(canvas)
43+
return
44+
}
45+
mBlurRenderNode.setPosition(bounds)
46+
if (!mBlurRenderNode.hasDisplayList()) {
47+
// Record render node if its display list is not recorded or discarded
48+
// (which happens when it's no longer drawn by anything).
49+
val recordingCanvas = mBlurRenderNode.beginRecording()
50+
super.draw(recordingCanvas)
51+
mBlurRenderNode.endRecording()
52+
}
53+
canvas.drawRenderNode(mBlurRenderNode)
54+
}
55+
56+
override fun getOpacity(): Int {
57+
return PixelFormat.OPAQUE
58+
}
59+
}

quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchTaskView.java

+25-14
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import android.content.res.TypedArray;
2424
import android.graphics.Bitmap;
2525
import android.graphics.Canvas;
26+
import android.graphics.drawable.Drawable;
2627
import android.util.AttributeSet;
2728
import android.view.View;
2829
import android.widget.ImageView;
@@ -47,6 +48,8 @@
4748
*/
4849
public class KeyboardQuickSwitchTaskView extends ConstraintLayout {
4950

51+
private static final float THUMBNAIL_BLUR_RADIUS = 1f;
52+
5053
@ColorInt private final int mBorderColor;
5154

5255
@Nullable private BorderAnimator mBorderAnimator;
@@ -89,10 +92,10 @@ public KeyboardQuickSwitchTaskView(
8992
@Override
9093
protected void onFinishInflate() {
9194
super.onFinishInflate();
92-
mThumbnailView1 = findViewById(R.id.thumbnail1);
93-
mThumbnailView2 = findViewById(R.id.thumbnail2);
94-
mIcon1 = findViewById(R.id.icon1);
95-
mIcon2 = findViewById(R.id.icon2);
95+
mThumbnailView1 = findViewById(R.id.thumbnail_1);
96+
mThumbnailView2 = findViewById(R.id.thumbnail_2);
97+
mIcon1 = findViewById(R.id.icon_1);
98+
mIcon2 = findViewById(R.id.icon_2);
9699
mContent = findViewById(R.id.content);
97100

98101
Resources resources = mContext.getResources();
@@ -167,10 +170,7 @@ private void applyThumbnail(
167170
@Nullable ImageView thumbnailView,
168171
@Nullable Task task,
169172
@Nullable ThumbnailUpdateFunction updateFunction) {
170-
if (thumbnailView == null) {
171-
return;
172-
}
173-
if (task == null) {
173+
if (thumbnailView == null || task == null) {
174174
return;
175175
}
176176
if (updateFunction == null) {
@@ -182,19 +182,30 @@ private void applyThumbnail(
182182
}
183183

184184
private void applyThumbnail(
185-
@NonNull ImageView thumbnailView, ThumbnailData thumbnailData) {
185+
@NonNull ImageView thumbnailView,
186+
ThumbnailData thumbnailData) {
186187
Bitmap bm = thumbnailData == null ? null : thumbnailData.thumbnail;
187188

188-
thumbnailView.setVisibility(VISIBLE);
189-
thumbnailView.setImageBitmap(bm);
189+
if (thumbnailView.getVisibility() != VISIBLE) {
190+
thumbnailView.setVisibility(VISIBLE);
191+
}
192+
thumbnailView.setImageDrawable(new BlurredBitmapDrawable(bm, THUMBNAIL_BLUR_RADIUS));
190193
}
191194

192195
private void applyIcon(@Nullable ImageView iconView, @Nullable Task task) {
193-
if (iconView == null || task == null) {
196+
if (iconView == null || task == null || task.icon == null) {
194197
return;
195198
}
196-
iconView.setVisibility(VISIBLE);
197-
iconView.setImageDrawable(task.icon);
199+
Drawable.ConstantState constantState = task.icon.getConstantState();
200+
if (constantState == null) {
201+
return;
202+
}
203+
if (iconView.getVisibility() != VISIBLE) {
204+
iconView.setVisibility(VISIBLE);
205+
}
206+
// Use the bitmap directly since the drawable's scale can change
207+
iconView.setImageDrawable(
208+
constantState.newDrawable(getResources(), getContext().getTheme()));
198209
}
199210

200211
protected interface ThumbnailUpdateFunction {

0 commit comments

Comments
 (0)