diff options
Diffstat (limited to 'src')
9 files changed, 124 insertions, 36 deletions
diff --git a/src/com/android/documentsui/HorizontalBreadcrumb.java b/src/com/android/documentsui/HorizontalBreadcrumb.java index cb25479b3..f47f464c0 100644 --- a/src/com/android/documentsui/HorizontalBreadcrumb.java +++ b/src/com/android/documentsui/HorizontalBreadcrumb.java @@ -16,6 +16,8 @@ package com.android.documentsui; +import static com.android.documentsui.util.FlagUtils.isUseMaterial3FlagEnabled; + import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; @@ -183,8 +185,6 @@ public final class HorizontalBreadcrumb extends RecyclerView implements Breadcru @Override public void onBindViewHolder(BreadcrumbHolder holder, int position) { - final int padding = (int) holder.itemView.getResources() - .getDimension(R.dimen.breadcrumb_item_padding); final boolean isFirst = position == 0; // Note that when isFirst is true, there might not be a DocumentInfo on the stack as it // could be an error state screen accessible from the root info. @@ -193,8 +193,39 @@ public final class HorizontalBreadcrumb extends RecyclerView implements Breadcru holder.mTitle.setText( isFirst ? mEnv.getCurrentRoot().title : mState.stack.get(position).displayName); holder.mTitle.setEnabled(isLast); - holder.mTitle.setPadding(isFirst ? padding * 3 : padding, - padding, isLast ? padding * 2 : padding, padding); + if (isUseMaterial3FlagEnabled()) { + final int paddingHorizontal = + (int) + holder.itemView + .getResources() + .getDimension(R.dimen.breadcrumb_item_padding_horizontal); + final int paddingVertical = + (int) + holder.itemView + .getResources() + .getDimension(R.dimen.breadcrumb_item_padding_vertical); + final int arrowPadding = + (int) + holder.itemView + .getResources() + .getDimension(R.dimen.breadcrumb_item_arrow_padding); + holder.mTitle.setPadding( + paddingHorizontal, paddingVertical, paddingHorizontal, paddingVertical); + + ViewGroup.MarginLayoutParams params = + (ViewGroup.MarginLayoutParams) holder.mArrow.getLayoutParams(); + params.setMarginStart(arrowPadding); + params.setMarginEnd(arrowPadding); + holder.mArrow.setLayoutParams(params); + } else { + final int padding = (int) holder.itemView.getResources() + .getDimension(R.dimen.breadcrumb_item_padding); + holder.mTitle.setPadding( + isFirst ? padding * 3 : padding, + padding, + isLast ? padding * 2 : padding, + padding); + } holder.mArrow.setVisibility(isLast ? View.GONE : View.VISIBLE); holder.itemView.setOnKeyListener(mClickListener); diff --git a/src/com/android/documentsui/ProfileTabs.java b/src/com/android/documentsui/ProfileTabs.java index 5aacc22b0..74db6f4bd 100644 --- a/src/com/android/documentsui/ProfileTabs.java +++ b/src/com/android/documentsui/ProfileTabs.java @@ -157,9 +157,12 @@ public class ProfileTabs implements ProfileTabsAddons { int tabMarginSide = (int) mTabsContainer.getContext().getResources() .getDimension(R.dimen.profile_tab_margin_side); if (isUseMaterial3FlagEnabled()) { - // M3 uses the margin value as the right margin, except for the last child. + final boolean isRtl = mTabs.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL; + // if use_material3 flag is ON, we uses the margin value as the right margin + // (left margin for RTL), except for the last child. if (i != mTabs.getTabCount() - 1) { - marginLayoutParams.setMargins(0, 0, tabMarginSide, 0); + marginLayoutParams.setMargins( + isRtl ? tabMarginSide : 0, 0, isRtl ? 0 : tabMarginSide, 0); } } else { marginLayoutParams.setMargins(tabMarginSide, 0, tabMarginSide, 0); diff --git a/src/com/android/documentsui/dirlist/DocumentHolder.java b/src/com/android/documentsui/dirlist/DocumentHolder.java index 8e5f50636..957975c4b 100644 --- a/src/com/android/documentsui/dirlist/DocumentHolder.java +++ b/src/com/android/documentsui/dirlist/DocumentHolder.java @@ -58,8 +58,6 @@ public abstract class DocumentHolder static final float DISABLED_ALPHA = isUseMaterial3FlagEnabled() ? 0.6f : 0.3f; - static final int THUMBNAIL_STROKE_WIDTH = isUseMaterial3FlagEnabled() ? 2 : 0; - protected final Context mContext; protected @Nullable String mModelId; diff --git a/src/com/android/documentsui/dirlist/DocumentsSwipeRefreshLayout.java b/src/com/android/documentsui/dirlist/DocumentsSwipeRefreshLayout.java index 838b1fa72..64409673e 100644 --- a/src/com/android/documentsui/dirlist/DocumentsSwipeRefreshLayout.java +++ b/src/com/android/documentsui/dirlist/DocumentsSwipeRefreshLayout.java @@ -22,13 +22,13 @@ import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.util.Log; -import android.util.TypedValue; import android.view.MotionEvent; import androidx.annotation.ColorRes; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.android.documentsui.R; +import com.android.documentsui.util.ColorUtils; /** * A {@link SwipeRefreshLayout} that does not intercept any touch events. This relies on its nested @@ -46,20 +46,12 @@ public class DocumentsSwipeRefreshLayout extends SwipeRefreshLayout { super(context, attrs); if (isUseMaterial3FlagEnabled()) { - TypedValue spinnerColor = new TypedValue(); - context.getTheme() - .resolveAttribute( - com.google.android.material.R.attr.colorOnPrimaryContainer, - spinnerColor, - true); - setColorSchemeResources(spinnerColor.resourceId); - TypedValue spinnerBackgroundColor = new TypedValue(); - context.getTheme() - .resolveAttribute( - com.google.android.material.R.attr.colorPrimaryContainer, - spinnerBackgroundColor, - true); - setProgressBackgroundColorSchemeResource(spinnerBackgroundColor.resourceId); + setColorSchemeColors( + ColorUtils.resolveMaterialColorAttribute( + context, com.google.android.material.R.attr.colorOnPrimaryContainer)); + setProgressBackgroundColorSchemeColor( + ColorUtils.resolveMaterialColorAttribute( + context, com.google.android.material.R.attr.colorPrimaryContainer)); } else { final int[] styledAttrs = {android.R.attr.colorAccent}; diff --git a/src/com/android/documentsui/dirlist/GridDocumentHolder.java b/src/com/android/documentsui/dirlist/GridDocumentHolder.java index f2802ff66..431ace5d9 100644 --- a/src/com/android/documentsui/dirlist/GridDocumentHolder.java +++ b/src/com/android/documentsui/dirlist/GridDocumentHolder.java @@ -79,6 +79,8 @@ final class GridDocumentHolder extends DocumentHolder { // Non-null only when useMaterial3 flag is ON. private final @Nullable MaterialCardView mIconWrapper; + // It will be 0 when use_material flag is OFF. + private final int mThumbnailStrokeWidth; GridDocumentHolder(Context context, ViewGroup parent, IconHelper iconHelper, ConfigStore configStore) { @@ -90,12 +92,16 @@ final class GridDocumentHolder extends DocumentHolder { mIconLayout = null; mIconMimeSm = null; mIconCheck = null; + mThumbnailStrokeWidth = + context.getResources() + .getDimensionPixelSize(R.dimen.grid_item_thumbnail_border_width); } else { mBullet = null; mIconWrapper = null; mIconLayout = itemView.findViewById(R.id.icon); mIconMimeSm = (ImageView) itemView.findViewById(R.id.icon_mime_sm); mIconCheck = (ImageView) itemView.findViewById(R.id.icon_check); + mThumbnailStrokeWidth = 0; } mTitle = (TextView) itemView.findViewById(android.R.id.title); @@ -157,7 +163,7 @@ final class GridDocumentHolder extends DocumentHolder { if (selected) { mIconWrapper.setStrokeWidth(0); } else if (mIconThumb.getDrawable() != null) { - mIconWrapper.setStrokeWidth(THUMBNAIL_STROKE_WIDTH); + mIconWrapper.setStrokeWidth(mThumbnailStrokeWidth); } } } @@ -258,7 +264,7 @@ final class GridDocumentHolder extends DocumentHolder { // Show stroke when thumbnail is loaded. if (mIconWrapper != null) { mIconWrapper.setStrokeWidth( - thumbnailLoaded ? THUMBNAIL_STROKE_WIDTH : 0); + thumbnailLoaded ? mThumbnailStrokeWidth : 0); } }); } else { @@ -293,8 +299,8 @@ final class GridDocumentHolder extends DocumentHolder { } } - if (mBullet != null && (mDetails.getVisibility() == View.GONE - || mDate.getText().isEmpty())) { + if (mBullet != null && (mDetails.getText() == null || mDetails.getText().length() == 0 + || mDate.getText() == null || mDate.getText().length() == 0)) { // There is no need for the bullet separating the details and date. mBullet.setVisibility(View.GONE); } diff --git a/src/com/android/documentsui/dirlist/ListDocumentHolder.java b/src/com/android/documentsui/dirlist/ListDocumentHolder.java index 0d0f79919..24b7e3ae5 100644 --- a/src/com/android/documentsui/dirlist/ListDocumentHolder.java +++ b/src/com/android/documentsui/dirlist/ListDocumentHolder.java @@ -78,6 +78,8 @@ final class ListDocumentHolder extends DocumentHolder { private final ImageView mIconBadge; private final View mIconLayout; final View mPreviewIcon; + // It will be 0 when use_material flag is OFF. + private final int mThumbnailStrokeWidth; private final IconHelper mIconHelper; private final Lookup<String, String> mFileTypeLookup; @@ -103,6 +105,13 @@ final class ListDocumentHolder extends DocumentHolder { // Warning: mDetails view doesn't exists in layout-sw720dp-land layout mDetails = (LinearLayout) itemView.findViewById(R.id.line2); mPreviewIcon = itemView.findViewById(R.id.preview_icon); + if (isUseMaterial3FlagEnabled()) { + mThumbnailStrokeWidth = + context.getResources() + .getDimensionPixelSize(R.dimen.list_item_thumbnail_border_width); + } else { + mThumbnailStrokeWidth = 0; + } mIconHelper = iconHelper; mFileTypeLookup = fileTypeLookup; @@ -152,7 +161,7 @@ final class ListDocumentHolder extends DocumentHolder { if (selected) { mIconWrapper.setStrokeWidth(0); } else if (mIconThumb.getDrawable() != null) { - mIconWrapper.setStrokeWidth(2); + mIconWrapper.setStrokeWidth(mThumbnailStrokeWidth); } } } @@ -271,7 +280,8 @@ final class ListDocumentHolder extends DocumentHolder { thumbnailLoaded -> { // Show stroke when thumbnail is loaded. if (isUseMaterial3FlagEnabled() && mIconWrapper != null) { - mIconWrapper.setStrokeWidth(thumbnailLoaded ? THUMBNAIL_STROKE_WIDTH : 0); + mIconWrapper.setStrokeWidth( + thumbnailLoaded ? mThumbnailStrokeWidth : 0); } }); diff --git a/src/com/android/documentsui/picker/PickFragment.java b/src/com/android/documentsui/picker/PickFragment.java index 66f05fa0f..0d20083a8 100644 --- a/src/com/android/documentsui/picker/PickFragment.java +++ b/src/com/android/documentsui/picker/PickFragment.java @@ -181,12 +181,21 @@ public class PickFragment extends Fragment { switch (mAction) { case State.ACTION_OPEN_TREE: mPick.setText(getString(R.string.open_tree_button)); - // On laptops we want the "Use this folder" button to appear with the "Cancel" - // button as a back gesture with a mouse is not easy. - if (!isUseMaterial3FlagEnabled() - || !getActivity().getPackageManager() - .hasSystemFeature(PackageManager.FEATURE_PC)) { + // When use_material3 flag is enabled, all form factors should have the pick button + // wrap the text content instead of taking up the full width. + if (!isUseMaterial3FlagEnabled()) { + mCancel.setVisibility(View.GONE); mPick.setWidth(Integer.MAX_VALUE); + mPickOverlay.setVisibility( + mPickTarget.isBlockedFromTree() && mRestrictScopeStorage + ? View.VISIBLE + : View.GONE); + } else if (!getActivity() + .getPackageManager() + .hasSystemFeature(PackageManager.FEATURE_PC)) { + // On non-desktop devices the back gesture is used to cancel the picker, so + // don't show the "Cancel" button on these devices and instead enable the pick + // overlay which enables showing a toast when the disabled button is pressed. mCancel.setVisibility(View.GONE); mPickOverlay.setVisibility( mPickTarget.isBlockedFromTree() && mRestrictScopeStorage diff --git a/src/com/android/documentsui/queries/SearchChipViewManager.java b/src/com/android/documentsui/queries/SearchChipViewManager.java index f673b7408..bf3d1e865 100644 --- a/src/com/android/documentsui/queries/SearchChipViewManager.java +++ b/src/com/android/documentsui/queries/SearchChipViewManager.java @@ -387,7 +387,10 @@ public class SearchChipViewManager { .getDimensionPixelSize(R.dimen.focus_ring_width); chip.setChipStrokeWidth(focusRingWidth); } else { - chip.setChipStrokeWidth(1f); + final int strokeWidth = mChipGroup + .getResources() + .getDimensionPixelSize(R.dimen.search_chip_inactive_stroke_width); + chip.setChipStrokeWidth(strokeWidth); } } @@ -518,7 +521,7 @@ public class SearchChipViewManager { } // Let the first checked chip can be shown. - View parent = (View) mChipGroup.getParent(); + View parent = (View) mChipGroup.getParent().getParent(); if (parent instanceof HorizontalScrollView) { final int scrollToX = isRtl ? parent.getWidth() : 0; ((HorizontalScrollView) parent).smoothScrollTo(scrollToX, 0); diff --git a/src/com/android/documentsui/util/ColorUtils.kt b/src/com/android/documentsui/util/ColorUtils.kt new file mode 100644 index 000000000..ee67b7832 --- /dev/null +++ b/src/com/android/documentsui/util/ColorUtils.kt @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2025 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.documentsui.util + +import android.content.Context +import android.util.TypedValue +import androidx.annotation.AttrRes + +class ColorUtils { + companion object { + /** + * Resolve a color attribute from the Material3 theme, example usage. + * resolveMaterialColorAttribute(context, com.google.android.material.R.attr.XXX). + */ + @JvmStatic + fun resolveMaterialColorAttribute(context: Context, @AttrRes colorAttrId: Int): Int { + val typedValue = TypedValue() + context.theme.resolveAttribute(colorAttrId, typedValue, true) + return typedValue.data + } + } +} |