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

Commit 427bb31

Browse files
csadilekpocmo
authored andcommitted
Issue #141: Support device back button for navigation
1 parent 57c3542 commit 427bb31

File tree

4 files changed

+76
-10
lines changed

4 files changed

+76
-10
lines changed

components/feature/session/src/main/java/mozilla/components/feature/session/SessionFeature.kt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import mozilla.components.browser.session.SessionManager
1212
* Feature implementation for connecting the engine module with the session module.
1313
*/
1414
class SessionFeature(
15-
sessionManager: SessionManager,
15+
private val sessionManager: SessionManager,
16+
private val sessionUseCases: SessionUseCases,
1617
engine: Engine,
1718
engineView: EngineView,
1819
sessionMapping: SessionMapping = SessionMapping()
@@ -26,6 +27,20 @@ class SessionFeature(
2627
presenter.start()
2728
}
2829

30+
/**
31+
* Handler for back pressed events in activities that use this feature.
32+
*
33+
* @return true if the event was handled, otherwise false.
34+
*/
35+
fun handleBackPressed(): Boolean {
36+
if (sessionManager.selectedSession.canGoBack) {
37+
sessionUseCases.goBack.invoke()
38+
return true
39+
}
40+
41+
return false
42+
}
43+
2944
/**
3045
* Stop feature: App is in the background.
3146
*/

components/feature/session/src/test/java/mozilla/components/feature/session/SessionFeatureTest.kt

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,61 @@
44

55
package mozilla.components.feature.session
66

7+
import mozilla.components.browser.session.Session
78
import mozilla.components.browser.session.SessionManager
9+
import mozilla.components.browser.session.SessionProvider
810
import mozilla.components.concept.engine.Engine
11+
import mozilla.components.concept.engine.EngineSession
912
import mozilla.components.concept.engine.EngineView
1013
import org.junit.Test
11-
import org.mockito.Mockito
14+
import org.mockito.Mockito.`when`
15+
import org.mockito.Mockito.mock
16+
import org.mockito.Mockito.never
1217
import org.mockito.Mockito.verify
1318

1419
class SessionFeatureTest {
15-
private val sessionManager = Mockito.mock(SessionManager::class.java)
16-
private val engine = Mockito.mock(Engine::class.java)
17-
private val engineView = Mockito.mock(EngineView::class.java)
18-
private val sessionMapping = Mockito.mock(SessionMapping::class.java)
20+
private val sessionManager = mock(SessionManager::class.java)
21+
private val engine = mock(Engine::class.java)
22+
private val engineView = mock(EngineView::class.java)
23+
private val sessionMapping = mock(SessionMapping::class.java)
24+
private val sessionUseCases = SessionUseCases(sessionManager, engine, sessionMapping)
1925

2026
@Test
2127
fun testStartEngineViewPresenter() {
22-
val feature = SessionFeature(sessionManager, engine, engineView, sessionMapping)
28+
val feature = SessionFeature(sessionManager, sessionUseCases, engine, engineView, sessionMapping)
2329
feature.start()
2430
verify(sessionManager).register(feature.presenter)
2531
}
2632

33+
@Test
34+
fun testHandleBackPressed() {
35+
val engineSession = mock(EngineSession::class.java)
36+
`when`(sessionMapping.getOrCreate(engine, sessionManager.selectedSession)).thenReturn(engineSession)
37+
38+
val session = Session("https://www.mozilla.org")
39+
40+
val sessionProvider = object : SessionProvider {
41+
override fun getInitialSessions(): Pair<List<Session>, Int> {
42+
val sessions = mutableListOf(session)
43+
return Pair(sessions, 0)
44+
}
45+
}
46+
val sessionManager = SessionManager(sessionProvider)
47+
sessionManager.select(session)
48+
49+
val feature = SessionFeature(sessionManager, sessionUseCases, engine, engineView, sessionMapping)
50+
51+
feature.handleBackPressed()
52+
verify(engineSession, never()).goBack()
53+
54+
session.canGoBack = true
55+
feature.handleBackPressed()
56+
verify(engineSession).goBack()
57+
}
58+
2759
@Test
2860
fun testStopEngineViewPresenter() {
29-
val feature = SessionFeature(sessionManager, engine, engineView, sessionMapping)
61+
val feature = SessionFeature(sessionManager, sessionUseCases, engine, engineView, sessionMapping)
3062
feature.stop()
3163
verify(sessionManager).unregister(feature.presenter)
3264
}

components/feature/toolbar/src/main/java/mozilla/components/feature/toolbar/ToolbarFeature.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,15 @@ class ToolbarFeature(
2727
presenter.start()
2828
}
2929

30+
/**
31+
* Handler for back pressed events in activities that use this feature.
32+
*
33+
* @return true if the event was handled, otherwise false.
34+
*/
35+
fun handleBackPressed(): Boolean {
36+
return false
37+
}
38+
3039
/**
3140
* Stop feature: App is in the background.
3241
*/

samples/browser/src/main/java/org/mozilla/samples/browser/MainActivity.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ class MainActivity : AppCompatActivity() {
2626
super.onCreate(savedInstanceState)
2727
setContentView(R.layout.activity_main)
2828

29-
sessionFeature = SessionFeature(components.sessionManager, components.engine, engineView,
30-
components.sessionMapping)
29+
sessionFeature = SessionFeature(components.sessionManager, components.sessionUseCases,
30+
components.engine, engineView, components.sessionMapping)
3131

3232
toolbarFeature = ToolbarFeature(components.sessionManager, components.sessionUseCases.loadUrl, toolbar)
3333

@@ -48,6 +48,16 @@ class MainActivity : AppCompatActivity() {
4848
toolbarFeature?.stop()
4949
}
5050

51+
override fun onBackPressed() {
52+
if (toolbarFeature?.handleBackPressed() == true)
53+
return
54+
55+
if (sessionFeature?.handleBackPressed() == true)
56+
return
57+
58+
super.onBackPressed()
59+
}
60+
5161
override fun onCreateView(parent: View?, name: String?, context: Context?, attrs: AttributeSet?): View? {
5262
if (name == EngineView::class.java.name) {
5363
return components.engine.createView(context!!, attrs).asView()

0 commit comments

Comments
 (0)