Skip to content

Commit

Permalink
Merge pull request #737 from chrisbanes/cb/remove-appcompat
Browse files Browse the repository at this point in the history
Remove AppCompat + MDC
  • Loading branch information
chrisbanes committed Dec 1, 2020
2 parents 5e700c8 + bc5683e commit 8f4d9c0
Show file tree
Hide file tree
Showing 78 changed files with 932 additions and 916 deletions.
24 changes: 15 additions & 9 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,6 @@ plugins {

id 'kotlin-android'
id 'kotlin-kapt'

id 'com.google.android.gms.oss-licenses-plugin'
id 'androidx.navigation.safeargs.kotlin'
}

play {
Expand Down Expand Up @@ -118,6 +115,12 @@ android {

buildFeatures {
viewBinding true
compose true
}

composeOptions {
kotlinCompilerVersion Libs.Kotlin.version
kotlinCompilerExtensionVersion Libs.AndroidX.Compose.version
}

testOptions {
Expand Down Expand Up @@ -163,6 +166,7 @@ dependencies {
implementation project(':base-android')
implementation project(':common-ui-view')
implementation project(':common-imageloading')
implementation project(':common-ui-compose')
implementation project(':data')
implementation project(':data-android')
implementation project(':trakt')
Expand All @@ -186,16 +190,19 @@ dependencies {
implementation Libs.AndroidX.Lifecycle.livedata
implementation Libs.AndroidX.Lifecycle.viewmodel

implementation Libs.AndroidX.appcompat
implementation Libs.AndroidX.emoji
implementation Libs.AndroidX.constraintlayout
implementation Libs.AndroidX.Fragment.fragmentKtx
implementation Libs.AndroidX.Navigation.fragment
implementation Libs.AndroidX.Navigation.ui

implementation Libs.Mdc.material
implementation Libs.AndroidX.Compose.foundation
implementation Libs.AndroidX.Compose.ui
implementation Libs.AndroidX.Compose.layout
implementation Libs.AndroidX.Compose.material
implementation Libs.AndroidX.Compose.animation
implementation Libs.AndroidX.Compose.tooling
implementation Libs.AndroidX.Compose.livedata

implementation Libs.Insetter.ktx
implementation Libs.Accompanist.insets

implementation Libs.threeTenAbp

Expand All @@ -215,7 +222,6 @@ dependencies {

implementation Libs.Google.crashlytics
implementation Libs.Google.analytics
implementation Libs.Google.openSourceLicensesLibrary

debugImplementation Libs.leakCanary

Expand Down
13 changes: 3 additions & 10 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -24,22 +24,15 @@
native <methods>;
}

-keep public class * extends android.view.View {
# We only need to keep ComposeView + FragmentContainerView
-keep public class androidx.compose.ui.platform.ComposeView {
public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
-keep public class androidx.fragment.app.FragmentContainerView {
public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}

# For enumeration classes
-keepclassmembers enum * {
<fields>;
Expand Down
98 changes: 98 additions & 0 deletions app/src/main/java/app/tivi/home/Home.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
/*
* Copyright 2020 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

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.preferredHeight
import androidx.compose.material.BottomNavigationItem
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.material.contentColorFor
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.FavoriteBorder
import androidx.compose.material.icons.filled.Search
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import app.tivi.R
import app.tivi.common.compose.IconResource
import dev.chrisbanes.accompanist.insets.navigationBarsHeight

internal enum class HomeNavigation {
Discover,
Following,
Watched,
Search,
}

@Composable
internal fun HomeBottomNavigation(
selectedNavigation: HomeNavigation,
onNavigationSelected: (HomeNavigation) -> Unit,
modifier: Modifier = Modifier
) {
Surface(
color = MaterialTheme.colors.surface,
contentColor = contentColorFor(MaterialTheme.colors.surface),
elevation = 8.dp,
modifier = modifier
) {
Column {
Row(
Modifier.fillMaxWidth().preferredHeight(56.dp),
horizontalArrangement = Arrangement.SpaceBetween,
) {
BottomNavigationItem(
icon = { IconResource(R.drawable.ic_weekend_black_24dp) },
label = { Text(stringResource(R.string.discover_title)) },
selected = selectedNavigation == HomeNavigation.Discover,
onClick = { onNavigationSelected(HomeNavigation.Discover) },
)

BottomNavigationItem(
icon = { Icon(Icons.Default.FavoriteBorder) },
label = { Text(stringResource(R.string.following_shows_title)) },
selected = selectedNavigation == HomeNavigation.Following,
onClick = { onNavigationSelected(HomeNavigation.Following) },
)

BottomNavigationItem(
icon = { IconResource(R.drawable.ic_visibility) },
label = { Text(stringResource(R.string.watched_shows_title)) },
selected = selectedNavigation == HomeNavigation.Watched,
onClick = { onNavigationSelected(HomeNavigation.Watched) },
)

BottomNavigationItem(
icon = { Icon(Icons.Default.Search) },
label = { Text(stringResource(R.string.search_navigation_title)) },
selected = selectedNavigation == HomeNavigation.Search,
onClick = { onNavigationSelected(HomeNavigation.Search) },
)
}

Spacer(modifier = Modifier.navigationBarsHeight())
}
}
}
113 changes: 70 additions & 43 deletions app/src/main/java/app/tivi/home/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,27 @@ package app.tivi.home

import android.content.Intent
import android.os.Bundle
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.core.view.WindowCompat
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.NavController
import app.tivi.AppNavigator
import app.tivi.R
import app.tivi.TiviActivity
import app.tivi.common.compose.shouldUseDarkColors
import app.tivi.common.compose.theme.TiviTheme
import app.tivi.databinding.ActivityMainBinding
import app.tivi.extensions.MultipleBackStackNavigation
import app.tivi.extensions.hideSoftInput
import app.tivi.extensions.setupWithNavController
import app.tivi.settings.TiviPreferences
import app.tivi.trakt.TraktConstants
import dagger.hilt.android.AndroidEntryPoint
import dev.chrisbanes.insetter.Insetter
import dev.chrisbanes.insetter.Side
import dev.chrisbanes.accompanist.insets.ProvideWindowInsets
import javax.inject.Inject

@AndroidEntryPoint
Expand All @@ -44,70 +52,89 @@ class MainActivity : TiviActivity() {

@Inject lateinit var navigator: AppNavigator

@Inject lateinit var preferences: TiviPreferences

private var currentSelectedItem by mutableStateOf(HomeNavigation.Discover)

private lateinit var multiBackStackNavigation: MultipleBackStackNavigation

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

WindowCompat.setDecorFitsSystemWindows(window, false)

viewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)

binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

Insetter.builder()
.applySystemWindowInsetsToPadding(Side.LEFT or Side.RIGHT)
.consumeSystemWindowInsets(Insetter.CONSUME_AUTO)
.applyToView(binding.root)

Insetter.builder()
.applySystemWindowInsetsToPadding(Side.BOTTOM)
.consumeSystemWindowInsets(Insetter.CONSUME_AUTO)
.applyToView(binding.homeBottomNavigation)

Insetter.setEdgeToEdgeSystemUiFlags(binding.homeRoot, true)

if (savedInstanceState == null) {
setupBottomNavigationBar()
}
}

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
// Now that BottomNavigationBar has restored its instance state
// and its selectedItemId, we can proceed with setting up the
// BottomNavigationBar with Navigation
setupBottomNavigationBar()
}

override fun handleIntent(intent: Intent) {
when (intent.action) {
TraktConstants.INTENT_ACTION_HANDLE_AUTH_RESPONSE -> {
navigator.onAuthResponse(intent)
}
}
}

private fun setupBottomNavigationBar() {
currentNavController = binding.homeBottomNavigation.setupWithNavController(
navGraphIds = listOf(
multiBackStackNavigation = MultipleBackStackNavigation(
navGraphIds = intArrayOf(
R.navigation.discover_nav_graph,
R.navigation.watched_nav_graph,
R.navigation.following_nav_graph,
R.navigation.watched_nav_graph,
R.navigation.search_nav_graph
),
fragmentManager = supportFragmentManager,
containerId = R.id.home_nav_container,
intent = intent
intent = intent,
getSelectedItemId = { currentSelectedItem.toNavigationId() },
setSelectedItemId = { currentSelectedItem = navigationIdToHomeNavigation(it) },
)

currentNavController = multiBackStackNavigation.selectedNavController
currentNavController?.observe(this) { navController ->
navController.addOnDestinationChangedListener { _, destination, _ ->
if (destination.id != R.id.navigation_search) {
hideSoftInput()
}
}
}

binding.homeBottomNavigation.setContent {
ProvideWindowInsets {
TiviTheme(useDarkColors = preferences.shouldUseDarkColors()) {
HomeBottomNavigation(
selectedNavigation = currentSelectedItem,
onNavigationSelected = { item ->
if (currentSelectedItem == item) {
multiBackStackNavigation.onReselected(item.toNavigationId())
} else {
currentSelectedItem = item
multiBackStackNavigation.onItemSelected(item.toNavigationId())
}
},
modifier = Modifier.fillMaxWidth()
)
}
}
}
}

override fun onSupportNavigateUp(): Boolean {
return currentNavController?.value?.navigateUp() ?: super.onSupportNavigateUp()
override fun handleIntent(intent: Intent) {
when (intent.action) {
TraktConstants.INTENT_ACTION_HANDLE_AUTH_RESPONSE -> {
navigator.onAuthResponse(intent)
}
}
}

override fun onNavigateUp(): Boolean {
return currentNavController?.value?.navigateUp() ?: super.onNavigateUp()
}
}

private fun HomeNavigation.toNavigationId(): Int = when (this) {
HomeNavigation.Discover -> R.navigation.discover_nav_graph
HomeNavigation.Following -> R.navigation.following_nav_graph
HomeNavigation.Watched -> R.navigation.watched_nav_graph
HomeNavigation.Search -> R.navigation.search_nav_graph
}

private fun navigationIdToHomeNavigation(id: Int): HomeNavigation = when (id) {
R.navigation.discover_nav_graph -> HomeNavigation.Discover
R.navigation.following_nav_graph -> HomeNavigation.Following
R.navigation.watched_nav_graph -> HomeNavigation.Watched
R.navigation.search_nav_graph -> HomeNavigation.Search
else -> throw IllegalArgumentException("Navigation graph with id not found: $id")
}
11 changes: 0 additions & 11 deletions app/src/main/java/app/tivi/inject/AppModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,8 @@ package app.tivi.inject

import android.app.Application
import android.content.Context
import androidx.navigation.ui.AppBarConfiguration
import app.tivi.BuildConfig
import app.tivi.extensions.withLocale
import app.tivi.home.followed.R
import app.tivi.tmdb.TmdbModule
import app.tivi.trakt.TraktModule
import app.tivi.util.AppCoroutineDispatchers
Expand Down Expand Up @@ -113,15 +111,6 @@ object AppModule {
return DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).withLocale(context)
}

@Provides
@Singleton
fun provideAppBarConfiguration() = AppBarConfiguration.Builder(
R.id.navigation_followed,
R.id.navigation_watched,
R.id.navigation_discover,
R.id.navigation_search
).build()

@Provides
@Singleton
fun provideFirebaseCrashlytics(): FirebaseCrashlytics = FirebaseCrashlytics.getInstance()
Expand Down
Loading

0 comments on commit 8f4d9c0

Please sign in to comment.