Skip to content

Commit

Permalink
Create new HomeNavigationFragment
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisbanes committed Mar 9, 2019
1 parent 09eb33a commit 32a7f86
Show file tree
Hide file tree
Showing 16 changed files with 512 additions and 264 deletions.
17 changes: 14 additions & 3 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

129 changes: 2 additions & 127 deletions app/src/main/java/app/tivi/home/HomeActivity.kt
Expand Up @@ -18,157 +18,32 @@ package app.tivi.home


import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.ViewGroup
import androidx.core.view.forEach
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.ViewModelProviders import androidx.lifecycle.ViewModelProviders
import app.tivi.R
import app.tivi.SharedElementHelper
import app.tivi.TiviActivity import app.tivi.TiviActivity
import app.tivi.extensions.observeK import app.tivi.home.main.HomeNavigationFragment
import app.tivi.home.HomeActivityViewModel.NavigationItem.DISCOVER
import app.tivi.home.HomeActivityViewModel.NavigationItem.LIBRARY
import app.tivi.home.discover.DiscoverFragment
import app.tivi.home.library.LibraryFragment
import app.tivi.home.popular.PopularShowsFragment
import app.tivi.home.trending.TrendingShowsFragment
import app.tivi.trakt.TraktConstants import app.tivi.trakt.TraktConstants
import kotlinx.android.synthetic.main.activity_home.*
import net.openid.appauth.AuthorizationException import net.openid.appauth.AuthorizationException
import net.openid.appauth.AuthorizationResponse import net.openid.appauth.AuthorizationResponse
import net.openid.appauth.AuthorizationService import net.openid.appauth.AuthorizationService


class HomeActivity : TiviActivity() { class HomeActivity : TiviActivity() {
companion object {
const val ROOT_FRAGMENT = "root"
}


private lateinit var viewModel: HomeActivityViewModel private lateinit var viewModel: HomeActivityViewModel
private lateinit var navigatorViewModel: HomeNavigatorViewModel


val authService by lazy(LazyThreadSafetyMode.NONE) { val authService by lazy(LazyThreadSafetyMode.NONE) {
AuthorizationService(this) AuthorizationService(this)
} }


override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_home)

home_content.setOnApplyWindowInsetsListener { view, insets ->
var consumed = false

(view as ViewGroup).forEach { child ->
if (child.dispatchApplyWindowInsets(insets).isConsumed) {
consumed = true
}
}

if (consumed) insets.consumeSystemWindowInsets() else insets
}

viewModel = ViewModelProviders.of(this, viewModelFactory) viewModel = ViewModelProviders.of(this, viewModelFactory)
.get(HomeActivityViewModel::class.java) .get(HomeActivityViewModel::class.java)


navigatorViewModel = ViewModelProviders.of(this, viewModelFactory)
.get(HomeNavigatorViewModel::class.java)

home_bottom_nav.setOnNavigationItemSelectedListener {
when (it.itemId) {
home_bottom_nav.selectedItemId -> {
if (supportFragmentManager.backStackEntryCount > 0) {
for (i in 0 until supportFragmentManager.backStackEntryCount) {
supportFragmentManager.popBackStack()
}
} else {
val fragment = supportFragmentManager.findFragmentById(R.id.home_content)
when (fragment) {
is DiscoverFragment -> fragment.scrollToTop()
is LibraryFragment -> fragment.scrollToTop()
}
}
true
}
R.id.home_nav_collection -> {
viewModel.onNavigationItemClicked(LIBRARY)
true
}
R.id.home_nav_discover -> {
viewModel.onNavigationItemClicked(DISCOVER)
true
}
else -> false
}
}

viewModel.navigationLiveData.observeK(this, this::showNavigationItem)

navigatorViewModel.showPopularCall.observeK(this, this::showPopular)
navigatorViewModel.showTrendingCall.observeK(this, this::showTrending)
navigatorViewModel.upClickedCall.observeK(this) { this.onUpClicked() }
}

