summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
author Wenbo Jie <wenbojie@google.com> 2025-03-17 02:42:18 +0000
committer Wenbo Jie <wenbojie@google.com> 2025-03-17 02:42:42 +0000
commitda3f6d64b886035ee536fea32577fd9a133b23bb (patch)
treefb7ddc071fe1e981526b0c37b8f17ee4e848aad5 /src
parentb83b6afad2faa5c6c53d15f2d36c077b1f03703a (diff)
[DocsUI M3] Fix the corner pixelation for thumbnail
Thumbnail corner in list/grid view shows a weird pixelation issue, this CL applies a custom outline to the ImageView which holds the thumbnail to fix the issue. Check the attached bug for the before/after comparison. Bug: 403413105 Test: m DocumentsUIGoogle && manual inspection Flag: com.android.documentsui.flags.use_material3 Change-Id: I8ac34e5b0fc7d92d36006a9e2bb8315ef8cb5dca
Diffstat (limited to 'src')
-rw-r--r--src/com/android/documentsui/IconUtils.java32
-rw-r--r--src/com/android/documentsui/dirlist/GridDocumentHolder.java8
-rw-r--r--src/com/android/documentsui/dirlist/ListDocumentHolder.java5
3 files changed, 45 insertions, 0 deletions
diff --git a/src/com/android/documentsui/IconUtils.java b/src/com/android/documentsui/IconUtils.java
index 1763fd2a3..ece38bb64 100644
--- a/src/com/android/documentsui/IconUtils.java
+++ b/src/com/android/documentsui/IconUtils.java
@@ -19,8 +19,12 @@ package com.android.documentsui;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
+import android.graphics.Outline;
import android.graphics.drawable.Drawable;
import android.util.TypedValue;
+import android.view.View;
+import android.view.ViewOutlineProvider;
+import android.widget.ImageView;
import com.android.documentsui.base.UserId;
@@ -80,4 +84,32 @@ public class IconUtils {
context.getTheme().resolveAttribute(tintAttrId, outValue, true);
return applyTintColor(context, drawableId, outValue.resourceId);
}
+
+ /**
+ * When a ImageView loads a thumbnail from a bitmap, we usually uses a CardView to wrap it to
+ * apply CardView's corner radius to the ImageView. This causes the corner pixelation of the
+ * thumbnail especially when there's a border (stroke) around the CardView. This method creates
+ * a custom clip outline with the correct shape to fix this issue.
+ *
+ * @param imageView ImageView to apply clip outline.
+ * @param strokeWidth stroke width of the thumbnail.
+ * @param cornerRadius corner radius of the thumbnail.
+ */
+ public static void applyThumbnailClipOutline(
+ ImageView imageView, int strokeWidth, int cornerRadius) {
+ ViewOutlineProvider outlineProvider =
+ new ViewOutlineProvider() {
+ @Override
+ public void getOutline(View view, Outline outline) {
+ outline.setRoundRect(
+ strokeWidth,
+ strokeWidth,
+ view.getWidth() - strokeWidth,
+ view.getHeight() - strokeWidth,
+ cornerRadius);
+ }
+ };
+ imageView.setOutlineProvider(outlineProvider);
+ imageView.setClipToOutline(true);
+ }
}
diff --git a/src/com/android/documentsui/dirlist/GridDocumentHolder.java b/src/com/android/documentsui/dirlist/GridDocumentHolder.java
index 9523c331c..72ba1c3f9 100644
--- a/src/com/android/documentsui/dirlist/GridDocumentHolder.java
+++ b/src/com/android/documentsui/dirlist/GridDocumentHolder.java
@@ -41,6 +41,7 @@ import androidx.annotation.RequiresApi;
import com.android.documentsui.ConfigStore;
import com.android.documentsui.DocumentsApplication;
+import com.android.documentsui.IconUtils;
import com.android.documentsui.R;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.Shared;
@@ -112,6 +113,13 @@ final class GridDocumentHolder extends DocumentHolder {
mIconBadge = (ImageView) itemView.findViewById(R.id.icon_profile_badge);
mPreviewIcon = itemView.findViewById(R.id.preview_icon);
+ if (isUseMaterial3FlagEnabled()) {
+ int clipCornerRadius = context.getResources()
+ .getDimensionPixelSize(R.dimen.thumbnail_clip_corner_radius);
+ IconUtils.applyThumbnailClipOutline(
+ mIconThumb, mThumbnailStrokeWidth, clipCornerRadius);
+ }
+
mIconHelper = iconHelper;
if (SdkLevel.isAtLeastT() && !mConfigStore.isPrivateSpaceInDocsUIEnabled()) {
diff --git a/src/com/android/documentsui/dirlist/ListDocumentHolder.java b/src/com/android/documentsui/dirlist/ListDocumentHolder.java
index 24b7e3ae5..d91c9547e 100644
--- a/src/com/android/documentsui/dirlist/ListDocumentHolder.java
+++ b/src/com/android/documentsui/dirlist/ListDocumentHolder.java
@@ -43,6 +43,7 @@ import androidx.annotation.RequiresApi;
import com.android.documentsui.ConfigStore;
import com.android.documentsui.DocumentsApplication;
+import com.android.documentsui.IconUtils;
import com.android.documentsui.R;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.Lookup;
@@ -109,6 +110,10 @@ final class ListDocumentHolder extends DocumentHolder {
mThumbnailStrokeWidth =
context.getResources()
.getDimensionPixelSize(R.dimen.list_item_thumbnail_border_width);
+ int clipCornerRadius = context.getResources()
+ .getDimensionPixelSize(R.dimen.thumbnail_clip_corner_radius);
+ IconUtils.applyThumbnailClipOutline(
+ mIconThumb, mThumbnailStrokeWidth, clipCornerRadius);
} else {
mThumbnailStrokeWidth = 0;
}