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

Commit 6037caf

Browse files
Mugurellmergify[bot]
authored andcommitted
For #9659 - New forceCollapse api in BrowserToolbarBehavior
Similar to the existing forceExpand this new method will collapse the toolbar (be it placed at the bottom or at the top). There were also some tests from a previous patch that needed some touchups.
1 parent 4a649aa commit 6037caf

File tree

5 files changed

+72
-69
lines changed

5 files changed

+72
-69
lines changed

components/browser/toolbar/src/main/java/mozilla/components/browser/toolbar/behavior/BrowserToolbarBehavior.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,13 @@ class BrowserToolbarBehavior(
150150
yTranslator.expandWithAnimation(toolbar)
151151
}
152152

153+
/**
154+
* Used to collapse the [BrowserToolbar]
155+
*/
156+
fun forceCollapse(toolbar: BrowserToolbar) {
157+
yTranslator.collapseWithAnimation(toolbar)
158+
}
159+
153160
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
154161
internal fun positionSnackbar(child: View, snackbarLayout: Snackbar.SnackbarLayout) {
155162
val params = snackbarLayout.layoutParams as CoordinatorLayout.LayoutParams

components/browser/toolbar/src/main/java/mozilla/components/browser/toolbar/behavior/BrowserToolbarYTranslator.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import mozilla.components.browser.toolbar.BrowserToolbar
1717
*/
1818
class BrowserToolbarYTranslator(toolbarPosition: ToolbarPosition) {
1919
@VisibleForTesting
20-
internal val strategy = getTranslationStrategy(toolbarPosition)
20+
internal var strategy = getTranslationStrategy(toolbarPosition)
2121

2222
/**
2323
* Snap the [BrowserToolbar] to be collapsed or expanded, depending on whatever state is closer
@@ -41,6 +41,13 @@ class BrowserToolbarYTranslator(toolbarPosition: ToolbarPosition) {
4141
strategy.expandWithAnimation(toolbar)
4242
}
4343

44+
/**
45+
* Translate the [BrowserToolbar] to be hidden from view over a short amount of time.
46+
*/
47+
internal fun collapseWithAnimation(toolbar: BrowserToolbar) {
48+
strategy.collapseWithAnimation(toolbar)
49+
}
50+
4451
/**
4552
* Force expanding the [BrowserToolbar] depending on the [distance] value that should be translated
4653
* cancelling any other translation already in progress.

components/browser/toolbar/src/test/java/mozilla/components/browser/toolbar/behavior/BrowserToolbarBehaviorTest.kt

Lines changed: 18 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ class BrowserToolbarBehaviorTest {
210210
assertTrue(behavior.shouldSnapAfterScroll)
211211
verify(yTranslator).cancelInProgressTranslation()
212212
verify(yTranslator, never()).expandWithAnimation(any())
213+
verify(yTranslator, never()).collapseWithAnimation(any())
213214

214215
behavior.stopNestedScroll(0, child)
215216

@@ -239,6 +240,7 @@ class BrowserToolbarBehaviorTest {
239240
assertTrue(behavior.shouldSnapAfterScroll)
240241
verify(yTranslator).cancelInProgressTranslation()
241242
verify(yTranslator, never()).expandWithAnimation(any())
243+
verify(yTranslator, never()).collapseWithAnimation(any())
242244

243245
behavior.stopNestedScroll(0, child)
244246

@@ -381,66 +383,27 @@ class BrowserToolbarBehaviorTest {
381383
}
382384

383385
@Test
384-
fun `Behavior will snap toolbar first finishing translation animations if they are in progress`() {
385-
// val behavior = BrowserToolbarBehavior(testContext, null, ToolbarPosition.BOTTOM)
386-
// val yTranslator: BrowserToolbarYTranslator = mock()
387-
// behavior.yTranslator = yTranslatorr
388-
// val child = mock<BrowserToolbar>()
389-
// behavior.browserToolbar = child
390-
// doReturn(100).`when`(child).height
391-
// doReturn(40f).`when`(child).translationY
392-
//
393-
// behavior.snapToolbarVertically()
394-
//
395-
// verify(animator).end()
396-
}
386+
fun `forceExpand should delegate the translator`() {
387+
val behavior = spy(BrowserToolbarBehavior(testContext, null, ToolbarPosition.BOTTOM))
388+
val yTranslator: BrowserToolbarYTranslator = mock()
389+
behavior.yTranslator = yTranslator
390+
val toolbar: BrowserToolbar = mock()
397391

398-
@Test
399-
fun `Behavior can snap toolbar if it is translated to the bottom half`() {
400-
// val behavior = BrowserToolbarBehavior(testContext, null, ToolbarPosition.BOTTOM)
401-
// val animator: ValueAnimator = mock()
402-
// behavior.snapAnimator = animator
403-
// doReturn(false).`when`(animator).isStarted
404-
// val child = mock<BrowserToolbar>()
405-
// behavior.browserToolbar = child
406-
// doReturn(100).`when`(child).height
407-
// doReturn(40f).`when`(child).translationY
408-
//
409-
// behavior.snapToolbarVertically()
410-
//
411-
// verify(child).translationY = 0f
412-
}
392+
behavior.forceExpand(toolbar)
413393

414-
@Test
415-
fun `Behavior can snap toolbar if it is translated to the top half`() {
416-
// val behavior = BrowserToolbarBehavior(testContext, null, ToolbarPosition.BOTTOM)
417-
// val animator: ValueAnimator = mock()
418-
// behavior.snapAnimator = animator
419-
// doReturn(false).`when`(animator).isStarted
420-
// val child = mock<BrowserToolbar>()
421-
// behavior.browserToolbar = child
422-
// doReturn(100).`when`(child).height
423-
// doReturn(60f).`when`(child).translationY
424-
//
425-
// behavior.snapToolbarVertically()
426-
//
427-
// verify(child).translationY = 100f
394+
verify(yTranslator).expandWithAnimation(toolbar)
428395
}
429396

430397
@Test
431-
fun `Behavior will snap toolbar to top if it is translated to exactly half`() {
432-
// val behavior = BrowserToolbarBehavior(testContext, null, ToolbarPosition.BOTTOM)
433-
// val animator: ValueAnimator = mock()
434-
// behavior.snapAnimator = animator
435-
// doReturn(false).`when`(animator).isStarted
436-
// val child = mock<BrowserToolbar>()
437-
// doReturn(100).`when`(child).height
438-
// doReturn(50f).`when`(child).translationY
439-
// behavior.browserToolbar = child
440-
//
441-
// behavior.snapToolbarVertically()
442-
//
443-
// verify(child).translationY = 100f
398+
fun `forceCollapse should delegate the translator`() {
399+
val behavior = spy(BrowserToolbarBehavior(testContext, null, ToolbarPosition.BOTTOM))
400+
val yTranslator: BrowserToolbarYTranslator = mock()
401+
behavior.yTranslator = yTranslator
402+
val toolbar: BrowserToolbar = mock()
403+
404+
behavior.forceCollapse(toolbar)
405+
406+
verify(yTranslator).collapseWithAnimation(toolbar)
444407
}
445408

446409
@Test

components/browser/toolbar/src/test/java/mozilla/components/browser/toolbar/behavior/BrowserToolbarYTranslatorTest.kt

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import mozilla.components.support.test.mock
1010
import org.junit.Assert.assertTrue
1111
import org.junit.Test
1212
import org.junit.runner.RunWith
13-
import org.mockito.Mockito.spy
1413
import org.mockito.Mockito.verify
1514

1615
@RunWith(AndroidJUnit4::class)
@@ -31,60 +30,84 @@ class BrowserToolbarYTranslatorTest {
3130

3231
@Test
3332
fun `yTranslator should delegate it's strategy for snapWithAnimation`() {
34-
val yTranslator = spy(BrowserToolbarYTranslator(ToolbarPosition.BOTTOM))
33+
val yTranslator = BrowserToolbarYTranslator(ToolbarPosition.BOTTOM)
34+
val strategy: BrowserToolbarYTranslationStrategy = mock()
35+
yTranslator.strategy = strategy
3536
val toolbar: BrowserToolbar = mock()
3637

3738
yTranslator.snapWithAnimation(toolbar)
3839

39-
verify(yTranslator).snapWithAnimation(toolbar)
40+
verify(strategy).snapWithAnimation(toolbar)
4041
}
4142

4243
@Test
4344
fun `yTranslator should delegate it's strategy for expandWithAnimation`() {
44-
val yTranslator = spy(BrowserToolbarYTranslator(ToolbarPosition.BOTTOM))
45+
val yTranslator = BrowserToolbarYTranslator(ToolbarPosition.BOTTOM)
46+
val strategy: BrowserToolbarYTranslationStrategy = mock()
47+
yTranslator.strategy = strategy
4548
val toolbar: BrowserToolbar = mock()
4649

4750
yTranslator.expandWithAnimation(toolbar)
4851

49-
verify(yTranslator).expandWithAnimation(toolbar)
52+
verify(strategy).expandWithAnimation(toolbar)
53+
}
54+
55+
@Test
56+
fun `yTranslator should delegate it's strategy for collapseWithAnimation`() {
57+
val yTranslator = BrowserToolbarYTranslator(ToolbarPosition.BOTTOM)
58+
val strategy: BrowserToolbarYTranslationStrategy = mock()
59+
yTranslator.strategy = strategy
60+
val toolbar: BrowserToolbar = mock()
61+
62+
yTranslator.collapseWithAnimation(toolbar)
63+
64+
verify(strategy).collapseWithAnimation(toolbar)
5065
}
5166

5267
@Test
5368
fun `yTranslator should delegate it's strategy for forceExpandIfNotAlready`() {
54-
val yTranslator = spy(BrowserToolbarYTranslator(ToolbarPosition.BOTTOM))
69+
val yTranslator = BrowserToolbarYTranslator(ToolbarPosition.BOTTOM)
70+
val strategy: BrowserToolbarYTranslationStrategy = mock()
71+
yTranslator.strategy = strategy
5572
val toolbar: BrowserToolbar = mock()
5673

5774
yTranslator.forceExpandIfNotAlready(toolbar, 14f)
5875

59-
verify(yTranslator).forceExpandIfNotAlready(toolbar, 14f)
76+
verify(strategy).forceExpandWithAnimation(toolbar, 14f)
6077
}
6178

6279
@Test
6380
fun `yTranslator should delegate it's strategy for translate`() {
64-
val yTranslator = spy(BrowserToolbarYTranslator(ToolbarPosition.BOTTOM))
81+
val yTranslator = BrowserToolbarYTranslator(ToolbarPosition.BOTTOM)
82+
val strategy: BrowserToolbarYTranslationStrategy = mock()
83+
yTranslator.strategy = strategy
6584
val toolbar: BrowserToolbar = mock()
6685

6786
yTranslator.translate(toolbar, 23f)
6887

69-
verify(yTranslator).translate(toolbar, 23f)
88+
verify(strategy).translate(toolbar, 23f)
7089
}
7190

7291
@Test
7392
fun `yTranslator should delegate it's strategy for cancelInProgressTranslation`() {
74-
val yTranslator = spy(BrowserToolbarYTranslator(ToolbarPosition.BOTTOM))
93+
val yTranslator = BrowserToolbarYTranslator(ToolbarPosition.BOTTOM)
94+
val strategy: BrowserToolbarYTranslationStrategy = mock()
95+
yTranslator.strategy = strategy
7596

7697
yTranslator.cancelInProgressTranslation()
7798

78-
verify(yTranslator).cancelInProgressTranslation()
99+
verify(strategy).cancelInProgressTranslation()
79100
}
80101

81102
@Test
82103
fun `yTranslator should delegate it's strategy for snapImmediately`() {
83-
val yTranslator = spy(BrowserToolbarYTranslator(ToolbarPosition.BOTTOM))
104+
val yTranslator = BrowserToolbarYTranslator(ToolbarPosition.BOTTOM)
105+
val strategy: BrowserToolbarYTranslationStrategy = mock()
106+
yTranslator.strategy = strategy
84107
val toolbar: BrowserToolbar = mock()
85108

86109
yTranslator.snapImmediately(toolbar)
87110

88-
verify(yTranslator).snapImmediately(toolbar)
111+
verify(strategy).snapImmediately(toolbar)
89112
}
90113
}

docs/changelog.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ permalink: /changelog/
1515
* **All components**
1616
* ⚠️Increased `targetSdkVersion` to 30 (Android R)
1717

18+
* **browser-toolbar**
19+
* 🌟 Added `BrowserToolbarBehavior#forceCollapse` to easily collapse the top/bottom toolbar.
20+
1821
* **browser-toolbar**
1922
* ⚠️ **This is a breaking change**: `BrowserToolbarBottomBehavior` is renamed to `BrowserToolbarBehavior` as it is now a common behavior for toolbars be them placed at the bottom or at the top of the screen.
2023

0 commit comments

Comments
 (0)