private fun showNavigationItem(item: HomeActivityViewModel.NavigationItem?) {
if (item == null) {
return
}

val newFragment: Fragment
val newItemId: Int

when (item) {
DISCOVER -> {
newFragment = DiscoverFragment()
newItemId = R.id.home_nav_discover
}
LIBRARY -> {
newFragment = LibraryFragment()
newItemId = R.id.home_nav_collection
}
}

supportFragmentManager.popBackStackImmediate(ROOT_FRAGMENT, 0)

supportFragmentManager
.beginTransaction()
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
.replace(R.id.home_content, newFragment, ROOT_FRAGMENT)
.commit()

// Now make the bottom nav show the correct item
if (home_bottom_nav.selectedItemId != newItemId) {
home_bottom_nav.menu.findItem(newItemId)?.isChecked = true
}
}

private fun showPopular(sharedElements: SharedElementHelper?) {
showStackFragment(PopularShowsFragment(), sharedElements)
}

private fun showTrending(sharedElements: SharedElementHelper?) {
showStackFragment(TrendingShowsFragment(), sharedElements)
}

private fun showStackFragment(fragment: Fragment, sharedElements: SharedElementHelper? = null) {
supportFragmentManager.beginTransaction() supportFragmentManager.beginTransaction()
.setReorderingAllowed(true) .replace(android.R.id.content, HomeNavigationFragment())
.replace(R.id.home_content, fragment)
.addToBackStack(null)
.apply {
if (sharedElements != null && !sharedElements.isEmpty()) {
sharedElements.applyToTransaction(this)
} else {
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
}
}
.commit() .commit()
} }


private fun onUpClicked() {
// TODO can probably do something better here
supportFragmentManager.popBackStack()
}

