diff --git a/README.md b/README.md index 87428765..e45aedde 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ Browse, search, download, and share amazing free photos provided by talented pho - [Jetpack Compose](https://developer.android.com/jetpack/compose) - [Android Architecture Components](https://developer.android.com/topic/libraries/architecture) - [Hilt](https://developer.android.com/training/dependency-injection/hilt-android) +- [Navigation Component](https://developer.android.com/guide/navigation) - [Paging 3](https://developer.android.com/topic/libraries/architecture/paging/v3-overview) - [Room](https://developer.android.com/topic/libraries/architecture/room) - [Retrofit](https://square.github.io/retrofit) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 83c48be9..b39c3a71 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -119,6 +119,9 @@ dependencies { implementation(libs.material) implementation(libs.androidx.viewpager2) + implementation(libs.androidx.navigation.ui.ktx) + implementation(libs.androidx.navigation.fragment.ktx) + implementation(libs.hilt.android) kapt(libs.hilt.compiler) diff --git a/app/src/main/java/com/github/sikv/photos/di/RouteModule.kt b/app/src/main/java/com/github/sikv/photos/di/RouteModule.kt index b6588f17..6e769b85 100644 --- a/app/src/main/java/com/github/sikv/photos/di/RouteModule.kt +++ b/app/src/main/java/com/github/sikv/photos/di/RouteModule.kt @@ -2,9 +2,11 @@ package com.github.sikv.photos.di import com.github.sikv.photos.navigation.route.FeedbackRoute import com.github.sikv.photos.navigation.route.PhotoDetailsRoute +import com.github.sikv.photos.navigation.route.SearchRoute import com.github.sikv.photos.navigation.route.SetWallpaperRoute import com.github.sikv.photos.route.impl.FeedbackRouteImpl import com.github.sikv.photos.route.impl.PhotoDetailsRouteImpl +import com.github.sikv.photos.route.impl.SearchRouteImpl import com.github.sikv.photos.route.impl.SetWallpaperRouteImpl import dagger.Binds import dagger.Module @@ -18,6 +20,9 @@ abstract class RouteModule { @Binds abstract fun bindPhotoDetailsRoute(route: PhotoDetailsRouteImpl): PhotoDetailsRoute + @Binds + abstract fun bindSearchRoute(route: SearchRouteImpl): SearchRoute + @Binds abstract fun bindSetWallpaperRoute(route: SetWallpaperRouteImpl): SetWallpaperRoute diff --git a/app/src/main/java/com/github/sikv/photos/route/impl/FeedbackRouteImpl.kt b/app/src/main/java/com/github/sikv/photos/route/impl/FeedbackRouteImpl.kt index 242b7fd1..621b2053 100644 --- a/app/src/main/java/com/github/sikv/photos/route/impl/FeedbackRouteImpl.kt +++ b/app/src/main/java/com/github/sikv/photos/route/impl/FeedbackRouteImpl.kt @@ -1,13 +1,13 @@ package com.github.sikv.photos.route.impl -import com.github.sikv.photos.feedback.FeedbackFragment -import com.github.sikv.photos.navigation.Navigation +import androidx.navigation.NavController +import com.github.sikv.photos.R import com.github.sikv.photos.navigation.route.FeedbackRoute import javax.inject.Inject class FeedbackRouteImpl @Inject constructor() : FeedbackRoute { - override fun present(navigation: Navigation?) { - navigation?.addFragment(FeedbackFragment()) + override fun present(navController: NavController) { + navController.navigate(R.id.navigateToFeedback) } } diff --git a/app/src/main/java/com/github/sikv/photos/route/impl/PhotoDetailsRouteImpl.kt b/app/src/main/java/com/github/sikv/photos/route/impl/PhotoDetailsRouteImpl.kt index 6c1e437a..ac019bc8 100644 --- a/app/src/main/java/com/github/sikv/photos/route/impl/PhotoDetailsRouteImpl.kt +++ b/app/src/main/java/com/github/sikv/photos/route/impl/PhotoDetailsRouteImpl.kt @@ -1,21 +1,15 @@ package com.github.sikv.photos.route.impl -import com.github.sikv.photos.navigation.Navigation -import com.github.sikv.photos.navigation.NavigationAnimation +import androidx.navigation.NavController +import com.github.sikv.photos.R import com.github.sikv.photos.navigation.args.PhotoDetailsFragmentArguments -import com.github.sikv.photos.navigation.args.withArguments +import com.github.sikv.photos.navigation.navigate import com.github.sikv.photos.navigation.route.PhotoDetailsRoute -import com.github.sikv.photos.photo.details.PhotoDetailsFragment import javax.inject.Inject class PhotoDetailsRouteImpl @Inject constructor() : PhotoDetailsRoute { - override fun present(navigation: Navigation?, args: PhotoDetailsFragmentArguments) { - val photoDetailsFragment = PhotoDetailsFragment() - .withArguments(args) - - navigation?.addFragment(photoDetailsFragment, - animation = NavigationAnimation.SLIDE_V - ) + override fun present(navController: NavController, args: PhotoDetailsFragmentArguments) { + navController.navigate(R.id.navigateToPhotoDetails, args) } } diff --git a/app/src/main/java/com/github/sikv/photos/route/impl/SearchRouteImpl.kt b/app/src/main/java/com/github/sikv/photos/route/impl/SearchRouteImpl.kt new file mode 100644 index 00000000..71938675 --- /dev/null +++ b/app/src/main/java/com/github/sikv/photos/route/impl/SearchRouteImpl.kt @@ -0,0 +1,15 @@ +package com.github.sikv.photos.route.impl + +import androidx.navigation.NavController +import com.github.sikv.photos.R +import com.github.sikv.photos.navigation.args.SearchFragmentArguments +import com.github.sikv.photos.navigation.navigate +import com.github.sikv.photos.navigation.route.SearchRoute +import javax.inject.Inject + +class SearchRouteImpl @Inject constructor() : SearchRoute { + + override fun present(navController: NavController, args: SearchFragmentArguments) { + navController.navigate(R.id.navigateToSearch, args) + } +} diff --git a/app/src/main/java/com/github/sikv/photos/ui/MainActivity.kt b/app/src/main/java/com/github/sikv/photos/ui/MainActivity.kt index 7847585d..0e68844c 100644 --- a/app/src/main/java/com/github/sikv/photos/ui/MainActivity.kt +++ b/app/src/main/java/com/github/sikv/photos/ui/MainActivity.kt @@ -1,32 +1,22 @@ package com.github.sikv.photos.ui -import android.content.pm.ShortcutManager -import android.os.Build import android.os.Bundle -import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import androidx.core.view.isVisible -import androidx.fragment.app.Fragment +import androidx.navigation.NavController +import androidx.navigation.NavDestination +import androidx.navigation.fragment.NavHostFragment +import androidx.navigation.ui.NavigationUI +import androidx.navigation.ui.setupWithNavController import com.github.sikv.photos.FeatureFlagFetcher import com.github.sikv.photos.R -import com.github.sikv.photos.common.ui.BaseFragment import com.github.sikv.photos.databinding.ActivityMainBinding -import com.github.sikv.photos.navigation.OnDestinationChangedListener import com.github.sikv.photos.navigation.args.SearchFragmentArguments -import com.github.sikv.photos.navigation.args.withArguments -import com.github.sikv.photos.photo.details.PhotoDetailsFragment -import com.github.sikv.photos.search.SearchFragment -import com.github.sikv.photos.ui.fragment.root.FavoritesRootFragment -import com.github.sikv.photos.ui.fragment.root.HomeRootFragment -import com.github.sikv.photos.ui.fragment.root.MoreRootFragment -import com.github.sikv.photos.ui.fragment.root.RootFragment -import com.github.sikv.photos.ui.fragment.root.SearchRootFragment -import com.github.sikv.photos.util.changeFragment -import com.github.sikv.photos.util.getActiveRootFragment +import com.github.sikv.photos.navigation.route.SearchRoute +import com.github.sikv.photos.util.reportShortcutUsed import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject -import kotlin.reflect.KClass @AndroidEntryPoint class MainActivity : AppCompatActivity() { @@ -34,22 +24,13 @@ class MainActivity : AppCompatActivity() { @Inject lateinit var featureFlagFetcher: FeatureFlagFetcher - private val fragmentsTag = mapOf( - R.id.home to HomeRootFragment::class.customTag(), - R.id.search to SearchRootFragment::class.customTag(), - R.id.favorites to FavoritesRootFragment::class.customTag(), - R.id.more to MoreRootFragment::class.customTag() - ) - - private var initialFragmentId = R.id.home - private var initialDelayedFragment: Fragment? = null + @Inject + lateinit var searchRoute: SearchRoute private lateinit var binding: ActivityMainBinding - private val destinationChangedListener = object : OnDestinationChangedListener { - override fun onDestinationChanged(fragment: Fragment?) { - handleBottomNavigationVisibility(fragment) - } + private val destinationChangedListener = NavController.OnDestinationChangedListener { _, destination, _ -> + handleBottomNavigationVisibility(destination) } override fun onCreate(savedInstanceState: Bundle?) { @@ -60,141 +41,48 @@ class MainActivity : AppCompatActivity() { binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - handleBackPress() - } - }) - featureFlagFetcher.fetch(this) { - when (intent.action) { - getString(R.string._shortcut_action_search) -> { - getString(R.string._shortcut_search).reportShortcutUsed() - - initialFragmentId = R.id.search - initialDelayedFragment = SearchFragment().withArguments(SearchFragmentArguments()) - } - } - - if (savedInstanceState == null) { - setupNavigation() + findNavController().addOnDestinationChangedListener(destinationChangedListener) + binding.bottomNavigationView.setupWithNavController(findNavController()) + + // This solves the follow issue: + // https://stackoverflow.com/questions/71089052/android-navigation-component-bottomnavigationviews-selected-tab-icon-is-not-u + // Always show selected Bottom Navigation item as selected (return true). + binding.bottomNavigationView.setOnItemSelectedListener { item -> + // In order to get the expected behavior, you have to call default Navigation method manually. + NavigationUI.onNavDestinationSelected(item, findNavController()) + return@setOnItemSelectedListener true } - setNavigationListener() - setOnDestinationChangedListener(destinationChangedListener) - - handleBottomNavigationVisibility() - } - } - - // FYI: Marked as public because of Lint 'Synthetic Accessor' error. - fun handleBackPress() { - if ((supportFragmentManager.getActiveRootFragment() as? RootFragment)?.provideNavigation() - ?.backPressed() == false - ) { - if (isInitialFragmentSelected()) { - selectInitialFragment() - } else { - finish() - } + handleShortcuts() } } override fun onDestroy() { - setOnDestinationChangedListener(null) + findNavController().removeOnDestinationChangedListener(destinationChangedListener) super.onDestroy() } - // TODO Hide [Search] tab if ConfigProvider.getSearchSources() returns 0. - private fun setupNavigation() { - binding.bottomNavigationView.selectedItemId = initialFragmentId - - listOf( - HomeRootFragment(), - SearchRootFragment(), - FavoritesRootFragment(), - MoreRootFragment() - ).forEach { fragment -> - val tag = fragment.customTag() - - val transaction = supportFragmentManager - .beginTransaction() - .add(R.id.navigationContainer, fragment, tag) - - if (tag != fragmentsTag[initialFragmentId]) { - transaction.hide(fragment) - } - - transaction.commitNow() - } - - val delayedFragment = initialDelayedFragment - - if (delayedFragment != null) { - val tag = fragmentsTag[initialFragmentId] - val fragment = supportFragmentManager.findFragmentByTag(tag) as? RootFragment - - fragment?.addDelayedFragment(delayedFragment) - } - } - - fun handleBottomNavigationVisibility(fragment: Fragment?) { - // Hide bottom navigation if [Photo Details] is opened. - val bottomNavigationVisible = fragment !is PhotoDetailsFragment - binding.bottomNavigationView.isVisible = bottomNavigationVisible - } - - private fun handleBottomNavigationVisibility() { - supportFragmentManager.fragments.iterator().forEach { rootFragment -> - if (!rootFragment.isHidden) { - // Check the current fragment. - handleBottomNavigationVisibility(rootFragment.childFragmentManager.fragments.lastOrNull()) - } - } - } - - private fun setNavigationListener() { - binding.bottomNavigationView.setOnItemSelectedListener { menuItem -> - supportFragmentManager.changeFragment( - hideFragmentTag = supportFragmentManager.getActiveRootFragment()?.customTag(), - showFragmentTag = fragmentsTag[menuItem.itemId] - ) - true - } + private fun handleShortcuts() { + when (intent.action) { + getString(R.string._shortcut_action_search) -> { + val searchDashboardItem = binding.bottomNavigationView.menu.findItem(R.id.searchDashboard) + NavigationUI.onNavDestinationSelected(searchDashboardItem, findNavController()) - binding.bottomNavigationView.setOnItemReselectedListener { menuItem -> - val tag = fragmentsTag[menuItem.itemId] - val fragment = supportFragmentManager.findFragmentByTag(tag) as? RootFragment + searchRoute.present(findNavController(), SearchFragmentArguments()) - if (fragment?.isAdded == true) { - (fragment.provideNavigation().backToRoot() as? BaseFragment)?.onScrollToTop() + getString(R.string._shortcut_search).reportShortcutUsed(this) } } } - private fun setOnDestinationChangedListener(destinationChangedListener: OnDestinationChangedListener?) { - supportFragmentManager.fragments.iterator().forEach { fragment -> - val navigation = (fragment as? RootFragment)?.provideNavigation() - navigation?.setOnDestinationChangedListener(destinationChangedListener) - } - } - - private fun isInitialFragmentSelected(): Boolean { - return binding.bottomNavigationView.selectedItemId != initialFragmentId + private fun findNavController(): NavController { + val navHostFragment = supportFragmentManager.findFragmentById(R.id.navHost) as NavHostFragment + return navHostFragment.navController } - private fun selectInitialFragment() { - binding.bottomNavigationView.selectedItemId = initialFragmentId - } - - private fun KClass.customTag(): String = java.simpleName - - private fun Fragment.customTag(): String = this::class.customTag() - - private fun String.reportShortcutUsed() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { - val shortcutManager = getSystemService(ShortcutManager::class.java) as ShortcutManager - shortcutManager.reportShortcutUsed(this) - } + private fun handleBottomNavigationVisibility(destination: NavDestination) { + // Hide bottom navigation if Photo Details is opened. + binding.bottomNavigationView.isVisible = destination.id != R.id.photoDetails } } diff --git a/app/src/main/java/com/github/sikv/photos/ui/fragment/SearchDashboardFragment.kt b/app/src/main/java/com/github/sikv/photos/ui/fragment/SearchDashboardFragment.kt index 9b0e64c8..93d2a688 100644 --- a/app/src/main/java/com/github/sikv/photos/ui/fragment/SearchDashboardFragment.kt +++ b/app/src/main/java/com/github/sikv/photos/ui/fragment/SearchDashboardFragment.kt @@ -5,27 +5,31 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController import com.github.sikv.photos.R import com.github.sikv.photos.common.VoiceInputManager -import com.github.sikv.photos.common.ui.BaseFragment import com.github.sikv.photos.common.ui.applyStatusBarsInsets import com.github.sikv.photos.config.FeatureFlag import com.github.sikv.photos.config.FeatureFlagProvider import com.github.sikv.photos.databinding.FragmentSearchDashboardBinding import com.github.sikv.photos.navigation.args.SearchFragmentArguments -import com.github.sikv.photos.navigation.args.withArguments +import com.github.sikv.photos.navigation.route.SearchRoute import com.github.sikv.photos.recommendations.RecommendationsFragment -import com.github.sikv.photos.search.SearchFragment import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject // TODO: Move to a separate module. + @AndroidEntryPoint -class SearchDashboardFragment : BaseFragment() { +class SearchDashboardFragment : Fragment() { @Inject lateinit var featureFlagProvider: FeatureFlagProvider + @Inject + lateinit var searchRoute: SearchRoute + private lateinit var voiceInputManager: VoiceInputManager private var _binding: FragmentSearchDashboardBinding? = null @@ -69,17 +73,11 @@ class SearchDashboardFragment : BaseFragment() { override fun onDestroyView() { super.onDestroyView() - _binding = null } - override fun onScrollToTop() {} - private fun showSearchFragment(searchText: String? = null) { - val fragment = SearchFragment().withArguments( - SearchFragmentArguments(searchText) - ) - navigation?.addFragment(fragment) + searchRoute.present(findNavController(), SearchFragmentArguments(searchText)) } private fun setListeners() { diff --git a/app/src/main/java/com/github/sikv/photos/ui/fragment/root/FavoritesRootFragment.kt b/app/src/main/java/com/github/sikv/photos/ui/fragment/root/FavoritesRootFragment.kt deleted file mode 100644 index 2e0ef960..00000000 --- a/app/src/main/java/com/github/sikv/photos/ui/fragment/root/FavoritesRootFragment.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.github.sikv.photos.ui.fragment.root - -import androidx.fragment.app.Fragment -import com.github.sikv.photos.favorites.FavoritesFragment - -class FavoritesRootFragment : RootFragment() { - - override fun provideRootFragment(): Fragment { - return FavoritesFragment() - } -} diff --git a/app/src/main/java/com/github/sikv/photos/ui/fragment/root/HomeRootFragment.kt b/app/src/main/java/com/github/sikv/photos/ui/fragment/root/HomeRootFragment.kt deleted file mode 100644 index fbdca99f..00000000 --- a/app/src/main/java/com/github/sikv/photos/ui/fragment/root/HomeRootFragment.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.github.sikv.photos.ui.fragment.root - -import androidx.fragment.app.Fragment -import com.github.sikv.photos.curated.CuratedPhotosFragment - -class HomeRootFragment : RootFragment() { - - override fun provideRootFragment(): Fragment { - return CuratedPhotosFragment() - } -} diff --git a/app/src/main/java/com/github/sikv/photos/ui/fragment/root/MoreRootFragment.kt b/app/src/main/java/com/github/sikv/photos/ui/fragment/root/MoreRootFragment.kt deleted file mode 100644 index c5cf0a4c..00000000 --- a/app/src/main/java/com/github/sikv/photos/ui/fragment/root/MoreRootFragment.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.github.sikv.photos.ui.fragment.root - -import androidx.fragment.app.Fragment -import com.github.sikv.photos.ui.fragment.MoreFragment - -class MoreRootFragment : RootFragment() { - - override fun provideRootFragment(): Fragment { - return MoreFragment() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/github/sikv/photos/ui/fragment/root/RootFragment.kt b/app/src/main/java/com/github/sikv/photos/ui/fragment/root/RootFragment.kt deleted file mode 100644 index 82154f2b..00000000 --- a/app/src/main/java/com/github/sikv/photos/ui/fragment/root/RootFragment.kt +++ /dev/null @@ -1,47 +0,0 @@ -package com.github.sikv.photos.ui.fragment.root - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import com.github.sikv.photos.R -import com.github.sikv.photos.navigation.Navigation -import com.github.sikv.photos.navigation.NavigationAnimation -import com.github.sikv.photos.navigation.NavigationDispatcher -import com.github.sikv.photos.navigation.NavigationProvider - -abstract class RootFragment : Fragment(), NavigationProvider { - - private val navigation: Navigation by lazy { - NavigationDispatcher(this, R.id.fragmentContainer) - } - - private var delayedFragment: Fragment? = null - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_root, container, false) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - if (savedInstanceState == null) { - provideNavigation().addFragment(provideRootFragment(), animation = NavigationAnimation.NONE) - - delayedFragment?.let { - provideNavigation().addFragment(it, animation = NavigationAnimation.NONE) - } - } - } - - fun addDelayedFragment(fragment: Fragment) { - delayedFragment = fragment - } - - override fun provideNavigation(): Navigation { - return navigation - } - - abstract fun provideRootFragment(): Fragment -} diff --git a/app/src/main/java/com/github/sikv/photos/ui/fragment/root/SearchRootFragment.kt b/app/src/main/java/com/github/sikv/photos/ui/fragment/root/SearchRootFragment.kt deleted file mode 100644 index 6ff83d46..00000000 --- a/app/src/main/java/com/github/sikv/photos/ui/fragment/root/SearchRootFragment.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.github.sikv.photos.ui.fragment.root - -import androidx.fragment.app.Fragment -import com.github.sikv.photos.ui.fragment.SearchDashboardFragment - -class SearchRootFragment : RootFragment() { - - override fun provideRootFragment(): Fragment { - return SearchDashboardFragment() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/github/sikv/photos/util/Extensions.kt b/app/src/main/java/com/github/sikv/photos/util/Extensions.kt new file mode 100644 index 00000000..d3394656 --- /dev/null +++ b/app/src/main/java/com/github/sikv/photos/util/Extensions.kt @@ -0,0 +1,12 @@ +package com.github.sikv.photos.util + +import android.app.Activity +import android.content.pm.ShortcutManager +import android.os.Build + +fun String.reportShortcutUsed(activity: Activity) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + val shortcutManager = activity.getSystemService(ShortcutManager::class.java) as ShortcutManager + shortcutManager.reportShortcutUsed(this) + } +} diff --git a/app/src/main/java/com/github/sikv/photos/util/FragmentManagerExtensions.kt b/app/src/main/java/com/github/sikv/photos/util/FragmentManagerExtensions.kt deleted file mode 100644 index ad283679..00000000 --- a/app/src/main/java/com/github/sikv/photos/util/FragmentManagerExtensions.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.github.sikv.photos.util - -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager - -fun FragmentManager.getActiveRootFragment(): Fragment? { - fragments.iterator().forEach { fragment -> - if (fragment.isVisible) { - return fragment - } - } - return null -} - -fun FragmentManager.changeFragment(hideFragmentTag: String?, showFragmentTag: String?) { - val hideFragment = findFragmentByTag(hideFragmentTag) - val showFragment = findFragmentByTag(showFragmentTag) - - val tr = beginTransaction() - - if (hideFragment != null) { - tr.hide(hideFragment) - } - if (showFragment != null) { - tr.show(showFragment) - } - - tr.commit() -} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 81518de3..9d7cb1bd 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,12 +4,15 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + app:layout_constraintTop_toTopOf="parent" + app:navGraph="@navigation/navigation" + app:defaultNavHost="true" /> diff --git a/app/src/main/res/navigation/navigation.xml b/app/src/main/res/navigation/navigation.xml new file mode 100644 index 00000000..423dce78 --- /dev/null +++ b/app/src/main/res/navigation/navigation.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 78090e50..d92d1daf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -16,4 +16,9 @@ Photos Search + + Curated photos + Search dashboard + Photo details + Feedback diff --git a/common-ui/src/main/java/com/github/sikv/photos/common/ui/BaseFragment.kt b/common-ui/src/main/java/com/github/sikv/photos/common/ui/BaseFragment.kt index bf04f7bc..289c5416 100644 --- a/common-ui/src/main/java/com/github/sikv/photos/common/ui/BaseFragment.kt +++ b/common-ui/src/main/java/com/github/sikv/photos/common/ui/BaseFragment.kt @@ -7,8 +7,6 @@ import android.widget.Toast import androidx.fragment.app.Fragment import com.github.sikv.photos.common.ui.toolbar.FragmentToolbar import com.github.sikv.photos.common.ui.toolbar.FragmentToolbarManager -import com.github.sikv.photos.navigation.Navigation -import com.github.sikv.photos.navigation.NavigationProvider import com.google.android.material.color.MaterialColors @Deprecated("Use Jetpack Compose") @@ -19,20 +17,6 @@ abstract class BaseFragment : Fragment() { protected open val overrideBackground = false - val navigation: Navigation? - get() { - var parent = parentFragment - - while (parent != null) { - if (parent is NavigationProvider) { - return (parent as NavigationProvider).provideNavigation() - } else { - parent = parent.parentFragment - } - } - return null - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/feature/curated-photos/src/main/java/com/github/sikv/photos/curated/CuratedPhotosFragment.kt b/feature/curated-photos/src/main/java/com/github/sikv/photos/curated/CuratedPhotosFragment.kt index 9e211abc..21ed4212 100644 --- a/feature/curated-photos/src/main/java/com/github/sikv/photos/curated/CuratedPhotosFragment.kt +++ b/feature/curated-photos/src/main/java/com/github/sikv/photos/curated/CuratedPhotosFragment.kt @@ -5,8 +5,9 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.compose.ui.platform.ComposeView +import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels -import com.github.sikv.photos.common.ui.BaseFragment +import androidx.navigation.fragment.findNavController import com.github.sikv.photos.navigation.args.PhotoDetailsFragmentArguments import com.github.sikv.photos.navigation.route.PhotoDetailsRoute import com.google.accompanist.themeadapter.material3.Mdc3Theme @@ -14,7 +15,7 @@ import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @AndroidEntryPoint -class CuratedPhotosFragment : BaseFragment() { +class CuratedPhotosFragment : Fragment() { @Inject lateinit var photoDetailsRoute: PhotoDetailsRoute @@ -30,10 +31,11 @@ class CuratedPhotosFragment : BaseFragment() { setContent { Mdc3Theme { CuratedPhotosScreen( - viewModel = viewModel, - onOpenPhotoDetails = { photo -> - photoDetailsRoute.present(navigation, PhotoDetailsFragmentArguments(photo)) - }) + onGoToPhotoDetails = { photo -> + photoDetailsRoute.present(findNavController(), PhotoDetailsFragmentArguments(photo)) + }, + viewModel = viewModel + ) } } } diff --git a/feature/curated-photos/src/main/java/com/github/sikv/photos/curated/CuratedPhotosScreen.kt b/feature/curated-photos/src/main/java/com/github/sikv/photos/curated/CuratedPhotosScreen.kt index 0c5bed51..9ccc9318 100644 --- a/feature/curated-photos/src/main/java/com/github/sikv/photos/curated/CuratedPhotosScreen.kt +++ b/feature/curated-photos/src/main/java/com/github/sikv/photos/curated/CuratedPhotosScreen.kt @@ -23,8 +23,8 @@ import com.github.sikv.photos.domain.Photo @Composable internal fun CuratedPhotosScreen( + onGoToPhotoDetails: (Photo) -> Unit, viewModel: CuratedPhotosViewModel, - onOpenPhotoDetails: (Photo) -> Unit, ) { val photos = viewModel.getCuratedPhotos().collectAsLazyPagingItems() val listLayout by viewModel.listLayoutState.collectAsStateWithLifecycle() @@ -44,7 +44,7 @@ internal fun CuratedPhotosScreen( photo = photo, listLayout = listLayout, viewModel = viewModel, - onOpenPhotoDetails = onOpenPhotoDetails + onGoToPhotoDetails = onGoToPhotoDetails ) } } @@ -57,7 +57,7 @@ private fun Photo( photo: Photo, listLayout: ListLayout, viewModel: CuratedPhotosViewModel, - onOpenPhotoDetails: (Photo) -> Unit + onGoToPhotoDetails: (Photo) -> Unit ) { val context = LocalContext.current val isFavorite by viewModel.isFavorite(photo).collectAsStateWithLifecycle(initialValue = false) @@ -68,7 +68,7 @@ private fun Photo( photo = photo, isFavorite = isFavorite, onClick = { - onOpenPhotoDetails(photo) + onGoToPhotoDetails(photo) }, onAttributionClick = { viewModel.onPhotoAttributionClick(context.findActivity(), photo) @@ -91,7 +91,7 @@ private fun Photo( PhotoItemCompact( photo = photo, onClick = { - onOpenPhotoDetails(photo) + onGoToPhotoDetails(photo) } ) } diff --git a/feature/feedback/src/main/java/com/github/sikv/photos/feedback/FeedbackFragment.kt b/feature/feedback/src/main/java/com/github/sikv/photos/feedback/FeedbackFragment.kt index 869ab670..6f3bb048 100644 --- a/feature/feedback/src/main/java/com/github/sikv/photos/feedback/FeedbackFragment.kt +++ b/feature/feedback/src/main/java/com/github/sikv/photos/feedback/FeedbackFragment.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import androidx.compose.runtime.collectAsState import androidx.compose.ui.platform.ComposeView import androidx.fragment.app.viewModels +import androidx.navigation.findNavController import com.github.sikv.photos.common.ui.BaseFragment import com.google.accompanist.themeadapter.material3.Mdc3Theme import dagger.hilt.android.AndroidEntryPoint @@ -39,7 +40,7 @@ class FeedbackFragment : BaseFragment() { onEmailChanged = viewModel::emailChanged, onDescriptionChanged = viewModel::descriptionChanged, onSubmitPressed = viewModel::submit, - onBackPressed = { navigation?.backPressed() } + onBackPressed = { findNavController().popBackStack() } ) } } diff --git a/feature/photo-details/src/main/java/com/github/sikv/photos/photo/details/PhotoDetailsFragment.kt b/feature/photo-details/src/main/java/com/github/sikv/photos/photo/details/PhotoDetailsFragment.kt index 6317ed01..70e5ff0e 100644 --- a/feature/photo-details/src/main/java/com/github/sikv/photos/photo/details/PhotoDetailsFragment.kt +++ b/feature/photo-details/src/main/java/com/github/sikv/photos/photo/details/PhotoDetailsFragment.kt @@ -4,12 +4,12 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Surface import androidx.compose.runtime.collectAsState import androidx.compose.ui.platform.ComposeView +import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels -import com.github.sikv.photos.common.ui.BaseFragment +import androidx.navigation.fragment.findNavController import com.github.sikv.photos.common.ui.openUrl import com.github.sikv.photos.data.createShareIntent import com.github.sikv.photos.domain.Photo @@ -20,7 +20,7 @@ import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @AndroidEntryPoint -class PhotoDetailsFragment : BaseFragment() { +class PhotoDetailsFragment : Fragment() { @Inject lateinit var setWallpaperRoute: SetWallpaperRoute @@ -36,6 +36,7 @@ class PhotoDetailsFragment : BaseFragment() { ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) + setContent { Mdc3Theme { Surface { @@ -48,7 +49,7 @@ class PhotoDetailsFragment : BaseFragment() { is PhotoUiState.Ready -> { PhotoDetailsScreen( photo = state.photo, - onBackPressed = { navigation?.backPressed() }, + onBackPressed = { findNavController().popBackStack() }, isFavorite = state.isFavorite, onToggleFavorite = { viewModel.toggleFavorite() }, onSharePressed = { sharePhoto(state.photo) }, diff --git a/feature/preferences/src/main/java/com/github/sikv/photos/preferences/PreferenceFragment.kt b/feature/preferences/src/main/java/com/github/sikv/photos/preferences/PreferenceFragment.kt index 15ac32a7..d05f2bd8 100644 --- a/feature/preferences/src/main/java/com/github/sikv/photos/preferences/PreferenceFragment.kt +++ b/feature/preferences/src/main/java/com/github/sikv/photos/preferences/PreferenceFragment.kt @@ -8,6 +8,7 @@ import android.view.ViewGroup import androidx.compose.runtime.collectAsState import androidx.compose.ui.platform.ComposeView import androidx.fragment.app.viewModels +import androidx.navigation.fragment.findNavController import com.github.sikv.photos.common.ui.BaseFragment import com.github.sikv.photos.navigation.route.FeedbackRoute import com.google.accompanist.themeadapter.material3.Mdc3Theme @@ -52,7 +53,7 @@ class PreferenceFragment : BaseFragment() { viewModel.createChangeThemeDialog().show(childFragmentManager) } PreferenceAction.SendFeedback -> { - feedbackRoute.present((parentFragment as? BaseFragment)?.navigation) + feedbackRoute.present(findNavController()) } PreferenceAction.OpenSourceLicenses -> { startActivity(Intent(context, OssLicensesMenuActivity::class.java)) diff --git a/feature/recommendations/src/main/java/com/github/sikv/photos/recommendations/RecommendationsFragment.kt b/feature/recommendations/src/main/java/com/github/sikv/photos/recommendations/RecommendationsFragment.kt index 8ca70c74..b05cf643 100644 --- a/feature/recommendations/src/main/java/com/github/sikv/photos/recommendations/RecommendationsFragment.kt +++ b/feature/recommendations/src/main/java/com/github/sikv/photos/recommendations/RecommendationsFragment.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import androidx.compose.runtime.collectAsState import androidx.compose.ui.platform.ComposeView import androidx.fragment.app.viewModels +import androidx.navigation.fragment.findNavController import com.github.sikv.photos.common.ui.BaseFragment import com.github.sikv.photos.domain.Photo import com.github.sikv.photos.navigation.args.PhotoDetailsFragmentArguments @@ -55,6 +56,6 @@ class RecommendationsFragment : BaseFragment() { } private fun openPhotoDetails(photo: Photo) { - photoDetailsRoute.present(navigation, PhotoDetailsFragmentArguments(photo)) + photoDetailsRoute.present(this.findNavController(), PhotoDetailsFragmentArguments(photo)) } } diff --git a/feature/search/src/main/java/com/github/sikv/photos/search/SearchFragment.kt b/feature/search/src/main/java/com/github/sikv/photos/search/SearchFragment.kt index 82a21fcf..cfdf5178 100644 --- a/feature/search/src/main/java/com/github/sikv/photos/search/SearchFragment.kt +++ b/feature/search/src/main/java/com/github/sikv/photos/search/SearchFragment.kt @@ -8,6 +8,7 @@ import android.view.View import android.view.ViewGroup import android.view.inputmethod.EditorInfo import androidx.fragment.app.activityViewModels +import androidx.navigation.fragment.findNavController import com.github.sikv.photos.common.ui.* import com.github.sikv.photos.config.ConfigProvider import com.github.sikv.photos.navigation.args.SearchFragmentArguments @@ -46,7 +47,7 @@ class SearchFragment : BaseFragment() { setupToolbarWithBackButton( title = null, navigationOnClickListener = { - navigation?.backPressed() + findNavController().popBackStack() } ) @@ -64,12 +65,13 @@ class SearchFragment : BaseFragment() { setListeners() changeClearButtonVisibility(false, withAnimation = false) - navigation?.setOnBackPressedListener(object : - com.github.sikv.photos.navigation.OnBackPressedListener { - override fun onBackPressed() { - viewModel.clearSearch() - } - }) + // TODO: Fix this. +// navigation?.setOnBackPressedListener(object : +// com.github.sikv.photos.navigation.OnBackPressedListener { +// override fun onBackPressed() { +// viewModel.clearSearch() +// } +// }) } override fun onDestroyView() { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ad90a41f..49983e92 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,19 +1,17 @@ [versions] gradle = "8.4.0" -kotlin = "1.8.0" -composeCompiler = "1.4.1" -hilt = "2.44" +kotlin = "1.9.0" +composeCompiler = "1.5.2" +hilt = "2.50" appcompat = "1.6.1" material = "1.10.0-alpha04" lifecycle = "2.6.1" +navigation = "2.7.7" retrofit2 = "2.9.0" room = "2.5.2" gms = "4.3.15" ossLicensesPlugin = "0.10.6" landscapist = "2.1.9" # Do not update until "Sealed classes are not supported as program classes" error fixed. -junit = "4.13.2" -junitVersion = "1.1.5" -espressoCore = "3.5.1" [plugins] android-application = { id = "com.android.application", version.ref = "gradle" } @@ -35,6 +33,9 @@ androidx-recyclerview = { group = "androidx.recyclerview", name = "recyclerview" androidx-viewpager2 = { group = "androidx.viewpager2", name = "viewpager2", version = "1.0.0" } androidx-browser = { group = "androidx.browser", name = "browser", version = "1.5.0" } +androidx-navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "navigation" } +androidx-navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigation" } + androidx-paging-runtime = { group = "androidx.paging", name = "paging-runtime-ktx", version = "3.3.0" } androidx-paging-compose = { group = "androidx.paging", name = "paging-compose", version = "3.3.0" } @@ -76,9 +77,6 @@ mlkit-imageLabeling = { group = "com.google.mlkit", name = "image-labeling", ver playServices-auth = { group = "com.google.android.gms", name = "play-services-auth", version = "20.5.0" } playServices-ossLicenses = { group = "com.google.android.gms", name = "play-services-oss-licenses", version = "17.0.1" } gms-oss-licenses-plugin = { module = "com.google.android.gms:oss-licenses-plugin", version.ref = "ossLicensesPlugin" } -junit = { group = "junit", name = "junit", version.ref = "junit" } -androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } -androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } [bundles] retrofit2 = ["retrofit2", "retrofit2-converter-gson", "okhttp3-logging"] diff --git a/navigation/build.gradle b/navigation/build.gradle index a2503d41..708d58e1 100644 --- a/navigation/build.gradle +++ b/navigation/build.gradle @@ -13,4 +13,7 @@ dependencies { implementation libs.androidx.appcompat implementation libs.androidx.core + + api libs.androidx.navigation.ui.ktx + api libs.androidx.navigation.fragment.ktx } diff --git a/navigation/src/main/java/com/github/sikv/photos/navigation/Extensions.kt b/navigation/src/main/java/com/github/sikv/photos/navigation/Extensions.kt new file mode 100644 index 00000000..59b88006 --- /dev/null +++ b/navigation/src/main/java/com/github/sikv/photos/navigation/Extensions.kt @@ -0,0 +1,10 @@ +package com.github.sikv.photos.navigation + +import androidx.annotation.IdRes +import androidx.core.os.bundleOf +import androidx.navigation.NavController +import com.github.sikv.photos.navigation.args.FragmentArguments + +fun NavController.navigate(@IdRes resId: Int, args: FragmentArguments) { + navigate(resId, args = bundleOf(FragmentArguments.KEY to args)) +} diff --git a/navigation/src/main/java/com/github/sikv/photos/navigation/Navigation.kt b/navigation/src/main/java/com/github/sikv/photos/navigation/Navigation.kt deleted file mode 100644 index 4792c620..00000000 --- a/navigation/src/main/java/com/github/sikv/photos/navigation/Navigation.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.github.sikv.photos.navigation - -import androidx.fragment.app.Fragment - -interface Navigation { - fun addFragment(fragment: Fragment, animation: NavigationAnimation = NavigationAnimation.NONE) - fun backPressed(): Boolean - fun backToRoot(): Fragment? - fun setOnDestinationChangedListener(destinationChangedListener: OnDestinationChangedListener?) - fun setOnBackPressedListener(backPressedListener: OnBackPressedListener?) -} diff --git a/navigation/src/main/java/com/github/sikv/photos/navigation/NavigationAnimation.kt b/navigation/src/main/java/com/github/sikv/photos/navigation/NavigationAnimation.kt deleted file mode 100644 index 424e0dcf..00000000 --- a/navigation/src/main/java/com/github/sikv/photos/navigation/NavigationAnimation.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.github.sikv.photos.navigation - -enum class NavigationAnimation { - NONE, - SLIDE_H, - SLIDE_V -} diff --git a/navigation/src/main/java/com/github/sikv/photos/navigation/NavigationDispatcher.kt b/navigation/src/main/java/com/github/sikv/photos/navigation/NavigationDispatcher.kt deleted file mode 100644 index 8902a39d..00000000 --- a/navigation/src/main/java/com/github/sikv/photos/navigation/NavigationDispatcher.kt +++ /dev/null @@ -1,102 +0,0 @@ -package com.github.sikv.photos.navigation - -import android.app.Activity -import android.content.Context -import android.view.inputmethod.InputMethodManager -import androidx.annotation.IdRes -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager - -private fun Activity.hideSoftInput() { - val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - inputMethodManager.hideSoftInputFromWindow(currentFocus?.windowToken, 0) -} - -private fun FragmentManager.getActiveFragment(): Fragment? { - fragments.iterator().forEach { fragment -> - if (fragment.isVisible) { - return fragment - } - } - return null -} - -class NavigationDispatcher( - private val fragment: Fragment, - @IdRes private val containerId: Int -) : Navigation { - - private var destinationChangedListener: OnDestinationChangedListener? = null - private var backPressedListener: OnBackPressedListener? = null - - override fun addFragment(fragment: Fragment, animation: NavigationAnimation) { - val fm = this.fragment.childFragmentManager - val transaction = fm.beginTransaction() - - when (animation) { - NavigationAnimation.SLIDE_H -> { - transaction.setCustomAnimations( - R.anim.slide_in_right, - R.anim.slide_out_left, - R.anim.slide_in_right, - R.anim.slide_out_left - ) - } - NavigationAnimation.SLIDE_V -> { - transaction.setCustomAnimations( - R.anim.slide_in_bottom, - R.anim.slide_out_top, - R.anim.slide_in_bottom, - R.anim.slide_out_top - ) - } - else -> { } - } - - transaction - .add(containerId, fragment) - .addToBackStack(null) - .commit() - - destinationChangedListener?.onDestinationChanged(fragment) - } - - override fun backPressed(): Boolean { - fragment.activity?.hideSoftInput() - - val fm = fragment.childFragmentManager - - return if (fm.backStackEntryCount > 1) { - fm.popBackStack() - - destinationChangedListener?.onDestinationChanged(fm.getActiveFragment()) - backPressedListener?.onBackPressed() - true - } else { - false - } - } - - override fun backToRoot(): Fragment? { - val fm = fragment.childFragmentManager - - for (i in 1 until fm.backStackEntryCount) { - fm.popBackStack() - } - - val rootFragment = fm.fragments.firstOrNull() - - destinationChangedListener?.onDestinationChanged(rootFragment) - backPressedListener?.onBackPressed() - - return rootFragment - } - - override fun setOnDestinationChangedListener(destinationChangedListener: OnDestinationChangedListener?) { - this.destinationChangedListener = destinationChangedListener - } - - override fun setOnBackPressedListener(backPressedListener: OnBackPressedListener?) { - this.backPressedListener = backPressedListener - } -} diff --git a/navigation/src/main/java/com/github/sikv/photos/navigation/NavigationProvider.kt b/navigation/src/main/java/com/github/sikv/photos/navigation/NavigationProvider.kt deleted file mode 100644 index 74913d56..00000000 --- a/navigation/src/main/java/com/github/sikv/photos/navigation/NavigationProvider.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.github.sikv.photos.navigation - -interface NavigationProvider { - fun provideNavigation(): Navigation -} diff --git a/navigation/src/main/java/com/github/sikv/photos/navigation/OnBackPressedListener.kt b/navigation/src/main/java/com/github/sikv/photos/navigation/OnBackPressedListener.kt deleted file mode 100644 index 0ae9e4cb..00000000 --- a/navigation/src/main/java/com/github/sikv/photos/navigation/OnBackPressedListener.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.github.sikv.photos.navigation - -interface OnBackPressedListener { - fun onBackPressed() -} diff --git a/navigation/src/main/java/com/github/sikv/photos/navigation/OnDestinationChangedListener.kt b/navigation/src/main/java/com/github/sikv/photos/navigation/OnDestinationChangedListener.kt deleted file mode 100644 index 72e5c306..00000000 --- a/navigation/src/main/java/com/github/sikv/photos/navigation/OnDestinationChangedListener.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.github.sikv.photos.navigation - -import androidx.fragment.app.Fragment - -interface OnDestinationChangedListener { - fun onDestinationChanged(fragment: Fragment?) -} diff --git a/navigation/src/main/java/com/github/sikv/photos/navigation/args/FragmentArguments.kt b/navigation/src/main/java/com/github/sikv/photos/navigation/args/FragmentArguments.kt index a1267ac7..8f45e237 100644 --- a/navigation/src/main/java/com/github/sikv/photos/navigation/args/FragmentArguments.kt +++ b/navigation/src/main/java/com/github/sikv/photos/navigation/args/FragmentArguments.kt @@ -7,7 +7,7 @@ import androidx.lifecycle.SavedStateHandle interface FragmentArguments : Parcelable { companion object { - const val KEY = "FragmentArguments" + const val KEY = "args" } } diff --git a/navigation/src/main/java/com/github/sikv/photos/navigation/args/SearchFragmentArguments.kt b/navigation/src/main/java/com/github/sikv/photos/navigation/args/SearchFragmentArguments.kt index 6ee8f407..da309504 100644 --- a/navigation/src/main/java/com/github/sikv/photos/navigation/args/SearchFragmentArguments.kt +++ b/navigation/src/main/java/com/github/sikv/photos/navigation/args/SearchFragmentArguments.kt @@ -4,5 +4,5 @@ import kotlinx.parcelize.Parcelize @Parcelize data class SearchFragmentArguments( - val query: String? = null + val query: String? = null, ) : FragmentArguments diff --git a/navigation/src/main/java/com/github/sikv/photos/navigation/route/FeedbackRoute.kt b/navigation/src/main/java/com/github/sikv/photos/navigation/route/FeedbackRoute.kt index beb124c9..b64fe838 100644 --- a/navigation/src/main/java/com/github/sikv/photos/navigation/route/FeedbackRoute.kt +++ b/navigation/src/main/java/com/github/sikv/photos/navigation/route/FeedbackRoute.kt @@ -1,7 +1,7 @@ package com.github.sikv.photos.navigation.route -import com.github.sikv.photos.navigation.Navigation +import androidx.navigation.NavController interface FeedbackRoute { - fun present(navigation: Navigation?) + fun present(navController: NavController) } diff --git a/navigation/src/main/java/com/github/sikv/photos/navigation/route/PhotoDetailsRoute.kt b/navigation/src/main/java/com/github/sikv/photos/navigation/route/PhotoDetailsRoute.kt index 45605171..819d1a58 100644 --- a/navigation/src/main/java/com/github/sikv/photos/navigation/route/PhotoDetailsRoute.kt +++ b/navigation/src/main/java/com/github/sikv/photos/navigation/route/PhotoDetailsRoute.kt @@ -1,8 +1,8 @@ package com.github.sikv.photos.navigation.route -import com.github.sikv.photos.navigation.Navigation +import androidx.navigation.NavController import com.github.sikv.photos.navigation.args.PhotoDetailsFragmentArguments interface PhotoDetailsRoute { - fun present(navigation: Navigation?, args: PhotoDetailsFragmentArguments) + fun present(navController: NavController, args: PhotoDetailsFragmentArguments) } diff --git a/navigation/src/main/java/com/github/sikv/photos/navigation/route/SearchRoute.kt b/navigation/src/main/java/com/github/sikv/photos/navigation/route/SearchRoute.kt new file mode 100644 index 00000000..1e2edaad --- /dev/null +++ b/navigation/src/main/java/com/github/sikv/photos/navigation/route/SearchRoute.kt @@ -0,0 +1,8 @@ +package com.github.sikv.photos.navigation.route + +import androidx.navigation.NavController +import com.github.sikv.photos.navigation.args.SearchFragmentArguments + +interface SearchRoute { + fun present(navController: NavController, args: SearchFragmentArguments) +} diff --git a/photo-list-ui/src/main/java/com/github/sikv/photo/list/ui/PhotoActionDispatcher.kt b/photo-list-ui/src/main/java/com/github/sikv/photo/list/ui/PhotoActionDispatcher.kt index a4b4f5f4..96db04ed 100644 --- a/photo-list-ui/src/main/java/com/github/sikv/photo/list/ui/PhotoActionDispatcher.kt +++ b/photo-list-ui/src/main/java/com/github/sikv/photo/list/ui/PhotoActionDispatcher.kt @@ -4,10 +4,15 @@ import android.Manifest import android.app.Activity import android.os.Build import android.view.View +import androidx.navigation.fragment.findNavController import com.github.sikv.photos.common.DownloadService import com.github.sikv.photos.common.PermissionManager import com.github.sikv.photos.common.PhotoLoader -import com.github.sikv.photos.common.ui.* +import com.github.sikv.photos.common.ui.BaseFragment +import com.github.sikv.photos.common.ui.OptionsBottomSheetDialog +import com.github.sikv.photos.common.ui.copyText +import com.github.sikv.photos.common.ui.openAppSettings +import com.github.sikv.photos.common.ui.openUrl import com.github.sikv.photos.data.createShareIntent import com.github.sikv.photos.domain.Photo import com.github.sikv.photos.navigation.args.PhotoDetailsFragmentArguments @@ -38,7 +43,7 @@ class PhotoActionDispatcher( override fun onPhotoAction(action: OnPhotoActionListener.Action, photo: Photo, view: View) { when (action) { OnPhotoActionListener.Action.CLICK -> { - photoDetailsRoute.present(fragment.navigation, PhotoDetailsFragmentArguments(photo)) + photoDetailsRoute.present(fragment.findNavController(), PhotoDetailsFragmentArguments(photo)) } OnPhotoActionListener.Action.HOLD -> {