From a2fb21c1406202a0eec0ae02fa4d18c8d3f351e9 Mon Sep 17 00:00:00 2001 From: Daniil Borisovskii Date: Wed, 14 Aug 2019 19:09:05 +0300 Subject: [PATCH 01/14] Add primary tabbar navigation --- build.gradle | 3 +- modules.gradle | 2 + tabbarnavigation/.gitignore | 1 + tabbarnavigation/build.gradle | 27 ++++ tabbarnavigation/src/main/AndroidManifest.xml | 2 + .../BottomNavigationController.kt | 126 ++++++++++++++++++ .../MainNavigationFragment.kt | 67 ++++++++++ .../tabbarnavigation/NavigationActivity.kt | 31 +++++ .../NavigationContainerFragment.kt | 53 ++++++++ 9 files changed, 311 insertions(+), 1 deletion(-) create mode 100644 tabbarnavigation/.gitignore create mode 100644 tabbarnavigation/build.gradle create mode 100644 tabbarnavigation/src/main/AndroidManifest.xml create mode 100644 tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/BottomNavigationController.kt create mode 100644 tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/MainNavigationFragment.kt create mode 100644 tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/NavigationActivity.kt create mode 100644 tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/NavigationContainerFragment.kt diff --git a/build.gradle b/build.gradle index 5e32dc3..b6b7adb 100644 --- a/build.gradle +++ b/build.gradle @@ -38,6 +38,7 @@ ext { rxJava : '2.2.2', rxAndroid : '2.1.0', crashlytics: '2.9.5', - location : '16.0.0' + location : '16.0.0', + coreKtx : '1.0.1' ] } diff --git a/modules.gradle b/modules.gradle index 1fff4cf..c296c9d 100644 --- a/modules.gradle +++ b/modules.gradle @@ -19,6 +19,7 @@ include ':views' include ':recyclerview-adapters' include ':kotlin-extensions' include ':templates' +include ':tabbarnavigation' project(':utils').projectDir = new File(rootDir, 'utils') project(':logging').projectDir = new File(rootDir, 'logging') @@ -31,3 +32,4 @@ project(':views').projectDir = new File(rootDir, 'views') project(':recyclerview-adapters').projectDir = new File(rootDir, 'recyclerview-adapters') project(':kotlin-extensions').projectDir = new File(rootDir, 'kotlin-extensions') project(':templates').projectDir = new File(rootDir, 'templates') +project(':tabbarnavigation').projectDir = new File(rootDir, 'tabbarnavigation') diff --git a/tabbarnavigation/.gitignore b/tabbarnavigation/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/tabbarnavigation/.gitignore @@ -0,0 +1 @@ +/build diff --git a/tabbarnavigation/build.gradle b/tabbarnavigation/build.gradle new file mode 100644 index 0000000..db65d77 --- /dev/null +++ b/tabbarnavigation/build.gradle @@ -0,0 +1,27 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +android { + compileSdkVersion versions.compileSdk + + defaultConfig { + minSdkVersion 16 + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + +} + +dependencies { + api project(":navigation") + api project(":templates") + + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + + implementation "androidx.core:core-ktx:$versions.coreKtx" + + implementation "androidx.appcompat:appcompat:$versions.appcompat" +} diff --git a/tabbarnavigation/src/main/AndroidManifest.xml b/tabbarnavigation/src/main/AndroidManifest.xml new file mode 100644 index 0000000..ed8e143 --- /dev/null +++ b/tabbarnavigation/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/BottomNavigationController.kt b/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/BottomNavigationController.kt new file mode 100644 index 0000000..86c7f92 --- /dev/null +++ b/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/BottomNavigationController.kt @@ -0,0 +1,126 @@ +package ru.touchin.tabbarnavigation + +import android.content.Context +import android.os.Bundle +import android.os.Parcelable +import android.util.SparseArray +import android.view.View +import android.view.ViewGroup +import androidx.annotation.IdRes +import androidx.core.util.forEach +import androidx.core.view.children +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import ru.touchin.roboswag.components.navigation.fragments.ViewControllerFragment +import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewController +import ru.touchin.roboswag.core.utils.ShouldNotHappenException + +class BottomNavigationController( + private val context: Context, + private val fragmentManager: FragmentManager, + private val viewControllers: SparseArray>, Parcelable>>, + private val contentContainerViewId: Int, + private val wrapWithNavigationContainer: Boolean = false, + @IdRes private val topLevelViewControllerId: Int = 0, // If it zero back press with empty fragment back stack would close the app + private val onReselectListener: (() -> Unit)? = null +) { + + private lateinit var callback: FragmentManager.FragmentLifecycleCallbacks + + private var currentViewControllerId = -1 + + fun attach(navigationTabsContainer: ViewGroup) { + detach() + + //This is provides to set pressed tab status to isActivated providing an opportunity to specify custom style + callback = object : FragmentManager.FragmentLifecycleCallbacks() { + override fun onFragmentViewCreated(fragmentManager: FragmentManager, fragment: Fragment, view: View, savedInstanceState: Bundle?) { + viewControllers.forEach { itemId, (viewControllerClass, _) -> + if (isViewControllerFragment(fragment, viewControllerClass)) { + navigationTabsContainer.children.forEach { itemView -> itemView.isActivated = itemView.id == itemId } + } + } + } + } + fragmentManager.registerFragmentLifecycleCallbacks(callback, false) + + navigationTabsContainer.children.forEach { itemView -> + viewControllers[itemView.id]?.let { (viewControllerClass, _) -> + itemView.setOnClickListener { + if (!isViewControllerFragment(fragmentManager.primaryNavigationFragment, viewControllerClass)) { + navigateTo(itemView.id) + } else { + onReselectListener?.invoke() + } + } + } + } + } + + fun detach() { + if (::callback.isInitialized) { + fragmentManager.unregisterFragmentLifecycleCallbacks(callback) + } + } + + fun navigateTo(@IdRes itemId: Int, state: Parcelable? = null) { + // Find view controller class that needs to open + val (viewControllerClass, defaultViewControllerState) = viewControllers[itemId] ?: return + if (state != null && state::class != defaultViewControllerState::class) { + throw ShouldNotHappenException( + "Incorrect state type for navigation tab root ViewController. Should be ${defaultViewControllerState::class}" + ) + } + val viewControllerState = state ?: defaultViewControllerState + val transaction = fragmentManager.beginTransaction() + // Detach current primary fragment + fragmentManager.primaryNavigationFragment?.let(transaction::detach) + val viewControllerName = viewControllerClass.canonicalName + var fragment = fragmentManager.findFragmentByTag(viewControllerName) + + //TODO: figure out do we need to remove exists fragment before instantiate him one more time + if (fragment != null) { + transaction.attach(fragment) + } else { + fragment = if (wrapWithNavigationContainer) { + Fragment.instantiate( + context, + NavigationContainerFragment::class.java.name, + NavigationContainerFragment.args(viewControllerClass, viewControllerState) + ) + } else { + Fragment.instantiate( + context, + ViewControllerFragment::class.java.name, + ViewControllerFragment.args(viewControllerClass, viewControllerState) + ) + } + transaction.add(contentContainerViewId, fragment, viewControllerName) + } + + transaction + .setPrimaryNavigationFragment(fragment) + .setReorderingAllowed(true) + .commit() + + currentViewControllerId = itemId + } + + // If current fragment top and it's not the top level view controller open to top level view controller + fun onBackPressed() = + if (fragmentManager.primaryNavigationFragment?.childFragmentManager?.backStackEntryCount == 0 + && topLevelViewControllerId != 0 + && currentViewControllerId != topLevelViewControllerId) { + navigateTo(topLevelViewControllerId) + true + } else { + false + } + + private fun isViewControllerFragment(fragment: Fragment?, viewControllerClass: Class>) = + if (wrapWithNavigationContainer) { + (fragment as NavigationContainerFragment).getViewControllerClass() + } else { + (fragment as ViewControllerFragment<*, *>).viewControllerClass + } === viewControllerClass +} diff --git a/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/MainNavigationFragment.kt b/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/MainNavigationFragment.kt new file mode 100644 index 0000000..2f012a3 --- /dev/null +++ b/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/MainNavigationFragment.kt @@ -0,0 +1,67 @@ +package ru.touchin.tabbarnavigation + +import android.os.Bundle +import android.os.Parcelable +import android.util.SparseArray +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import ru.touchin.roboswag.components.navigation.activities.OnBackPressedListener +import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewController + +abstract class MainNavigationFragment : Fragment() { + + private lateinit var bottomNavigationController: BottomNavigationController + + private val backPressedListener = OnBackPressedListener { bottomNavigationController.onBackPressed() } + + abstract fun getRootViewId(): Int + + abstract fun getNavigationContainerId(): Int + + abstract fun getContentContainerId(): Int + + abstract fun getTopLevelViewControllerId(): Int + + abstract fun wrapWithNavigationContainer(): Boolean + + protected abstract fun getNavigationViewControllers(): SparseArray>, Parcelable>> + + open fun getReselectListener(): (() -> Unit) = { getNavigationActivity().getInnerNavigation().up() } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + bottomNavigationController = BottomNavigationController( + context = requireContext(), + fragmentManager = childFragmentManager, + viewControllers = getNavigationViewControllers(), + contentContainerViewId = getContentContainerId(), + topLevelViewControllerId = getTopLevelViewControllerId(), + wrapWithNavigationContainer = wrapWithNavigationContainer(), + onReselectListener = getReselectListener() + ) + if (savedInstanceState == null) { + bottomNavigationController.navigateTo(getTopLevelViewControllerId()) + } + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + val fragmentView = inflater.inflate(getRootViewId(), container, false) + + bottomNavigationController.attach(fragmentView.findViewById(getNavigationContainerId())) + + (activity as NavigationActivity).addOnBackPressedListener(backPressedListener) + + return fragmentView + } + + override fun onDestroyView() { + super.onDestroyView() + (activity as NavigationActivity).removeOnBackPressedListener(backPressedListener) + bottomNavigationController.detach() + } + + private fun getNavigationActivity() = requireActivity() as NavigationActivity + +} diff --git a/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/NavigationActivity.kt b/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/NavigationActivity.kt new file mode 100644 index 0000000..805a8de --- /dev/null +++ b/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/NavigationActivity.kt @@ -0,0 +1,31 @@ +package ru.touchin.tabbarnavigation + +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentTransaction +import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewControllerNavigation +import ru.touchin.templates.TouchinActivity + +abstract class NavigationActivity : TouchinActivity() { + val screenNavigation by lazy { + ViewControllerNavigation( + this, + supportFragmentManager, + getContainerViewId(), + getTransition() + ) + } + + abstract fun getContainerViewId(): Int + + open fun getTransition() = FragmentTransaction.TRANSIT_NONE + + fun getInnerNavigation() = getNavigationContainer(supportFragmentManager)?.navigation ?: screenNavigation + + private fun getNavigationContainer(fragmentManager: FragmentManager?): NavigationContainerFragment? = + fragmentManager + ?.primaryNavigationFragment + ?.let { navigationFragment -> + navigationFragment as? NavigationContainerFragment + ?: getNavigationContainer(navigationFragment.childFragmentManager) + } +} diff --git a/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/NavigationContainerFragment.kt b/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/NavigationContainerFragment.kt new file mode 100644 index 0000000..8ef39f2 --- /dev/null +++ b/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/NavigationContainerFragment.kt @@ -0,0 +1,53 @@ +package ru.touchin.tabbarnavigation + +import android.os.Bundle +import android.os.Parcelable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentTransaction +import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewController +import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewControllerNavigation + +abstract class NavigationContainerFragment : Fragment() { + + companion object { + private const val VIEW_CONTROLLER_CLASS_ARG = "VIEW_CONTROLLER_CLASS_ARG" + private const val VIEW_CONTROLLER_STATE_ARG = "VIEW_CONTROLLER_STATE_ARG" + + fun args(cls: Class>, state: Parcelable) = Bundle().apply { + putSerializable(VIEW_CONTROLLER_CLASS_ARG, cls) + putParcelable(VIEW_CONTROLLER_STATE_ARG, state) + } + } + + val navigation by lazy { + ViewControllerNavigation( + requireContext(), + childFragmentManager, + getContainerViewId(), + getTransition() + ) + } + + abstract fun getContainerViewId(): Int + + open fun getTransition() = FragmentTransaction.TRANSIT_NONE + + @Suppress("UNCHECKED_CAST") + fun getViewControllerClass(): Class> = + arguments?.getSerializable(VIEW_CONTROLLER_CLASS_ARG) as Class> + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + if (savedInstanceState == null) { + val args = arguments ?: return + navigation.setInitialViewController(getViewControllerClass(), args.getParcelable(VIEW_CONTROLLER_STATE_ARG)) + } + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = + inflater.inflate(getContainerViewId(), container, false) + +} From bb6d142617366bc2580cedc3167454501b8118cf Mon Sep 17 00:00:00 2001 From: Daniil Borisovskii Date: Wed, 14 Aug 2019 19:27:33 +0300 Subject: [PATCH 02/14] Changed package name --- .../components}/tabbarnavigation/BottomNavigationController.kt | 2 +- .../components}/tabbarnavigation/MainNavigationFragment.kt | 2 +- .../components}/tabbarnavigation/NavigationActivity.kt | 2 +- .../components}/tabbarnavigation/NavigationContainerFragment.kt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename tabbarnavigation/src/main/java/ru/touchin/{ => roboswag/components}/tabbarnavigation/BottomNavigationController.kt (99%) rename tabbarnavigation/src/main/java/ru/touchin/{ => roboswag/components}/tabbarnavigation/MainNavigationFragment.kt (97%) rename tabbarnavigation/src/main/java/ru/touchin/{ => roboswag/components}/tabbarnavigation/NavigationActivity.kt (95%) rename tabbarnavigation/src/main/java/ru/touchin/{ => roboswag/components}/tabbarnavigation/NavigationContainerFragment.kt (97%) diff --git a/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/BottomNavigationController.kt b/tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt similarity index 99% rename from tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/BottomNavigationController.kt rename to tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt index 86c7f92..1cb5163 100644 --- a/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/BottomNavigationController.kt +++ b/tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt @@ -1,4 +1,4 @@ -package ru.touchin.tabbarnavigation +package ru.touchin.roboswag.components.tabbarnavigation import android.content.Context import android.os.Bundle diff --git a/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/MainNavigationFragment.kt b/tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/MainNavigationFragment.kt similarity index 97% rename from tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/MainNavigationFragment.kt rename to tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/MainNavigationFragment.kt index 2f012a3..009f71e 100644 --- a/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/MainNavigationFragment.kt +++ b/tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/MainNavigationFragment.kt @@ -1,4 +1,4 @@ -package ru.touchin.tabbarnavigation +package ru.touchin.roboswag.components.tabbarnavigation import android.os.Bundle import android.os.Parcelable diff --git a/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/NavigationActivity.kt b/tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationActivity.kt similarity index 95% rename from tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/NavigationActivity.kt rename to tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationActivity.kt index 805a8de..e7886d8 100644 --- a/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/NavigationActivity.kt +++ b/tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationActivity.kt @@ -1,4 +1,4 @@ -package ru.touchin.tabbarnavigation +package ru.touchin.roboswag.components.tabbarnavigation import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction diff --git a/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/NavigationContainerFragment.kt b/tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt similarity index 97% rename from tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/NavigationContainerFragment.kt rename to tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt index 8ef39f2..dd1bf70 100644 --- a/tabbarnavigation/src/main/java/ru/touchin/tabbarnavigation/NavigationContainerFragment.kt +++ b/tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt @@ -1,4 +1,4 @@ -package ru.touchin.tabbarnavigation +package ru.touchin.roboswag.components.tabbarnavigation import android.os.Bundle import android.os.Parcelable From 0988249dbb93a34446d49f8b186d97ca5b271358 Mon Sep 17 00:00:00 2001 From: Daniil Borisovskii Date: Thu, 15 Aug 2019 10:54:37 +0300 Subject: [PATCH 03/14] Changed module name and package --- modules.gradle | 4 ++-- {tabbarnavigation => tabbar-navigation}/.gitignore | 0 {tabbarnavigation => tabbar-navigation}/build.gradle | 1 - tabbar-navigation/src/main/AndroidManifest.xml | 2 ++ .../components/tabbarnavigation/BottomNavigationController.kt | 0 .../components/tabbarnavigation/MainNavigationFragment.kt | 0 .../components/tabbarnavigation/NavigationActivity.kt | 0 .../tabbarnavigation/NavigationContainerFragment.kt | 0 tabbarnavigation/src/main/AndroidManifest.xml | 2 -- 9 files changed, 4 insertions(+), 5 deletions(-) rename {tabbarnavigation => tabbar-navigation}/.gitignore (100%) rename {tabbarnavigation => tabbar-navigation}/build.gradle (99%) create mode 100644 tabbar-navigation/src/main/AndroidManifest.xml rename {tabbarnavigation => tabbar-navigation}/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt (100%) rename {tabbarnavigation => tabbar-navigation}/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/MainNavigationFragment.kt (100%) rename {tabbarnavigation => tabbar-navigation}/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationActivity.kt (100%) rename {tabbarnavigation => tabbar-navigation}/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt (100%) delete mode 100644 tabbarnavigation/src/main/AndroidManifest.xml diff --git a/modules.gradle b/modules.gradle index c296c9d..23fbd1d 100644 --- a/modules.gradle +++ b/modules.gradle @@ -19,7 +19,7 @@ include ':views' include ':recyclerview-adapters' include ':kotlin-extensions' include ':templates' -include ':tabbarnavigation' +include ':tabbar-navigation' project(':utils').projectDir = new File(rootDir, 'utils') project(':logging').projectDir = new File(rootDir, 'logging') @@ -32,4 +32,4 @@ project(':views').projectDir = new File(rootDir, 'views') project(':recyclerview-adapters').projectDir = new File(rootDir, 'recyclerview-adapters') project(':kotlin-extensions').projectDir = new File(rootDir, 'kotlin-extensions') project(':templates').projectDir = new File(rootDir, 'templates') -project(':tabbarnavigation').projectDir = new File(rootDir, 'tabbarnavigation') +project(':tabbar-navigation').projectDir = new File(rootDir, 'tabbar-navigation') diff --git a/tabbarnavigation/.gitignore b/tabbar-navigation/.gitignore similarity index 100% rename from tabbarnavigation/.gitignore rename to tabbar-navigation/.gitignore diff --git a/tabbarnavigation/build.gradle b/tabbar-navigation/build.gradle similarity index 99% rename from tabbarnavigation/build.gradle rename to tabbar-navigation/build.gradle index db65d77..8fce2f8 100644 --- a/tabbarnavigation/build.gradle +++ b/tabbar-navigation/build.gradle @@ -12,7 +12,6 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } - } dependencies { diff --git a/tabbar-navigation/src/main/AndroidManifest.xml b/tabbar-navigation/src/main/AndroidManifest.xml new file mode 100644 index 0000000..9437bbd --- /dev/null +++ b/tabbar-navigation/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt similarity index 100% rename from tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt rename to tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt diff --git a/tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/MainNavigationFragment.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/MainNavigationFragment.kt similarity index 100% rename from tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/MainNavigationFragment.kt rename to tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/MainNavigationFragment.kt diff --git a/tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationActivity.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationActivity.kt similarity index 100% rename from tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationActivity.kt rename to tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationActivity.kt diff --git a/tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt similarity index 100% rename from tabbarnavigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt rename to tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt diff --git a/tabbarnavigation/src/main/AndroidManifest.xml b/tabbarnavigation/src/main/AndroidManifest.xml deleted file mode 100644 index ed8e143..0000000 --- a/tabbarnavigation/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - From bff71ad795f45a23a79ccc6a8b7df301d914d774 Mon Sep 17 00:00:00 2001 From: Daniil Borisovskii Date: Thu, 15 Aug 2019 11:18:59 +0300 Subject: [PATCH 04/14] =?UTF-8?q?*=20Changed=20naming=20=E2=80=93=20added?= =?UTF-8?q?=20"Base"=20prefix=20to=20NavigationActivity=20and=20Navigation?= =?UTF-8?q?Fragment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Refactoring of NavigationContainerFragment – remove abstract modifier and provide necessary params --- ...nActivity.kt => BaseNavigationActivity.kt} | 4 +-- ...nFragment.kt => BaseNavigationFragment.kt} | 8 ++--- .../BottomNavigationController.kt | 2 +- .../NavigationContainerFragment.kt | 33 +++++++++++++------ 4 files changed, 30 insertions(+), 17 deletions(-) rename tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/{NavigationActivity.kt => BaseNavigationActivity.kt} (90%) rename tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/{MainNavigationFragment.kt => BaseNavigationFragment.kt} (87%) diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationActivity.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt similarity index 90% rename from tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationActivity.kt rename to tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt index e7886d8..93022bf 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationActivity.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt @@ -5,9 +5,9 @@ import androidx.fragment.app.FragmentTransaction import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewControllerNavigation import ru.touchin.templates.TouchinActivity -abstract class NavigationActivity : TouchinActivity() { +abstract class BaseNavigationActivity : TouchinActivity() { val screenNavigation by lazy { - ViewControllerNavigation( + ViewControllerNavigation( this, supportFragmentManager, getContainerViewId(), diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/MainNavigationFragment.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt similarity index 87% rename from tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/MainNavigationFragment.kt rename to tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt index 009f71e..1b60169 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/MainNavigationFragment.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt @@ -10,7 +10,7 @@ import androidx.fragment.app.Fragment import ru.touchin.roboswag.components.navigation.activities.OnBackPressedListener import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewController -abstract class MainNavigationFragment : Fragment() { +abstract class BaseNavigationFragment : Fragment() { private lateinit var bottomNavigationController: BottomNavigationController @@ -51,17 +51,17 @@ abstract class MainNavigationFragment : Fragment() { bottomNavigationController.attach(fragmentView.findViewById(getNavigationContainerId())) - (activity as NavigationActivity).addOnBackPressedListener(backPressedListener) + (activity as BaseNavigationActivity).addOnBackPressedListener(backPressedListener) return fragmentView } override fun onDestroyView() { super.onDestroyView() - (activity as NavigationActivity).removeOnBackPressedListener(backPressedListener) + (activity as BaseNavigationActivity).removeOnBackPressedListener(backPressedListener) bottomNavigationController.detach() } - private fun getNavigationActivity() = requireActivity() as NavigationActivity + private fun getNavigationActivity() = requireActivity() as BaseNavigationActivity } diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt index 1cb5163..dcfe17f 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt @@ -86,7 +86,7 @@ class BottomNavigationController( Fragment.instantiate( context, NavigationContainerFragment::class.java.name, - NavigationContainerFragment.args(viewControllerClass, viewControllerState) + NavigationContainerFragment.args(viewControllerClass, viewControllerState, contentContainerViewId) ) } else { Fragment.instantiate( diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt index dd1bf70..59d75e0 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt @@ -10,44 +10,57 @@ import androidx.fragment.app.FragmentTransaction import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewController import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewControllerNavigation -abstract class NavigationContainerFragment : Fragment() { +class NavigationContainerFragment : Fragment() { companion object { private const val VIEW_CONTROLLER_CLASS_ARG = "VIEW_CONTROLLER_CLASS_ARG" private const val VIEW_CONTROLLER_STATE_ARG = "VIEW_CONTROLLER_STATE_ARG" + private const val CONTAINER_VIEW_ID_ARG = "CONTAINER_VIEW_ID_ARG" + private const val TRANSITION_ARG = "TRANSITION_ARG" - fun args(cls: Class>, state: Parcelable) = Bundle().apply { + fun args( + cls: Class>, + state: Parcelable, + containerViewId: Int, + transition: Int = FragmentTransaction.TRANSIT_NONE + ) = Bundle().apply { putSerializable(VIEW_CONTROLLER_CLASS_ARG, cls) putParcelable(VIEW_CONTROLLER_STATE_ARG, state) + putInt(CONTAINER_VIEW_ID_ARG, containerViewId) + putInt(TRANSITION_ARG, transition) } } val navigation by lazy { - ViewControllerNavigation( + ViewControllerNavigation( requireContext(), childFragmentManager, - getContainerViewId(), - getTransition() + containerViewId, + transition ) } - abstract fun getContainerViewId(): Int + private var containerViewId = 0 - open fun getTransition() = FragmentTransaction.TRANSIT_NONE + private var transition = 0 @Suppress("UNCHECKED_CAST") - fun getViewControllerClass(): Class> = - arguments?.getSerializable(VIEW_CONTROLLER_CLASS_ARG) as Class> + fun getViewControllerClass(): Class> = + arguments?.getSerializable(VIEW_CONTROLLER_CLASS_ARG) as Class> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState == null) { val args = arguments ?: return + with(args) { + containerViewId = getInt(CONTAINER_VIEW_ID_ARG) + transition = getInt(TRANSITION_ARG) + } navigation.setInitialViewController(getViewControllerClass(), args.getParcelable(VIEW_CONTROLLER_STATE_ARG)) } } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = - inflater.inflate(getContainerViewId(), container, false) + inflater.inflate(containerViewId, container, false) } From 3247f44bc0be5da6f15dfcacbc714006056bccb7 Mon Sep 17 00:00:00 2001 From: Daniil Borisovskii Date: Thu, 15 Aug 2019 11:32:20 +0300 Subject: [PATCH 05/14] =?UTF-8?q?Small=20naming=20refactoring=20=E2=80=93?= =?UTF-8?q?=20change=20getRootViewId=20to=20getRootViewLayoutId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/tabbarnavigation/BaseNavigationFragment.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt index 1b60169..f8fd53b 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt @@ -16,7 +16,7 @@ abstract class BaseNavigationFragment : Fragment() { private val backPressedListener = OnBackPressedListener { bottomNavigationController.onBackPressed() } - abstract fun getRootViewId(): Int + abstract fun getRootViewLayoutId(): Int abstract fun getNavigationContainerId(): Int @@ -47,7 +47,7 @@ abstract class BaseNavigationFragment : Fragment() { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - val fragmentView = inflater.inflate(getRootViewId(), container, false) + val fragmentView = inflater.inflate(getRootViewLayoutId(), container, false) bottomNavigationController.attach(fragmentView.findViewById(getNavigationContainerId())) From bf604d87efcc0f5a6d4449e50618d3d988ee3014 Mon Sep 17 00:00:00 2001 From: Daniil Borisovskii Date: Thu, 15 Aug 2019 11:57:06 +0300 Subject: [PATCH 06/14] Provide content container layout id --- .../components/tabbarnavigation/BaseNavigationFragment.kt | 3 +++ .../tabbarnavigation/BottomNavigationController.kt | 3 ++- .../tabbarnavigation/NavigationContainerFragment.kt | 8 +++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt index f8fd53b..389605e 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt @@ -22,6 +22,8 @@ abstract class BaseNavigationFragment : Fragment() { abstract fun getContentContainerId(): Int + abstract fun getContentContainerLayoutId(): Int + abstract fun getTopLevelViewControllerId(): Int abstract fun wrapWithNavigationContainer(): Boolean @@ -37,6 +39,7 @@ abstract class BaseNavigationFragment : Fragment() { fragmentManager = childFragmentManager, viewControllers = getNavigationViewControllers(), contentContainerViewId = getContentContainerId(), + contentContainerLayoutId = getContentContainerLayoutId(), topLevelViewControllerId = getTopLevelViewControllerId(), wrapWithNavigationContainer = wrapWithNavigationContainer(), onReselectListener = getReselectListener() diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt index dcfe17f..e2a8618 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt @@ -20,6 +20,7 @@ class BottomNavigationController( private val fragmentManager: FragmentManager, private val viewControllers: SparseArray>, Parcelable>>, private val contentContainerViewId: Int, + private val contentContainerLayoutId: Int, private val wrapWithNavigationContainer: Boolean = false, @IdRes private val topLevelViewControllerId: Int = 0, // If it zero back press with empty fragment back stack would close the app private val onReselectListener: (() -> Unit)? = null @@ -86,7 +87,7 @@ class BottomNavigationController( Fragment.instantiate( context, NavigationContainerFragment::class.java.name, - NavigationContainerFragment.args(viewControllerClass, viewControllerState, contentContainerViewId) + NavigationContainerFragment.args(viewControllerClass, viewControllerState, contentContainerViewId, contentContainerLayoutId) ) } else { Fragment.instantiate( diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt index 59d75e0..c060197 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt @@ -16,17 +16,20 @@ class NavigationContainerFragment : Fragment() { private const val VIEW_CONTROLLER_CLASS_ARG = "VIEW_CONTROLLER_CLASS_ARG" private const val VIEW_CONTROLLER_STATE_ARG = "VIEW_CONTROLLER_STATE_ARG" private const val CONTAINER_VIEW_ID_ARG = "CONTAINER_VIEW_ID_ARG" + private const val CONTAINER_LAYOUT_ID_ARG = "CONTAINER_LAYOUT_ID_ARG" private const val TRANSITION_ARG = "TRANSITION_ARG" fun args( cls: Class>, state: Parcelable, containerViewId: Int, + containerLayoutId: Int, transition: Int = FragmentTransaction.TRANSIT_NONE ) = Bundle().apply { putSerializable(VIEW_CONTROLLER_CLASS_ARG, cls) putParcelable(VIEW_CONTROLLER_STATE_ARG, state) putInt(CONTAINER_VIEW_ID_ARG, containerViewId) + putInt(CONTAINER_LAYOUT_ID_ARG, containerLayoutId) putInt(TRANSITION_ARG, transition) } } @@ -42,6 +45,8 @@ class NavigationContainerFragment : Fragment() { private var containerViewId = 0 + private var containerLayoutId = 0 + private var transition = 0 @Suppress("UNCHECKED_CAST") @@ -54,6 +59,7 @@ class NavigationContainerFragment : Fragment() { val args = arguments ?: return with(args) { containerViewId = getInt(CONTAINER_VIEW_ID_ARG) + containerLayoutId = getInt(CONTAINER_LAYOUT_ID_ARG) transition = getInt(TRANSITION_ARG) } navigation.setInitialViewController(getViewControllerClass(), args.getParcelable(VIEW_CONTROLLER_STATE_ARG)) @@ -61,6 +67,6 @@ class NavigationContainerFragment : Fragment() { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = - inflater.inflate(containerViewId, container, false) + inflater.inflate(containerLayoutId, container, false) } From 26b65fe83114e19e30945a62f73af6aa5caaedae Mon Sep 17 00:00:00 2001 From: Daniil Borisovskii Date: Thu, 15 Aug 2019 12:05:12 +0300 Subject: [PATCH 07/14] Small naming refactoring --- .../tabbarnavigation/BaseNavigationActivity.kt | 4 ++-- .../tabbarnavigation/BaseNavigationFragment.kt | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt index 93022bf..3043a32 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt @@ -10,12 +10,12 @@ abstract class BaseNavigationActivity : TouchinActivity() { ViewControllerNavigation( this, supportFragmentManager, - getContainerViewId(), + getFragmentContainerViewId(), getTransition() ) } - abstract fun getContainerViewId(): Int + abstract fun getFragmentContainerViewId(): Int open fun getTransition() = FragmentTransaction.TRANSIT_NONE diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt index 389605e..2bf4cab 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt @@ -16,11 +16,11 @@ abstract class BaseNavigationFragment : Fragment() { private val backPressedListener = OnBackPressedListener { bottomNavigationController.onBackPressed() } - abstract fun getRootViewLayoutId(): Int + abstract fun getRootLayoutId(): Int - abstract fun getNavigationContainerId(): Int + abstract fun getNavigationContainerViewId(): Int - abstract fun getContentContainerId(): Int + abstract fun getContentContainerViewId(): Int abstract fun getContentContainerLayoutId(): Int @@ -38,7 +38,7 @@ abstract class BaseNavigationFragment : Fragment() { context = requireContext(), fragmentManager = childFragmentManager, viewControllers = getNavigationViewControllers(), - contentContainerViewId = getContentContainerId(), + contentContainerViewId = getContentContainerViewId(), contentContainerLayoutId = getContentContainerLayoutId(), topLevelViewControllerId = getTopLevelViewControllerId(), wrapWithNavigationContainer = wrapWithNavigationContainer(), @@ -50,9 +50,9 @@ abstract class BaseNavigationFragment : Fragment() { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - val fragmentView = inflater.inflate(getRootViewLayoutId(), container, false) + val fragmentView = inflater.inflate(getRootLayoutId(), container, false) - bottomNavigationController.attach(fragmentView.findViewById(getNavigationContainerId())) + bottomNavigationController.attach(fragmentView.findViewById(getNavigationContainerViewId())) (activity as BaseNavigationActivity).addOnBackPressedListener(backPressedListener) From 78ee6ee6fc7932e83832fe45dfbb73c01e3a323e Mon Sep 17 00:00:00 2001 From: Daniil Borisovskii Date: Thu, 15 Aug 2019 12:19:54 +0300 Subject: [PATCH 08/14] Changed visibility modifiers --- .../tabbarnavigation/BaseNavigationActivity.kt | 4 ++-- .../tabbarnavigation/BaseNavigationFragment.kt | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt index 3043a32..8c437c9 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt @@ -15,9 +15,9 @@ abstract class BaseNavigationActivity : TouchinActivity() { ) } - abstract fun getFragmentContainerViewId(): Int + protected abstract fun getFragmentContainerViewId(): Int - open fun getTransition() = FragmentTransaction.TRANSIT_NONE + protected open fun getTransition() = FragmentTransaction.TRANSIT_NONE fun getInnerNavigation() = getNavigationContainer(supportFragmentManager)?.navigation ?: screenNavigation diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt index 2bf4cab..b435be6 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt @@ -16,21 +16,21 @@ abstract class BaseNavigationFragment : Fragment() { private val backPressedListener = OnBackPressedListener { bottomNavigationController.onBackPressed() } - abstract fun getRootLayoutId(): Int + protected abstract fun getRootLayoutId(): Int - abstract fun getNavigationContainerViewId(): Int + protected abstract fun getNavigationContainerViewId(): Int - abstract fun getContentContainerViewId(): Int + protected abstract fun getContentContainerViewId(): Int - abstract fun getContentContainerLayoutId(): Int + protected abstract fun getContentContainerLayoutId(): Int - abstract fun getTopLevelViewControllerId(): Int + protected abstract fun getTopLevelViewControllerId(): Int - abstract fun wrapWithNavigationContainer(): Boolean + protected abstract fun wrapWithNavigationContainer(): Boolean protected abstract fun getNavigationViewControllers(): SparseArray>, Parcelable>> - open fun getReselectListener(): (() -> Unit) = { getNavigationActivity().getInnerNavigation().up() } + protected open fun getReselectListener(): (() -> Unit) = { getNavigationActivity().getInnerNavigation().up() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) From 8c02b55009d5c75ad8073206887ff152e4ccf006 Mon Sep 17 00:00:00 2001 From: Daniil Borisovskii Date: Thu, 15 Aug 2019 15:01:24 +0300 Subject: [PATCH 09/14] Fixed according to https://github.com/TouchInstinct/RoboSwag/pull/45#discussion_r314247889 https://github.com/TouchInstinct/RoboSwag/pull/45#discussion_r314246666 https://github.com/TouchInstinct/RoboSwag/pull/45#discussion_r314246050 https://github.com/TouchInstinct/RoboSwag/pull/45#discussion_r314245790 https://github.com/TouchInstinct/RoboSwag/pull/45#discussion_r314245032 https://github.com/TouchInstinct/RoboSwag/pull/45#discussion_r314242845 https://github.com/TouchInstinct/RoboSwag/pull/45#discussion_r314242614 --- .../activities/BaseNavigationActivity.kt | 4 +++ .../BaseNavigationActivity.kt | 14 ++++---- .../BaseNavigationFragment.kt | 34 +++++++++---------- .../BottomNavigationController.kt | 15 ++++---- .../NavigationContainerFragment.kt | 9 +++-- 5 files changed, 41 insertions(+), 35 deletions(-) create mode 100644 navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseNavigationActivity.kt diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseNavigationActivity.kt b/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseNavigationActivity.kt new file mode 100644 index 0000000..6102afd --- /dev/null +++ b/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseNavigationActivity.kt @@ -0,0 +1,4 @@ +package ru.touchin.roboswag.components.navigation.activities + +class BaseNavigationActivity { +} \ No newline at end of file diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt index 8c437c9..c58eaba 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt @@ -6,20 +6,22 @@ import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewControllerN import ru.touchin.templates.TouchinActivity abstract class BaseNavigationActivity : TouchinActivity() { - val screenNavigation by lazy { + val navigation by lazy { ViewControllerNavigation( this, supportFragmentManager, - getFragmentContainerViewId(), - getTransition() + fragmentContainerViewId, + transition ) } - protected abstract fun getFragmentContainerViewId(): Int + val innerNavigation by lazy { + getNavigationContainer(supportFragmentManager)?.navigation ?: navigation + } - protected open fun getTransition() = FragmentTransaction.TRANSIT_NONE + protected abstract val fragmentContainerViewId: Int - fun getInnerNavigation() = getNavigationContainer(supportFragmentManager)?.navigation ?: screenNavigation + protected open val transition = FragmentTransaction.TRANSIT_NONE private fun getNavigationContainer(fragmentManager: FragmentManager?): NavigationContainerFragment? = fragmentManager diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt index b435be6..8c282a5 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt @@ -16,43 +16,43 @@ abstract class BaseNavigationFragment : Fragment() { private val backPressedListener = OnBackPressedListener { bottomNavigationController.onBackPressed() } - protected abstract fun getRootLayoutId(): Int + protected abstract val rootLayoutId: Int - protected abstract fun getNavigationContainerViewId(): Int + protected abstract val navigationContainerViewId: Int - protected abstract fun getContentContainerViewId(): Int + protected abstract val contentContainerViewId: Int - protected abstract fun getContentContainerLayoutId(): Int + protected abstract val contentContainerLayoutId: Int - protected abstract fun getTopLevelViewControllerId(): Int + protected abstract val topLevelViewControllerId: Int - protected abstract fun wrapWithNavigationContainer(): Boolean + protected abstract val wrapWithNavigationContainer: Boolean - protected abstract fun getNavigationViewControllers(): SparseArray>, Parcelable>> + protected abstract val navigationViewControllers: SparseArray>, Parcelable>> - protected open fun getReselectListener(): (() -> Unit) = { getNavigationActivity().getInnerNavigation().up() } + protected open val reselectListener: (() -> Unit) = { getNavigationActivity().innerNavigation.up() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) bottomNavigationController = BottomNavigationController( context = requireContext(), fragmentManager = childFragmentManager, - viewControllers = getNavigationViewControllers(), - contentContainerViewId = getContentContainerViewId(), - contentContainerLayoutId = getContentContainerLayoutId(), - topLevelViewControllerId = getTopLevelViewControllerId(), - wrapWithNavigationContainer = wrapWithNavigationContainer(), - onReselectListener = getReselectListener() + viewControllers = navigationViewControllers, + contentContainerViewId = contentContainerViewId, + contentContainerLayoutId = contentContainerLayoutId, + topLevelViewControllerId = topLevelViewControllerId, + wrapWithNavigationContainer = wrapWithNavigationContainer, + onReselectListener = reselectListener ) if (savedInstanceState == null) { - bottomNavigationController.navigateTo(getTopLevelViewControllerId()) + bottomNavigationController.navigateTo(topLevelViewControllerId) } } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - val fragmentView = inflater.inflate(getRootLayoutId(), container, false) + val fragmentView = inflater.inflate(rootLayoutId, container, false) - bottomNavigationController.attach(fragmentView.findViewById(getNavigationContainerViewId())) + bottomNavigationController.attach(fragmentView.findViewById(navigationContainerViewId)) (activity as BaseNavigationActivity).addOnBackPressedListener(backPressedListener) diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt index e2a8618..594c274 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt @@ -7,6 +7,7 @@ import android.util.SparseArray import android.view.View import android.view.ViewGroup import androidx.annotation.IdRes +import androidx.annotation.LayoutRes import androidx.core.util.forEach import androidx.core.view.children import androidx.fragment.app.Fragment @@ -19,14 +20,14 @@ class BottomNavigationController( private val context: Context, private val fragmentManager: FragmentManager, private val viewControllers: SparseArray>, Parcelable>>, - private val contentContainerViewId: Int, - private val contentContainerLayoutId: Int, + @IdRes private val contentContainerViewId: Int, + @LayoutRes private val contentContainerLayoutId: Int, private val wrapWithNavigationContainer: Boolean = false, @IdRes private val topLevelViewControllerId: Int = 0, // If it zero back press with empty fragment back stack would close the app private val onReselectListener: (() -> Unit)? = null ) { - private lateinit var callback: FragmentManager.FragmentLifecycleCallbacks + private var callback: FragmentManager.FragmentLifecycleCallbacks? = null private var currentViewControllerId = -1 @@ -43,7 +44,7 @@ class BottomNavigationController( } } } - fragmentManager.registerFragmentLifecycleCallbacks(callback, false) + fragmentManager.registerFragmentLifecycleCallbacks(callback!!, false) navigationTabsContainer.children.forEach { itemView -> viewControllers[itemView.id]?.let { (viewControllerClass, _) -> @@ -58,11 +59,7 @@ class BottomNavigationController( } } - fun detach() { - if (::callback.isInitialized) { - fragmentManager.unregisterFragmentLifecycleCallbacks(callback) - } - } + fun detach() = callback?.let { fragmentManager.unregisterFragmentLifecycleCallbacks(it) } fun navigateTo(@IdRes itemId: Int, state: Parcelable? = null) { // Find view controller class that needs to open diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt index c060197..4968aac 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt @@ -5,10 +5,13 @@ import android.os.Parcelable import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.annotation.IdRes +import androidx.annotation.LayoutRes import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentTransaction import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewController import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewControllerNavigation +import ru.touchin.roboswag.core.utils.ShouldNotHappenException class NavigationContainerFragment : Fragment() { @@ -22,8 +25,8 @@ class NavigationContainerFragment : Fragment() { fun args( cls: Class>, state: Parcelable, - containerViewId: Int, - containerLayoutId: Int, + @IdRes containerViewId: Int, + @LayoutRes containerLayoutId: Int, transition: Int = FragmentTransaction.TRANSIT_NONE ) = Bundle().apply { putSerializable(VIEW_CONTROLLER_CLASS_ARG, cls) @@ -56,7 +59,7 @@ class NavigationContainerFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState == null) { - val args = arguments ?: return + val args = arguments ?: throw ShouldNotHappenException("Fragment is not instantiable without arguments") with(args) { containerViewId = getInt(CONTAINER_VIEW_ID_ARG) containerLayoutId = getInt(CONTAINER_LAYOUT_ID_ARG) From 9c810c84217c17d84676f8bf8a5e1c7ba8d7b63f Mon Sep 17 00:00:00 2001 From: Daniil Borisovskii Date: Thu, 15 Aug 2019 15:02:29 +0300 Subject: [PATCH 10/14] Delete unnecessary class --- .../navigation/activities/BaseNavigationActivity.kt | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseNavigationActivity.kt diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseNavigationActivity.kt b/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseNavigationActivity.kt deleted file mode 100644 index 6102afd..0000000 --- a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseNavigationActivity.kt +++ /dev/null @@ -1,4 +0,0 @@ -package ru.touchin.roboswag.components.navigation.activities - -class BaseNavigationActivity { -} \ No newline at end of file From 67f89bb9b1dfd74c11cae299d2ce30531d8b3aaa Mon Sep 17 00:00:00 2001 From: Daniil Borisovskii Date: Thu, 15 Aug 2019 15:58:23 +0300 Subject: [PATCH 11/14] Fixed according to https://github.com/TouchInstinct/RoboSwag/pull/45#discussion_r314240139 * Removed module "templates" --- .../java/ru/touchin/extensions/Activity.kt | 23 +++++++ modules.gradle | 2 - navigation/build.gradle | 9 +++ .../components/navigation}/TouchinApp.java | 9 +-- .../navigation/activities/BaseActivity.kt | 12 ++++ .../activities/BaseNavigationActivity.kt | 25 +++++++ tabbar-navigation/build.gradle | 1 - ...ctivity.kt => BottomNavigationActivity.kt} | 23 ++----- ...ragment.kt => BottomNavigationFragment.kt} | 8 +-- .../NavigationContainerFragment.kt | 6 +- templates/.gitignore | 1 - templates/build.gradle | 31 --------- templates/src/main/AndroidManifest.xml | 3 - .../ru/touchin/templates/TouchinActivity.java | 69 ------------------- 14 files changed, 88 insertions(+), 134 deletions(-) rename {templates/src/main/java/ru/touchin/templates => navigation/src/main/java/ru/touchin/roboswag/components/navigation}/TouchinApp.java (98%) create mode 100644 navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseNavigationActivity.kt rename tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/{BaseNavigationActivity.kt => BottomNavigationActivity.kt} (52%) rename tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/{BaseNavigationFragment.kt => BottomNavigationFragment.kt} (90%) delete mode 100644 templates/.gitignore delete mode 100644 templates/build.gradle delete mode 100644 templates/src/main/AndroidManifest.xml delete mode 100644 templates/src/main/java/ru/touchin/templates/TouchinActivity.java diff --git a/kotlin-extensions/src/main/java/ru/touchin/extensions/Activity.kt b/kotlin-extensions/src/main/java/ru/touchin/extensions/Activity.kt index ac9acbc..b199623 100644 --- a/kotlin-extensions/src/main/java/ru/touchin/extensions/Activity.kt +++ b/kotlin-extensions/src/main/java/ru/touchin/extensions/Activity.kt @@ -1,8 +1,31 @@ package ru.touchin.extensions import android.app.Activity +import android.app.ActivityManager import android.content.Intent +import android.os.Build import android.os.Bundle +import androidx.annotation.ColorRes +import androidx.annotation.DrawableRes +import androidx.core.content.ContextCompat fun Activity.safeStartActivityForResult(intent: Intent, requestCode: Int, options: Bundle? = null, resolveFlags: Int = 0): Boolean = packageManager.resolveActivity(intent, resolveFlags)?.let { startActivityForResult(intent, requestCode, options) } != null + +/** + * Setup task description of application for Android 5.0 and later. It is showing when user opens task bar. + * + * @param label Name of application to show in task bar; + * @param iconRes Icon of application to show in task bar; + * @param primaryColorRes Color of application to show in task bar. + */ +fun Activity.setupTaskDescriptor(label: String, @DrawableRes iconRes: Int, @ColorRes primaryColorRes: Int) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + val taskDescription = ActivityManager.TaskDescription( + label, + iconRes, + ContextCompat.getColor(this, primaryColorRes) + ) + setTaskDescription(taskDescription) + } +} \ No newline at end of file diff --git a/modules.gradle b/modules.gradle index 23fbd1d..b7d1194 100644 --- a/modules.gradle +++ b/modules.gradle @@ -18,7 +18,6 @@ include ':lifecycle-rx' include ':views' include ':recyclerview-adapters' include ':kotlin-extensions' -include ':templates' include ':tabbar-navigation' project(':utils').projectDir = new File(rootDir, 'utils') @@ -31,5 +30,4 @@ project(':lifecycle-rx').projectDir = new File(rootDir, 'lifecycle-rx') project(':views').projectDir = new File(rootDir, 'views') project(':recyclerview-adapters').projectDir = new File(rootDir, 'recyclerview-adapters') project(':kotlin-extensions').projectDir = new File(rootDir, 'kotlin-extensions') -project(':templates').projectDir = new File(rootDir, 'templates') project(':tabbar-navigation').projectDir = new File(rootDir, 'tabbar-navigation') diff --git a/navigation/build.gradle b/navigation/build.gradle index d8d1b2b..1110b4a 100644 --- a/navigation/build.gradle +++ b/navigation/build.gradle @@ -17,9 +17,18 @@ android { dependencies { api project(":utils") api project(":logging") + api project(":api-logansquare") + + api 'androidx.multidex:multidex:2.0.1' + + api 'net.danlew:android.joda:2.9.9.4' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "androidx.appcompat:appcompat:$versions.appcompat" + implementation("com.crashlytics.sdk.android:crashlytics:$versions.crashlytics@aar") { + transitive = true + } + } diff --git a/templates/src/main/java/ru/touchin/templates/TouchinApp.java b/navigation/src/main/java/ru/touchin/roboswag/components/navigation/TouchinApp.java similarity index 98% rename from templates/src/main/java/ru/touchin/templates/TouchinApp.java rename to navigation/src/main/java/ru/touchin/roboswag/components/navigation/TouchinApp.java index 54ca007..49f4047 100644 --- a/templates/src/main/java/ru/touchin/templates/TouchinApp.java +++ b/navigation/src/main/java/ru/touchin/roboswag/components/navigation/TouchinApp.java @@ -17,14 +17,11 @@ * */ -package ru.touchin.templates; +package ru.touchin.roboswag.components.navigation; import android.app.Application; import android.content.Context; import android.os.StrictMode; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.multidex.MultiDex; import android.util.Log; import com.crashlytics.android.Crashlytics; @@ -34,6 +31,9 @@ import net.danlew.android.joda.JodaTimeAndroid; import java.util.ArrayList; import java.util.List; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.multidex.MultiDex; import io.fabric.sdk.android.Fabric; import ru.touchin.roboswag.core.log.ConsoleLogProcessor; import ru.touchin.roboswag.core.log.Lc; @@ -41,6 +41,7 @@ import ru.touchin.roboswag.core.log.LcGroup; import ru.touchin.roboswag.core.log.LcLevel; import ru.touchin.roboswag.core.log.LogProcessor; import ru.touchin.roboswag.core.utils.ShouldNotHappenException; +import ru.touchin.templates.ApiModel; /** * Created by Gavriil Sitnikov on 10/03/16. diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseActivity.kt b/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseActivity.kt index edf3dff..1897cc1 100644 --- a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseActivity.kt +++ b/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseActivity.kt @@ -21,6 +21,7 @@ package ru.touchin.roboswag.components.navigation.activities import android.content.Intent import android.os.Bundle +import android.os.PersistableBundle import androidx.appcompat.app.AppCompatActivity import ru.touchin.roboswag.components.navigation.keyboard_resizeable.KeyboardBehaviorDetector import ru.touchin.roboswag.components.navigation.viewcontrollers.LifecycleLoggingObserver @@ -41,6 +42,17 @@ abstract class BaseActivity : AppCompatActivity() { lifecycle.addObserver(LifecycleLoggingObserver()) } + override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { + super.onCreate(savedInstanceState, persistentState) + // Possible work around for market launches. See http://code.google.com/p/android/issues/detail?id=2373 + // for more details. Essentially, the market launches the main activity on top of other activities. + // we never want this to happen. Instead, we check if we are the root and if not, we finish. + if (!isTaskRoot && intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN == intent.action) { + Lc.e("Finishing activity as it is launcher but not root") + finish() + } + } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) LcGroup.UI_LIFECYCLE.i("${Lc.getCodePoint(this)} requestCode: $requestCode; resultCode: $resultCode") diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseNavigationActivity.kt b/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseNavigationActivity.kt new file mode 100644 index 0000000..29b7c2f --- /dev/null +++ b/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseNavigationActivity.kt @@ -0,0 +1,25 @@ +package ru.touchin.roboswag.components.navigation.activities + +import androidx.fragment.app.FragmentTransaction +import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewControllerNavigation + +/** + * Created by Daniil Borisovskii on 15/08/2019. + * Base activity with nested navigation. + */ +abstract class BaseNavigationActivity : BaseActivity() { + + protected abstract val fragmentContainerViewId: Int + + protected open val transition = FragmentTransaction.TRANSIT_NONE + + val navigation by lazy { + ViewControllerNavigation( + this, + supportFragmentManager, + fragmentContainerViewId, + transition + ) + } + +} diff --git a/tabbar-navigation/build.gradle b/tabbar-navigation/build.gradle index 8fce2f8..fb98a51 100644 --- a/tabbar-navigation/build.gradle +++ b/tabbar-navigation/build.gradle @@ -16,7 +16,6 @@ android { dependencies { api project(":navigation") - api project(":templates") implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationActivity.kt similarity index 52% rename from tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt rename to tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationActivity.kt index c58eaba..52ce0fe 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationActivity.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationActivity.kt @@ -1,28 +1,18 @@ package ru.touchin.roboswag.components.tabbarnavigation import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentTransaction -import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewControllerNavigation -import ru.touchin.templates.TouchinActivity +import ru.touchin.roboswag.components.navigation.activities.BaseNavigationActivity -abstract class BaseNavigationActivity : TouchinActivity() { - val navigation by lazy { - ViewControllerNavigation( - this, - supportFragmentManager, - fragmentContainerViewId, - transition - ) - } +/** + * Created by Daniil Borisovskii on 15/08/2019. + * Activity to manage tab container navigation. + */ +abstract class BottomNavigationActivity : BaseNavigationActivity() { val innerNavigation by lazy { getNavigationContainer(supportFragmentManager)?.navigation ?: navigation } - protected abstract val fragmentContainerViewId: Int - - protected open val transition = FragmentTransaction.TRANSIT_NONE - private fun getNavigationContainer(fragmentManager: FragmentManager?): NavigationContainerFragment? = fragmentManager ?.primaryNavigationFragment @@ -30,4 +20,5 @@ abstract class BaseNavigationActivity : TouchinActivity() { navigationFragment as? NavigationContainerFragment ?: getNavigationContainer(navigationFragment.childFragmentManager) } + } diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationFragment.kt similarity index 90% rename from tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt rename to tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationFragment.kt index 8c282a5..994f19c 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BaseNavigationFragment.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationFragment.kt @@ -10,7 +10,7 @@ import androidx.fragment.app.Fragment import ru.touchin.roboswag.components.navigation.activities.OnBackPressedListener import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewController -abstract class BaseNavigationFragment : Fragment() { +abstract class BottomNavigationFragment : Fragment() { private lateinit var bottomNavigationController: BottomNavigationController @@ -54,17 +54,17 @@ abstract class BaseNavigationFragment : Fragment() { bottomNavigationController.attach(fragmentView.findViewById(navigationContainerViewId)) - (activity as BaseNavigationActivity).addOnBackPressedListener(backPressedListener) + (activity as BottomNavigationActivity).addOnBackPressedListener(backPressedListener) return fragmentView } override fun onDestroyView() { super.onDestroyView() - (activity as BaseNavigationActivity).removeOnBackPressedListener(backPressedListener) + (activity as BottomNavigationActivity).removeOnBackPressedListener(backPressedListener) bottomNavigationController.detach() } - private fun getNavigationActivity() = requireActivity() as BaseNavigationActivity + private fun getNavigationActivity() = requireActivity() as BottomNavigationActivity } diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt index 4968aac..0754d7a 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt @@ -38,7 +38,7 @@ class NavigationContainerFragment : Fragment() { } val navigation by lazy { - ViewControllerNavigation( + ViewControllerNavigation( requireContext(), childFragmentManager, containerViewId, @@ -53,8 +53,8 @@ class NavigationContainerFragment : Fragment() { private var transition = 0 @Suppress("UNCHECKED_CAST") - fun getViewControllerClass(): Class> = - arguments?.getSerializable(VIEW_CONTROLLER_CLASS_ARG) as Class> + fun getViewControllerClass(): Class> = + arguments?.getSerializable(VIEW_CONTROLLER_CLASS_ARG) as Class> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/templates/.gitignore b/templates/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/templates/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/templates/build.gradle b/templates/build.gradle deleted file mode 100644 index 90b764f..0000000 --- a/templates/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -apply plugin: 'com.android.library' - -android { - compileSdkVersion versions.compileSdk - - defaultConfig { - minSdkVersion 16 - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } -} - -dependencies { - api project(":utils") - api project(":logging") - api project(":api-logansquare") - api project(":navigation") - - api 'androidx.multidex:multidex:2.0.1' - - api 'net.danlew:android.joda:2.9.9.4' - - implementation "androidx.appcompat:appcompat:$versions.appcompat" - - implementation("com.crashlytics.sdk.android:crashlytics:$versions.crashlytics@aar") { - transitive = true - } -} diff --git a/templates/src/main/AndroidManifest.xml b/templates/src/main/AndroidManifest.xml deleted file mode 100644 index ad64e1e..0000000 --- a/templates/src/main/AndroidManifest.xml +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/templates/src/main/java/ru/touchin/templates/TouchinActivity.java b/templates/src/main/java/ru/touchin/templates/TouchinActivity.java deleted file mode 100644 index 23d0ce0..0000000 --- a/templates/src/main/java/ru/touchin/templates/TouchinActivity.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2016 Touch Instinct - * - * This file is part of RoboSwag library. - * - * 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 ru.touchin.templates; - -import android.app.ActivityManager; -import android.content.Intent; -import android.os.Build; -import android.os.Bundle; -import androidx.annotation.ColorRes; -import androidx.annotation.DrawableRes; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; - -import ru.touchin.roboswag.components.navigation.activities.BaseActivity; -import ru.touchin.roboswag.core.log.Lc; - -/** - * Created by Gavriil Sitnikov on 11/03/16. - * Base class of activity to extends for Touch Instinct related projects. - */ -public abstract class TouchinActivity extends BaseActivity { - - @Override - protected void onCreate(@Nullable final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - // Possible work around for market launches. See http://code.google.com/p/android/issues/detail?id=2373 - // for more details. Essentially, the market launches the main activity on top of other activities. - // we never want this to happen. Instead, we check if we are the root and if not, we finish. - if (!isTaskRoot() && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(getIntent().getAction())) { - Lc.e("Finishing activity as it is launcher but not root"); - finish(); - } - } - - /** - * Setup task description of application for Android 5.0 and later. It is showing when user opens task bar. - * - * @param label Name of application to show in task bar; - * @param iconRes Icon of application to show in task bar; - * @param primaryColorRes Color of application to show in task bar. - */ - protected void setupTaskDescriptor(@NonNull final String label, @DrawableRes final int iconRes, @ColorRes final int primaryColorRes) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - final ActivityManager.TaskDescription taskDescription = new ActivityManager.TaskDescription(label, - iconRes, - ContextCompat.getColor(this, primaryColorRes)); - setTaskDescription(taskDescription); - } - } - -} From 3793a2c8d64c07c140f4726b4c0a6e81b46b4284 Mon Sep 17 00:00:00 2001 From: Daniil Borisovskii Date: Thu, 15 Aug 2019 16:43:32 +0300 Subject: [PATCH 12/14] Fixed according to https://github.com/TouchInstinct/RoboSwag/pull/45#discussion_r314291983 --- .../components/tabbarnavigation/BottomNavigationController.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt index 594c274..367a507 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt @@ -59,7 +59,7 @@ class BottomNavigationController( } } - fun detach() = callback?.let { fragmentManager.unregisterFragmentLifecycleCallbacks(it) } + fun detach() = callback?.let(fragmentManager::unregisterFragmentLifecycleCallbacks) fun navigateTo(@IdRes itemId: Int, state: Parcelable? = null) { // Find view controller class that needs to open @@ -76,7 +76,6 @@ class BottomNavigationController( val viewControllerName = viewControllerClass.canonicalName var fragment = fragmentManager.findFragmentByTag(viewControllerName) - //TODO: figure out do we need to remove exists fragment before instantiate him one more time if (fragment != null) { transaction.attach(fragment) } else { From 25b7d2a37563ec59027ad21540711097182a814d Mon Sep 17 00:00:00 2001 From: Daniil Borisovskii Date: Thu, 15 Aug 2019 19:22:52 +0300 Subject: [PATCH 13/14] Fixed according to https://github.com/TouchInstinct/RoboSwag/pull/45#discussion_r314369387 https://github.com/TouchInstinct/RoboSwag/pull/45#discussion_r314369878 https://github.com/TouchInstinct/RoboSwag/pull/45#discussion_r314370051 --- .../{BaseNavigationActivity.kt => NavigationActivity.kt} | 4 ++-- .../tabbarnavigation/BottomNavigationActivity.kt | 7 ++++--- .../tabbarnavigation/BottomNavigationController.kt | 2 +- .../tabbarnavigation/NavigationContainerFragment.kt | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) rename navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/{BaseNavigationActivity.kt => NavigationActivity.kt} (84%) diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseNavigationActivity.kt b/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/NavigationActivity.kt similarity index 84% rename from navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseNavigationActivity.kt rename to navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/NavigationActivity.kt index 29b7c2f..9f345ac 100644 --- a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseNavigationActivity.kt +++ b/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/NavigationActivity.kt @@ -7,14 +7,14 @@ import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewControllerN * Created by Daniil Borisovskii on 15/08/2019. * Base activity with nested navigation. */ -abstract class BaseNavigationActivity : BaseActivity() { +abstract class NavigationActivity : BaseActivity() { protected abstract val fragmentContainerViewId: Int protected open val transition = FragmentTransaction.TRANSIT_NONE val navigation by lazy { - ViewControllerNavigation( + ViewControllerNavigation( this, supportFragmentManager, fragmentContainerViewId, diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationActivity.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationActivity.kt index 52ce0fe..ea6383a 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationActivity.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationActivity.kt @@ -1,16 +1,17 @@ package ru.touchin.roboswag.components.tabbarnavigation import androidx.fragment.app.FragmentManager -import ru.touchin.roboswag.components.navigation.activities.BaseNavigationActivity +import ru.touchin.roboswag.components.navigation.activities.NavigationActivity +import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewControllerNavigation /** * Created by Daniil Borisovskii on 15/08/2019. * Activity to manage tab container navigation. */ -abstract class BottomNavigationActivity : BaseNavigationActivity() { +abstract class BottomNavigationActivity : NavigationActivity() { val innerNavigation by lazy { - getNavigationContainer(supportFragmentManager)?.navigation ?: navigation + getNavigationContainer(supportFragmentManager)?.navigation ?: navigation as ViewControllerNavigation } private fun getNavigationContainer(fragmentManager: FragmentManager?): NavigationContainerFragment? = diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt index 367a507..c84c4a5 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt @@ -103,7 +103,7 @@ class BottomNavigationController( currentViewControllerId = itemId } - // If current fragment top and it's not the top level view controller open to top level view controller + // When you are in any tab instead of main you firstly navigate to main tab before exit application fun onBackPressed() = if (fragmentManager.primaryNavigationFragment?.childFragmentManager?.backStackEntryCount == 0 && topLevelViewControllerId != 0 diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt index 0754d7a..10381bb 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt @@ -46,9 +46,9 @@ class NavigationContainerFragment : Fragment() { ) } - private var containerViewId = 0 + @IdRes private var containerViewId = 0 - private var containerLayoutId = 0 + @LayoutRes private var containerLayoutId = 0 private var transition = 0 From 7e916052fa9eca749494aecc2bc4e0838f5b2ee7 Mon Sep 17 00:00:00 2001 From: Daniil Borisovskii Date: Thu, 15 Aug 2019 20:01:40 +0300 Subject: [PATCH 14/14] Fixed according to https://github.com/TouchInstinct/RoboSwag/pull/45#discussion_r314403838 --- .../tabbarnavigation/NavigationContainerFragment.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt index 10381bb..565f3e1 100644 --- a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt +++ b/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt @@ -46,9 +46,11 @@ class NavigationContainerFragment : Fragment() { ) } - @IdRes private var containerViewId = 0 + @IdRes + private var containerViewId = 0 - @LayoutRes private var containerLayoutId = 0 + @LayoutRes + private var containerLayoutId = 0 private var transition = 0