Skip to content
This repository was archived by the owner on Nov 1, 2022. It is now read-only.

Commit ae0b2d9

Browse files
committed
Closes #1314: Make AwesomeBar styleable.
1 parent cf26709 commit ae0b2d9

File tree

8 files changed

+66
-19
lines changed

8 files changed

+66
-19
lines changed

components/browser/awesomebar/src/main/java/mozilla/components/browser/awesomebar/BrowserAwesomeBar.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ import mozilla.components.concept.awesomebar.AwesomeBar
1818

1919
private const val PROVIDER_QUERY_THREADS = 3
2020

21+
private const val DEFAULT_TITLE_TEXT_COLOR = 0xFF272727.toInt()
22+
private const val DEFAULT_DESCRIPTION_TEXT_COLOR = 0xFF737373.toInt()
23+
private const val DEFAULT_CHIP_TEXT_COLOR = 0xFF272727.toInt()
24+
private const val DEFAULT_CHIP_BACKGROUND_COLOR = 0xFFFFEEEE.toInt()
25+
2126
/**
2227
* A customizable [AwesomeBar] implementation.
2328
*/
@@ -32,10 +37,20 @@ class BrowserAwesomeBar @JvmOverloads constructor(
3237
internal var scope = CoroutineScope(Dispatchers.Main)
3338
internal var job: Job? = null
3439
internal var listener: (() -> Unit)? = null
40+
internal val styling: BrowserAwesomeBarStyling
3541

3642
init {
3743
layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
3844
adapter = suggestionsAdapter
45+
46+
val attr = context.obtainStyledAttributes(attrs, R.styleable.BrowserAwesomeBar, defStyleAttr, 0)
47+
this@BrowserAwesomeBar.styling = BrowserAwesomeBarStyling(
48+
attr.getColor(R.styleable.BrowserAwesomeBar_awesomeBarTitleTextColor, DEFAULT_TITLE_TEXT_COLOR),
49+
attr.getColor(R.styleable.BrowserAwesomeBar_awesomeBarDescriptionTextColor, DEFAULT_DESCRIPTION_TEXT_COLOR),
50+
attr.getColor(R.styleable.BrowserAwesomeBar_awesomeBarChipTextColor, DEFAULT_CHIP_TEXT_COLOR),
51+
attr.getColor(R.styleable.BrowserAwesomeBar_awesomeBarChipBackgroundColor, DEFAULT_CHIP_BACKGROUND_COLOR)
52+
)
53+
attr.recycle()
3954
}
4055

4156
@Synchronized
@@ -82,3 +97,10 @@ class BrowserAwesomeBar @JvmOverloads constructor(
8297
this.listener = listener
8398
}
8499
}
100+
101+
internal data class BrowserAwesomeBarStyling(
102+
val titleTextColor: Int,
103+
val descriptionTextColor: Int,
104+
val chipTextColor: Int,
105+
val chipBackgroundColor: Int
106+
)

