summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/com/android/documentsui/HorizontalBreadcrumb.java39
-rw-r--r--src/com/android/documentsui/ProfileTabs.java7
-rw-r--r--src/com/android/documentsui/dirlist/DocumentHolder.java2
-rw-r--r--src/com/android/documentsui/dirlist/DocumentsSwipeRefreshLayout.java22
-rw-r--r--src/com/android/documentsui/dirlist/GridDocumentHolder.java14
-rw-r--r--src/com/android/documentsui/dirlist/ListDocumentHolder.java14
-rw-r--r--src/com/android/documentsui/picker/PickFragment.java19
-rw-r--r--src/com/android/documentsui/queries/SearchChipViewManager.java7
-rw-r--r--src/com/android/documentsui/util/ColorUtils.kt36
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
+ }
+ }
+}