diff --git a/src/com/android/launcher3/RectUtils.kt b/src/com/android/launcher3/RectUtils.kt
deleted file mode 100644
index 68d2eaf..0000000
--- a/src/com/android/launcher3/RectUtils.kt
+++ /dev/null
@@ -1,60 +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.launcher3
-
-import android.graphics.Rect
-
-/**
- * Fit [this] into [targetRect] with letter boxing. After calling this method, [this] will be
- * modified to be letter boxed.
- *
- * @param targetRect target [Rect] that [this] should be fitted into
- */
-fun Rect.letterBox(targetRect: Rect) {
-    letterBox(targetRect, this)
-}
-
-/**
- * Fit [this] into [targetRect] with letter boxing. After calling this method, [resultRect] will be
- * modified to be letter boxed.
- *
- * @param targetRect target [Rect] that [this] should be fitted into
- * @param resultRect the letter boxed [Rect]
- */
-fun Rect.letterBox(targetRect: Rect, resultRect: Rect) {
-    val widthRatio: Float = 1f * targetRect.width() / width()
-    val heightRatio: Float = 1f * targetRect.height() / height()
-    if (widthRatio < heightRatio) {
-        val scaledHeight: Int = (widthRatio * height()).toInt()
-        val verticalPadding: Int = (targetRect.height() - scaledHeight) / 2
-        resultRect.set(
-            targetRect.left,
-            targetRect.top + verticalPadding,
-            targetRect.right,
-            targetRect.bottom - verticalPadding
-        )
-    } else {
-        val scaledWidth: Int = (heightRatio * width()).toInt()
-        val horizontalPadding: Int = (targetRect.width() - scaledWidth) / 2
-        resultRect.set(
-            targetRect.left + horizontalPadding,
-            targetRect.top,
-            targetRect.right - horizontalPadding,
-            targetRect.bottom
-        )
-    }
-}
diff --git a/src/com/android/launcher3/widget/PendingAppWidgetHostView.java b/src/com/android/launcher3/widget/PendingAppWidgetHostView.java
index 7f9a1fc..9c9b80d 100644
--- a/src/com/android/launcher3/widget/PendingAppWidgetHostView.java
+++ b/src/com/android/launcher3/widget/PendingAppWidgetHostView.java
@@ -29,9 +29,11 @@
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Color;
+import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.PorterDuff;
 import android.graphics.Rect;
+import android.graphics.RectF;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
@@ -53,7 +55,6 @@
 import com.android.launcher3.Launcher;
 import com.android.launcher3.LauncherAppState;
 import com.android.launcher3.R;
-import com.android.launcher3.RectUtilsKt;
 import com.android.launcher3.icons.FastBitmapDrawable;
 import com.android.launcher3.icons.IconCache.ItemInfoUpdateReceiver;
 import com.android.launcher3.model.data.ItemInfoWithIcon;
@@ -77,9 +78,9 @@
 
     private final Rect mRect = new Rect();
 
-    private final Rect mPreviewBitmapRect = new Rect();
-    private final Rect mCanvasRect = new Rect();
-    private final Rect mLetterBoxedPreviewBitmapRect = new Rect();
+    private final Matrix mMatrix = new Matrix();
+    private final RectF mPreviewBitmapRect = new RectF();
+    private final RectF mCanvasRect = new RectF();
 
     private final LauncherWidgetHolder mWidgetHolder;
     private final LauncherAppWidgetProviderInfo mAppwidget;
@@ -458,9 +459,8 @@
             mPreviewBitmapRect.set(0, 0, mPreviewBitmap.getWidth(), mPreviewBitmap.getHeight());
             mCanvasRect.set(0, 0, getWidth(), getHeight());
 