components/browser/awesomebar/src/main/java/mozilla/components/browser/awesomebar/SuggestionViewHolder.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,12 @@ internal sealed class SuggestionViewHolder(
3131
private val awesomeBar: BrowserAwesomeBar,
3232
itemView: View
3333
) : SuggestionViewHolder(itemView) {
34-
private val titleView = itemView.findViewById<TextView>(R.id.mozac_browser_awesomebar_title)
35-
private val descriptionView = itemView.findViewById<TextView>(R.id.mozac_browser_awesomebar_description)
34+
private val titleView = itemView.findViewById<TextView>(R.id.mozac_browser_awesomebar_title).apply {
35+
setTextColor(awesomeBar.styling.titleTextColor)
36+
}
37+
private val descriptionView = itemView.findViewById<TextView>(R.id.mozac_browser_awesomebar_description).apply {
38+
setTextColor(awesomeBar.styling.descriptionTextColor)
39+
}
3640

3741
override fun bind(suggestion: AwesomeBar.Suggestion) {
3842
val title = if (suggestion.title.isNullOrEmpty()) suggestion.description else suggestion.title
@@ -79,6 +83,8 @@ internal sealed class SuggestionViewHolder(
7983
false
8084
) as TextView
8185

86+
view.setTextColor(awesomeBar.styling.chipTextColor)
87+
view.setBackgroundColor(awesomeBar.styling.chipBackgroundColor)
8288
view.text = chip.title
8389
view.setOnClickListener {
8490
suggestion.onChipClicked?.invoke(chip)

components/browser/awesomebar/src/main/res/layout/mozac_browser_awesomebar_chip.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
android:layout_width="wrap_content"
99
android:layout_height="wrap_content"
1010
android:layout_margin="4dp"
11-
android:background="#ffeeeeee"
1211
android:ellipsize="end"
1312
android:lines="1"
1413
android:padding="8dp"

components/browser/awesomebar/src/main/res/layout/mozac_browser_awesomebar_item_chips.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
android:layout_width="24dp"
1616
android:layout_height="24dp"
1717
android:layout_marginStart="16dp"
18-
android:background="#ffcccccc"
1918
android:importantForAccessibility="no"
2019
app:layout_constraintBottom_toBottomOf="parent"
2120
app:layout_constraintStart_toStartOf="parent"
@@ -29,7 +28,7 @@
2928
android:orientation="horizontal"
3029
app:layout_constraintEnd_toEndOf="parent"
3130
app:layout_constraintStart_toEndOf="@+id/mozac_browser_awesomebar_icon"
32-
app:layout_constraintTop_toBottomOf="@id/mozac_browser_awesomebar_title"
31+
app:layout_constraintTop_toTopOf="parent"
3332
tools:layout_height="50dp" />
3433

3534
</android.support.constraint.ConstraintLayout>

components/browser/awesomebar/src/main/res/layout/mozac_browser_awesomebar_item_generic.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
app:layout_constraintEnd_toEndOf="parent"
3535
app:layout_constraintStart_toEndOf="@+id/iconView"
3636
app:layout_constraintTop_toTopOf="parent"
37-
android:textColor="#272727"
3837
tools:text="Android Components" />
3938

4039
<TextView
@@ -47,7 +46,6 @@
4746
android:layout_marginBottom="8dp"
4847
android:ellipsize="end"
4948
android:lines="1"
50-
android:textColor="#737373"
5149
android:textSize="12sp"
5250
app:layout_constraintBottom_toBottomOf="parent"
5351
app:layout_constraintEnd_toEndOf="parent"
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<!-- This Source Code Form is subject to the terms of the Mozilla Public
3+
- License, v. 2.0. If a copy of the MPL was not distributed with this
4+
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
5+
<resources>
6+
<declare-styleable name="BrowserAwesomeBar">
7+
<attr name="awesomeBarTitleTextColor" format="reference|color" />
8+
<attr name="awesomeBarDescriptionTextColor" format="reference|color" />
9+
<attr name="awesomeBarChipTextColor" format="reference|color" />
10+
<attr name="awesomeBarChipBackgroundColor" format="reference|color" />
11+
</declare-styleable>
12+
</resources>

components/browser/awesomebar/src/test/java/mozilla/components/browser/awesomebar/SuggestionViewHolderTest.kt

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44

55
package mozilla.components.browser.awesomebar
66

7+
import android.content.Context
78
import android.view.LayoutInflater
89
import android.view.ViewGroup
910
import android.widget.TextView
1011
import mozilla.components.concept.awesomebar.AwesomeBar
11-
import mozilla.components.support.test.mock
1212
import org.junit.Assert.assertEquals
1313
import org.junit.Assert.assertFalse
1414
import org.junit.Assert.assertTrue
@@ -19,12 +19,16 @@ import org.robolectric.RuntimeEnvironment
1919

2020
@RunWith(RobolectricTestRunner::class)
2121
class SuggestionViewHolderTest {
22+
private val context: Context
23+
get() = RuntimeEnvironment.application
24+
2225
@Test
2326
fun `DefaultViewHolder sets title and description`() {
24-
val view = LayoutInflater.from(RuntimeEnvironment.application).inflate(
27+
val view = LayoutInflater.from(context).inflate(
2528
R.layout.mozac_browser_awesomebar_item_generic, null, false)
2629

27-
val viewHolder = SuggestionViewHolder.DefaultSuggestionViewHolder(mock(), view)
30+
val viewHolder = SuggestionViewHolder.DefaultSuggestionViewHolder(
31+
BrowserAwesomeBar(context), view)
2832

2933
val suggestion = AwesomeBar.Suggestion(
3034
title = "Hello World",
@@ -41,10 +45,11 @@ class SuggestionViewHolderTest {
4145

4246
@Test
4347
fun `Clicking on default suggestion view invokes callback`() {
44-
val view = LayoutInflater.from(RuntimeEnvironment.application).inflate(
48+
val view = LayoutInflater.from(context).inflate(
4549
R.layout.mozac_browser_awesomebar_item_generic, null, false)
4650

47-
val viewHolder = SuggestionViewHolder.DefaultSuggestionViewHolder(mock(), view)
51+
val viewHolder = SuggestionViewHolder.DefaultSuggestionViewHolder(
52+
BrowserAwesomeBar(context), view)
4853

4954
var callbackExecuted = false
5055
val suggestion = AwesomeBar.Suggestion(
@@ -62,10 +67,11 @@ class SuggestionViewHolderTest {
6267

6368
@Test
6469
fun `ChipsSuggestionViewHolder adds views for chips`() {
65-
val view = LayoutInflater.from(RuntimeEnvironment.application).inflate(
70+
val view = LayoutInflater.from(context).inflate(
6671
R.layout.mozac_browser_awesomebar_item_chips, null, false)
6772

68-
val viewHolder = SuggestionViewHolder.ChipsSuggestionViewHolder(mock(), view)
73+
val viewHolder = SuggestionViewHolder.ChipsSuggestionViewHolder(
74+
BrowserAwesomeBar(context), view)
6975

7076
val suggestion = AwesomeBar.Suggestion(
7177
chips = listOf(
@@ -88,10 +94,11 @@ class SuggestionViewHolderTest {
8894

8995
@Test
9096
fun `Clicking on a chip invokes callback`() {
91-
val view = LayoutInflater.from(RuntimeEnvironment.application).inflate(
97+
val view = LayoutInflater.from(context).inflate(
9298
R.layout.mozac_browser_awesomebar_item_chips, null, false)
9399

94-
val viewHolder = SuggestionViewHolder.ChipsSuggestionViewHolder(mock(), view)
100+
val viewHolder = SuggestionViewHolder.ChipsSuggestionViewHolder(
101+
BrowserAwesomeBar(context), view)
95102

96103
var chipClicked: String? = null
97104

components/browser/awesomebar/src/test/java/mozilla/components/browser/awesomebar/SuggestionsAdapterTest.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
package mozilla.components.browser.awesomebar
66

7+
import android.content.Context
78
import android.widget.LinearLayout
89
import mozilla.components.concept.awesomebar.AwesomeBar
910
import mozilla.components.support.test.any
@@ -22,6 +23,9 @@ import java.lang.IllegalArgumentException
2223

2324
@RunWith(RobolectricTestRunner::class)
2425
class SuggestionsAdapterTest {
26+
private val context: Context
27+
get() = RuntimeEnvironment.application
28+
2529
@Test
2630
fun `addSuggestions() should add suggestions of provider`() {
2731
val adapter = SuggestionsAdapter(mock())
@@ -123,9 +127,9 @@ class SuggestionsAdapterTest {
123127

124128
@Test
125129
fun `onCreateViewHolder() will create view holder matching layout id`() {
126-
val adapter = SuggestionsAdapter(mock())
130+
val adapter = SuggestionsAdapter(BrowserAwesomeBar(context))
127131

128-
val parent = LinearLayout(RuntimeEnvironment.application)
132+
val parent = LinearLayout(context)
129133

130134
assertTrue(adapter.createViewHolder(parent, SuggestionViewHolder.DefaultSuggestionViewHolder.LAYOUT_ID)
131135
is SuggestionViewHolder.DefaultSuggestionViewHolder)
@@ -138,7 +142,7 @@ class SuggestionsAdapterTest {
138142
fun `onCreateViewHolder() will throw for unknown id`() {
139143
val adapter = SuggestionsAdapter(mock())
140144

141-
val parent = LinearLayout(RuntimeEnvironment.application)
145+
val parent = LinearLayout(context)
142146

143147
adapter.onCreateViewHolder(parent, 0)
144148
}

0 commit comments

Comments
 (0)