diff --git a/commons/src/main/kotlin/org/fossify/commons/extensions/Context-styling.kt b/commons/src/main/kotlin/org/fossify/commons/extensions/Context-styling.kt index ca32edb5e5..eba99dec0d 100644 --- a/commons/src/main/kotlin/org/fossify/commons/extensions/Context-styling.kt +++ b/commons/src/main/kotlin/org/fossify/commons/extensions/Context-styling.kt @@ -7,6 +7,7 @@ import android.content.pm.PackageManager import android.content.res.Configuration import android.graphics.Color import android.view.ViewGroup +import androidx.core.content.res.ResourcesCompat import androidx.loader.content.CursorLoader import org.fossify.commons.R import org.fossify.commons.helpers.* @@ -216,3 +217,13 @@ fun Context.getBottomNavigationBackgroundColor(): Int { } return bottomColor } + +fun Context.getDialogBackgroundColor(): Int { + return when { + isDynamicTheme() -> ResourcesCompat.getColor( + resources, R.color.you_dialog_background_color, theme + ) + + else -> baseConfig.backgroundColor + } +} \ No newline at end of file diff --git a/commons/src/main/kotlin/org/fossify/commons/views/Breadcrumbs.kt b/commons/src/main/kotlin/org/fossify/commons/views/Breadcrumbs.kt index 3dee037f9f..dadbf22758 100644 --- a/commons/src/main/kotlin/org/fossify/commons/views/Breadcrumbs.kt +++ b/commons/src/main/kotlin/org/fossify/commons/views/Breadcrumbs.kt @@ -2,39 +2,50 @@ package org.fossify.commons.views import android.content.Context import android.content.res.ColorStateList -import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.GradientDrawable +import android.graphics.drawable.RippleDrawable import android.util.AttributeSet import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.widget.HorizontalScrollView import android.widget.LinearLayout -import androidx.core.content.ContextCompat +import androidx.appcompat.content.res.AppCompatResources import androidx.core.view.ViewCompat +import androidx.core.view.updatePadding +import androidx.core.widget.TextViewCompat import org.fossify.commons.R import org.fossify.commons.databinding.ItemBreadcrumbBinding -import org.fossify.commons.databinding.ItemBreadcrumbFirstBinding -import org.fossify.commons.extensions.* +import org.fossify.commons.extensions.adjustAlpha +import org.fossify.commons.extensions.getBasePath +import org.fossify.commons.extensions.getDialogBackgroundColor +import org.fossify.commons.extensions.getProperPrimaryColor +import org.fossify.commons.extensions.getProperTextColor +import org.fossify.commons.extensions.humanizePath +import org.fossify.commons.extensions.onGlobalLayout +import org.fossify.commons.extensions.setDrawablesRelativeWithIntrinsicBounds +import org.fossify.commons.helpers.MEDIUM_ALPHA import org.fossify.commons.models.FileDirItem class Breadcrumbs(context: Context, attrs: AttributeSet) : HorizontalScrollView(context, attrs) { - private val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater + private val inflater = + context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater private val itemsLayout: LinearLayout private var textColor = context.getProperTextColor() + private var accentColor = context.getProperPrimaryColor() private var fontSize = resources.getDimension(R.dimen.bigger_text_size) private var lastPath = "" private var isLayoutDirty = true private var isScrollToSelectedItemPending = false private var isFirstScroll = true private var stickyRootInitialLeft = 0 - private var rootStartPadding = 0 private val textColorStateList: ColorStateList get() = ColorStateList( arrayOf(intArrayOf(android.R.attr.state_activated), intArrayOf()), intArrayOf( - textColor, - textColor.adjustAlpha(0.6f) + accentColor, + textColor ) ) @@ -45,8 +56,7 @@ class Breadcrumbs(context: Context, attrs: AttributeSet) : HorizontalScrollView( isHorizontalScrollBarEnabled = false itemsLayout = LinearLayout(context) itemsLayout.orientation = LinearLayout.HORIZONTAL - rootStartPadding = paddingStart - itemsLayout.setPaddingRelative(0, paddingTop, paddingEnd, paddingBottom) + itemsLayout.setPaddingRelative(paddingStart, paddingTop, paddingEnd, paddingBottom) setPaddingRelative(0, 0, 0, 0) addView(itemsLayout, LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT)) onGlobalLayout { @@ -146,87 +156,75 @@ class Breadcrumbs(context: Context, attrs: AttributeSet) : HorizontalScrollView( val tempPath = context.humanizePath(fullPath) itemsLayout.removeAllViews() - val dirs = tempPath.split("/").dropLastWhile(String::isEmpty) - for (i in dirs.indices) { - val dir = dirs[i] - if (i > 0) { - currPath += dir + "/" - } - - if (dir.isEmpty()) { - continue + tempPath.split("/") + .dropLastWhile(String::isEmpty) + .forEachIndexed { i, dir -> + if (i > 0) { + currPath += "$dir/" + } + if (dir.isEmpty()) { + return@forEachIndexed + } + currPath = "${currPath.trimEnd('/')}/" + val item = FileDirItem(currPath, dir, true, 0, 0, 0) + addBreadcrumb( + item = item, + index = i, + isLast = item.path.trimEnd('/') == lastPath.trimEnd('/') + ) + scrollToSelectedItem() } - - currPath = "${currPath.trimEnd('/')}/" - val item = FileDirItem(currPath, dir, true, 0, 0, 0) - addBreadcrumb(item, i, i > 0) - scrollToSelectedItem() - } } - private fun addBreadcrumb(item: FileDirItem, index: Int, addPrefix: Boolean) { - if (itemsLayout.childCount == 0) { - val firstItemBgColor = if (isShownInDialog && context.isDynamicTheme()) { - resources.getColor(R.color.you_dialog_background_color, context.theme) - } else { - context.getProperBackgroundColor() - } - + private fun addBreadcrumb(item: FileDirItem, index: Int, isLast: Boolean) { + ItemBreadcrumbBinding.inflate(inflater, itemsLayout, false).apply { + breadcrumbText.isActivated = isLast - ItemBreadcrumbFirstBinding.inflate(inflater, itemsLayout, false).apply { - resources.apply { - breadcrumbText.background = ContextCompat.getDrawable(context, R.drawable.button_background) - breadcrumbText.background.applyColorFilter(textColor) - elevation = 1f - background = ColorDrawable(firstItemBgColor) - val medium = getDimension(R.dimen.medium_margin).toInt() - breadcrumbText.setPadding(medium, medium, medium, medium) - setPadding(rootStartPadding, 0, 0, 0) - } + breadcrumbText.text = item.name + breadcrumbText.setTextColor(textColorStateList) + breadcrumbText.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) - isActivated = item.path.trimEnd('/') == lastPath.trimEnd('/') - breadcrumbText.text = item.name - breadcrumbText.setTextColor(textColorStateList) - breadcrumbText.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) + itemsLayout.addView(root) + if (index > 0) { + breadcrumbText.setDrawablesRelativeWithIntrinsicBounds( + start = AppCompatResources.getDrawable( + context, R.drawable.ic_chevron_right_vector + ) + ) - itemsLayout.addView(this.root) + TextViewCompat.setCompoundDrawableTintList(breadcrumbText, textColorStateList) + } else { + breadcrumbText.elevation = context.resources.getDimension(R.dimen.one_dp) + setupStickyBreadcrumbBackground(breadcrumbText) + val horizontalPadding = + context.resources.getDimensionPixelSize(R.dimen.normal_margin) + breadcrumbText.updatePadding(left = horizontalPadding, right = horizontalPadding) + } - breadcrumbText.setOnClickListener { - if (itemsLayout.getChildAt(index) != null) { + breadcrumbText.setOnClickListener { v -> + if (itemsLayout.getChildAt(index) != null && itemsLayout.getChildAt(index) == v) { + if (index != 0 && isLast) { + scrollToSelectedItem() + } else { listener?.breadcrumbClicked(index) } } - - root.tag = item } - } else { - ItemBreadcrumbBinding.inflate(inflater, itemsLayout, false).apply { - var textToAdd = item.name - if (addPrefix) { - textToAdd = "> $textToAdd" - } - - isActivated = item.path.trimEnd('/') == lastPath.trimEnd('/') - - breadcrumbText.text = textToAdd - breadcrumbText.setTextColor(textColorStateList) - breadcrumbText.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) - itemsLayout.addView(root) - - breadcrumbText.setOnClickListener { v -> - if (itemsLayout.getChildAt(index) != null && itemsLayout.getChildAt(index) == v) { - if ((v.tag as? FileDirItem)?.path?.trimEnd('/') == lastPath.trimEnd('/')) { - scrollToSelectedItem() - } else { - listener?.breadcrumbClicked(index) - } - } - } + root.tag = item + } + } - root.tag = item + private fun setupStickyBreadcrumbBackground(view: MyTextView) { + val drawable = view.background.mutate() as RippleDrawable + (drawable.getDrawable(0) as GradientDrawable) + .apply { + setColor(context.getDialogBackgroundColor()) + setStroke( + context.resources.getDimensionPixelSize(R.dimen.one_dp), + context.getProperPrimaryColor().adjustAlpha(MEDIUM_ALPHA) + ) } - } } fun updateColor(color: Int) { diff --git a/commons/src/main/res/drawable/breadcrumb_button_background.xml b/commons/src/main/res/drawable/breadcrumb_button_background.xml new file mode 100644 index 0000000000..924727ccd3 --- /dev/null +++ b/commons/src/main/res/drawable/breadcrumb_button_background.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/item_breadcrumb.xml b/commons/src/main/res/layout/item_breadcrumb.xml index 05980f6c82..6026156be5 100644 --- a/commons/src/main/res/layout/item_breadcrumb.xml +++ b/commons/src/main/res/layout/item_breadcrumb.xml @@ -1,12 +1,15 @@ + android:paddingVertical="@dimen/medium_margin" + android:paddingStart="0dp" + android:paddingEnd="@dimen/tiny_margin" + android:textSize="@dimen/normal_text_size" + tools:drawableStart="@drawable/ic_chevron_right_vector" + tools:text="Fossify" /> diff --git a/commons/src/main/res/layout/item_breadcrumb_first.xml b/commons/src/main/res/layout/item_breadcrumb_first.xml deleted file mode 100644 index 145ddadf31..0000000000 --- a/commons/src/main/res/layout/item_breadcrumb_first.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - -