diff options
author | 2025-03-17 22:51:54 -0700 | |
---|---|---|
committer | 2025-03-17 22:51:54 -0700 | |
commit | 5d4b99a40e85da7260b2cf034b715ca8ba903ab8 (patch) | |
tree | 9ea93cb13256efd3b36b2d25faeb5f6934c7be5d /src/com | |
parent | 91bc3ee29efaba6a55bb1eb8e5cc6c214cde7ca0 (diff) | |
parent | da3f6d64b886035ee536fea32577fd9a133b23bb (diff) |
Merge "[DocsUI M3] Fix the corner pixelation for thumbnail" into main
Diffstat (limited to 'src/com')
-rw-r--r-- | src/com/android/documentsui/IconUtils.java | 32 | ||||
-rw-r--r-- | src/com/android/documentsui/dirlist/GridDocumentHolder.java | 8 | ||||
-rw-r--r-- | src/com/android/documentsui/dirlist/ListDocumentHolder.java | 5 |
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 431ace5d9..67ee1f2bf 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; } |