-            RectUtilsKt.letterBox(mPreviewBitmapRect, mCanvasRect, mLetterBoxedPreviewBitmapRect);
-            canvas.drawBitmap(mPreviewBitmap, mPreviewBitmapRect, mLetterBoxedPreviewBitmapRect,
-                    mPreviewPaint);
+            mMatrix.setRectToRect(mPreviewBitmapRect, mCanvasRect, Matrix.ScaleToFit.CENTER);
+            canvas.drawBitmap(mPreviewBitmap, mMatrix, mPreviewPaint);
             return;
         }
         if (mCenterDrawable == null) {
diff --git a/tests/src/com/android/launcher3/RectUtilsTest.kt b/tests/src/com/android/launcher3/RectUtilsTest.kt
deleted file mode 100644
index f0d22eb..0000000
--- a/tests/src/com/android/launcher3/RectUtilsTest.kt
+++ /dev/null
@@ -1,138 +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.launcher3
-
-import android.graphics.Rect
-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
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class RectUtilsTest {
-
-    private val srcRect = Rect()
-    private val destRect = Rect()
-    private val letterBoxedRect = Rect()
-
-    @Test
-    fun letterBoxSelf_toSameRect_noScale() {
-        srcRect.set(0, 0, 100, 100)
-        destRect.set(0, 0, 100, 100)
-
-        srcRect.letterBox(destRect)
-
-        assertThat(srcRect).isEqualTo(Rect(0, 0, 100, 100))
-    }
-
-    @Test
-    fun letterBox_toSameRect_noScale() {
-        srcRect.set(0, 0, 100, 100)
-        destRect.set(0, 0, 100, 100)
-
-        srcRect.letterBox(destRect, letterBoxedRect)
-
-        assertThat(letterBoxedRect).isEqualTo(Rect(0, 0, 100, 100))
-        assertThat(srcRect).isEqualTo(Rect(0, 0, 100, 100))
-    }
-
-    @Test
-    fun letterBoxSelf_toSmallHeight_scaleDownHorizontally() {
-        srcRect.set(0, 0, 2893, 2114)
-        destRect.set(0, 0, 939, 520)
-
-        srcRect.letterBox(destRect)
-
-        assertThat(srcRect).isEqualTo(Rect(114, 0, 825, 520))
-    }
-
-    @Test
-    fun letterBoxRect_toSmallHeight_scaleDownHorizontally() {
-        srcRect.set(0, 0, 2893, 2114)
-        destRect.set(0, 0, 939, 520)
-
-        srcRect.letterBox(destRect, letterBoxedRect)
-
-        assertThat(letterBoxedRect).isEqualTo(Rect(114, 0, 825, 520))
-        assertThat(srcRect).isEqualTo(Rect(0, 0, 2893, 2114))
-    }
-
-    @Test
-    fun letterBoxSelf_toSmallHeightWithOffset_scaleDownHorizontally() {
-        srcRect.set(0, 0, 2893, 2114)
-        destRect.set(10, 20, 949, 540)
-
-        srcRect.letterBox(destRect)
-
-        assertThat(srcRect).isEqualTo(Rect(124, 20, 835, 540))
-    }
-
-    @Test
-    fun letterBoxRect_toSmallHeightWithOffset_scaleDownHorizontally() {
-        srcRect.set(0, 0, 2893, 2114)
-        destRect.set(10, 20, 949, 540)
-
-        srcRect.letterBox(destRect, letterBoxedRect)
-
-        assertThat(letterBoxedRect).isEqualTo(Rect(124, 20, 835, 540))
-        assertThat(srcRect).isEqualTo(Rect(0, 0, 2893, 2114))
-    }
-
-    @Test
-    fun letterBoxSelf_toSmallWidth_scaleDownVertically() {
-        srcRect.set(0, 0, 2893, 2114)
-        destRect.set(0, 0, 520, 939)
-
-        srcRect.letterBox(destRect)
-
-        assertThat(srcRect).isEqualTo(Rect(0, 280, 520, 659))
-    }
-
-    @Test
-    fun letterBoxRect_toSmallWidth_scaleDownVertically() {
-        srcRect.set(0, 0, 2893, 2114)
-        destRect.set(0, 0, 520, 939)
-
-        srcRect.letterBox(destRect, letterBoxedRect)
-
-        assertThat(letterBoxedRect).isEqualTo(Rect(0, 280, 520, 659))
-        assertThat(srcRect).isEqualTo(Rect(0, 0, 2893, 2114))
-    }
-
-    @Test
-    fun letterBoxSelf_toSmallWidthWithOffset_scaleDownVertically() {
-        srcRect.set(0, 0, 2893, 2114)
-        destRect.set(40, 60, 560, 999)
-
-        srcRect.letterBox(destRect)
-
-        assertThat(srcRect).isEqualTo(Rect(40, 340, 560, 719))
-    }
-
-    @Test
-    fun letterBoxRect_toSmallWidthWithOffset_scaleDownVertically() {
-        srcRect.set(0, 0, 2893, 2114)
-        destRect.set(40, 60, 560, 999)
-
-        srcRect.letterBox(destRect, letterBoxedRect)
-
-        assertThat(letterBoxedRect).isEqualTo(Rect(40, 340, 560, 719))
-        assertThat(srcRect).isEqualTo(Rect(0, 0, 2893, 2114))
-    }
-}