override fun handleIntent(intent: Intent) { override fun handleIntent(intent: Intent) {
when (intent.action) { when (intent.action) {
TraktConstants.INTENT_ACTION_HANDLE_AUTH_RESPONSE -> { TraktConstants.INTENT_ACTION_HANDLE_AUTH_RESPONSE -> {
Expand Down
24 changes: 0 additions & 24 deletions app/src/main/java/app/tivi/home/HomeActivityViewModel.kt
Expand Up @@ -16,9 +16,7 @@


package app.tivi.home package app.tivi.home


import androidx.lifecycle.LiveData
import app.tivi.trakt.TraktManager import app.tivi.trakt.TraktManager
import app.tivi.util.SingleLiveEvent
import app.tivi.util.TiviViewModel import app.tivi.util.TiviViewModel
import net.openid.appauth.AuthorizationException import net.openid.appauth.AuthorizationException
import net.openid.appauth.AuthorizationResponse import net.openid.appauth.AuthorizationResponse
Expand All @@ -28,28 +26,6 @@ import javax.inject.Inject
internal class HomeActivityViewModel @Inject constructor( internal class HomeActivityViewModel @Inject constructor(
private val traktManager: TraktManager private val traktManager: TraktManager
) : TiviViewModel() { ) : TiviViewModel() {

enum class NavigationItem {
DISCOVER, LIBRARY
}

private val mutableNavLiveData = SingleLiveEvent<NavigationItem>()

/**
* Facade so that we don't leak the fact that its mutable
*/
val navigationLiveData: LiveData<NavigationItem>
get() = mutableNavLiveData

init {
// Set default value
mutableNavLiveData.value = NavigationItem.DISCOVER
}

fun onNavigationItemClicked(item: NavigationItem) {
mutableNavLiveData.value = item
}

fun onAuthResponse( fun onAuthResponse(
authService: AuthorizationService, authService: AuthorizationService,
response: AuthorizationResponse?, response: AuthorizationResponse?,
Expand Down
Expand Up @@ -16,15 +16,19 @@


package app.tivi.home package app.tivi.home


import android.content.Context
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import app.tivi.home.discover.DiscoverBuilder import androidx.lifecycle.ViewModelProvider
import app.tivi.home.library.LibraryBuilder import androidx.lifecycle.ViewModelProviders
import app.tivi.home.popular.PopularBuilder import app.tivi.AppNavigator
import app.tivi.home.trending.TrendingBuilder import app.tivi.TiviAppActivityNavigator
import app.tivi.home.main.HomeNavigationBuilder
import app.tivi.inject.PerActivity
import app.tivi.inject.ViewModelBuilder import app.tivi.inject.ViewModelBuilder
import app.tivi.inject.ViewModelKey import app.tivi.inject.ViewModelKey
import dagger.Binds import dagger.Binds
import dagger.Module import dagger.Module
import dagger.Provides
import dagger.android.ContributesAndroidInjector import dagger.android.ContributesAndroidInjector
import dagger.multibindings.IntoMap import dagger.multibindings.IntoMap


Expand All @@ -33,10 +37,7 @@ internal abstract class HomeBuilder {
@ContributesAndroidInjector(modules = [ @ContributesAndroidInjector(modules = [
ViewModelBuilder::class, ViewModelBuilder::class,
HomeModule::class, HomeModule::class,
DiscoverBuilder::class, HomeNavigationBuilder::class
TrendingBuilder::class,
PopularBuilder::class,
LibraryBuilder::class
]) ])
internal abstract fun homeActivity(): HomeActivity internal abstract fun homeActivity(): HomeActivity


Expand All @@ -49,4 +50,27 @@ internal abstract class HomeBuilder {
@IntoMap @IntoMap
@ViewModelKey(HomeNavigatorViewModel::class) @ViewModelKey(HomeNavigatorViewModel::class)
abstract fun bindHomeNavigatorViewModel(viewModel: HomeNavigatorViewModel): ViewModel abstract fun bindHomeNavigatorViewModel(viewModel: HomeNavigatorViewModel): ViewModel
}

@Module(includes = [HomeModuleBinds::class])
class HomeModule {
@Provides
fun provideHomeNavigator(
activity: HomeActivity,
factory: ViewModelProvider.Factory
): HomeNavigator {
return ViewModelProviders.of(activity, factory).get(HomeNavigatorViewModel::class.java)
}

@Provides
fun provideAppNavigator(activity: HomeActivity): AppNavigator {
return TiviAppActivityNavigator(activity)
}
}

@Module
abstract class HomeModuleBinds {
@Binds
@PerActivity
abstract fun provideContext(activity: HomeActivity): Context
} }
46 changes: 0 additions & 46 deletions app/src/main/java/app/tivi/home/HomeModule.kt

This file was deleted.

1 change: 0 additions & 1 deletion app/src/main/java/app/tivi/home/library/LibraryFragment.kt
Expand Up @@ -23,7 +23,6 @@ import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.browser.customtabs.CustomTabsIntent import androidx.browser.customtabs.CustomTabsIntent
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.fragment.app.commit import androidx.fragment.app.commit
import app.tivi.R import app.tivi.R
Expand Down
35 changes: 35 additions & 0 deletions app/src/main/java/app/tivi/home/main/HomeNavigationBuilder.kt
@@ -0,0 +1,35 @@
/*
* Copyright 2019 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package app.tivi.home.main

import app.tivi.home.discover.DiscoverBuilder
import app.tivi.home.library.LibraryBuilder
import app.tivi.home.popular.PopularBuilder
import app.tivi.home.trending.TrendingBuilder
import dagger.Module
import dagger.android.ContributesAndroidInjector

@Module
internal abstract class HomeNavigationBuilder {
@ContributesAndroidInjector(modules = [
DiscoverBuilder::class,
TrendingBuilder::class,
PopularBuilder::class,
LibraryBuilder::class
])
internal abstract fun homeNavigationFragment(): HomeNavigationFragment
}

0 comments on commit 32a7f86

Please sign in to comment.