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