Navigation : add simple fragment backstack management.

This commit is contained in:
ganfra 2018-12-28 12:35:40 +01:00 committed by ganfra
parent c42be8141e
commit b696e4a6de
7 changed files with 37 additions and 15 deletions

View File

@ -0,0 +1,10 @@
package im.vector.riotredesign.core.platform

interface OnBackPressed {

/**
* Returns true, if the on back pressed event has been handled by this Fragment.
* Otherwise return false
*/
fun onBackPressed(): Boolean
}

View File

@ -2,12 +2,15 @@ package im.vector.riotredesign.core.platform


import com.airbnb.mvrx.BaseMvRxFragment import com.airbnb.mvrx.BaseMvRxFragment


abstract class RiotFragment : BaseMvRxFragment() { abstract class RiotFragment : BaseMvRxFragment(), OnBackPressed {


val riotActivity: RiotActivity by lazy { val riotActivity: RiotActivity by lazy {
activity as RiotActivity activity as RiotActivity
} }


override fun onBackPressed(): Boolean {
return false
}


override fun invalidate() { override fun invalidate() {
//no-ops by default //no-ops by default

View File

@ -5,14 +5,12 @@ import im.vector.matrix.android.api.Matrix
import im.vector.riotredesign.core.platform.RiotActivity import im.vector.riotredesign.core.platform.RiotActivity
import im.vector.riotredesign.features.home.HomeActivity import im.vector.riotredesign.features.home.HomeActivity
import im.vector.riotredesign.features.login.LoginActivity import im.vector.riotredesign.features.login.LoginActivity
import org.koin.android.ext.android.inject




class MainActivity : RiotActivity() { class MainActivity : RiotActivity() {


private val authenticator = Matrix.getInstance().authenticator() private val authenticator = Matrix.getInstance().authenticator()



override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
val intent = if (authenticator.hasActiveSessions()) { val intent = if (authenticator.hasActiveSessions()) {

View File

@ -1,4 +0,0 @@
package im.vector.riotredesign.features

class RootFlowCoordinator {
}

View File

@ -3,6 +3,7 @@ package im.vector.riotredesign.features.home
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.support.v4.app.FragmentManager
import android.support.v4.view.GravityCompat import android.support.v4.view.GravityCompat
import android.support.v4.widget.DrawerLayout import android.support.v4.widget.DrawerLayout
import android.support.v7.app.ActionBarDrawerToggle import android.support.v7.app.ActionBarDrawerToggle
@ -12,6 +13,7 @@ import android.view.MenuItem
import android.view.View import android.view.View
import im.vector.riotredesign.R import im.vector.riotredesign.R
import im.vector.riotredesign.core.extensions.replaceFragment import im.vector.riotredesign.core.extensions.replaceFragment
import im.vector.riotredesign.core.platform.OnBackPressed
import im.vector.riotredesign.core.platform.RiotActivity import im.vector.riotredesign.core.platform.RiotActivity
import im.vector.riotredesign.core.platform.ToolbarConfigurable import im.vector.riotredesign.core.platform.ToolbarConfigurable
import im.vector.riotredesign.features.home.room.detail.LoadingRoomDetailFragment import im.vector.riotredesign.features.home.room.detail.LoadingRoomDetailFragment
@ -46,7 +48,6 @@ class HomeActivity : RiotActivity(), HomeNavigator, ToolbarConfigurable {


override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
// Android home
android.R.id.home -> { android.R.id.home -> {
drawerLayout.openDrawer(GravityCompat.START) drawerLayout.openDrawer(GravityCompat.START)
return true return true
@ -60,10 +61,30 @@ class HomeActivity : RiotActivity(), HomeNavigator, ToolbarConfigurable {
if (drawerLayout.isDrawerOpen(Gravity.LEFT)) { if (drawerLayout.isDrawerOpen(Gravity.LEFT)) {
drawerLayout.closeDrawer(Gravity.LEFT) drawerLayout.closeDrawer(Gravity.LEFT)
} else { } else {
super.onBackPressed() val handled = recursivelyDispatchOnBackPressed(supportFragmentManager)
if (!handled) {
super.onBackPressed()
}
} }
} }


private fun recursivelyDispatchOnBackPressed(fm: FragmentManager): Boolean {
if (fm.backStackEntryCount == 0)
return false
val reverseOrder = fm.fragments.filter { it is OnBackPressed }.reversed()
for (f in reverseOrder) {
val handledByChildFragments = recursivelyDispatchOnBackPressed(f.childFragmentManager)
if (handledByChildFragments) {
return true
}
val backPressable = f as OnBackPressed
if (backPressable.onBackPressed()) {
return true
}
}
return false
}

// HomeNavigator ******************************************************************************* // HomeNavigator *******************************************************************************


override fun openRoomDetail(roomId: String, eventId: String?) { override fun openRoomDetail(roomId: String, eventId: String?) {

View File

@ -1,4 +0,0 @@
package im.vector.riotredesign.features.home

class HomeFlowCoordinator {
}

View File

@ -1,2 +0,0 @@
package im.vector.riotredesign.features.login