Commit 0dd2285d authored by Sawyer Blatz's avatar Sawyer Blatz
Browse files

No issue: Updates HighlightableMenuItem to allow startImage

parent e1ea6e3c
Loading
Loading
Loading
Loading
+21 −11
Original line number Diff line number Diff line
@@ -12,14 +12,14 @@ import androidx.appcompat.widget.AppCompatImageView
import mozilla.components.browser.menu.BrowserMenu
import mozilla.components.browser.menu.R

private val defaultHighlight = BrowserMenuHighlightableItem.Highlight(0, 0, 0)
private val defaultHighlight = BrowserMenuHighlightableItem.Highlight(0, 0, 0, 0)

/**
 * A menu item for displaying text with an image icon and a highlight state which sets the
 * background of the menu item and a second image icon to the right of the text.
 *
 * @param label The visible label of this menu item.
 * @param imageResource ID of a drawable resource to be shown as a leftmost icon.
 * @param startImageResource ID of a drawable resource to be shown as a leftmost icon.
 * @param iconTintColorResource Optional ID of color resource to tint the icon.
 * @param textColorResource Optional ID of color resource to tint the text.
 * @param highlight Highlight object storing the background drawable and additional icon
@@ -29,7 +29,7 @@ private val defaultHighlight = BrowserMenuHighlightableItem.Highlight(0, 0, 0)
class BrowserMenuHighlightableItem(
    private val label: String,
    @DrawableRes
    private val imageResource: Int,
    private val startImageResource: Int,
    @DrawableRes
    @ColorRes
    private val iconTintColorResource: Int = NO_ID,
@@ -40,7 +40,7 @@ class BrowserMenuHighlightableItem(
    private val listener: () -> Unit = {}
) : BrowserMenuImageText(
    label,
    imageResource,
    startImageResource,
    iconTintColorResource,
    textColorResource,
    listener
@@ -79,7 +79,7 @@ class BrowserMenuHighlightableItem(
        wasHighlighted = isHighlighted()
        updateHighlight(view, wasHighlighted)

        val highlightImageView = view.findViewById<AppCompatImageView>(R.id.highlight_image)
        val highlightImageView = view.findViewById<AppCompatImageView>(R.id.end_image)
        highlightImageView.setTintResource(iconTintColorResource)
    }

@@ -92,14 +92,22 @@ class BrowserMenuHighlightableItem(
    }

    private fun updateHighlight(view: View, isHighlighted: Boolean) {
        val highlightImageView = view.findViewById<AppCompatImageView>(R.id.highlight_image)
        val startImageView = view.findViewById<AppCompatImageView>(R.id.image)
        val endImageView = view.findViewById<AppCompatImageView>(R.id.end_image)

        if (isHighlighted) {
            view.setBackgroundResource(highlight.backgroundResource)
            with(highlightImageView) {
                setImageResource(highlight.imageResource)
            with(startImageView) {
                if (highlight.startImageResource != NO_ID) {
                    setImageResource(highlight.startImageResource)
                }
            }
            with(endImageView) {
                if (highlight.endImageResource != NO_ID) {
                    setImageResource(highlight.endImageResource)
                    visibility = View.VISIBLE
                }
            }
        } else {
            val selectableItemBackground = TypedValue()
            view.context.theme.resolveAttribute(
@@ -109,7 +117,7 @@ class BrowserMenuHighlightableItem(
            )

            view.setBackgroundResource(selectableItemBackground.resourceId)
            with(highlightImageView) {
            with(endImageView) {
                setImageResource(0)
                visibility = View.GONE
            }
@@ -118,7 +126,9 @@ class BrowserMenuHighlightableItem(

    class Highlight(
        @DrawableRes
        val imageResource: Int,
        val startImageResource: Int = NO_ID,
        @DrawableRes
        val endImageResource: Int = NO_ID,
        @DrawableRes
        val backgroundResource: Int,
        @ColorRes
+1 −1
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@
        android:importantForAccessibility="no"/>

    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/highlight_image"
        android:id="@+id/end_image"
        android:layout_alignParentEnd="true"
        android:layout_gravity="center_vertical"
        style="@style/Mozac.Browser.Menu.Item.ImageText.Icon"
+47 −21
Original line number Diff line number Diff line
@@ -11,17 +11,20 @@ import android.view.LayoutInflater
import android.view.View
import android.widget.TextView
import androidx.appcompat.widget.AppCompatImageView
import androidx.core.view.isVisible
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import mozilla.components.browser.menu.BrowserMenu
import mozilla.components.browser.menu.R
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.mock
import org.robolectric.Shadows

@RunWith(AndroidJUnit4::class)
class BrowserMenuHighlightableItemTest {
@@ -36,7 +39,11 @@ class BrowserMenuHighlightableItemTest {
            android.R.drawable.ic_menu_report_image,
            android.R.color.black,
            android.R.color.black,
            BrowserMenuHighlightableItem.Highlight(android.R.drawable.ic_menu_report_image, R.color.photonRed50, R.color.photonRed50)
            BrowserMenuHighlightableItem.Highlight(
                    endImageResource = android.R.drawable.ic_menu_report_image,
                    backgroundResource = R.color.photonRed50,
                    colorResource = R.color.photonRed50
            )
        ) {
            onClickWasPress = true
        }
@@ -48,13 +55,20 @@ class BrowserMenuHighlightableItemTest {
    }

    @Test
    fun `browser menu highlightable item  should have the right text, image, and iconTintColorResource`() {
    fun `browser menu highlightable item should properly handle highlighting`() {
        var shouldHighlight = false
        val item = BrowserMenuHighlightableItem(
            "label",
            android.R.drawable.ic_menu_report_image,
            android.R.color.black,
            android.R.color.black,
            BrowserMenuHighlightableItem.Highlight(android.R.drawable.ic_menu_report_image, R.color.photonRed50, R.color.photonRed50)
                label = "label",
                startImageResource = android.R.drawable.ic_menu_report_image,
                iconTintColorResource = android.R.color.black,
                textColorResource = android.R.color.black,
                highlight = BrowserMenuHighlightableItem.Highlight(
                        startImageResource = android.R.drawable.ic_menu_camera,
                        endImageResource = android.R.drawable.ic_menu_add,
                        backgroundResource = R.color.photonRed50,
                        colorResource = R.color.photonRed50
                ),
                isHighlighted = { shouldHighlight }
        )

        val view = inflate(item)
@@ -62,15 +76,23 @@ class BrowserMenuHighlightableItemTest {
        val textView = view.findViewById<TextView>(R.id.text)
        assertEquals(textView.text, "label")

        val imageView = view.findViewById<AppCompatImageView>(R.id.image)
        val highlightImageView = view.findViewById<AppCompatImageView>(R.id.highlight_image)
        val startImageView = view.findViewById<AppCompatImageView>(R.id.image)
        val highlightImageView = view.findViewById<AppCompatImageView>(R.id.end_image)

        // Highlight should not exist before set
        assertEquals(android.R.drawable.ic_menu_report_image, Shadows.shadowOf(startImageView.drawable).createdFromResId)
        assertFalse(highlightImageView.isVisible)

        assertNotNull(imageView.drawable)
        assertNotNull(imageView.imageTintList)
        assertEquals(highlightImageView.visibility, View.VISIBLE)
        assertNotNull(highlightImageView.drawable)
        shouldHighlight = true
        item.invalidate(view)

        // Highlight should now exist
        assertTrue(highlightImageView.isVisible)
        assertNotNull(startImageView.imageTintList)
        assertEquals(android.R.drawable.ic_menu_camera, Shadows.shadowOf(startImageView.drawable).createdFromResId)
        assertEquals(android.R.drawable.ic_menu_add, Shadows.shadowOf(highlightImageView.drawable).createdFromResId)
        assertNotNull(highlightImageView.imageTintList)
        assertNotNull(view.background)
        assertEquals(R.color.photonRed50, Shadows.shadowOf(view.background).createdFromResId)
    }

    @Test
@@ -78,16 +100,20 @@ class BrowserMenuHighlightableItemTest {
        val item = BrowserMenuHighlightableItem(
            "label",
            android.R.drawable.ic_menu_report_image,
            highlight = BrowserMenuHighlightableItem.Highlight(android.R.drawable.ic_menu_report_image, R.color.photonRed50, R.color.photonRed50)
            highlight = BrowserMenuHighlightableItem.Highlight(
                    endImageResource = android.R.drawable.ic_menu_report_image,
                    backgroundResource = R.color.photonRed50,
                    colorResource = R.color.photonRed50
            )
        )

        val view = inflate(item)

        val imageView = view.findViewById<AppCompatImageView>(R.id.image)
        val highlightImageView = view.findViewById<AppCompatImageView>(R.id.highlight_image)
        val startImageView = view.findViewById<AppCompatImageView>(R.id.image)
        val endImageView = view.findViewById<AppCompatImageView>(R.id.end_image)

        assertNull(imageView.imageTintList)
        assertNull(highlightImageView.imageTintList)
        assertNull(startImageView.imageTintList)
        assertNull(endImageView.imageTintList)
    }

    @Test
@@ -99,8 +125,8 @@ class BrowserMenuHighlightableItemTest {
        )

        val view = inflate(item)
        val highlightImageView = view.findViewById<AppCompatImageView>(R.id.highlight_image)
        assertEquals(highlightImageView.visibility, View.GONE)
        val endImageView = view.findViewById<AppCompatImageView>(R.id.end_image)
        assertEquals(endImageView.visibility, View.GONE)
    }

    private fun inflate(item: BrowserMenuHighlightableItem): View {
+9 −9
Original line number Diff line number Diff line
@@ -634,7 +634,7 @@ class BrowserToolbarTest {

    @Test
    fun `BrowserToolbar Button must set padding`() {
        var button = BrowserToolbar.Button(mock(), "imageResource", visible = { true }) {}
        var button = BrowserToolbar.Button(mock(), "endImageResource", visible = { true }) {}
        val linearLayout = LinearLayout(testContext)
        var view = button.createView(linearLayout)
        val padding = Padding(0, 0, 0, 0)
@@ -642,20 +642,20 @@ class BrowserToolbarTest {
        assertEquals(view.paddingTop, ACTION_PADDING_DP)
        assertEquals(view.paddingRight, ACTION_PADDING_DP)
        assertEquals(view.paddingBottom, ACTION_PADDING_DP)
        button = BrowserToolbar.Button(mock(), "imageResource", padding = padding.copy(left = 16)) {}
        button = BrowserToolbar.Button(mock(), "endImageResource", padding = padding.copy(left = 16)) {}
        view = button.createView(linearLayout)
        assertEquals(view.paddingLeft, 16)
        button = BrowserToolbar.Button(mock(), "imageResource", padding = padding.copy(top = 16)) {}
        button = BrowserToolbar.Button(mock(), "endImageResource", padding = padding.copy(top = 16)) {}
        view = button.createView(linearLayout)
        assertEquals(view.paddingTop, 16)
        button = BrowserToolbar.Button(mock(), "imageResource", padding = padding.copy(right = 16)) {}
        button = BrowserToolbar.Button(mock(), "endImageResource", padding = padding.copy(right = 16)) {}
        view = button.createView(linearLayout)
        assertEquals(view.paddingRight, 16)
        button = BrowserToolbar.Button(mock(), "imageResource", padding = padding.copy(bottom = 16)) {}
        button = BrowserToolbar.Button(mock(), "endImageResource", padding = padding.copy(bottom = 16)) {}
        view = button.createView(linearLayout)
        assertEquals(view.paddingBottom, 16)
        button = BrowserToolbar.Button(
            mock(), "imageResource",
            mock(), "endImageResource",
            padding = Padding(16, 20, 24, 28)
        ) {}
        view = button.createView(linearLayout)
@@ -671,7 +671,7 @@ class BrowserToolbarTest {
        var button = BrowserToolbar.ToggleButton(
            mock(),
            mock(),
            "imageResource",
            "endImageResource",
            "",
            visible = { true },
            selected = false,
@@ -687,7 +687,7 @@ class BrowserToolbarTest {
        button = BrowserToolbar.ToggleButton(
            mock(),
            mock(),
            "imageResource",
            "endImageResource",
            "",
            visible = { true },
            selected = false,
@@ -704,7 +704,7 @@ class BrowserToolbarTest {
        button = BrowserToolbar.ToggleButton(
            mock(),
            mock(),
            "imageResource",
            "endImageResource",
            "",
            selected = false,
            background = 0
+2 −2
Original line number Diff line number Diff line
@@ -107,8 +107,8 @@ class MenuButtonTest {
        val highlightMenuBuilder = spy(BrowserMenuBuilder(listOf(
            BrowserMenuHighlightableItem(
                label = "Test",
                imageResource = 0,
                highlight = BrowserMenuHighlightableItem.Highlight(0, colorResource, colorResource),
                startImageResource = 0,
                highlight = BrowserMenuHighlightableItem.Highlight(0, 0, colorResource, colorResource),
                isHighlighted = { isHighlighted }
            )
        )))
Loading