Add: Main app, main activity and navigation handling

This commit is contained in:
Carlos Martinez
2021-06-15 22:08:27 -04:00
parent e85196ad03
commit 7a62f260ee
16 changed files with 370 additions and 3 deletions

View File

@@ -3,13 +3,32 @@
package="dev.carlos.acronyms"
>
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".MainApplication"
android:allowBackup="true"
android:label="@string/app_name"
android:fullBackupContent="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:supportsRtl="false"
android:theme="@style/Theme.Acronyms"
/>
android:hardwareAccelerated="true"
>
<activity
android:name=".views.MainActivity"
android:launchMode="singleTask"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@@ -0,0 +1,32 @@
package dev.carlos.acronyms
import android.app.Application
import dev.carlos.acronyms.di.appModules
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
import timber.log.Timber
@Suppress("unused")
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
setupLogger()
setupDi()
}
private fun setupLogger() {
Timber.plant(Timber.DebugTree())
}
private fun setupDi() {
startKoin {
androidContext(this@MainApplication)
modules(
listOf(
appModules
)
)
}
}
}

View File

@@ -0,0 +1,17 @@
package dev.carlos.acronyms.di
import dev.carlos.acronyms.BuildConfig
import dev.carlos.acronyms.viewmodel.NavigationViewmodel
import dev.carlos.core.domain.network.RemoteClient
import dev.carlos.core.navigation.NavigationRouter
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module
val appModules = module {
// Retrofit
single { RemoteClient(BuildConfig.BASE_ENDPOINT) }
// Navigation
single { NavigationRouter() }
viewModel { NavigationViewmodel() }
}

View File

@@ -0,0 +1,18 @@
package dev.carlos.acronyms.viewmodel
import android.os.Bundle
import androidx.annotation.IdRes
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import dev.carlos.core.navigation.NavigationEvent
class NavigationViewmodel : ViewModel() {
val navigate = MutableLiveData<Pair<@IdRes Int, Bundle>>()
fun onNavigationEvent(event: NavigationEvent) {
when (event) {
else -> throw NoWhenBranchMatchedException("Undefined navigation event parent")
}
}
}

View File

@@ -0,0 +1,43 @@
package dev.carlos.acronyms.views
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import androidx.navigation.ui.NavigationUI
import dev.carlos.acronyms.R
import dev.carlos.acronyms.di.appModules
import dev.carlos.acronyms.viewmodel.NavigationViewmodel
import dev.carlos.core.extensions.findNavHostFragment
import dev.carlos.core.extensions.observeNonNull
import dev.carlos.core.navigation.NavigationRouter
import org.koin.android.ext.android.inject
import org.koin.android.ext.koin.androidContext
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.context.startKoin
class MainActivity : AppCompatActivity() {
private val navController by lazy { findNavController(R.id.main_fragment_container) }
private val navRouter: NavigationRouter by inject()
private val viewModel: NavigationViewmodel by viewModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setupNavigation()
}
private fun setupNavigation() {
navController.setGraph(R.navigation.main_navigation)
navRouter.setOnNavigationEvent {
viewModel.onNavigationEvent(it)
}
viewModel.navigate.observeNonNull(this) { pair ->
// Pair.first is a Navigation Id
// Pair.second is a Bundle
navController.navigate(pair.first, pair.second)
}
NavigationUI.setupActionBarWithNavController(this, navController)
}
}

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<androidx.fragment.app.FragmentContainerView
android:id="@+id/main_fragment_container"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_navigation"
>
</navigation>