1
0
Fork 0

Closes #403 Use Fragments for Navigation, Add Toolbar to HomeActivity

master
Emily Kager 2019-02-07 15:37:52 -08:00 committed by Jeff Boek
parent cf260e4b8d
commit 77883c0f30
16 changed files with 165 additions and 107 deletions

View File

@ -143,7 +143,9 @@ dependencies {
x86Implementation Deps.geckoview_nightly_x86 x86Implementation Deps.geckoview_nightly_x86
implementation Deps.androidx_legacy implementation Deps.androidx_legacy
implementation Deps.androidx_preference implementation Deps.androidx_preference
implementation Deps.androidx_fragment
implementation Deps.android_arch_navigation implementation Deps.android_arch_navigation
implementation Deps.android_arch_navigation_ui
} }

View File

@ -64,12 +64,6 @@
<action android:name="android.support.customtabs.action.CustomTabsService" /> <action android:name="android.support.customtabs.action.CustomTabsService" />
</intent-filter> </intent-filter>
</service> </service>
<activity
android:name=".settings.SettingsActivity"
android:label="@string/settings"
android:parentActivityName=".HomeActivity"
android:theme="@style/SettingsTheme"/>
</application> </application>
</manifest> </manifest>

View File

@ -9,7 +9,10 @@ import android.os.Bundle
import android.util.AttributeSet import android.util.AttributeSet
import android.view.View import android.view.View
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.NavigationUI
import mozilla.components.concept.engine.EngineView import mozilla.components.concept.engine.EngineView
import mozilla.components.feature.intent.IntentProcessor import mozilla.components.feature.intent.IntentProcessor
import mozilla.components.support.base.feature.BackHandler import mozilla.components.support.base.feature.BackHandler
@ -35,6 +38,13 @@ open class HomeActivity : AppCompatActivity() {
if (intent?.extras?.getBoolean(OPEN_TO_BROWSER) == true) { if (intent?.extras?.getBoolean(OPEN_TO_BROWSER) == true) {
openToBrowser() openToBrowser()
} }
val host = supportFragmentManager.findFragmentById(R.id.container) as NavHostFragment
val hostNavController = host.navController
val appBarConfiguration = AppBarConfiguration.Builder(setOf(R.id.libraryFragment)).build()
val navigationToolbar = findViewById<Toolbar>(R.id.navigationToolbar)
setSupportActionBar(navigationToolbar)
NavigationUI.setupWithNavController(navigationToolbar, hostNavController, appBarConfiguration)
} }
override fun onCreateView( override fun onCreateView(

View File

@ -14,6 +14,7 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.accessibility.AccessibilityManager import android.view.accessibility.AccessibilityManager
import androidx.appcompat.app.AppCompatActivity
import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
@ -106,6 +107,8 @@ class BrowserFragment : Fragment(), BackHandler {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
(activity as AppCompatActivity).supportActionBar?.hide()
val sessionId = arguments?.getString(SESSION_ID) val sessionId = arguments?.getString(SESSION_ID)
val sessionManager = requireComponents.core.sessionManager val sessionManager = requireComponents.core.sessionManager
@ -208,7 +211,7 @@ class BrowserFragment : Fragment(), BackHandler {
is ToolbarMenu.Item.Forward -> sessionUseCases.goForward.invoke() is ToolbarMenu.Item.Forward -> sessionUseCases.goForward.invoke()
is ToolbarMenu.Item.Reload -> sessionUseCases.reload.invoke() is ToolbarMenu.Item.Reload -> sessionUseCases.reload.invoke()
is ToolbarMenu.Item.Settings -> Navigation.findNavController(toolbar) is ToolbarMenu.Item.Settings -> Navigation.findNavController(toolbar)
.navigate(R.id.action_browserFragment_to_settingsActivity, null, null) .navigate(R.id.action_browserFragment_to_settingsFragment, null, null)
is ToolbarMenu.Item.Library -> Navigation.findNavController(toolbar) is ToolbarMenu.Item.Library -> Navigation.findNavController(toolbar)
.navigate(R.id.action_browserFragment_to_libraryFragment, null, null) .navigate(R.id.action_browserFragment_to_libraryFragment, null, null)
is ToolbarMenu.Item.RequestDesktop -> sessionUseCases.requestDesktopSite.invoke(action.item.isChecked) is ToolbarMenu.Item.RequestDesktop -> sessionUseCases.requestDesktopSite.invoke(action.item.isChecked)

View File

@ -10,6 +10,7 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.motion.widget.MotionLayout import androidx.constraintlayout.motion.widget.MotionLayout
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.navigation.Navigation import androidx.navigation.Navigation
@ -40,6 +41,8 @@ class HomeFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
(activity as AppCompatActivity).supportActionBar?.hide()
layoutComponents(view.homeLayout) layoutComponents(view.homeLayout)
val searchIcon = requireComponents.search.searchEngineManager.getDefaultSearchEngine(requireContext()).let { val searchIcon = requireComponents.search.searchEngineManager.getDefaultSearchEngine(requireContext()).let {
@ -48,7 +51,7 @@ class HomeFragment : Fragment() {
// Temporary so we can easily test settings // Temporary so we can easily test settings
view.menuButton.setOnClickListener { view.menuButton.setOnClickListener {
Navigation.findNavController(it).navigate(R.id.action_homeFragment_to_settingsActivity, null, null) Navigation.findNavController(it).navigate(R.id.action_homeFragment_to_settingsFragment, null, null)
} }
view.toolbar.setCompoundDrawablesWithIntrinsicBounds(searchIcon, null, null, null) view.toolbar.setCompoundDrawablesWithIntrinsicBounds(searchIcon, null, null, null)

View File

@ -6,9 +6,14 @@ package org.mozilla.fenix.library
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.navigation.Navigation
import org.mozilla.fenix.R import org.mozilla.fenix.R
class LibraryFragment : Fragment() { class LibraryFragment : Fragment() {
@ -20,4 +25,28 @@ class LibraryFragment : Fragment() {
): View? { ): View? {
return inflater.inflate(R.layout.fragment_library, container, false) return inflater.inflate(R.layout.fragment_library, container, false)
} }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
(activity as AppCompatActivity).supportActionBar?.show()
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.library_menu, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.libraryClose -> {
Navigation.findNavController(requireActivity(), R.id.container).popBackStack()
true
}
R.id.librarySearch -> {
// TODO Library Search
true
}
else -> super.onOptionsItemSelected(item)
}
}
} }

View File

@ -9,6 +9,7 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.navigation.Navigation import androidx.navigation.Navigation
import kotlinx.android.synthetic.main.fragment_search.view.* import kotlinx.android.synthetic.main.fragment_search.view.*
@ -47,6 +48,8 @@ class SearchFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
(activity as AppCompatActivity).supportActionBar?.hide()
layoutComponents(view.search_layout) layoutComponents(view.search_layout)
lifecycle.addObserver((toolbarComponent.uiView as ToolbarUIView).toolbarIntegration) lifecycle.addObserver((toolbarComponent.uiView as ToolbarUIView).toolbarIntegration)

View File

@ -1,36 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.settings
import android.R.id.content
import android.os.Bundle
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
class SettingsActivity : AppCompatActivity(), SettingsFragment.ActionBarUpdater {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState == null) {
with(supportFragmentManager.beginTransaction()) {
replace(content, SettingsFragment())
commit()
}
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {
android.R.id.home -> {
onBackPressed()
true
}
else -> super.onOptionsItemSelected(item)
}
override fun updateTitle(titleResId: Int) {
setTitle(titleResId)
}
}

View File

@ -8,6 +8,7 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.provider.Settings import android.provider.Settings
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.Preference.OnPreferenceClickListener import androidx.preference.Preference.OnPreferenceClickListener
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
@ -17,8 +18,9 @@ import org.mozilla.fenix.ext.getPreferenceKey
class SettingsFragment : PreferenceFragmentCompat() { class SettingsFragment : PreferenceFragmentCompat() {
interface ActionBarUpdater { override fun onCreate(savedInstanceState: Bundle?) {
fun updateTitle(titleResId: Int) super.onCreate(savedInstanceState)
(activity as AppCompatActivity).supportActionBar?.show()
} }
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
@ -29,12 +31,8 @@ class SettingsFragment : PreferenceFragmentCompat() {
super.onResume() super.onResume()
setupPreferences() setupPreferences()
getActionBarUpdater().apply {
updateTitle(R.string.settings)
}
} }
@Suppress("LongMethod") // Yep, this should be refactored.
private fun setupPreferences() { private fun setupPreferences() {
val makeDefaultBrowserKey = context?.getPreferenceKey(pref_key_make_default_browser) val makeDefaultBrowserKey = context?.getPreferenceKey(pref_key_make_default_browser)
@ -61,6 +59,4 @@ class SettingsFragment : PreferenceFragmentCompat() {
defaultClickListener defaultClickListener
} }
} }
private fun getActionBarUpdater() = activity as ActionBarUpdater
} }

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="@color/icons"
android:pathData="M13.326,12l4.337,-4.337a0.938,0.938 0,0 0,-1.326 -1.326L12,10.674 7.663,6.337A0.938,0.938 0,0 0,6.337 7.663L10.674,12 6.337,16.337a0.938,0.938 0,0 0,1.326 1.326L12,13.326l4.337,4.337a0.938,0.938 0,0 0,1.326 -1.326Z" />
</vector>

View File

@ -8,6 +8,6 @@
android:viewportWidth="24.0" android:viewportWidth="24.0"
android:viewportHeight="24.0"> android:viewportHeight="24.0">
<path <path
android:fillColor="#0c0c0d" android:fillColor="@color/icons"
android:pathData="M21.457,20.043l-6,-6a7.528,7.528 0,1 0,-1.414 1.414l6,6a1,1 0,0 0,1.414 -1.414ZM9.5,15A5.5,5.5 0,1 1,15 9.5,5.507 5.507,0 0,1 9.5,15Z"/> android:pathData="M21.457,20.043l-6,-6a7.528,7.528 0,1 0,-1.414 1.414l6,6a1,1 0,0 0,1.414 -1.414ZM9.5,15A5.5,5.5 0,1 1,15 9.5,5.507 5.507,0 0,1 9.5,15Z" />
</vector> </vector>

View File

@ -1,20 +1,26 @@
<!-- This Source Code Form is subject to the terms of the Mozilla Public <!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this - License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<androidx.constraintlayout.widget.ConstraintLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".HomeActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/navigationToolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="56dp"
tools:context=".HomeActivity"> android:background="@color/off_white"
android:elevation="8dp"/>
<fragment <fragment
android:name="androidx.navigation.fragment.NavHostFragment" android:id="@+id/container"
android:layout_width="match_parent" android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_height="match_parent" android:layout_width="match_parent"
app:navGraph="@navigation/nav_graph" android:layout_height="match_parent"
app:defaultNavHost="true" app:defaultNavHost="true"
android:id="@+id/container"/> app:navGraph="@navigation/nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout> </LinearLayout>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<item
android:id="@+id/librarySearch"
android:icon="@drawable/ic_search"
android:iconTint="@color/icons"
android:title="@string/library_search"
app:showAsAction="always"
tools:targetApi="o" />
<item
android:id="@+id/libraryClose"
android:icon="@drawable/ic_close"
android:iconTint="@color/icons"
android:title="@string/mozac_close_button_description"
app:showAsAction="always"
tools:targetApi="o" />
</menu>

View File

@ -21,8 +21,11 @@
android:id="@+id/action_homeFragment_to_browserFragment" android:id="@+id/action_homeFragment_to_browserFragment"
app:destination="@id/browserFragment" /> app:destination="@id/browserFragment" />
<action <action
android:id="@+id/action_homeFragment_to_settingsActivity" android:id="@+id/action_homeFragment_to_libraryFragment"
app:destination="@id/settingsActivity" /> app:destination="@id/libraryFragment" />
<action
android:id="@+id/action_homeFragment_to_settingsFragment"
app:destination="@id/settingsFragment" />
</fragment> </fragment>
<fragment <fragment
@ -36,36 +39,37 @@
app:popUpTo="@id/homeFragment" /> app:popUpTo="@id/homeFragment" />
</fragment> </fragment>
<fragment
android:id="@+id/libraryFragment"
android:name="org.mozilla.fenix.library.LibraryFragment"
android:label="fragment_library"
tools:layout="@layout/fragment_library">
</fragment>
<fragment <fragment
android:id="@+id/browserFragment" android:id="@+id/browserFragment"
android:name="org.mozilla.fenix.browser.BrowserFragment" android:name="org.mozilla.fenix.browser.BrowserFragment"
android:label="fragment_browser" android:label="fragment_browser"
tools:layout="@layout/fragment_browser"> tools:layout="@layout/fragment_browser">
<action <action
android:id="@+id/action_browserFragment_to_homeFragment" android:id="@+id/action_browserFragment_to_homeFragment"
app:destination="@id/homeFragment" app:popUpToInclusive="true" app:popUpTo="@+id/homeFragment"/> app:destination="@id/homeFragment"
app:popUpTo="@+id/homeFragment"
app:popUpToInclusive="true" />
<action <action
android:id="@+id/action_browserFragment_to_searchFragment" android:id="@+id/action_browserFragment_to_searchFragment"
app:destination="@id/searchFragment" /> app:destination="@id/searchFragment" />
<argument
android:name="session_id"
app:argType="string"
app:nullable="true" />
<action
android:id="@+id/action_browserFragment_to_settingsFragment"
app:destination="@id/settingsFragment" />
<action <action
android:id="@+id/action_browserFragment_to_libraryFragment" android:id="@+id/action_browserFragment_to_libraryFragment"
app:destination="@id/libraryFragment" /> app:destination="@id/libraryFragment" />
<action
android:id="@+id/action_browserFragment_to_settingsActivity"
app:destination="@id/settingsActivity" />
<argument android:name="session_id" app:argType="string" app:nullable="true" />
</fragment> </fragment>
<fragment
<activity android:id="@+id/libraryFragment"
android:id="@+id/settingsActivity" android:name="org.mozilla.fenix.library.LibraryFragment"
android:name="org.mozilla.fenix.settings.SettingsActivity" android:label="@string/library_title"
android:label="SettingsActivity" /> tools:layout="@layout/fragment_library" />
<fragment
android:id="@+id/settingsFragment"
android:name="org.mozilla.fenix.settings.SettingsFragment"
android:label="@string/settings_title" />
</navigation> </navigation>

View File

@ -63,20 +63,6 @@
<!-- Button in the search view that lets a user navigate to the site in their clipboard --> <!-- Button in the search view that lets a user navigate to the site in their clipboard -->
<string name="awesomebar_clipboard_title">Fill link from Clipboard</string> <string name="awesomebar_clipboard_title">Fill link from Clipboard</string>
<!-- Library -->
<!-- Option in Library to open Sessions page -->
<string name="library_sessions">Sessions</string>
<!-- Option in Library to open Screenshots page -->
<string name="library_screenshots">Screenshots</string>
<!-- Option in Library to open Downloads page -->
<string name="library_downloads">Downloads</string>
<!-- Option in Library to open Favorites page -->
<string name="library_favorites">Favorites</string>
<!-- Option in Library to open History page -->
<string name="library_history">History</string>
<!-- Option in Library to open Logins page -->
<string name="library_logins">Logins</string>
<!-- Settings Fragment --> <!-- Settings Fragment -->
<!-- Title for the settings page--> <!-- Title for the settings page-->
<string name="settings">Settings</string> <string name="settings">Settings</string>
@ -119,4 +105,24 @@
<string name="preferences_language">Language</string> <string name="preferences_language">Language</string>
<!-- Preference for data choices --> <!-- Preference for data choices -->
<string name="preferences_data_choices">Data choices</string> <string name="preferences_data_choices">Data choices</string>
<!-- Library -->
<!-- Option in Library to open Sessions page -->
<string name="library_sessions">Sessions</string>
<!-- Option in Library to open Screenshots page -->
<string name="library_screenshots">Screenshots</string>
<!-- Option in Library to open Downloads page -->
<string name="library_downloads">Downloads</string>
<!-- Option in Library to open Favorites page -->
<string name="library_favorites">Favorites</string>
<!-- Option in Library to open History page -->
<string name="library_history">History</string>
<!-- Option in Library to open Logins page -->
<string name="library_logins">Logins</string>
<!-- Menu Item Label for Search in Library -->
<string name="library_search">Search</string>
<!-- Library Page Title -->
<string name="library_title">Library</string>
<!-- Settings Page Title -->
<string name="settings_title">Settings</string>
</resources> </resources>

View File

@ -11,12 +11,13 @@ private object Versions {
const val anko = "0.10.8" const val anko = "0.10.8"
const val sentry = "1.7.10" const val sentry = "1.7.10"
const val androidx_appcompat = "1.0.2" const val androidx_appcompat = "1.1.0-alpha02"
const val androidx_constraint_layout = "2.0.0-alpha2" const val androidx_constraint_layout = "2.0.0-alpha2"
const val androidx_preference = "1.1.0-alpha02" const val androidx_preference = "1.1.0-alpha03"
const val androidx_legacy = "1.0.0" const val androidx_legacy = "1.0.0"
const val androidx_annotation = "1.0.1" const val androidx_annotation = "1.0.1"
const val androidx_lifecycle = "2.0.0" const val androidx_lifecycle = "2.0.0"
const val androidx_fragment = "1.1.0-alpha04"
const val mozilla_android_components = "0.42.0-SNAPSHOT" const val mozilla_android_components = "0.42.0-SNAPSHOT"
@ -24,7 +25,7 @@ private object Versions {
const val test_tools = "1.0.2" const val test_tools = "1.0.2"
const val espresso_core = "2.2.2" const val espresso_core = "2.2.2"
const val android_arch_navigation = "1.0.0-alpha11" const val android_arch_navigation = "1.0.0-beta01"
} }
@Suppress("unused") @Suppress("unused")
@ -92,12 +93,14 @@ object Deps {
const val tools_espresso_core = "com.android.support.test.espresso:espresso-core:${Versions.espresso_core}" const val tools_espresso_core = "com.android.support.test.espresso:espresso-core:${Versions.espresso_core}"
const val androidx_annotation = "androidx.annotation:annotation:${Versions.androidx_annotation}" const val androidx_annotation = "androidx.annotation:annotation:${Versions.androidx_annotation}"
const val androidx_fragment = "androidx.fragment:fragment:${Versions.androidx_fragment}"
const val androidx_appcompat = "androidx.appcompat:appcompat:${Versions.androidx_appcompat}" const val androidx_appcompat = "androidx.appcompat:appcompat:${Versions.androidx_appcompat}"
const val androidx_constraintlayout = "androidx.constraintlayout:constraintlayout:${Versions.androidx_constraint_layout}" const val androidx_constraintlayout = "androidx.constraintlayout:constraintlayout:${Versions.androidx_constraint_layout}"
const val androidx_legacy = "androidx.legacy:legacy-support-v4:${Versions.androidx_legacy}" const val androidx_legacy = "androidx.legacy:legacy-support-v4:${Versions.androidx_legacy}"
const val androidx_lifecycle_runtime = "androidx.lifecycle:lifecycle-runtime:${Versions.androidx_lifecycle}" const val androidx_lifecycle_runtime = "androidx.lifecycle:lifecycle-runtime:${Versions.androidx_lifecycle}"
const val androidx_preference = "androidx.preference:preference-ktx:${Versions.androidx_preference}" const val androidx_preference = "androidx.preference:preference-ktx:${Versions.androidx_preference}"
const val android_arch_navigation = "android.arch.navigation:navigation-fragment:${Versions.android_arch_navigation}" const val android_arch_navigation = "android.arch.navigation:navigation-fragment:${Versions.android_arch_navigation}"
const val android_arch_navigation_ui = "android.arch.navigation:navigation-ui:${Versions.android_arch_navigation}"
} }