diff --git a/designsystem/src/main/kotlin/com/natura/android/appbar/AppBar.kt b/designsystem/src/main/kotlin/com/natura/android/appbar/AppBar.kt
index 59c9e4fa4..a4db7b9fa 100644
--- a/designsystem/src/main/kotlin/com/natura/android/appbar/AppBar.kt
+++ b/designsystem/src/main/kotlin/com/natura/android/appbar/AppBar.kt
@@ -1,101 +1,124 @@
package com.natura.android.appbar
-import android.app.Activity
import android.content.Context
-import android.graphics.Color
-import android.os.Build
+import android.graphics.drawable.Drawable
import android.util.AttributeSet
+import android.util.DisplayMetrics
import android.util.TypedValue
+import android.view.Gravity
import android.view.View
+import android.view.ViewGroup
import android.view.WindowManager
+import android.widget.ImageView
import androidx.appcompat.widget.Toolbar
import com.natura.android.R
-import kotlin.math.sqrt
+import com.natura.android.ext.setVisibilityFromBoolean
+import com.natura.android.badge.BadgeDrawable
-// WIP
class AppBar(context: Context, attrs: AttributeSet) : Toolbar(context, attrs) {
- var color: Int
+
+ private lateinit var badgeDrawable: BadgeDrawable
+ private var showLogo: Boolean
+ private val logo: ImageView
init {
- context
- .theme
- .obtainStyledAttributes(attrs, R.styleable.AppBar, 0, 0)
- .apply {
- try {
- color = this.getInt(R.styleable.AppBar_appBarType, 0)
- } finally {
- recycle()
- }
- }
- }
+ logo = createLogo(context, attrs)
- override fun onAttachedToWindow() {
- super.onAttachedToWindow()
- setStatusBarStyle()
+ val typedValue = context.obtainStyledAttributes(attrs, R.styleable.AppBar)
+ showLogo = typedValue.getBoolean(R.styleable.AppBar_showLogo, false)
+ setLogoVisibility()
- this.setBackgroundColor(getThemeColor(getMainColorFromAttrs()))
- this.setTitleTextColor(getThemeColor(getMainOnColorFromAttrs()))
+ addView(logo)
- if (isOnColorTooLight(getThemeColor(getMainOnColorFromAttrs()))) {
- setStatusBarIconsLighter()
- } else {
- setStatusBarIconsDarker()
+ contentInsetStartWithNavigation = 0
+ elevation = getElevationFromTheme(context)
+
+ typedValue.recycle()
+ }
+
+ private fun setLogoVisibility() {
+ logo.setVisibilityFromBoolean(showLogo)
+
+ if (showLogo) {
+ title = ""
}
}
- private fun isOnColorTooLight(color: Int): Boolean {
- val rgb = intArrayOf(Color.red(color), Color.green(color), Color.blue(color))
- val brightness = sqrt(rgb[0] * rgb[0] * .241 + (rgb[1] * rgb[1] * .691) + rgb[2] * rgb[2] * .068).toInt()
- return brightness >= 200
+ fun showLogo() {
+ showLogo = true
+ setLogoVisibility()
}
- private fun setStatusBarStyle() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ fun hideLogo() {
+ showLogo = false
+ setLogoVisibility()
+ }
+
+ fun addMenuIconBadge(menuIcon: Drawable, initBadgeValue: Int) {
+ badgeDrawable = BadgeDrawable(context, initBadgeValue, menuIcon)
+ }
- val context = context as Activity
- val window = context.window
- window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
- window.statusBarColor = getThemeColor(getMainColorFromAttrs())
+ fun updateBadgeValue(value: Int) {
+ if (this::badgeDrawable.isInitialized) {
+ badgeDrawable.updateBadgeDrawable(value)
}
}
- private fun getMainColorFromAttrs(): Int {
- return when (color) {
- 1 -> R.attr.colorPrimary
- 2 -> R.attr.colorSecondary
- 3 -> android.R.color.transparent
- else -> R.attr.colorSurface
- }
+ private fun createLogo(context: Context, attrs: AttributeSet): ImageView {
+ val imageView = ImageView(context)
+ imageView.setImageResource(getLogoResId(context, attrs))
+ val logoWidth = getLogoWidthFromTheme(context)
+ imageView.layoutParams =
+ LayoutParams(logoWidth, ViewGroup.LayoutParams.WRAP_CONTENT, getLogoAlign(context))
+ imageView.visibility = View.GONE
+ return imageView
}
- private fun getMainOnColorFromAttrs(): Int {
- return when (color) {
- 1 -> R.attr.colorOnPrimary
- 2 -> R.attr.colorOnSecondary
- 3 -> R.attr.colorOnSurface
- else -> R.attr.colorOnSurface
+ private fun getLogoAlign(context: Context): Int {
+ return if (getWindowWidthInPx(context) < MINIMUM_SCREEN_SIZE_FOR_CENTRALIZED_LOGO) {
+ Gravity.START
+ } else {
+ Gravity.CENTER
}
}
- private fun getThemeColor(colorAttr: Int): Int {
- val outValue = TypedValue()
- context.theme.resolveAttribute(colorAttr, outValue, true)
- return outValue.data
+ private fun getLogoWidthFromTheme(context: Context): Int {
+ val typedValue = TypedValue()
+ if (context.theme.resolveAttribute(R.attr.sizeHugeX, typedValue, true)) {
+ return TypedValue.complexToDimensionPixelSize(typedValue.data, resources.displayMetrics)
+ }
+
+ return ViewGroup.LayoutParams.WRAP_CONTENT
}
- private fun setStatusBarIconsDarker() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- val context = context as Activity
- val window = context.window
- window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
+ private fun getElevationFromTheme(context: Context): Float {
+ val typedValue = TypedValue()
+ if (context.theme.resolveAttribute(R.attr.elevation02, typedValue, true)) {
+ return TypedValue.complexToDimensionPixelSize(typedValue.data, resources.displayMetrics).toFloat()
}
+
+ return 0f
}
- private fun setStatusBarIconsLighter() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- val context = context as Activity
- val window = context.window
- window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ private fun getLogoResId(context: Context, attrs: AttributeSet): Int {
+ val typedValue = context.theme
+ .obtainStyledAttributes(attrs, intArrayOf(R.attr.logoHorizontal), 0, 0)
+ return typedValue.getResourceId(0, 0)
+ }
+
+ private fun getWindowWidthInPx(context: Context): Int {
+ return try {
+ val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
+ val metrics = DisplayMetrics()
+ windowManager.defaultDisplay.getMetrics(metrics)
+
+ metrics.widthPixels
+ } catch (ex: Exception) {
+ MINIMUM_SCREEN_SIZE_FOR_CENTRALIZED_LOGO
}
}
+
+ companion object {
+ private const val MINIMUM_SCREEN_SIZE_FOR_CENTRALIZED_LOGO = 361
+ }
}
diff --git a/designsystem/src/main/res/layout/custom_app_bar.xml b/designsystem/src/main/res/layout/custom_app_bar.xml
deleted file mode 100644
index 732be60b7..000000000
--- a/designsystem/src/main/res/layout/custom_app_bar.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
diff --git a/designsystem/src/main/res/menu/custom_menu.xml b/designsystem/src/main/res/menu/custom_menu.xml
index fd7771753..b6d541e46 100644
--- a/designsystem/src/main/res/menu/custom_menu.xml
+++ b/designsystem/src/main/res/menu/custom_menu.xml
@@ -13,4 +13,5 @@
android:icon="@drawable/icon_base_badge"
android:title="notification"
app:showAsAction="always" />
+
\ No newline at end of file
diff --git a/designsystem/src/main/res/values/ds_attrs.xml b/designsystem/src/main/res/values/ds_attrs.xml
index 4eb5a521e..4fb2a4c64 100644
--- a/designsystem/src/main/res/values/ds_attrs.xml
+++ b/designsystem/src/main/res/values/ds_attrs.xml
@@ -13,12 +13,7 @@
-
-
-
-
-
-
+
diff --git a/designsystem/src/main/res/values/styles.xml b/designsystem/src/main/res/values/styles.xml
index 44093760a..4c406845a 100644
--- a/designsystem/src/main/res/values/styles.xml
+++ b/designsystem/src/main/res/values/styles.xml
@@ -158,6 +158,7 @@
- @dimen/ds_toolbar_height
- @drawable/outlined_navigation_directionright
- @drawable/outlined_navigation_directionright
+ - @style/ActionButton
+
+