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 @@
-
-
-
-
-
-