From 5c4742c3934f0bb1c391ed8fb8fc1ee789578405 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 24 Apr 2020 19:14:27 +0300 Subject: [PATCH 01/14] navigation_new became navigation_base, tabbar navigation has appropriate postfix now --- lifecycle/build.gradle | 2 +- .../viewmodel/LifecycleViewModelProviders.kt | 2 +- .../.gitignore | 0 {navigation-new => navigation-base}/README.md | 0 .../build.gradle | 1 - .../src/main/AndroidManifest.xml | 2 +- .../navigation_base}/FragmentNavigation.kt | 40 +-- .../SimpleActionBarDrawerToggle.kt | 6 +- .../navigation_base}/TouchinApp.java | 2 +- .../activities/BaseActivity.kt | 6 +- .../activities/NavigationActivity.kt | 5 +- .../activities/OnBackPressedListener.java | 2 +- .../fragments/BaseFragment.kt | 5 +- .../navigation_base/fragments}/EmptyState.kt | 2 +- .../fragments}/LifecycleLoggingObserver.kt | 2 +- .../KeyboardBehaviorDetector.kt | 4 +- .../KeyboardResizeableFragment.kt | 8 +- .../.gitignore | 0 .../README.md | 0 .../build.gradle | 1 + .../src/main/AndroidManifest.xml | 2 +- .../fragments/ViewControllerFragment.kt | 6 +- .../KeyboardResizeableViewController.kt | 8 +- .../viewcontrollers/ViewController.kt | 5 +- .../ViewControllerNavigation.kt | 54 ++-- .../navigation/FragmentNavigation.kt | 244 ------------------ .../activities/NavigationActivity.kt | 25 -- .../.gitignore | 0 .../build.gradle | 2 +- .../src/main/AndroidManifest.xml | 2 + .../BottomNavigationActivity.kt | 6 +- .../BottomNavigationController.kt | 4 +- .../BottomNavigationFragment.kt | 6 +- .../NavigationContainerFragment.kt | 6 +- .../src/main/AndroidManifest.xml | 2 - .../.gitignore | 0 .../README.md | 0 .../build.gradle | 2 +- .../src/main/AndroidManifest.xml | 2 + .../BottomNavigationActivity.kt | 0 .../BottomNavigationController.kt | 0 .../BottomNavigationFragment.kt | 0 .../NavigationContainerFragment.kt | 0 .../src/main/AndroidManifest.xml | 2 - 44 files changed, 103 insertions(+), 365 deletions(-) rename {navigation-new => navigation-base}/.gitignore (100%) rename {navigation-new => navigation-base}/README.md (100%) rename {navigation-new => navigation-base}/build.gradle (97%) rename {navigation => navigation-base}/src/main/AndroidManifest.xml (53%) rename {navigation-new/src/main/java/ru/touchin/roboswag/components/navigation_new => navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base}/FragmentNavigation.kt (91%) rename {navigation/src/main/java/ru/touchin/roboswag/components/navigation => navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base}/SimpleActionBarDrawerToggle.kt (96%) rename {navigation/src/main/java/ru/touchin/roboswag/components/navigation => navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base}/TouchinApp.java (99%) rename {navigation/src/main/java/ru/touchin/roboswag/components/navigation => navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base}/activities/BaseActivity.kt (93%) rename {navigation-new/src/main/java/ru/touchin/roboswag/components/navigation_new => navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base}/activities/NavigationActivity.kt (72%) rename {navigation/src/main/java/ru/touchin/roboswag/components/navigation => navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base}/activities/OnBackPressedListener.java (52%) rename {navigation-new/src/main/java/ru/touchin/roboswag/components/navigation_new => navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base}/fragments/BaseFragment.kt (94%) rename {navigation/src/main/java/ru/touchin/roboswag/components/navigation/viewcontrollers => navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments}/EmptyState.kt (86%) rename {navigation/src/main/java/ru/touchin/roboswag/components/navigation/viewcontrollers => navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments}/LifecycleLoggingObserver.kt (95%) rename {navigation/src/main/java/ru/touchin/roboswag/components/navigation => navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base}/keyboard_resizeable/KeyboardBehaviorDetector.kt (91%) rename {navigation-new/src/main/java/ru/touchin/roboswag/components/navigation_new => navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base}/keyboard_resizeable/KeyboardResizeableFragment.kt (88%) rename {navigation => navigation-viewcontroller}/.gitignore (100%) rename {navigation => navigation-viewcontroller}/README.md (100%) rename {navigation => navigation-viewcontroller}/build.gradle (95%) rename {navigation-new => navigation-viewcontroller}/src/main/AndroidManifest.xml (50%) rename {navigation/src/main/java/ru/touchin/roboswag/components/navigation => navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller}/fragments/ViewControllerFragment.kt (97%) rename {navigation/src/main/java/ru/touchin/roboswag/components/navigation => navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller}/keyboard_resizeable/KeyboardResizeableViewController.kt (87%) rename {navigation/src/main/java/ru/touchin/roboswag/components/navigation => navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller}/viewcontrollers/ViewController.kt (97%) rename {navigation/src/main/java/ru/touchin/roboswag/components/navigation => navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller}/viewcontrollers/ViewControllerNavigation.kt (80%) delete mode 100644 navigation/src/main/java/ru/touchin/roboswag/components/navigation/FragmentNavigation.kt delete mode 100644 navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/NavigationActivity.kt rename {tabbar-navigation-new => tabbar-navigation-fragment}/.gitignore (100%) rename {tabbar-navigation-new => tabbar-navigation-fragment}/build.gradle (93%) create mode 100644 tabbar-navigation-fragment/src/main/AndroidManifest.xml rename {tabbar-navigation-new/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_new => tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment}/BottomNavigationActivity.kt (87%) rename {tabbar-navigation-new/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_new => tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment}/BottomNavigationController.kt (97%) rename {tabbar-navigation-new/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_new => tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment}/BottomNavigationFragment.kt (92%) rename {tabbar-navigation-new/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_new => tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment}/NavigationContainerFragment.kt (92%) delete mode 100644 tabbar-navigation-new/src/main/AndroidManifest.xml rename {tabbar-navigation => tabbar-navigation-viewcontroller}/.gitignore (100%) rename {tabbar-navigation => tabbar-navigation-viewcontroller}/README.md (100%) rename {tabbar-navigation => tabbar-navigation-viewcontroller}/build.gradle (92%) create mode 100644 tabbar-navigation-viewcontroller/src/main/AndroidManifest.xml rename {tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation => tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller}/BottomNavigationActivity.kt (100%) rename {tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation => tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller}/BottomNavigationController.kt (100%) rename {tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation => tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller}/BottomNavigationFragment.kt (100%) rename {tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation => tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller}/NavigationContainerFragment.kt (100%) delete mode 100644 tabbar-navigation/src/main/AndroidManifest.xml diff --git a/lifecycle/build.gradle b/lifecycle/build.gradle index f67ddbe..2ad19c2 100644 --- a/lifecycle/build.gradle +++ b/lifecycle/build.gradle @@ -19,7 +19,7 @@ android { } dependencies { - api project(":navigation") + api project(":navigation-viewcontroller") compileOnly "javax.inject:javax.inject:1" diff --git a/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/LifecycleViewModelProviders.kt b/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/LifecycleViewModelProviders.kt index ae3c610..f49d498 100644 --- a/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/LifecycleViewModelProviders.kt +++ b/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/LifecycleViewModelProviders.kt @@ -6,7 +6,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProviders import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity -import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewController +import ru.touchin.roboswag.components.navigation_viewcontroller.viewcontrollers.ViewController object LifecycleViewModelProviders { diff --git a/navigation-new/.gitignore b/navigation-base/.gitignore similarity index 100% rename from navigation-new/.gitignore rename to navigation-base/.gitignore diff --git a/navigation-new/README.md b/navigation-base/README.md similarity index 100% rename from navigation-new/README.md rename to navigation-base/README.md diff --git a/navigation-new/build.gradle b/navigation-base/build.gradle similarity index 97% rename from navigation-new/build.gradle rename to navigation-base/build.gradle index c53d4a0..8d3b8e9 100644 --- a/navigation-new/build.gradle +++ b/navigation-base/build.gradle @@ -18,7 +18,6 @@ android { dependencies { api project(":utils") api project(":logging") - api project(":navigation") api project(":api-logansquare") api 'androidx.multidex:multidex:2.0.1' diff --git a/navigation/src/main/AndroidManifest.xml b/navigation-base/src/main/AndroidManifest.xml similarity index 53% rename from navigation/src/main/AndroidManifest.xml rename to navigation-base/src/main/AndroidManifest.xml index bd2d3ee..74b4a83 100644 --- a/navigation/src/main/AndroidManifest.xml +++ b/navigation-base/src/main/AndroidManifest.xml @@ -1,3 +1,3 @@ + package="ru.touchin.roboswag.components.navigation_base"/> diff --git a/navigation-new/src/main/java/ru/touchin/roboswag/components/navigation_new/FragmentNavigation.kt b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/FragmentNavigation.kt similarity index 91% rename from navigation-new/src/main/java/ru/touchin/roboswag/components/navigation_new/FragmentNavigation.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/FragmentNavigation.kt index 8ef56cf..42dfca8 100644 --- a/navigation-new/src/main/java/ru/touchin/roboswag/components/navigation_new/FragmentNavigation.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/FragmentNavigation.kt @@ -17,7 +17,7 @@ * */ -package ru.touchin.roboswag.components.navigation_new +package ru.touchin.roboswag.components.navigation_base import android.content.Context import android.os.Bundle @@ -28,8 +28,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction import ru.touchin.roboswag.core.log.Lc -import ru.touchin.roboswag.components.navigation_new.fragments.BaseFragment -import ru.touchin.roboswag.components.navigation.viewcontrollers.EmptyState +import ru.touchin.roboswag.components.navigation_base.fragments.BaseFragment import kotlin.reflect.KClass /** @@ -96,6 +95,7 @@ open class FragmentNavigation( addToStack: Boolean, args: Bundle?, backStackName: String?, + tag: String?, transactionSetup: ((FragmentTransaction) -> Unit)? ) { if (fragmentManager.isDestroyed) { @@ -108,7 +108,7 @@ open class FragmentNavigation( val fragmentTransaction = fragmentManager.beginTransaction() transactionSetup?.invoke(fragmentTransaction) - fragmentTransaction.replace(containerViewId, fragment, null) + fragmentTransaction.replace(containerViewId, fragment, tag) if (addToStack) { fragmentTransaction .addToBackStack(backStackName) @@ -155,9 +155,10 @@ open class FragmentNavigation( args: Bundle? = null, addToStack: Boolean = true, backStackName: String? = null, + tag: String? = null, transactionSetup: ((FragmentTransaction) -> Unit)? = null ) { - addToStack(fragmentClass, null, 0, addToStack, args, backStackName, transactionSetup) + addToStack(fragmentClass, null, 0, addToStack, args, backStackName, tag, transactionSetup) } /** @@ -167,14 +168,15 @@ open class FragmentNavigation( * @param state State of instantiated [Fragment]; * @param transactionSetup Function to setup transaction before commit. It is useful to specify transition animations or additional info. */ - fun push( + fun push( fragmentClass: KClass>, - state: T? = null, + state: T, addToStack: Boolean = true, backStackName: String? = null, + tag: String? = null, transactionSetup: ((FragmentTransaction) -> Unit)? = null ) { - push(fragmentClass.java, BaseFragment.args(state ?: EmptyState), addToStack, backStackName, transactionSetup) + push(fragmentClass.java, BaseFragment.args(state), addToStack, backStackName, tag, transactionSetup) } /** @@ -190,6 +192,7 @@ open class FragmentNavigation( targetFragment: Fragment, targetRequestCode: Int, args: Bundle? = null, + tag: String? = null, transactionSetup: ((FragmentTransaction) -> Unit)? = null ) { addToStack( @@ -199,6 +202,7 @@ open class FragmentNavigation( true, args, null, + tag, transactionSetup ) } @@ -211,14 +215,15 @@ open class FragmentNavigation( * @param state State of instantiated [Fragment]; * @param transactionSetup Function to setup transaction before commit. It is useful to specify transition animations or additional info. */ - fun pushForResult( + fun pushForResult( fragmentClass: KClass>, targetFragment: Fragment, targetRequestCode: Int, - state: T? = null, + state: T, + tag: String? = null, transactionSetup: ((FragmentTransaction) -> Unit)? = null ) { - pushForResult(fragmentClass.java, targetFragment, targetRequestCode, BaseFragment.args(state ?: EmptyState), transactionSetup) + pushForResult(fragmentClass.java, targetFragment, targetRequestCode, BaseFragment.args(state), tag, transactionSetup) } /** @@ -233,9 +238,10 @@ open class FragmentNavigation( fragmentClass: Class, args: Bundle? = null, addToStack: Boolean = true, + tag: String? = null, transactionSetup: ((FragmentTransaction) -> Unit)? = null ) { - addToStack(fragmentClass, null, 0, addToStack, args, TOP_FRAGMENT_TAG_MARK, transactionSetup) + addToStack(fragmentClass, null, 0, addToStack, args, TOP_FRAGMENT_TAG_MARK, tag, transactionSetup) } /** @@ -249,10 +255,11 @@ open class FragmentNavigation( fun setInitial( fragmentClass: Class, args: Bundle? = null, + tag: String? = null, transactionSetup: ((FragmentTransaction) -> Unit)? = null ) { beforeSetInitialActions() - setAsTop(fragmentClass, args, false, transactionSetup) + setAsTop(fragmentClass, args, false, tag, transactionSetup) } /** @@ -262,13 +269,14 @@ open class FragmentNavigation( * @param state State of instantiated [Fragment]; * @param transactionSetup Function to setup transaction before commit. It is useful to specify transition animations or additional info. */ - fun setInitial( + fun setInitial( fragmentClass: KClass>, - state: T? = null, + state: T, + tag: String? = null, transactionSetup: ((FragmentTransaction) -> Unit)? = null ) { beforeSetInitialActions() - setAsTop(fragmentClass.java, BaseFragment.args(state ?: EmptyState), false, transactionSetup) + setAsTop(fragmentClass.java, BaseFragment.args(state), false, tag, transactionSetup) } /** diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/SimpleActionBarDrawerToggle.kt b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/SimpleActionBarDrawerToggle.kt similarity index 96% rename from navigation/src/main/java/ru/touchin/roboswag/components/navigation/SimpleActionBarDrawerToggle.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/SimpleActionBarDrawerToggle.kt index 79d417c..00c5ecb 100644 --- a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/SimpleActionBarDrawerToggle.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/SimpleActionBarDrawerToggle.kt @@ -17,7 +17,7 @@ * */ -package ru.touchin.roboswag.components.navigation +package ru.touchin.roboswag.components.navigation_base import android.animation.ValueAnimator import android.view.MenuItem @@ -25,8 +25,8 @@ import android.view.View import androidx.appcompat.app.ActionBarDrawerToggle import androidx.drawerlayout.widget.DrawerLayout import androidx.fragment.app.FragmentManager -import ru.touchin.roboswag.components.navigation.activities.BaseActivity -import ru.touchin.roboswag.components.navigation.activities.OnBackPressedListener +import ru.touchin.roboswag.components.navigation_base.activities.BaseActivity +import ru.touchin.roboswag.components.navigation_base.activities.OnBackPressedListener import ru.touchin.roboswag.components.utils.UiUtils /** diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/TouchinApp.java b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/TouchinApp.java similarity index 99% rename from navigation/src/main/java/ru/touchin/roboswag/components/navigation/TouchinApp.java rename to navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/TouchinApp.java index 49f4047..88bc813 100644 --- a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/TouchinApp.java +++ b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/TouchinApp.java @@ -17,7 +17,7 @@ * */ -package ru.touchin.roboswag.components.navigation; +package ru.touchin.roboswag.components.navigation_base; import android.app.Application; import android.content.Context; diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseActivity.kt b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/BaseActivity.kt similarity index 93% rename from navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseActivity.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/BaseActivity.kt index 10cc05e..af047ab 100644 --- a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/BaseActivity.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/BaseActivity.kt @@ -17,7 +17,7 @@ * */ -package ru.touchin.roboswag.components.navigation.activities +package ru.touchin.roboswag.components.navigation_base.activities import android.content.Context import android.content.Intent @@ -26,8 +26,8 @@ import android.os.Bundle import android.os.PersistableBundle import android.view.WindowManager import androidx.appcompat.app.AppCompatActivity -import ru.touchin.roboswag.components.navigation.keyboard_resizeable.KeyboardBehaviorDetector -import ru.touchin.roboswag.components.navigation.viewcontrollers.LifecycleLoggingObserver +import ru.touchin.roboswag.components.navigation_viewcontroller.keyboard_resizeable.KeyboardBehaviorDetector +import ru.touchin.roboswag.components.navigation_base.fragments.LifecycleLoggingObserver import ru.touchin.roboswag.core.log.Lc import ru.touchin.roboswag.core.log.LcGroup diff --git a/navigation-new/src/main/java/ru/touchin/roboswag/components/navigation_new/activities/NavigationActivity.kt b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/NavigationActivity.kt similarity index 72% rename from navigation-new/src/main/java/ru/touchin/roboswag/components/navigation_new/activities/NavigationActivity.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/NavigationActivity.kt index 39f6d35..a157813 100644 --- a/navigation-new/src/main/java/ru/touchin/roboswag/components/navigation_new/activities/NavigationActivity.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/NavigationActivity.kt @@ -1,8 +1,7 @@ -package ru.touchin.roboswag.components.navigation_new.activities +package ru.touchin.roboswag.components.navigation_base.activities import androidx.fragment.app.FragmentTransaction -import ru.touchin.roboswag.components.navigation.activities.BaseActivity -import ru.touchin.roboswag.components.navigation_new.FragmentNavigation +import ru.touchin.roboswag.components.navigation_base.FragmentNavigation /** * Created by Daniil Borisovskii on 15/08/2019. diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/OnBackPressedListener.java b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/OnBackPressedListener.java similarity index 52% rename from navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/OnBackPressedListener.java rename to navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/OnBackPressedListener.java index de5d318..1cf02ab 100644 --- a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/OnBackPressedListener.java +++ b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/OnBackPressedListener.java @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.navigation.activities; +package ru.touchin.roboswag.components.navigation_base.activities; public interface OnBackPressedListener { diff --git a/navigation-new/src/main/java/ru/touchin/roboswag/components/navigation_new/fragments/BaseFragment.kt b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/BaseFragment.kt similarity index 94% rename from navigation-new/src/main/java/ru/touchin/roboswag/components/navigation_new/fragments/BaseFragment.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/BaseFragment.kt index 830952a..e99477a 100644 --- a/navigation-new/src/main/java/ru/touchin/roboswag/components/navigation_new/fragments/BaseFragment.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/BaseFragment.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.navigation_new.fragments +package ru.touchin.roboswag.components.navigation_base.fragments import android.content.Context import android.content.res.ColorStateList @@ -17,8 +17,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import butterknife.ButterKnife import butterknife.Unbinder -import ru.touchin.roboswag.components.navigation_new.BuildConfig -import ru.touchin.roboswag.components.navigation.viewcontrollers.LifecycleLoggingObserver +import ru.touchin.roboswag.components.navigation_base.BuildConfig open class BaseFragment(@LayoutRes layoutRes: Int) : Fragment(layoutRes) { diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/viewcontrollers/EmptyState.kt b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/EmptyState.kt similarity index 86% rename from navigation/src/main/java/ru/touchin/roboswag/components/navigation/viewcontrollers/EmptyState.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/EmptyState.kt index 12424bc..fcac033 100644 --- a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/viewcontrollers/EmptyState.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/EmptyState.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.navigation.viewcontrollers +package ru.touchin.roboswag.components.navigation_base.fragments import android.os.Parcel import android.os.Parcelable diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/viewcontrollers/LifecycleLoggingObserver.kt b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/LifecycleLoggingObserver.kt similarity index 95% rename from navigation/src/main/java/ru/touchin/roboswag/components/navigation/viewcontrollers/LifecycleLoggingObserver.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/LifecycleLoggingObserver.kt index 43ef959..631d9fd 100644 --- a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/viewcontrollers/LifecycleLoggingObserver.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/LifecycleLoggingObserver.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.navigation.viewcontrollers +package ru.touchin.roboswag.components.navigation_base.fragments import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleObserver diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/keyboard_resizeable/KeyboardBehaviorDetector.kt b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt similarity index 91% rename from navigation/src/main/java/ru/touchin/roboswag/components/navigation/keyboard_resizeable/KeyboardBehaviorDetector.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt index e7faad3..4081118 100644 --- a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/keyboard_resizeable/KeyboardBehaviorDetector.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt @@ -1,11 +1,11 @@ -package ru.touchin.roboswag.components.navigation.keyboard_resizeable +package ru.touchin.roboswag.components.navigation_viewcontroller.keyboard_resizeable import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.OnLifecycleEvent -import ru.touchin.roboswag.components.navigation.activities.BaseActivity +import ru.touchin.roboswag.components.navigation_base.activities.BaseActivity /** * This detector NOT detect landscape fullscreen keyboard diff --git a/navigation-new/src/main/java/ru/touchin/roboswag/components/navigation_new/keyboard_resizeable/KeyboardResizeableFragment.kt b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt similarity index 88% rename from navigation-new/src/main/java/ru/touchin/roboswag/components/navigation_new/keyboard_resizeable/KeyboardResizeableFragment.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt index 7b03ce2..b9d4dec 100644 --- a/navigation-new/src/main/java/ru/touchin/roboswag/components/navigation_new/keyboard_resizeable/KeyboardResizeableFragment.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.navigation_new.keyboard_resizeable +package ru.touchin.roboswag.components.navigation_base.keyboard_resizeable import android.os.Build import android.os.Bundle @@ -6,9 +6,9 @@ import android.os.Parcelable import android.view.View import androidx.annotation.LayoutRes import androidx.lifecycle.LifecycleObserver -import ru.touchin.roboswag.components.navigation.activities.BaseActivity -import ru.touchin.roboswag.components.navigation.activities.OnBackPressedListener -import ru.touchin.roboswag.components.navigation_new.fragments.BaseFragment +import ru.touchin.roboswag.components.navigation_base.activities.BaseActivity +import ru.touchin.roboswag.components.navigation_base.activities.OnBackPressedListener +import ru.touchin.roboswag.components.navigation_base.fragments.BaseFragment import ru.touchin.roboswag.components.utils.UiUtils abstract class KeyboardResizeableFragment( diff --git a/navigation/.gitignore b/navigation-viewcontroller/.gitignore similarity index 100% rename from navigation/.gitignore rename to navigation-viewcontroller/.gitignore diff --git a/navigation/README.md b/navigation-viewcontroller/README.md similarity index 100% rename from navigation/README.md rename to navigation-viewcontroller/README.md diff --git a/navigation/build.gradle b/navigation-viewcontroller/build.gradle similarity index 95% rename from navigation/build.gradle rename to navigation-viewcontroller/build.gradle index e70ea8f..dd1ac36 100644 --- a/navigation/build.gradle +++ b/navigation-viewcontroller/build.gradle @@ -19,6 +19,7 @@ dependencies { api project(":utils") api project(":logging") api project(":api-logansquare") + api project(":navigation-base") api 'androidx.multidex:multidex:2.0.1' diff --git a/navigation-new/src/main/AndroidManifest.xml b/navigation-viewcontroller/src/main/AndroidManifest.xml similarity index 50% rename from navigation-new/src/main/AndroidManifest.xml rename to navigation-viewcontroller/src/main/AndroidManifest.xml index 93721cf..b0f6ab4 100644 --- a/navigation-new/src/main/AndroidManifest.xml +++ b/navigation-viewcontroller/src/main/AndroidManifest.xml @@ -1,3 +1,3 @@ + package="ru.touchin.roboswag.components.navigation_viewcontroller"/> diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/fragments/ViewControllerFragment.kt b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/fragments/ViewControllerFragment.kt similarity index 97% rename from navigation/src/main/java/ru/touchin/roboswag/components/navigation/fragments/ViewControllerFragment.kt rename to navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/fragments/ViewControllerFragment.kt index 21a2f33..63e75df 100644 --- a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/fragments/ViewControllerFragment.kt +++ b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/fragments/ViewControllerFragment.kt @@ -17,7 +17,7 @@ * */ -package ru.touchin.roboswag.components.navigation.fragments +package ru.touchin.roboswag.components.navigation_viewcontroller.fragments import android.animation.Animator import android.annotation.SuppressLint @@ -35,8 +35,8 @@ import android.view.animation.Animation import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.lifecycle.Lifecycle -import ru.touchin.roboswag.components.navigation.BuildConfig -import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewController +import ru.touchin.roboswag.components.navigation_viewcontroller.BuildConfig +import ru.touchin.roboswag.components.navigation_viewcontroller.viewcontrollers.ViewController /** * Created by Gavriil Sitnikov on 21/10/2015. diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/keyboard_resizeable/KeyboardResizeableViewController.kt b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/keyboard_resizeable/KeyboardResizeableViewController.kt similarity index 87% rename from navigation/src/main/java/ru/touchin/roboswag/components/navigation/keyboard_resizeable/KeyboardResizeableViewController.kt rename to navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/keyboard_resizeable/KeyboardResizeableViewController.kt index 24d935e..930ee38 100644 --- a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/keyboard_resizeable/KeyboardResizeableViewController.kt +++ b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/keyboard_resizeable/KeyboardResizeableViewController.kt @@ -1,13 +1,13 @@ -package ru.touchin.roboswag.components.navigation.keyboard_resizeable +package ru.touchin.roboswag.components.navigation_viewcontroller.keyboard_resizeable import android.os.Build import android.os.Parcelable import androidx.annotation.CallSuper import androidx.annotation.LayoutRes import androidx.lifecycle.LifecycleObserver -import ru.touchin.roboswag.components.navigation.activities.BaseActivity -import ru.touchin.roboswag.components.navigation.activities.OnBackPressedListener -import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewController +import ru.touchin.roboswag.components.navigation_base.activities.BaseActivity +import ru.touchin.roboswag.components.navigation_base.activities.OnBackPressedListener +import ru.touchin.roboswag.components.navigation_viewcontroller.viewcontrollers.ViewController import ru.touchin.roboswag.components.utils.UiUtils abstract class KeyboardResizeableViewController( diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/viewcontrollers/ViewController.kt b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/viewcontrollers/ViewController.kt similarity index 97% rename from navigation/src/main/java/ru/touchin/roboswag/components/navigation/viewcontrollers/ViewController.kt rename to navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/viewcontrollers/ViewController.kt index 3a47352..0dca42a 100644 --- a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/viewcontrollers/ViewController.kt +++ b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/viewcontrollers/ViewController.kt @@ -17,7 +17,7 @@ * */ -package ru.touchin.roboswag.components.navigation.viewcontrollers +package ru.touchin.roboswag.components.navigation_viewcontroller.viewcontrollers import android.animation.Animator import android.content.Intent @@ -44,7 +44,8 @@ import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentTransaction import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner -import ru.touchin.roboswag.components.navigation.fragments.ViewControllerFragment +import ru.touchin.roboswag.components.navigation_viewcontroller.fragments.ViewControllerFragment +import ru.touchin.roboswag.components.navigation_base.fragments.LifecycleLoggingObserver import ru.touchin.roboswag.components.utils.UiUtils /** diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/viewcontrollers/ViewControllerNavigation.kt b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/viewcontrollers/ViewControllerNavigation.kt similarity index 80% rename from navigation/src/main/java/ru/touchin/roboswag/components/navigation/viewcontrollers/ViewControllerNavigation.kt rename to navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/viewcontrollers/ViewControllerNavigation.kt index 97eeb3b..fe9c85d 100644 --- a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/viewcontrollers/ViewControllerNavigation.kt +++ b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/viewcontrollers/ViewControllerNavigation.kt @@ -17,7 +17,7 @@ * */ -package ru.touchin.roboswag.components.navigation.viewcontrollers +package ru.touchin.roboswag.components.navigation_viewcontroller.viewcontrollers import android.content.Context import android.os.Parcelable @@ -27,8 +27,8 @@ import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction -import ru.touchin.roboswag.components.navigation.FragmentNavigation -import ru.touchin.roboswag.components.navigation.fragments.ViewControllerFragment +import ru.touchin.roboswag.components.navigation_viewcontroller.fragments.ViewControllerFragment +import ru.touchin.roboswag.components.navigation_base.FragmentNavigation /** * Created by Gavriil Sitnikov on 07/03/2016. @@ -64,14 +64,14 @@ open class ViewControllerNavigation( transactionSetup: ((FragmentTransaction) -> Unit)? = null ) { addToStack( - ViewControllerFragment::class.java, - null, - 0, - addToStack, - ViewControllerFragment.args(viewControllerClass, state), - backStackName, - tag, - transactionSetup + fragmentClass = ViewControllerFragment::class.java, + targetFragment = null, + targetRequestCode = 0, + addToStack = addToStack, + args = ViewControllerFragment.args(viewControllerClass, state), + backStackName = backStackName, + tag = tag, + transactionSetup = transactionSetup ) } @@ -98,14 +98,14 @@ open class ViewControllerNavigation( transactionSetup: ((FragmentTransaction) -> Unit)? = null ) { addToStack( - ViewControllerFragment::class.java, - targetFragment, - targetRequestCode, - true, - ViewControllerFragment.args(viewControllerClass, state), - backStackName, - tag, - transactionSetup + fragmentClass = ViewControllerFragment::class.java, + targetFragment = targetFragment, + targetRequestCode = targetRequestCode, + addToStack = true, + args = ViewControllerFragment.args(viewControllerClass, state), + backStackName = backStackName, + tag = tag, + transactionSetup = transactionSetup ) } @@ -127,14 +127,14 @@ open class ViewControllerNavigation( transactionSetup: ((FragmentTransaction) -> Unit)? = null ) { addToStack( - ViewControllerFragment::class.java, - null, - 0, - addToStack, - ViewControllerFragment.args(viewControllerClass, state), - TOP_FRAGMENT_TAG_MARK, - tag, - transactionSetup + fragmentClass = ViewControllerFragment::class.java, + targetFragment = null, + targetRequestCode = 0, + addToStack = addToStack, + args = ViewControllerFragment.args(viewControllerClass, state), + backStackName = TOP_FRAGMENT_TAG_MARK, + tag = tag, + transactionSetup = transactionSetup ) } diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/FragmentNavigation.kt b/navigation/src/main/java/ru/touchin/roboswag/components/navigation/FragmentNavigation.kt deleted file mode 100644 index 2a0aa6a..0000000 --- a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/FragmentNavigation.kt +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (c) 2015 RoboSwag (Gavriil Sitnikov, Vsevolod Ivanov) - * - * 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.roboswag.components.navigation - -import android.content.Context -import android.os.Bundle -import android.view.MenuItem -import androidx.annotation.IdRes -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentTransaction -import ru.touchin.roboswag.core.log.Lc - -/** - * Created by Gavriil Sitnikov on 07/03/2016. - * Navigation which is controlling fragments on activity using [FragmentManager]. - * Basically there are 4 main actions to add fragments to activity. - * 1) [.setInitial] means to set fragment on top and remove all previously added fragments from stack; - * 2) [.push] means to simply add fragment on top of the stack; - * 3) [.setAsTop] means to push fragment on top of the stack with specific [.TOP_FRAGMENT_TAG_MARK] tag. - * It is useful to realize up/back navigation: if [.up] method will be called then stack will go to nearest fragment with TOP tag. - * If [.back] method will be called then stack will go to previous fragment. - * Usually such logic using to set as top fragments from sidebar and show hamburger when some of them appeared; - * 4) [.pushForResult] means to push fragment with target fragment. It is also adding [.WITH_TARGET_FRAGMENT_TAG_MARK] tag. - * Also if such up/back navigation logic is not OK then [.backTo] method could be used with any condition to back to. - * In that case in any stack-change method it is allowed to setup fragment transactions. - */ -open class FragmentNavigation( - private val context: Context, - private val fragmentManager: FragmentManager, - @IdRes private val containerViewId: Int, - private val transition: Int = FragmentTransaction.TRANSIT_FRAGMENT_OPEN -) { - - companion object { - const val TOP_FRAGMENT_TAG_MARK = "TOP_FRAGMENT" - } - - /** - * Returns if last fragment in stack is top (added by [.setAsTop] or [.setInitial]) like fragment from sidebar menu. - * - * @return True if last fragment on stack has TOP_FRAGMENT_TAG_MARK. - */ - fun isCurrentFragmentTop(): Boolean = if (fragmentManager.backStackEntryCount == 0) { - true - } else { - fragmentManager - .getBackStackEntryAt(fragmentManager.backStackEntryCount - 1) - .name - ?.contains(TOP_FRAGMENT_TAG_MARK) ?: false - } - - /** - * Allowed to react on [android.app.Activity]'s menu item selection. - * - * @param item Selected menu item; - * @return True if reaction fired. - */ - fun onOptionsItemSelected(item: MenuItem): Boolean = item.itemId == android.R.id.home && back() - - /** - * Base method which is adding fragment to stack. - * - * @param fragmentClass Class of [Fragment] to instantiate; - * @param targetFragment Target fragment to be set as [Fragment.getTargetFragment] of instantiated [Fragment]; - * @param addToStack Flag to add this transaction to the back stack; - * @param args Bundle to be set as [Fragment.getArguments] of instantiated [Fragment]; - * @param backStackName Name of [Fragment] in back stack; - * @param tag Optional tag name for the [Fragment]; - * @param transactionSetup Function to setup transaction before commit. It is useful to specify transition animations or additional info. - */ - fun addToStack( - fragmentClass: Class, - targetFragment: Fragment?, - targetRequestCode: Int, - addToStack: Boolean, - args: Bundle?, - backStackName: String?, - tag: String?, - transactionSetup: ((FragmentTransaction) -> Unit)? - ) { - if (fragmentManager.isDestroyed) { - Lc.assertion("FragmentManager is destroyed") - return - } - - val fragment = Fragment.instantiate(context, fragmentClass.name, args) - fragment.setTargetFragment(targetFragment, targetRequestCode) - - val fragmentTransaction = fragmentManager.beginTransaction() - transactionSetup?.invoke(fragmentTransaction) - fragmentTransaction.replace(containerViewId, fragment, tag) - if (addToStack) { - fragmentTransaction - .addToBackStack(backStackName) - .setTransition(transition) - } - fragmentTransaction - .setPrimaryNavigationFragment(fragment) - .commit() - } - - /** - * Simply calls [FragmentManager.popBackStack]. - * - * @return True if it have back to some entry in stack. - */ - fun back(): Boolean { - if (fragmentManager.backStackEntryCount >= 1) { - fragmentManager.popBackStack() - return true - } - return false - } - - /** - * Backs to fragment with specific [.TOP_FRAGMENT_TAG_MARK] tag. - * This tag is adding if fragment added to stack via [.setInitial] or [.setAsTop] methods. - * It can be used to create simple up/back navigation. - * - * @return True if it have back to some entry in stack. - */ - fun up(name: String? = null, inclusive: Boolean = false) { - fragmentManager.popBackStack(name, if (inclusive) FragmentManager.POP_BACK_STACK_INCLUSIVE else 0) - } - - /** - * Pushes [Fragment] on top of stack with specific arguments and transaction setup. - * - * @param fragmentClass Class of [Fragment] to instantiate; - * @param args Bundle to be set as [Fragment.getArguments] of instantiated [Fragment]; - * @param tag Optional tag name for the [Fragment]; - * @param transactionSetup Function to setup transaction before commit. It is useful to specify transition animations or additional info. - */ - fun push( - fragmentClass: Class, - args: Bundle? = null, - addToStack: Boolean = true, - backStackName: String? = null, - tag: String? = null, - transactionSetup: ((FragmentTransaction) -> Unit)? = null - ) { - addToStack(fragmentClass, null, 0, addToStack, args, backStackName, tag, transactionSetup) - } - - /** - * Pushes [Fragment] on top of stack with specific target fragment, arguments and transaction setup. - * - * @param fragmentClass Class of [Fragment] to instantiate; - * @param targetFragment Target fragment to be set as [Fragment.getTargetFragment] of instantiated [Fragment]; - * @param args Bundle to be set as [Fragment.getArguments] of instantiated [Fragment]; - * @param tag Optional tag name for the [Fragment]; - * @param transactionSetup Function to setup transaction before commit. It is useful to specify transition animations or additional info. - */ - fun pushForResult( - fragmentClass: Class, - targetFragment: Fragment, - targetRequestCode: Int, - args: Bundle? = null, - tag: String? = null, - transactionSetup: ((FragmentTransaction) -> Unit)? = null - ) { - addToStack( - fragmentClass, - targetFragment, - targetRequestCode, - true, - args, - null, - tag, - transactionSetup - ) - } - - /** - * Pushes [Fragment] on top of stack with specific transaction setup, arguments - * and with [.TOP_FRAGMENT_TAG_MARK] tag used for simple up/back navigation. - * - * @param fragmentClass Class of [Fragment] to instantiate; - * @param args Bundle to be set as [Fragment.getArguments] of instantiated [Fragment]; - * @param tag Optional tag name for the [Fragment]; - * @param transactionSetup Function to setup transaction before commit. It is useful to specify transition animations or additional info. - */ - fun setAsTop( - fragmentClass: Class, - args: Bundle? = null, - addToStack: Boolean = true, - tag: String? = null, - transactionSetup: ((FragmentTransaction) -> Unit)? = null - ) { - addToStack(fragmentClass, null, 0, addToStack, args, TOP_FRAGMENT_TAG_MARK, tag, transactionSetup) - } - - /** - * Pops all [Fragment]s and places new initial [Fragment] on top of stack with specific transaction setup and arguments. - * - * @param fragmentClass Class of [Fragment] to instantiate; - * @param args Bundle to be set as [Fragment.getArguments] of instantiated [Fragment]; - * @param tag Optional tag name for the [Fragment]; - * @param transactionSetup Function to setup transaction before commit. It is useful to specify transition animations or additional info. - */ - @JvmOverloads - fun setInitial( - fragmentClass: Class, - args: Bundle? = null, - tag: String? = null, - transactionSetup: ((FragmentTransaction) -> Unit)? = null - ) { - beforeSetInitialActions() - setAsTop(fragmentClass, args, false, tag, transactionSetup) - } - - /** - * Method calls every time before initial [Fragment] will be placed. - */ - protected fun beforeSetInitialActions() { - if (fragmentManager.isDestroyed) { - Lc.assertion("FragmentManager is destroyed") - return - } - - if (fragmentManager.backStackEntryCount > 0) { - fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) - } - } - -} diff --git a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/NavigationActivity.kt b/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/NavigationActivity.kt deleted file mode 100644 index 51e7cfc..0000000 --- a/navigation/src/main/java/ru/touchin/roboswag/components/navigation/activities/NavigationActivity.kt +++ /dev/null @@ -1,25 +0,0 @@ -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 NavigationActivity : BaseActivity() { - - protected abstract val fragmentContainerViewId: Int - - protected open val transition = FragmentTransaction.TRANSIT_NONE - - open val navigation by lazy { - ViewControllerNavigation( - this, - supportFragmentManager, - fragmentContainerViewId, - transition - ) - } - -} diff --git a/tabbar-navigation-new/.gitignore b/tabbar-navigation-fragment/.gitignore similarity index 100% rename from tabbar-navigation-new/.gitignore rename to tabbar-navigation-fragment/.gitignore diff --git a/tabbar-navigation-new/build.gradle b/tabbar-navigation-fragment/build.gradle similarity index 93% rename from tabbar-navigation-new/build.gradle rename to tabbar-navigation-fragment/build.gradle index a7e4bf3..1871f15 100644 --- a/tabbar-navigation-new/build.gradle +++ b/tabbar-navigation-fragment/build.gradle @@ -15,7 +15,7 @@ android { } dependencies { - api project(":navigation-new") + api project(":navigation-base") implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/tabbar-navigation-fragment/src/main/AndroidManifest.xml b/tabbar-navigation-fragment/src/main/AndroidManifest.xml new file mode 100644 index 0000000..fbf5f9f --- /dev/null +++ b/tabbar-navigation-fragment/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/tabbar-navigation-new/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_new/BottomNavigationActivity.kt b/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationActivity.kt similarity index 87% rename from tabbar-navigation-new/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_new/BottomNavigationActivity.kt rename to tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationActivity.kt index faf4c84..44d9516 100644 --- a/tabbar-navigation-new/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_new/BottomNavigationActivity.kt +++ b/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationActivity.kt @@ -1,10 +1,10 @@ -package ru.touchin.roboswag.components.tabbarnavigation_new +package ru.touchin.roboswag.components.tabbarnavigation_fragment import android.os.Parcelable import androidx.annotation.IdRes import androidx.fragment.app.FragmentManager -import ru.touchin.roboswag.components.navigation_new.activities.NavigationActivity -import ru.touchin.roboswag.components.navigation_new.FragmentNavigation +import ru.touchin.roboswag.components.navigation_base.activities.NavigationActivity +import ru.touchin.roboswag.components.navigation_base.FragmentNavigation /** * Created by Daniil Borisovskii on 15/08/2019. diff --git a/tabbar-navigation-new/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_new/BottomNavigationController.kt b/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationController.kt similarity index 97% rename from tabbar-navigation-new/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_new/BottomNavigationController.kt rename to tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationController.kt index f14504b..fc218f4 100644 --- a/tabbar-navigation-new/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_new/BottomNavigationController.kt +++ b/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationController.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.tabbarnavigation_new +package ru.touchin.roboswag.components.tabbarnavigation_fragment import android.content.Context import android.os.Bundle @@ -12,7 +12,7 @@ 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_new.fragments.BaseFragment +import ru.touchin.roboswag.components.navigation_base.fragments.BaseFragment import ru.touchin.roboswag.core.utils.ShouldNotHappenException class BottomNavigationController( diff --git a/tabbar-navigation-new/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_new/BottomNavigationFragment.kt b/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationFragment.kt similarity index 92% rename from tabbar-navigation-new/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_new/BottomNavigationFragment.kt rename to tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationFragment.kt index cb204f3..c5ee281 100644 --- a/tabbar-navigation-new/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_new/BottomNavigationFragment.kt +++ b/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationFragment.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.tabbarnavigation_new +package ru.touchin.roboswag.components.tabbarnavigation_fragment import android.os.Bundle import android.os.Parcelable @@ -8,8 +8,8 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.IdRes import androidx.fragment.app.Fragment -import ru.touchin.roboswag.components.navigation.activities.OnBackPressedListener -import ru.touchin.roboswag.components.navigation_new.fragments.BaseFragment +import ru.touchin.roboswag.components.navigation_base.activities.OnBackPressedListener +import ru.touchin.roboswag.components.navigation_base.fragments.BaseFragment abstract class BottomNavigationFragment : Fragment() { diff --git a/tabbar-navigation-new/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_new/NavigationContainerFragment.kt b/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/NavigationContainerFragment.kt similarity index 92% rename from tabbar-navigation-new/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_new/NavigationContainerFragment.kt rename to tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/NavigationContainerFragment.kt index 3d9e5a9..3326f5d 100644 --- a/tabbar-navigation-new/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_new/NavigationContainerFragment.kt +++ b/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/NavigationContainerFragment.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.tabbarnavigation_new +package ru.touchin.roboswag.components.tabbarnavigation_fragment import android.os.Bundle import android.os.Parcelable @@ -9,8 +9,8 @@ import androidx.annotation.IdRes import androidx.annotation.LayoutRes import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentTransaction -import ru.touchin.roboswag.components.navigation_new.FragmentNavigation -import ru.touchin.roboswag.components.navigation_new.fragments.BaseFragment +import ru.touchin.roboswag.components.navigation_base.FragmentNavigation +import ru.touchin.roboswag.components.navigation_base.fragments.BaseFragment import ru.touchin.roboswag.core.utils.ShouldNotHappenException class NavigationContainerFragment : Fragment() { diff --git a/tabbar-navigation-new/src/main/AndroidManifest.xml b/tabbar-navigation-new/src/main/AndroidManifest.xml deleted file mode 100644 index 07f130a..0000000 --- a/tabbar-navigation-new/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - diff --git a/tabbar-navigation/.gitignore b/tabbar-navigation-viewcontroller/.gitignore similarity index 100% rename from tabbar-navigation/.gitignore rename to tabbar-navigation-viewcontroller/.gitignore diff --git a/tabbar-navigation/README.md b/tabbar-navigation-viewcontroller/README.md similarity index 100% rename from tabbar-navigation/README.md rename to tabbar-navigation-viewcontroller/README.md diff --git a/tabbar-navigation/build.gradle b/tabbar-navigation-viewcontroller/build.gradle similarity index 92% rename from tabbar-navigation/build.gradle rename to tabbar-navigation-viewcontroller/build.gradle index fb98a51..1e40362 100644 --- a/tabbar-navigation/build.gradle +++ b/tabbar-navigation-viewcontroller/build.gradle @@ -15,7 +15,7 @@ android { } dependencies { - api project(":navigation") + api project(":navigation-viewcontroller") implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/tabbar-navigation-viewcontroller/src/main/AndroidManifest.xml b/tabbar-navigation-viewcontroller/src/main/AndroidManifest.xml new file mode 100644 index 0000000..7c7d821 --- /dev/null +++ b/tabbar-navigation-viewcontroller/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationActivity.kt b/tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationActivity.kt similarity index 100% rename from tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationActivity.kt rename to tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationActivity.kt diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt b/tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationController.kt similarity index 100% rename from tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationController.kt rename to tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationController.kt diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationFragment.kt b/tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationFragment.kt similarity index 100% rename from tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/BottomNavigationFragment.kt rename to tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationFragment.kt diff --git a/tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt b/tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/NavigationContainerFragment.kt similarity index 100% rename from tabbar-navigation/src/main/java/ru/touchin/roboswag/components/tabbarnavigation/NavigationContainerFragment.kt rename to tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/NavigationContainerFragment.kt diff --git a/tabbar-navigation/src/main/AndroidManifest.xml b/tabbar-navigation/src/main/AndroidManifest.xml deleted file mode 100644 index 9437bbd..0000000 --- a/tabbar-navigation/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - From 7cd318cc74b09f86cf4d67e5cc79488c16e7ccf4 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 27 Apr 2020 12:45:15 +0300 Subject: [PATCH 02/14] merge fix --- .../components/navigation_base/fragments/BaseFragment.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/BaseFragment.kt b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/BaseFragment.kt index 07c653e..beb9369 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/BaseFragment.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/BaseFragment.kt @@ -16,7 +16,6 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import ru.touchin.roboswag.components.navigation_base.BuildConfig -import ru.touchin.roboswag.components.navigation_base.LifecycleLoggingObserver open class BaseFragment(@LayoutRes layoutRes: Int) : Fragment(layoutRes) { From 263ac4d6599673c494b35c412ee0dc4d4319592b Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 27 Apr 2020 16:34:45 +0300 Subject: [PATCH 03/14] removed `components` middle package --- navigation-base/src/main/AndroidManifest.xml | 4 +--- .../navigation_base/FragmentNavigation.kt | 4 ++-- .../navigation_base/SimpleActionBarDrawerToggle.kt | 6 +++--- .../{components => }/navigation_base/TouchinApp.java | 2 +- .../navigation_base/activities/BaseActivity.kt | 4 ++-- .../navigation_base/activities/NavigationActivity.kt | 4 ++-- .../navigation_base/activities/OnBackPressedListener.java | 2 +- .../navigation_base/fragments/BaseFragment.kt | 4 ++-- .../navigation_base/fragments/EmptyState.kt | 2 +- .../navigation_base/fragments/LifecycleLoggingObserver.kt | 2 +- .../keyboard_resizeable/KeyboardBehaviorDetector.kt | 2 +- .../keyboard_resizeable/KeyboardResizeableFragment.kt | 8 ++++---- .../KeyboardResizeableViewController.kt | 4 ++-- .../viewcontrollers/ViewController.kt | 2 +- .../viewcontrollers/ViewControllerNavigation.kt | 2 +- .../tabbarnavigation_fragment/BottomNavigationActivity.kt | 4 ++-- .../BottomNavigationController.kt | 2 +- .../tabbarnavigation_fragment/BottomNavigationFragment.kt | 4 ++-- .../NavigationContainerFragment.kt | 4 ++-- 19 files changed, 32 insertions(+), 34 deletions(-) rename navigation-base/src/main/java/ru/touchin/roboswag/{components => }/navigation_base/FragmentNavigation.kt (98%) rename navigation-base/src/main/java/ru/touchin/roboswag/{components => }/navigation_base/SimpleActionBarDrawerToggle.kt (96%) rename navigation-base/src/main/java/ru/touchin/roboswag/{components => }/navigation_base/TouchinApp.java (99%) rename navigation-base/src/main/java/ru/touchin/roboswag/{components => }/navigation_base/activities/BaseActivity.kt (96%) rename navigation-base/src/main/java/ru/touchin/roboswag/{components => }/navigation_base/activities/NavigationActivity.kt (79%) rename navigation-base/src/main/java/ru/touchin/roboswag/{components => }/navigation_base/activities/OnBackPressedListener.java (52%) rename navigation-base/src/main/java/ru/touchin/roboswag/{components => }/navigation_base/fragments/BaseFragment.kt (96%) rename navigation-base/src/main/java/ru/touchin/roboswag/{components => }/navigation_base/fragments/EmptyState.kt (86%) rename navigation-base/src/main/java/ru/touchin/roboswag/{components => }/navigation_base/fragments/LifecycleLoggingObserver.kt (95%) rename navigation-base/src/main/java/ru/touchin/roboswag/{components => }/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt (96%) rename navigation-base/src/main/java/ru/touchin/roboswag/{components => }/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt (88%) diff --git a/navigation-base/src/main/AndroidManifest.xml b/navigation-base/src/main/AndroidManifest.xml index 74b4a83..b05e20d 100644 --- a/navigation-base/src/main/AndroidManifest.xml +++ b/navigation-base/src/main/AndroidManifest.xml @@ -1,3 +1 @@ - + diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/FragmentNavigation.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/FragmentNavigation.kt similarity index 98% rename from navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/FragmentNavigation.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/FragmentNavigation.kt index 42dfca8..3dc6fe0 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/FragmentNavigation.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/FragmentNavigation.kt @@ -17,7 +17,7 @@ * */ -package ru.touchin.roboswag.components.navigation_base +package ru.touchin.roboswag.navigation_base import android.content.Context import android.os.Bundle @@ -28,7 +28,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction import ru.touchin.roboswag.core.log.Lc -import ru.touchin.roboswag.components.navigation_base.fragments.BaseFragment +import ru.touchin.roboswag.navigation_base.fragments.BaseFragment import kotlin.reflect.KClass /** diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/SimpleActionBarDrawerToggle.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/SimpleActionBarDrawerToggle.kt similarity index 96% rename from navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/SimpleActionBarDrawerToggle.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/SimpleActionBarDrawerToggle.kt index 00c5ecb..166a561 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/SimpleActionBarDrawerToggle.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/SimpleActionBarDrawerToggle.kt @@ -17,7 +17,7 @@ * */ -package ru.touchin.roboswag.components.navigation_base +package ru.touchin.roboswag.navigation_base import android.animation.ValueAnimator import android.view.MenuItem @@ -25,9 +25,9 @@ import android.view.View import androidx.appcompat.app.ActionBarDrawerToggle import androidx.drawerlayout.widget.DrawerLayout import androidx.fragment.app.FragmentManager -import ru.touchin.roboswag.components.navigation_base.activities.BaseActivity -import ru.touchin.roboswag.components.navigation_base.activities.OnBackPressedListener import ru.touchin.roboswag.components.utils.UiUtils +import ru.touchin.roboswag.navigation_base.activities.BaseActivity +import ru.touchin.roboswag.navigation_base.activities.OnBackPressedListener /** * Created by Gavriil Sitnikov on 11/03/16. diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/TouchinApp.java b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/TouchinApp.java similarity index 99% rename from navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/TouchinApp.java rename to navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/TouchinApp.java index 88bc813..ac977ac 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/TouchinApp.java +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/TouchinApp.java @@ -17,7 +17,7 @@ * */ -package ru.touchin.roboswag.components.navigation_base; +package ru.touchin.roboswag.navigation_base; import android.app.Application; import android.content.Context; diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/BaseActivity.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/BaseActivity.kt similarity index 96% rename from navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/BaseActivity.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/BaseActivity.kt index af047ab..b1437d3 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/BaseActivity.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/BaseActivity.kt @@ -17,7 +17,7 @@ * */ -package ru.touchin.roboswag.components.navigation_base.activities +package ru.touchin.roboswag.navigation_base.activities import android.content.Context import android.content.Intent @@ -27,9 +27,9 @@ import android.os.PersistableBundle import android.view.WindowManager import androidx.appcompat.app.AppCompatActivity import ru.touchin.roboswag.components.navigation_viewcontroller.keyboard_resizeable.KeyboardBehaviorDetector -import ru.touchin.roboswag.components.navigation_base.fragments.LifecycleLoggingObserver import ru.touchin.roboswag.core.log.Lc import ru.touchin.roboswag.core.log.LcGroup +import ru.touchin.roboswag.navigation_base.fragments.LifecycleLoggingObserver /** * Created by Gavriil Sitnikov on 08/03/2016. diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/NavigationActivity.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/NavigationActivity.kt similarity index 79% rename from navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/NavigationActivity.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/NavigationActivity.kt index a157813..7c1d669 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/NavigationActivity.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/NavigationActivity.kt @@ -1,7 +1,7 @@ -package ru.touchin.roboswag.components.navigation_base.activities +package ru.touchin.roboswag.navigation_base.activities import androidx.fragment.app.FragmentTransaction -import ru.touchin.roboswag.components.navigation_base.FragmentNavigation +import ru.touchin.roboswag.navigation_base.FragmentNavigation /** * Created by Daniil Borisovskii on 15/08/2019. diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/OnBackPressedListener.java b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/OnBackPressedListener.java similarity index 52% rename from navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/OnBackPressedListener.java rename to navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/OnBackPressedListener.java index 1cf02ab..f1f05c6 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/activities/OnBackPressedListener.java +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/OnBackPressedListener.java @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.navigation_base.activities; +package ru.touchin.roboswag.navigation_base.activities; public interface OnBackPressedListener { diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/BaseFragment.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/BaseFragment.kt similarity index 96% rename from navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/BaseFragment.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/BaseFragment.kt index beb9369..c8a85df 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/BaseFragment.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/BaseFragment.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.navigation_base.fragments +package ru.touchin.roboswag.navigation_base.fragments import android.content.Context import android.content.res.ColorStateList @@ -15,7 +15,7 @@ import androidx.annotation.LayoutRes import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity -import ru.touchin.roboswag.components.navigation_base.BuildConfig +import ru.touchin.roboswag.navigation_base.BuildConfig open class BaseFragment(@LayoutRes layoutRes: Int) : Fragment(layoutRes) { diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/EmptyState.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/EmptyState.kt similarity index 86% rename from navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/EmptyState.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/EmptyState.kt index fcac033..0afa2dc 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/EmptyState.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/EmptyState.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.navigation_base.fragments +package ru.touchin.roboswag.navigation_base.fragments import android.os.Parcel import android.os.Parcelable diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/LifecycleLoggingObserver.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/LifecycleLoggingObserver.kt similarity index 95% rename from navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/LifecycleLoggingObserver.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/LifecycleLoggingObserver.kt index 631d9fd..a85255b 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/LifecycleLoggingObserver.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/LifecycleLoggingObserver.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.navigation_base.fragments +package ru.touchin.roboswag.navigation_base.fragments import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleObserver diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt similarity index 96% rename from navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt index 4081118..07cf436 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt @@ -5,7 +5,7 @@ import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.OnLifecycleEvent -import ru.touchin.roboswag.components.navigation_base.activities.BaseActivity +import ru.touchin.roboswag.navigation_base.activities.BaseActivity /** * This detector NOT detect landscape fullscreen keyboard diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt similarity index 88% rename from navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt index b9d4dec..7775227 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.navigation_base.keyboard_resizeable +package ru.touchin.roboswag.navigation_base.keyboard_resizeable import android.os.Build import android.os.Bundle @@ -6,10 +6,10 @@ import android.os.Parcelable import android.view.View import androidx.annotation.LayoutRes import androidx.lifecycle.LifecycleObserver -import ru.touchin.roboswag.components.navigation_base.activities.BaseActivity -import ru.touchin.roboswag.components.navigation_base.activities.OnBackPressedListener -import ru.touchin.roboswag.components.navigation_base.fragments.BaseFragment import ru.touchin.roboswag.components.utils.UiUtils +import ru.touchin.roboswag.navigation_base.activities.BaseActivity +import ru.touchin.roboswag.navigation_base.activities.OnBackPressedListener +import ru.touchin.roboswag.navigation_base.fragments.BaseFragment abstract class KeyboardResizeableFragment( @LayoutRes layoutRes: Int diff --git a/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/keyboard_resizeable/KeyboardResizeableViewController.kt b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/keyboard_resizeable/KeyboardResizeableViewController.kt index 930ee38..1a8c5f3 100644 --- a/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/keyboard_resizeable/KeyboardResizeableViewController.kt +++ b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/keyboard_resizeable/KeyboardResizeableViewController.kt @@ -5,10 +5,10 @@ import android.os.Parcelable import androidx.annotation.CallSuper import androidx.annotation.LayoutRes import androidx.lifecycle.LifecycleObserver -import ru.touchin.roboswag.components.navigation_base.activities.BaseActivity -import ru.touchin.roboswag.components.navigation_base.activities.OnBackPressedListener import ru.touchin.roboswag.components.navigation_viewcontroller.viewcontrollers.ViewController import ru.touchin.roboswag.components.utils.UiUtils +import ru.touchin.roboswag.navigation_base.activities.BaseActivity +import ru.touchin.roboswag.navigation_base.activities.OnBackPressedListener abstract class KeyboardResizeableViewController( @LayoutRes layoutRes: Int, diff --git a/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/viewcontrollers/ViewController.kt b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/viewcontrollers/ViewController.kt index 0dca42a..bbbff94 100644 --- a/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/viewcontrollers/ViewController.kt +++ b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/viewcontrollers/ViewController.kt @@ -45,8 +45,8 @@ import androidx.fragment.app.FragmentTransaction import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import ru.touchin.roboswag.components.navigation_viewcontroller.fragments.ViewControllerFragment -import ru.touchin.roboswag.components.navigation_base.fragments.LifecycleLoggingObserver import ru.touchin.roboswag.components.utils.UiUtils +import ru.touchin.roboswag.navigation_base.fragments.LifecycleLoggingObserver /** * Created by Gavriil Sitnikov on 21/10/2015. diff --git a/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/viewcontrollers/ViewControllerNavigation.kt b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/viewcontrollers/ViewControllerNavigation.kt index fe9c85d..b473508 100644 --- a/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/viewcontrollers/ViewControllerNavigation.kt +++ b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/viewcontrollers/ViewControllerNavigation.kt @@ -28,7 +28,7 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction import ru.touchin.roboswag.components.navigation_viewcontroller.fragments.ViewControllerFragment -import ru.touchin.roboswag.components.navigation_base.FragmentNavigation +import ru.touchin.roboswag.navigation_base.FragmentNavigation /** * Created by Gavriil Sitnikov on 07/03/2016. diff --git a/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationActivity.kt b/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationActivity.kt index 44d9516..dec1437 100644 --- a/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationActivity.kt +++ b/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationActivity.kt @@ -3,8 +3,8 @@ package ru.touchin.roboswag.components.tabbarnavigation_fragment import android.os.Parcelable import androidx.annotation.IdRes import androidx.fragment.app.FragmentManager -import ru.touchin.roboswag.components.navigation_base.activities.NavigationActivity -import ru.touchin.roboswag.components.navigation_base.FragmentNavigation +import ru.touchin.roboswag.navigation_base.FragmentNavigation +import ru.touchin.roboswag.navigation_base.activities.NavigationActivity /** * Created by Daniil Borisovskii on 15/08/2019. diff --git a/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationController.kt b/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationController.kt index fc218f4..bc771b2 100644 --- a/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationController.kt +++ b/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationController.kt @@ -12,8 +12,8 @@ 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_base.fragments.BaseFragment import ru.touchin.roboswag.core.utils.ShouldNotHappenException +import ru.touchin.roboswag.navigation_base.fragments.BaseFragment class BottomNavigationController( private val context: Context, diff --git a/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationFragment.kt b/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationFragment.kt index c5ee281..194cb05 100644 --- a/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationFragment.kt +++ b/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationFragment.kt @@ -8,8 +8,8 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.IdRes import androidx.fragment.app.Fragment -import ru.touchin.roboswag.components.navigation_base.activities.OnBackPressedListener -import ru.touchin.roboswag.components.navigation_base.fragments.BaseFragment +import ru.touchin.roboswag.navigation_base.activities.OnBackPressedListener +import ru.touchin.roboswag.navigation_base.fragments.BaseFragment abstract class BottomNavigationFragment : Fragment() { diff --git a/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/NavigationContainerFragment.kt b/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/NavigationContainerFragment.kt index 3326f5d..d0d2cef 100644 --- a/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/NavigationContainerFragment.kt +++ b/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/NavigationContainerFragment.kt @@ -9,9 +9,9 @@ import androidx.annotation.IdRes import androidx.annotation.LayoutRes import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentTransaction -import ru.touchin.roboswag.components.navigation_base.FragmentNavigation -import ru.touchin.roboswag.components.navigation_base.fragments.BaseFragment import ru.touchin.roboswag.core.utils.ShouldNotHappenException +import ru.touchin.roboswag.navigation_base.FragmentNavigation +import ru.touchin.roboswag.navigation_base.fragments.BaseFragment class NavigationContainerFragment : Fragment() { From b5f0ab736c3db37400487a0a40b42e435efd97db Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 27 Apr 2020 17:16:30 +0300 Subject: [PATCH 04/14] moved most of the bottom_navigation_viewcontroller logic to bottom_navigation_fragment --- .../.gitignore | 0 .../build.gradle | 0 .../src/main/AndroidManifest.xml | 2 + .../BottomNavigationActivity.kt | 8 +- .../BottomNavigationController.kt | 2 +- .../BottomNavigationFragment.kt | 2 +- .../NavigationContainerFragment.kt | 2 +- .../.gitignore | 0 .../README.md | 0 .../build.gradle | 1 + .../src/main/AndroidManifest.xml | 2 + .../BottomNavigationActivity.kt | 16 +++ .../navigation_base/FragmentNavigation.kt | 2 +- .../src/main/AndroidManifest.xml | 2 - .../src/main/AndroidManifest.xml | 2 - .../BottomNavigationActivity.kt | 42 ------ .../BottomNavigationController.kt | 127 ------------------ .../BottomNavigationFragment.kt | 118 ---------------- .../NavigationContainerFragment.kt | 79 ----------- 19 files changed, 27 insertions(+), 380 deletions(-) rename {tabbar-navigation-fragment => bottom-navigation-fragment}/.gitignore (100%) rename {tabbar-navigation-fragment => bottom-navigation-fragment}/build.gradle (100%) create mode 100644 bottom-navigation-fragment/src/main/AndroidManifest.xml rename {tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment => bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment}/BottomNavigationActivity.kt (88%) rename {tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment => bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment}/BottomNavigationController.kt (98%) rename {tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment => bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment}/BottomNavigationFragment.kt (97%) rename {tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment => bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment}/NavigationContainerFragment.kt (97%) rename {tabbar-navigation-viewcontroller => bottom-navigation-viewcontroller}/.gitignore (100%) rename {tabbar-navigation-viewcontroller => bottom-navigation-viewcontroller}/README.md (100%) rename {tabbar-navigation-viewcontroller => bottom-navigation-viewcontroller}/build.gradle (92%) create mode 100644 bottom-navigation-viewcontroller/src/main/AndroidManifest.xml create mode 100644 bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationActivity.kt delete mode 100644 tabbar-navigation-fragment/src/main/AndroidManifest.xml delete mode 100644 tabbar-navigation-viewcontroller/src/main/AndroidManifest.xml delete mode 100644 tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationActivity.kt delete mode 100644 tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationController.kt delete mode 100644 tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationFragment.kt delete mode 100644 tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/NavigationContainerFragment.kt diff --git a/tabbar-navigation-fragment/.gitignore b/bottom-navigation-fragment/.gitignore similarity index 100% rename from tabbar-navigation-fragment/.gitignore rename to bottom-navigation-fragment/.gitignore diff --git a/tabbar-navigation-fragment/build.gradle b/bottom-navigation-fragment/build.gradle similarity index 100% rename from tabbar-navigation-fragment/build.gradle rename to bottom-navigation-fragment/build.gradle diff --git a/bottom-navigation-fragment/src/main/AndroidManifest.xml b/bottom-navigation-fragment/src/main/AndroidManifest.xml new file mode 100644 index 0000000..09792dd --- /dev/null +++ b/bottom-navigation-fragment/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationActivity.kt b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationActivity.kt similarity index 88% rename from tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationActivity.kt rename to bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationActivity.kt index dec1437..6565e91 100644 --- a/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationActivity.kt +++ b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationActivity.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.tabbarnavigation_fragment +package ru.touchin.roboswag.bottom_navigation_fragment import android.os.Parcelable import androidx.annotation.IdRes @@ -6,13 +6,9 @@ import androidx.fragment.app.FragmentManager import ru.touchin.roboswag.navigation_base.FragmentNavigation import ru.touchin.roboswag.navigation_base.activities.NavigationActivity -/** - * Created by Daniil Borisovskii on 15/08/2019. - * Activity to manage tab container navigation. - */ abstract class BottomNavigationActivity : NavigationActivity() { - val innerNavigation: FragmentNavigation + open val innerNavigation: FragmentNavigation get() = getNavigationContainer(supportFragmentManager)?.navigation ?: navigation /** diff --git a/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationController.kt b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationController.kt similarity index 98% rename from tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationController.kt rename to bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationController.kt index bc771b2..ccecf1e 100644 --- a/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationController.kt +++ b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationController.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.tabbarnavigation_fragment +package ru.touchin.roboswag.bottom_navigation_fragment import android.content.Context import android.os.Bundle diff --git a/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationFragment.kt b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationFragment.kt similarity index 97% rename from tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationFragment.kt rename to bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationFragment.kt index 194cb05..c23969c 100644 --- a/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/BottomNavigationFragment.kt +++ b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationFragment.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.tabbarnavigation_fragment +package ru.touchin.roboswag.bottom_navigation_fragment import android.os.Bundle import android.os.Parcelable diff --git a/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/NavigationContainerFragment.kt b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationContainerFragment.kt similarity index 97% rename from tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/NavigationContainerFragment.kt rename to bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationContainerFragment.kt index d0d2cef..71fb9eb 100644 --- a/tabbar-navigation-fragment/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_fragment/NavigationContainerFragment.kt +++ b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationContainerFragment.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.tabbarnavigation_fragment +package ru.touchin.roboswag.bottom_navigation_fragment import android.os.Bundle import android.os.Parcelable diff --git a/tabbar-navigation-viewcontroller/.gitignore b/bottom-navigation-viewcontroller/.gitignore similarity index 100% rename from tabbar-navigation-viewcontroller/.gitignore rename to bottom-navigation-viewcontroller/.gitignore diff --git a/tabbar-navigation-viewcontroller/README.md b/bottom-navigation-viewcontroller/README.md similarity index 100% rename from tabbar-navigation-viewcontroller/README.md rename to bottom-navigation-viewcontroller/README.md diff --git a/tabbar-navigation-viewcontroller/build.gradle b/bottom-navigation-viewcontroller/build.gradle similarity index 92% rename from tabbar-navigation-viewcontroller/build.gradle rename to bottom-navigation-viewcontroller/build.gradle index 1e40362..260741e 100644 --- a/tabbar-navigation-viewcontroller/build.gradle +++ b/bottom-navigation-viewcontroller/build.gradle @@ -16,6 +16,7 @@ android { dependencies { api project(":navigation-viewcontroller") + api project(":bottom-navigation-fragment") implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/bottom-navigation-viewcontroller/src/main/AndroidManifest.xml b/bottom-navigation-viewcontroller/src/main/AndroidManifest.xml new file mode 100644 index 0000000..656fcf7 --- /dev/null +++ b/bottom-navigation-viewcontroller/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationActivity.kt b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationActivity.kt new file mode 100644 index 0000000..9634b43 --- /dev/null +++ b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationActivity.kt @@ -0,0 +1,16 @@ +package ru.touchin.roboswag.components.tabbarnavigation + +import android.os.Parcelable +import androidx.annotation.IdRes +import androidx.fragment.app.FragmentManager +import ru.touchin.roboswag.navigation.activities.NavigationActivity +import ru.touchin.roboswag.navigation.viewcontrollers.ViewControllerNavigation +import ru.touchin.roboswag.bottom_navigation_fragment.BottomNavigationActivity as FragmentBottomNavigationActivity + +abstract class BottomNavigationActivity : FragmentBottomNavigationActivity() { + + final override val innerNavigation: ViewControllerNavigation + get() = getNavigationContainer(supportFragmentManager)?.navigation + ?: navigation as ViewControllerNavigation + +} diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/FragmentNavigation.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/FragmentNavigation.kt index 3dc6fe0..bb43c5e 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/FragmentNavigation.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/FragmentNavigation.kt @@ -95,7 +95,7 @@ open class FragmentNavigation( addToStack: Boolean, args: Bundle?, backStackName: String?, - tag: String?, + tag: String? = null, transactionSetup: ((FragmentTransaction) -> Unit)? ) { if (fragmentManager.isDestroyed) { diff --git a/tabbar-navigation-fragment/src/main/AndroidManifest.xml b/tabbar-navigation-fragment/src/main/AndroidManifest.xml deleted file mode 100644 index fbf5f9f..0000000 --- a/tabbar-navigation-fragment/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - diff --git a/tabbar-navigation-viewcontroller/src/main/AndroidManifest.xml b/tabbar-navigation-viewcontroller/src/main/AndroidManifest.xml deleted file mode 100644 index 7c7d821..0000000 --- a/tabbar-navigation-viewcontroller/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - diff --git a/tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationActivity.kt b/tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationActivity.kt deleted file mode 100644 index 69679a6..0000000 --- a/tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationActivity.kt +++ /dev/null @@ -1,42 +0,0 @@ -package ru.touchin.roboswag.components.tabbarnavigation - -import android.os.Parcelable -import androidx.annotation.IdRes -import androidx.fragment.app.FragmentManager -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 : NavigationActivity() { - - val innerNavigation: ViewControllerNavigation - get() = getNavigationContainer(supportFragmentManager)?.navigation ?: navigation as ViewControllerNavigation - - /** - * Navigates to the given navigation tab. - * Can be called from any node of navigation graph so all back stack will be cleared. - * - * @param navigationTabId Id of navigation tab. - * @param state State of the given tab. If not null tab's fragment will be recreated, otherwise only in case it has not been created before. - */ - fun navigateTo(@IdRes navigationTabId: Int, state: Parcelable? = null) { - supportFragmentManager.run { - // Clear all navigation stack unto the main bottom navigation (tagged as top) - popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) - - (primaryNavigationFragment as? BottomNavigationFragment)?.navigateTo(navigationTabId, state) - } - } - - private fun getNavigationContainer(fragmentManager: FragmentManager?): NavigationContainerFragment? = - fragmentManager - ?.primaryNavigationFragment - ?.let { navigationFragment -> - navigationFragment as? NavigationContainerFragment - ?: getNavigationContainer(navigationFragment.childFragmentManager) - } - -} diff --git a/tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationController.kt b/tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationController.kt deleted file mode 100644 index 8e21e3c..0000000 --- a/tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationController.kt +++ /dev/null @@ -1,127 +0,0 @@ -package ru.touchin.roboswag.components.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.annotation.LayoutRes -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, - @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 var callback: FragmentManager.FragmentLifecycleCallbacks? = null - - 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() = callback?.let(fragmentManager::unregisterFragmentLifecycleCallbacks) - - @Suppress("detekt.ComplexMethod") - fun navigateTo(@IdRes itemId: Int, state: Parcelable? = null) { - // Find view controller class that needs to open - val (viewControllerClass, defaultViewControllerState, saveStateOnSwitching) = 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) - - if (saveStateOnSwitching && state == null && fragment != null) { - transaction.attach(fragment) - } else { - // If fragment already exist remove it first - if (fragment != null) transaction.remove(fragment) - - fragment = if (wrapWithNavigationContainer) { - Fragment.instantiate( - context, - NavigationContainerFragment::class.java.name, - NavigationContainerFragment.args(viewControllerClass, viewControllerState, contentContainerViewId, contentContainerLayoutId) - ) - } 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 - } - - // 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 - && 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/tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationFragment.kt b/tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationFragment.kt deleted file mode 100644 index c1364fc..0000000 --- a/tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/BottomNavigationFragment.kt +++ /dev/null @@ -1,118 +0,0 @@ -package ru.touchin.roboswag.components.tabbarnavigation - -import android.os.Bundle -import android.os.Parcel -import android.os.Parcelable -import android.util.SparseArray -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.annotation.IdRes -import androidx.fragment.app.Fragment -import ru.touchin.roboswag.components.navigation.activities.OnBackPressedListener -import ru.touchin.roboswag.components.navigation.viewcontrollers.EmptyState -import ru.touchin.roboswag.components.navigation.viewcontrollers.ViewController - -abstract class BottomNavigationFragment : Fragment() { - - private lateinit var bottomNavigationController: BottomNavigationController - - private val backPressedListener = OnBackPressedListener { bottomNavigationController.onBackPressed() } - - protected abstract val rootLayoutId: Int - - protected abstract val navigationContainerViewId: Int - - protected abstract val contentContainerViewId: Int - - protected abstract val contentContainerLayoutId: Int - - protected abstract val topLevelViewControllerId: Int - - protected abstract val wrapWithNavigationContainer: Boolean - - protected abstract val navigationViewControllers: SparseArray - - protected open val reselectListener: (() -> Unit) = { getNavigationActivity().innerNavigation.up(inclusive = true) } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - bottomNavigationController = BottomNavigationController( - context = requireContext(), - fragmentManager = childFragmentManager, - viewControllers = navigationViewControllers, - contentContainerViewId = contentContainerViewId, - contentContainerLayoutId = contentContainerLayoutId, - topLevelViewControllerId = topLevelViewControllerId, - wrapWithNavigationContainer = wrapWithNavigationContainer, - onReselectListener = reselectListener - ) - if (savedInstanceState == null) { - bottomNavigationController.navigateTo(topLevelViewControllerId) - } - } - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - val fragmentView = inflater.inflate(rootLayoutId, container, false) - - bottomNavigationController.attach(fragmentView.findViewById(navigationContainerViewId)) - - (activity as BottomNavigationActivity).addOnBackPressedListener(backPressedListener) - - return fragmentView - } - - override fun onDestroyView() { - super.onDestroyView() - (activity as BottomNavigationActivity).removeOnBackPressedListener(backPressedListener) - bottomNavigationController.detach() - } - - fun navigateTo(@IdRes navigationTabId: Int, state: Parcelable? = null) { - bottomNavigationController.navigateTo(navigationTabId, state) - } - - private fun getNavigationActivity() = requireActivity() as BottomNavigationActivity - - class TabData( - val viewControllerClass: Class>, - viewControllerState: Parcelable, - /** - * It can be useful in some cases when it is necessary to create ViewController - * with initial state every time when tab opens. - */ - val saveStateOnSwitching: Boolean = true - ) { - - /** - * It is value as class body property instead of value as constructor parameter to specify - * custom getter of this field which returns copy of Parcelable every time it be called. - * This is necessary to avoid modifying this value if it would be a value as constructor parameter - * and every getting of this value would return the same instance. - */ - val viewControllerState = viewControllerState - get() = field.copy() - - operator fun component1() = viewControllerClass - - operator fun component2() = viewControllerState - - operator fun component3() = saveStateOnSwitching - - private fun Parcelable.copy(): Parcelable = - if (this is EmptyState) { - EmptyState - } else { - val parcel = Parcel.obtain() - parcel.writeParcelable(this, 0) - parcel.setDataPosition(0) - val result = parcel.readParcelable( - javaClass.classLoader ?: Thread.currentThread().contextClassLoader - ) ?: throw IllegalStateException("Failed to copy tab state") - parcel.recycle() - result - } - - } - -} diff --git a/tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/NavigationContainerFragment.kt b/tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/NavigationContainerFragment.kt deleted file mode 100644 index 7948b9e..0000000 --- a/tabbar-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/tabbarnavigation_viewcontroller/NavigationContainerFragment.kt +++ /dev/null @@ -1,79 +0,0 @@ -package ru.touchin.roboswag.components.tabbarnavigation - -import android.os.Bundle -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() { - - 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 CONTAINER_LAYOUT_ID_ARG = "CONTAINER_LAYOUT_ID_ARG" - private const val TRANSITION_ARG = "TRANSITION_ARG" - - fun args( - cls: Class>, - state: Parcelable, - @IdRes containerViewId: Int, - @LayoutRes 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) - } - } - - val navigation by lazy { - ViewControllerNavigation( - requireContext(), - childFragmentManager, - containerViewId, - transition - ) - } - - @IdRes - private var containerViewId = 0 - - @LayoutRes - private var containerLayoutId = 0 - - private var transition = 0 - - @Suppress("UNCHECKED_CAST") - fun getViewControllerClass(): Class> = - arguments?.getSerializable(VIEW_CONTROLLER_CLASS_ARG) as Class> - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - arguments?.let { args -> - transition = args.getInt(TRANSITION_ARG) - containerViewId = args.getInt(CONTAINER_VIEW_ID_ARG) - containerLayoutId = args.getInt(CONTAINER_LAYOUT_ID_ARG) - - if (savedInstanceState == null) { - navigation.setInitialViewController(getViewControllerClass(), args.getParcelable(VIEW_CONTROLLER_STATE_ARG) - ?: throw ShouldNotHappenException("Fragment state must not be null")) - } - } ?: throw ShouldNotHappenException("Fragment is not instantiable without arguments") - } - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = - inflater.inflate(containerLayoutId, container, false) - -} From 6ce2bbf82fb574846e72683d52ad39fb16c6be38 Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 28 Apr 2020 21:02:50 +0300 Subject: [PATCH 05/14] added bottom navigation base as separate module --- bottom-navigation-base/.gitignore | 1 + bottom-navigation-base/build.gradle | 30 ++++ .../src/main/AndroidManifest.xml | 2 + .../BaseBottomNavigationActivity.kt | 41 +++++ .../BaseBottomNavigationController.kt | 161 ++++++++++++++++++ .../BaseBottomNavigationFragment.kt | 72 ++++++++ .../BaseNavigationContainerFramgent.kt | 78 +++++++++ .../BaseNavigationTab.kt | 44 +++++ bottom-navigation-fragment/build.gradle | 1 + .../BottomNavigationActivity.kt | 39 +---- .../BottomNavigationController.kt | 123 ++----------- .../BottomNavigationFragment.kt | 81 ++------- .../NavigationContainerFragment.kt | 63 +------ .../NavigationTab.kt | 10 ++ bottom-navigation-viewcontroller/build.gradle | 2 +- .../BottomNavigationActivity.kt | 24 +-- .../BottomNavigationController.kt | 45 +++++ .../BottomNavigationFragment.kt | 19 +++ .../NavigationContainerFragment.kt | 26 +++ .../NavigationTab.kt | 15 ++ .../viewmodel/LifecycleViewModelProviders.kt | 6 +- .../activities/BaseActivity.kt | 2 +- .../activities/NavigationActivity.kt | 15 +- .../KeyboardBehaviorDetector.kt | 2 +- .../src/main/AndroidManifest.xml | 4 +- .../fragments/ViewControllerFragment.kt | 6 +- .../KeyboardResizeableViewController.kt | 6 +- .../viewcontrollers/ViewController.kt | 4 +- .../ViewControllerNavigation.kt | 5 +- 29 files changed, 618 insertions(+), 309 deletions(-) create mode 100644 bottom-navigation-base/.gitignore create mode 100644 bottom-navigation-base/build.gradle create mode 100644 bottom-navigation-base/src/main/AndroidManifest.xml create mode 100644 bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationActivity.kt create mode 100644 bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationController.kt create mode 100644 bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationFragment.kt create mode 100644 bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseNavigationContainerFramgent.kt create mode 100644 bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseNavigationTab.kt create mode 100644 bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationTab.kt create mode 100644 bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationController.kt create mode 100644 bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationFragment.kt create mode 100644 bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/NavigationContainerFragment.kt create mode 100644 bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/NavigationTab.kt rename navigation-viewcontroller/src/main/java/ru/touchin/roboswag/{components => }/navigation_viewcontroller/fragments/ViewControllerFragment.kt (97%) rename navigation-viewcontroller/src/main/java/ru/touchin/roboswag/{components => }/navigation_viewcontroller/keyboard_resizeable/KeyboardResizeableViewController.kt (93%) rename navigation-viewcontroller/src/main/java/ru/touchin/roboswag/{components => }/navigation_viewcontroller/viewcontrollers/ViewController.kt (98%) rename navigation-viewcontroller/src/main/java/ru/touchin/roboswag/{components => }/navigation_viewcontroller/viewcontrollers/ViewControllerNavigation.kt (97%) diff --git a/bottom-navigation-base/.gitignore b/bottom-navigation-base/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/bottom-navigation-base/.gitignore @@ -0,0 +1 @@ +/build diff --git a/bottom-navigation-base/build.gradle b/bottom-navigation-base/build.gradle new file mode 100644 index 0000000..40be017 --- /dev/null +++ b/bottom-navigation-base/build.gradle @@ -0,0 +1,30 @@ +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 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + +} + +dependencies { + api project(":navigation-base") + + 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/bottom-navigation-base/src/main/AndroidManifest.xml b/bottom-navigation-base/src/main/AndroidManifest.xml new file mode 100644 index 0000000..db41985 --- /dev/null +++ b/bottom-navigation-base/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationActivity.kt b/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationActivity.kt new file mode 100644 index 0000000..86a185e --- /dev/null +++ b/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationActivity.kt @@ -0,0 +1,41 @@ +package ru.touchin.roboswag.bottom_navigation_fragment + +import android.os.Parcelable +import androidx.annotation.IdRes +import androidx.fragment.app.FragmentManager +import ru.touchin.roboswag.navigation_base.FragmentNavigation +import ru.touchin.roboswag.navigation_base.activities.NavigationActivity + +abstract class BaseBottomNavigationActivity< + TNavigation : FragmentNavigation, + TNavigationFragment : BaseBottomNavigationFragment<*>, + TNavigationContainer : BaseNavigationContainerFragment<*, TNavigation>> : NavigationActivity() { + + val innerNavigation: TNavigation + get() = getNavigationContainer(supportFragmentManager)?.navigation ?: navigation + + /** + * Navigates to the given navigation tab. + * Can be called from any node of navigation graph so all back stack will be cleared. + * + * @param navigationTabId Id of navigation tab. + * @param state State of the given tab. If not null tab's fragment will be recreated, otherwise only in case it has not been created before. + */ + fun navigateTo(@IdRes navigationTabId: Int, state: Parcelable? = null) { + supportFragmentManager.run { + // Clear all navigation stack unto the main bottom navigation (tagged as top) + popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) + + (primaryNavigationFragment as? TNavigationFragment)?.navigateTo(navigationTabId, state) + } + } + + protected fun getNavigationContainer(fragmentManager: FragmentManager?): TNavigationContainer? = + fragmentManager + ?.primaryNavigationFragment + ?.let { navigationFragment -> + navigationFragment as? TNavigationContainer + ?: getNavigationContainer(navigationFragment.childFragmentManager) + } + +} diff --git a/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationController.kt b/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationController.kt new file mode 100644 index 0000000..ec69c76 --- /dev/null +++ b/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationController.kt @@ -0,0 +1,161 @@ +package ru.touchin.roboswag.bottom_navigation_fragment + +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.annotation.LayoutRes +import androidx.core.util.forEach +import androidx.core.view.children +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import ru.touchin.roboswag.core.utils.ShouldNotHappenException +import ru.touchin.roboswag.navigation_base.fragments.BaseFragment + +abstract class BaseBottomNavigationController( + private val tabs: SparseArray, + private val context: Context, + private val fragmentManager: FragmentManager, + @IdRes private val defaultTabId: Int = 0, // If it zero back press with empty fragment back stack would close the app + @IdRes private val contentContainerViewId: Int, + @LayoutRes private val contentContainerLayoutId: Int, + private val wrapWithNavigationContainer: Boolean = false +) { + + private var callback: FragmentManager.FragmentLifecycleCallbacks? = null + + private var tabsContainer: ViewGroup? = null + + private var selectedTabId: Int? = null + + fun attach(tabsContainer: ViewGroup) { + detach() + + this.tabsContainer = tabsContainer + + initializeCallback() + + tabsContainer.children.forEach { itemView -> + tabs[itemView.id]?.let { tab -> + itemView.setOnClickListener { buttonView -> + if (isTabClass(tab, fragmentManager.primaryNavigationFragment)) { + onTabReselected() + } else { + navigateTo(buttonView.id) + } + } + } + } + } + + fun detach() { + callback?.let(fragmentManager::unregisterFragmentLifecycleCallbacks) + + callback = null + tabsContainer = null + } + + fun navigateTo(@IdRes itemId: Int, state: Parcelable? = null) { + // Find fragment class that needs to open + val tabClass = tabs[itemId]?.cls ?: return + val defaultFragmentState = tabs[itemId]?.state ?: return + + if (state != null && state::class != defaultFragmentState::class) { + throw ShouldNotHappenException( + "Incorrect state type for navigation tab root Fragment. Should be ${defaultFragmentState::class}" + ) + } + + val transaction = fragmentManager.beginTransaction() + + // Detach current primary fragment + fragmentManager.primaryNavigationFragment?.let(transaction::detach) + + val fragmentName = tabClass.canonicalName + var fragment = fragmentManager.findFragmentByTag(fragmentName) + + if (state == null && fragment != null) { + transaction.attach(fragment) + } else { + // If fragment already exist remove it first + if (fragment != null) transaction.remove(fragment) + + fragment = instantiateFragment(tabClass, state ?: defaultFragmentState) + + transaction.add(contentContainerViewId, fragment, fragmentName) + } + + transaction + .setPrimaryNavigationFragment(fragment) + .setReorderingAllowed(true) + .commit() + + selectedTabId = itemId + } + + // 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 + && defaultTabId != 0 + && selectedTabId != defaultTabId) { + + navigateTo(defaultTabId) + + true + } else { + false + } + + protected open fun getNavigationContainerClass(): Class> = BaseNavigationContainerFragment::class.java + + protected open fun onTabReselected() = Unit + + protected open fun isTabClass(tab: TNavigationTab, fragment: Fragment?) = if (wrapWithNavigationContainer) { + (fragment as BaseNavigationContainerFragment<*, *>).getContainedClass() + } else { + fragment?.javaClass + } == tab.cls + + protected open fun instantiateFragment(clazz: Class<*>, state: Parcelable): Fragment = + if (wrapWithNavigationContainer) { + Fragment.instantiate( + context, + getNavigationContainerClass().name, + BaseNavigationContainerFragment.args(clazz, state, contentContainerViewId, contentContainerLayoutId) + ) + } else { + Fragment.instantiate( + context, + clazz.name, + BaseFragment.args(state) + ) + } + + private fun initializeCallback() { + callback = TabFragmentChangedCallback() + + fragmentManager.registerFragmentLifecycleCallbacks(callback!!, false) + } + + private inner class TabFragmentChangedCallback : FragmentManager.FragmentLifecycleCallbacks() { + + // Set selected tab active, disabling all others. Used for styling + override fun onFragmentViewCreated( + fragmentManager: FragmentManager, + fragment: Fragment, + view: View, + savedInstanceState: Bundle? + ) { + tabs.forEach { itemId, tab -> + if (isTabClass(tab, fragment)) { + tabsContainer!!.children.forEach { itemView -> itemView.isActivated = itemView.id == itemId } + } + } + } + + } + +} diff --git a/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationFragment.kt b/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationFragment.kt new file mode 100644 index 0000000..f721e59 --- /dev/null +++ b/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationFragment.kt @@ -0,0 +1,72 @@ +package ru.touchin.roboswag.bottom_navigation_fragment + +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.annotation.IdRes +import androidx.fragment.app.Fragment +import ru.touchin.roboswag.navigation_base.activities.BaseActivity +import ru.touchin.roboswag.navigation_base.activities.OnBackPressedListener + +abstract class BaseBottomNavigationFragment : Fragment() { + + protected abstract val rootLayoutId: Int + + protected abstract val navigationContainerViewId: Int + + protected abstract val contentContainerViewId: Int + + protected abstract val contentContainerLayoutId: Int + + protected abstract val defaultTabId: Int + + protected abstract val wrapWithNavigationContainer: Boolean + + protected abstract val tabs: SparseArray + + protected open val backPressedListener = OnBackPressedListener { bottomNavigationController.onBackPressed() } + + protected open val reselectListener: (() -> Unit) = { getNavigationActivity().innerNavigation.up(inclusive = true) } + + private lateinit var bottomNavigationController: BaseBottomNavigationController<*> + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + bottomNavigationController = createNavigationController() + + if (savedInstanceState == null) { + bottomNavigationController.navigateTo(defaultTabId) + } + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + val fragmentView = inflater.inflate(rootLayoutId, container, false) + + bottomNavigationController.attach(fragmentView.findViewById(navigationContainerViewId)) + + (activity as BaseActivity).addOnBackPressedListener(backPressedListener) + + return fragmentView + } + + override fun onDestroyView() { + (activity as BaseActivity).removeOnBackPressedListener(backPressedListener) + + bottomNavigationController.detach() + + super.onDestroyView() + } + + fun navigateTo(@IdRes navigationTabId: Int, state: Parcelable? = null) { + bottomNavigationController.navigateTo(navigationTabId, state) + } + + protected abstract fun createNavigationController(): BaseBottomNavigationController<*> + + protected fun getNavigationActivity() = requireActivity() as BaseBottomNavigationActivity<*, *, *> + +} diff --git a/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseNavigationContainerFramgent.kt b/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseNavigationContainerFramgent.kt new file mode 100644 index 0000000..35fe22c --- /dev/null +++ b/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseNavigationContainerFramgent.kt @@ -0,0 +1,78 @@ +package ru.touchin.roboswag.bottom_navigation_fragment + +import android.os.Bundle +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.core.utils.ShouldNotHappenException +import ru.touchin.roboswag.navigation_base.FragmentNavigation + +abstract class BaseNavigationContainerFragment : Fragment() { + + companion object { + const val TRANSITION_ARG = "TRANSITION_ARG" + const val FRAGMENT_STATE_ARG = "FRAGMENT_STATE_ARG" + const val CONTAINED_CLASS_ARG = "FRAGMENT_CLASS_ARG" + const val CONTAINER_VIEW_ID_ARG = "CONTAINER_VIEW_ID_ARG" + const val CONTAINER_LAYOUT_ID_ARG = "CONTAINER_LAYOUT_ID_ARG" + + fun args( + cls: Class<*>, + state: Parcelable, + @IdRes containerViewId: Int, + @LayoutRes containerLayoutId: Int, + transition: Int = FragmentTransaction.TRANSIT_NONE + ) = Bundle().apply { + putInt(TRANSITION_ARG, transition) + putInt(CONTAINER_VIEW_ID_ARG, containerViewId) + putInt(CONTAINER_LAYOUT_ID_ARG, containerLayoutId) + putParcelable(FRAGMENT_STATE_ARG, state) + putSerializable(CONTAINED_CLASS_ARG, cls) + } + } + + abstract val navigation: TNavigation + + @IdRes + protected var containerViewId = 0 + private set + + @LayoutRes + protected var containerLayoutId = 0 + private set + + protected var transition = 0 + private set + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + arguments?.let { args -> + transition = args.getInt(TRANSITION_ARG) + containerViewId = args.getInt(CONTAINER_VIEW_ID_ARG) + containerLayoutId = args.getInt(CONTAINER_LAYOUT_ID_ARG) + + if (savedInstanceState == null) { + onContainerCreated() + } + } ?: throw ShouldNotHappenException("Fragment is not instantiable without arguments") + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? = inflater.inflate(containerLayoutId, container, false) + + protected abstract fun onContainerCreated() + + @Suppress("UNCHECKED_CAST") + fun getContainedClass(): Class = + arguments?.getSerializable(CONTAINED_CLASS_ARG) as Class + +} diff --git a/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseNavigationTab.kt b/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseNavigationTab.kt new file mode 100644 index 0000000..6f4643c --- /dev/null +++ b/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseNavigationTab.kt @@ -0,0 +1,44 @@ +package ru.touchin.roboswag.bottom_navigation_fragment + +import android.os.Parcel +import android.os.Parcelable +import ru.touchin.roboswag.navigation_base.fragments.EmptyState + +open class BaseNavigationTab( + open val cls: Class<*>, + state: Parcelable, + /** + * It can be useful in some cases when it is necessary to create ViewController + * with initial state every time when tab opens. + */ + val saveStateOnSwitching: Boolean = true +) { + + /** + * It is value as class body property instead of value as constructor parameter to specify + * custom getter of this field which returns copy of Parcelable every time it be called. + * This is necessary to avoid modifying this value if it would be a value as constructor parameter + * and every getting of this value would return the same instance. + */ + val state = state + get() = field.copy() + + private fun Parcelable.copy(): Parcelable = + if (this is EmptyState) { + EmptyState + } else { + val parcel = Parcel.obtain() + + parcel.writeParcelable(this, 0) + parcel.setDataPosition(0) + + val result = parcel.readParcelable( + javaClass.classLoader ?: Thread.currentThread().contextClassLoader + ) ?: throw IllegalStateException("Failed to copy tab state") + + parcel.recycle() + + result + } + +} diff --git a/bottom-navigation-fragment/build.gradle b/bottom-navigation-fragment/build.gradle index 1871f15..f24dfbf 100644 --- a/bottom-navigation-fragment/build.gradle +++ b/bottom-navigation-fragment/build.gradle @@ -16,6 +16,7 @@ android { dependencies { api project(":navigation-base") + api project(":bottom-navigation-base") implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationActivity.kt b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationActivity.kt index 6565e91..214ea8f 100644 --- a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationActivity.kt +++ b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationActivity.kt @@ -1,38 +1,17 @@ package ru.touchin.roboswag.bottom_navigation_fragment -import android.os.Parcelable -import androidx.annotation.IdRes -import androidx.fragment.app.FragmentManager import ru.touchin.roboswag.navigation_base.FragmentNavigation -import ru.touchin.roboswag.navigation_base.activities.NavigationActivity -abstract class BottomNavigationActivity : NavigationActivity() { +abstract class BottomNavigationActivity : + BaseBottomNavigationActivity() { - open val innerNavigation: FragmentNavigation - get() = getNavigationContainer(supportFragmentManager)?.navigation ?: navigation - - /** - * Navigates to the given navigation tab. - * Can be called from any node of navigation graph so all back stack will be cleared. - * - * @param navigationTabId Id of navigation tab. - * @param state State of the given tab. If not null tab's fragment will be recreated, otherwise only in case it has not been created before. - */ - fun navigateTo(@IdRes navigationTabId: Int, state: Parcelable? = null) { - supportFragmentManager.run { - // Clear all navigation stack unto the main bottom navigation (tagged as top) - popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) - - (primaryNavigationFragment as? BottomNavigationFragment)?.navigateTo(navigationTabId, state) - } + override val navigation by lazy { + FragmentNavigation( + this, + supportFragmentManager, + fragmentContainerViewId, + transition + ) } - private fun getNavigationContainer(fragmentManager: FragmentManager?): NavigationContainerFragment? = - fragmentManager - ?.primaryNavigationFragment - ?.let { navigationFragment -> - navigationFragment as? NavigationContainerFragment - ?: getNavigationContainer(navigationFragment.childFragmentManager) - } - } diff --git a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationController.kt b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationController.kt index ccecf1e..eeb51ff 100644 --- a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationController.kt +++ b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationController.kt @@ -1,125 +1,34 @@ package ru.touchin.roboswag.bottom_navigation_fragment 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.annotation.LayoutRes -import androidx.core.util.forEach -import androidx.core.view.children -import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager -import ru.touchin.roboswag.core.utils.ShouldNotHappenException -import ru.touchin.roboswag.navigation_base.fragments.BaseFragment class BottomNavigationController( - private val context: Context, - private val fragmentManager: FragmentManager, - private val fragments: SparseArray>, Parcelable>>, + context: Context, + fragments: SparseArray, + fragmentManager: FragmentManager, + wrapWithNavigationContainer: Boolean = false, + @IdRes private val defaultTabId: Int = 0, // If it zero back press with empty fragment back stack would close the app @IdRes private val contentContainerViewId: Int, @LayoutRes private val contentContainerLayoutId: Int, - private val wrapWithNavigationContainer: Boolean = false, - @IdRes private val topLevelFragmentId: Int = 0, // If it zero back press with empty fragment back stack would close the app private val onReselectListener: (() -> Unit)? = null +) : BaseBottomNavigationController( + tabs = fragments, + context = context, + fragmentManager = fragmentManager, + defaultTabId = defaultTabId, + contentContainerViewId = contentContainerViewId, + contentContainerLayoutId = contentContainerLayoutId, + wrapWithNavigationContainer = wrapWithNavigationContainer ) { - private var callback: FragmentManager.FragmentLifecycleCallbacks? = null + override fun getNavigationContainerClass() = NavigationContainerFragment::class.java - private var currentFragmentId = -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?) { - fragments.forEach { itemId, (fragmentClass, _) -> - if (isFragment(fragment, fragmentClass)) { - navigationTabsContainer.children.forEach { itemView -> itemView.isActivated = itemView.id == itemId } - } - } - } - } - fragmentManager.registerFragmentLifecycleCallbacks(callback!!, false) - - navigationTabsContainer.children.forEach { itemView -> - fragments[itemView.id]?.let { (fragmentClass, _) -> - itemView.setOnClickListener { - if (!isFragment(fragmentManager.primaryNavigationFragment, fragmentClass)) { - navigateTo(itemView.id) - } else { - onReselectListener?.invoke() - } - } - } - } + override fun onTabReselected() { + onReselectListener?.invoke() } - fun detach() = callback?.let(fragmentManager::unregisterFragmentLifecycleCallbacks) - - fun navigateTo(@IdRes itemId: Int, state: Parcelable? = null) { - // Find fragment class that needs to open - val (fragmentClass, defaultFragmentState) = fragments[itemId] ?: return - if (state != null && state::class != defaultFragmentState::class) { - throw ShouldNotHappenException( - "Incorrect state type for navigation tab root Fragment. Should be ${defaultFragmentState::class}" - ) - } - val fragmentState = state ?: defaultFragmentState - val transaction = fragmentManager.beginTransaction() - // Detach current primary fragment - fragmentManager.primaryNavigationFragment?.let(transaction::detach) - val fragmentName = fragmentClass.canonicalName - var fragment = fragmentManager.findFragmentByTag(fragmentName) - - if (state == null && fragment != null) { - transaction.attach(fragment) - } else { - // If fragment already exist remove it first - if (fragment != null) transaction.remove(fragment) - - fragment = if (wrapWithNavigationContainer) { - Fragment.instantiate( - context, - NavigationContainerFragment::class.java.name, - NavigationContainerFragment.args(fragmentClass, fragmentState, contentContainerViewId, contentContainerLayoutId) - ) - } else { - Fragment.instantiate( - context, - fragmentClass.name, - BaseFragment.args(fragmentState) - ) - } - transaction.add(contentContainerViewId, fragment, fragmentName) - } - - transaction - .setPrimaryNavigationFragment(fragment) - .setReorderingAllowed(true) - .commit() - - currentFragmentId = itemId - } - - // 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 - && topLevelFragmentId != 0 - && currentFragmentId != topLevelFragmentId) { - navigateTo(topLevelFragmentId) - true - } else { - false - } - - private fun isFragment(fragment: Fragment?, fragmentClass: Class>) = - if (wrapWithNavigationContainer) { - (fragment as NavigationContainerFragment).getFragmentClass() - } else { - (fragment as BaseFragment<*, *>).javaClass - } === fragmentClass } diff --git a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationFragment.kt b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationFragment.kt index c23969c..5445473 100644 --- a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationFragment.kt +++ b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationFragment.kt @@ -1,75 +1,16 @@ package ru.touchin.roboswag.bottom_navigation_fragment -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.annotation.IdRes -import androidx.fragment.app.Fragment -import ru.touchin.roboswag.navigation_base.activities.OnBackPressedListener -import ru.touchin.roboswag.navigation_base.fragments.BaseFragment +abstract class BottomNavigationFragment : BaseBottomNavigationFragment() { -abstract class BottomNavigationFragment : Fragment() { - - private lateinit var bottomNavigationController: BottomNavigationController - - private val backPressedListener = OnBackPressedListener { bottomNavigationController.onBackPressed() } - - protected abstract val rootLayoutId: Int - - protected abstract val navigationContainerViewId: Int - - protected abstract val contentContainerViewId: Int - - protected abstract val contentContainerLayoutId: Int - - protected abstract val topLevelFragmentId: Int - - protected abstract val wrapWithNavigationContainer: Boolean - - protected abstract val navigationFragments: SparseArray>, Parcelable>> - - protected open val reselectListener: (() -> Unit) = { getNavigationActivity().innerNavigation.up(inclusive = true) } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - bottomNavigationController = BottomNavigationController( - context = requireContext(), - fragmentManager = childFragmentManager, - fragments = navigationFragments, - contentContainerViewId = contentContainerViewId, - contentContainerLayoutId = contentContainerLayoutId, - topLevelFragmentId = topLevelFragmentId, - wrapWithNavigationContainer = wrapWithNavigationContainer, - onReselectListener = reselectListener - ) - if (savedInstanceState == null) { - bottomNavigationController.navigateTo(topLevelFragmentId) - } - } - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - val fragmentView = inflater.inflate(rootLayoutId, container, false) - - bottomNavigationController.attach(fragmentView.findViewById(navigationContainerViewId)) - - (activity as BottomNavigationActivity).addOnBackPressedListener(backPressedListener) - - return fragmentView - } - - override fun onDestroyView() { - super.onDestroyView() - (activity as BottomNavigationActivity).removeOnBackPressedListener(backPressedListener) - bottomNavigationController.detach() - } - - fun navigateTo(@IdRes navigationTabId: Int, state: Parcelable? = null) { - bottomNavigationController.navigateTo(navigationTabId, state) - } - - private fun getNavigationActivity() = requireActivity() as BottomNavigationActivity + override fun createNavigationController() = BottomNavigationController( + context = requireContext(), + fragments = tabs, + fragmentManager = childFragmentManager, + defaultTabId = defaultTabId, + contentContainerViewId = contentContainerViewId, + contentContainerLayoutId = contentContainerLayoutId, + wrapWithNavigationContainer = wrapWithNavigationContainer, + onReselectListener = reselectListener + ) } diff --git a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationContainerFragment.kt b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationContainerFragment.kt index 71fb9eb..7d8356b 100644 --- a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationContainerFragment.kt +++ b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationContainerFragment.kt @@ -1,43 +1,12 @@ package ru.touchin.roboswag.bottom_navigation_fragment -import android.os.Bundle 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.core.utils.ShouldNotHappenException import ru.touchin.roboswag.navigation_base.FragmentNavigation import ru.touchin.roboswag.navigation_base.fragments.BaseFragment -class NavigationContainerFragment : Fragment() { +class NavigationContainerFragment : BaseNavigationContainerFragment, FragmentNavigation>() { - companion object { - private const val FRAGMENT_CLASS_ARG = "FRAGMENT_CLASS_ARG" - private const val FRAGMENT_STATE_ARG = "FRAGMENT_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, - @IdRes containerViewId: Int, - @LayoutRes containerLayoutId: Int, - transition: Int = FragmentTransaction.TRANSIT_NONE - ) = Bundle().apply { - putSerializable(FRAGMENT_CLASS_ARG, cls) - putParcelable(FRAGMENT_STATE_ARG, state) - putInt(CONTAINER_VIEW_ID_ARG, containerViewId) - putInt(CONTAINER_LAYOUT_ID_ARG, containerLayoutId) - putInt(TRANSITION_ARG, transition) - } - } - - val navigation by lazy { + override val navigation by lazy { FragmentNavigation( requireContext(), childFragmentManager, @@ -46,32 +15,8 @@ class NavigationContainerFragment : Fragment() { ) } - @IdRes - private var containerViewId = 0 - - @LayoutRes - private var containerLayoutId = 0 - - private var transition = 0 - - @Suppress("UNCHECKED_CAST") - fun getFragmentClass(): Class> = - arguments?.getSerializable(FRAGMENT_CLASS_ARG) as Class> - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - if (savedInstanceState == null) { - 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) - transition = getInt(TRANSITION_ARG) - } - navigation.setInitial(getFragmentClass().kotlin, args.getParcelable(FRAGMENT_STATE_ARG)) - } + override fun onContainerCreated() { + navigation.setInitial(getContainedClass().kotlin, arguments?.getParcelable(FRAGMENT_STATE_ARG)!!) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = - inflater.inflate(containerLayoutId, container, false) - } diff --git a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationTab.kt b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationTab.kt new file mode 100644 index 0000000..1a78e34 --- /dev/null +++ b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationTab.kt @@ -0,0 +1,10 @@ +package ru.touchin.roboswag.bottom_navigation_fragment + +import android.os.Parcelable +import ru.touchin.roboswag.navigation_base.fragments.BaseFragment + +class NavigationTab( + override val cls: Class>, + state: Parcelable, + saveStateOnSwitching: Boolean = true +) : BaseNavigationTab(cls, state, saveStateOnSwitching) diff --git a/bottom-navigation-viewcontroller/build.gradle b/bottom-navigation-viewcontroller/build.gradle index 260741e..0a4487e 100644 --- a/bottom-navigation-viewcontroller/build.gradle +++ b/bottom-navigation-viewcontroller/build.gradle @@ -16,7 +16,7 @@ android { dependencies { api project(":navigation-viewcontroller") - api project(":bottom-navigation-fragment") + api project(":bottom-navigation-base") implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationActivity.kt b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationActivity.kt index 9634b43..a9135fc 100644 --- a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationActivity.kt +++ b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationActivity.kt @@ -1,16 +1,18 @@ -package ru.touchin.roboswag.components.tabbarnavigation +package ru.touchin.roboswag.bottom_navigation_viewcontroller -import android.os.Parcelable -import androidx.annotation.IdRes -import androidx.fragment.app.FragmentManager -import ru.touchin.roboswag.navigation.activities.NavigationActivity -import ru.touchin.roboswag.navigation.viewcontrollers.ViewControllerNavigation -import ru.touchin.roboswag.bottom_navigation_fragment.BottomNavigationActivity as FragmentBottomNavigationActivity +import ru.touchin.roboswag.bottom_navigation_fragment.BaseBottomNavigationActivity +import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewControllerNavigation -abstract class BottomNavigationActivity : FragmentBottomNavigationActivity() { +abstract class BottomNavigationActivity : + BaseBottomNavigationActivity, BottomNavigationFragment, NavigationContainerFragment>() { - final override val innerNavigation: ViewControllerNavigation - get() = getNavigationContainer(supportFragmentManager)?.navigation - ?: navigation as ViewControllerNavigation + final override val navigation by lazy { + ViewControllerNavigation( + this, + supportFragmentManager, + fragmentContainerViewId, + transition + ) + } } diff --git a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationController.kt b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationController.kt new file mode 100644 index 0000000..6597ae3 --- /dev/null +++ b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationController.kt @@ -0,0 +1,45 @@ +package ru.touchin.roboswag.bottom_navigation_viewcontroller + +import android.content.Context +import android.util.SparseArray +import androidx.annotation.IdRes +import androidx.annotation.LayoutRes +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import ru.touchin.roboswag.bottom_navigation_fragment.BaseBottomNavigationController +import ru.touchin.roboswag.navigation_viewcontroller.fragments.ViewControllerFragment + +class BottomNavigationController( + context: Context, + fragmentManager: FragmentManager, + viewControllers: SparseArray, + private val wrapWithNavigationContainer: Boolean = false, + @IdRes private val defaultTabId: Int = 0, // If it zero back press with empty fragment back stack would close the app + @IdRes private val contentContainerViewId: Int, + @LayoutRes private val contentContainerLayoutId: Int, + private val onReselectListener: (() -> Unit)? = null +) : BaseBottomNavigationController( + context = context, + fragmentManager = fragmentManager, + tabs = viewControllers, + defaultTabId = defaultTabId, + contentContainerViewId = contentContainerViewId, + contentContainerLayoutId = contentContainerLayoutId, + wrapWithNavigationContainer = wrapWithNavigationContainer +) { + + override fun onTabReselected() { + onReselectListener?.invoke() + } + + override fun getNavigationContainerClass() = NavigationContainerFragment::class.java + + override fun isTabClass(tab: NavigationTab, fragment: Fragment?): Boolean = + if (wrapWithNavigationContainer) { + super.isTabClass(tab, fragment) + } else { + (fragment as ViewControllerFragment<*, *>).viewControllerClass + } === tab.cls + +} + diff --git a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationFragment.kt b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationFragment.kt new file mode 100644 index 0000000..8a2f3fc --- /dev/null +++ b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationFragment.kt @@ -0,0 +1,19 @@ +package ru.touchin.roboswag.bottom_navigation_viewcontroller + +import ru.touchin.roboswag.bottom_navigation_fragment.BaseBottomNavigationFragment + +abstract class BottomNavigationFragment : BaseBottomNavigationFragment() { + + override fun createNavigationController() = BottomNavigationController( + context = requireContext(), + fragmentManager = childFragmentManager, + viewControllers = tabs, + defaultTabId = defaultTabId, + contentContainerViewId = contentContainerViewId, + contentContainerLayoutId = contentContainerLayoutId, + wrapWithNavigationContainer = wrapWithNavigationContainer, + onReselectListener = reselectListener + ) + +} + diff --git a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/NavigationContainerFragment.kt b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/NavigationContainerFragment.kt new file mode 100644 index 0000000..c70e1fd --- /dev/null +++ b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/NavigationContainerFragment.kt @@ -0,0 +1,26 @@ +package ru.touchin.roboswag.bottom_navigation_viewcontroller + +import android.os.Parcelable +import ru.touchin.roboswag.bottom_navigation_fragment.BaseNavigationContainerFragment +import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewController +import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewControllerNavigation + +class NavigationContainerFragment : + BaseNavigationContainerFragment< + ViewController, + ViewControllerNavigation>() { + + override val navigation by lazy { + ViewControllerNavigation( + requireContext(), + childFragmentManager, + containerViewId, + transition + ) + } + + override fun onContainerCreated() { + navigation.setInitialViewController(getContainedClass(), arguments?.getParcelable(FRAGMENT_STATE_ARG)!!) + } + +} diff --git a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/NavigationTab.kt b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/NavigationTab.kt new file mode 100644 index 0000000..7ee96ed --- /dev/null +++ b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/NavigationTab.kt @@ -0,0 +1,15 @@ +package ru.touchin.roboswag.bottom_navigation_viewcontroller + +import android.os.Parcelable +import ru.touchin.roboswag.bottom_navigation_fragment.BaseNavigationTab +import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewController + +class NavigationTab( + override val cls: Class>, + state: Parcelable, + /** + * It can be useful in some cases when it is necessary to create ViewController + * with initial state every time when tab opens. + */ + saveStateOnSwitching: Boolean = true +) : BaseNavigationTab(cls, state, saveStateOnSwitching) diff --git a/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/LifecycleViewModelProviders.kt b/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/LifecycleViewModelProviders.kt index f49d498..8bdb97b 100644 --- a/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/LifecycleViewModelProviders.kt +++ b/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/LifecycleViewModelProviders.kt @@ -1,12 +1,12 @@ package ru.touchin.lifecycle.viewmodel import android.app.Activity +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProviders -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentActivity -import ru.touchin.roboswag.components.navigation_viewcontroller.viewcontrollers.ViewController +import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewController object LifecycleViewModelProviders { diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/BaseActivity.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/BaseActivity.kt index b1437d3..eda7d0c 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/BaseActivity.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/BaseActivity.kt @@ -26,10 +26,10 @@ import android.os.Bundle import android.os.PersistableBundle import android.view.WindowManager import androidx.appcompat.app.AppCompatActivity -import ru.touchin.roboswag.components.navigation_viewcontroller.keyboard_resizeable.KeyboardBehaviorDetector import ru.touchin.roboswag.core.log.Lc import ru.touchin.roboswag.core.log.LcGroup import ru.touchin.roboswag.navigation_base.fragments.LifecycleLoggingObserver +import ru.touchin.roboswag.navigation_viewcontroller.keyboard_resizeable.KeyboardBehaviorDetector /** * Created by Gavriil Sitnikov on 08/03/2016. diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/NavigationActivity.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/NavigationActivity.kt index 7c1d669..ed45972 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/NavigationActivity.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/NavigationActivity.kt @@ -3,23 +3,12 @@ package ru.touchin.roboswag.navigation_base.activities import androidx.fragment.app.FragmentTransaction import ru.touchin.roboswag.navigation_base.FragmentNavigation -/** - * Created by Daniil Borisovskii on 15/08/2019. - * Base activity with nested navigation. - */ -abstract class NavigationActivity : BaseActivity() { +abstract class NavigationActivity : BaseActivity() { protected abstract val fragmentContainerViewId: Int protected open val transition = FragmentTransaction.TRANSIT_NONE - open val navigation by lazy { - FragmentNavigation( - this, - supportFragmentManager, - fragmentContainerViewId, - transition - ) - } + abstract val navigation: TNavigation } diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt index 07cf436..7f93232 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.components.navigation_viewcontroller.keyboard_resizeable +package ru.touchin.roboswag.navigation_viewcontroller.keyboard_resizeable import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat diff --git a/navigation-viewcontroller/src/main/AndroidManifest.xml b/navigation-viewcontroller/src/main/AndroidManifest.xml index b0f6ab4..79d1d6e 100644 --- a/navigation-viewcontroller/src/main/AndroidManifest.xml +++ b/navigation-viewcontroller/src/main/AndroidManifest.xml @@ -1,3 +1 @@ - + diff --git a/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/fragments/ViewControllerFragment.kt b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/navigation_viewcontroller/fragments/ViewControllerFragment.kt similarity index 97% rename from navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/fragments/ViewControllerFragment.kt rename to navigation-viewcontroller/src/main/java/ru/touchin/roboswag/navigation_viewcontroller/fragments/ViewControllerFragment.kt index 63e75df..053f9a9 100644 --- a/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/fragments/ViewControllerFragment.kt +++ b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/navigation_viewcontroller/fragments/ViewControllerFragment.kt @@ -17,7 +17,7 @@ * */ -package ru.touchin.roboswag.components.navigation_viewcontroller.fragments +package ru.touchin.roboswag.navigation_viewcontroller.fragments import android.animation.Animator import android.annotation.SuppressLint @@ -35,8 +35,8 @@ import android.view.animation.Animation import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.lifecycle.Lifecycle -import ru.touchin.roboswag.components.navigation_viewcontroller.BuildConfig -import ru.touchin.roboswag.components.navigation_viewcontroller.viewcontrollers.ViewController +import ru.touchin.roboswag.navigation_viewcontroller.BuildConfig +import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewController /** * Created by Gavriil Sitnikov on 21/10/2015. diff --git a/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/keyboard_resizeable/KeyboardResizeableViewController.kt b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/navigation_viewcontroller/keyboard_resizeable/KeyboardResizeableViewController.kt similarity index 93% rename from navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/keyboard_resizeable/KeyboardResizeableViewController.kt rename to navigation-viewcontroller/src/main/java/ru/touchin/roboswag/navigation_viewcontroller/keyboard_resizeable/KeyboardResizeableViewController.kt index 1a8c5f3..bd7f7c8 100644 --- a/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/components/navigation_viewcontroller/keyboard_resizeable/KeyboardResizeableViewController.kt +++ b/navigation-viewcontroller/src/main/java/ru/touchin/roboswag/navigation_viewcontroller/keyboard_resizeable/KeyboardResizeableViewController.kt @@ -1,14 +1,14 @@ -package ru.touchin.roboswag.components.navigation_viewcontroller.keyboard_resizeable +package ru.touchin.roboswag.navigation_viewcontroller.keyboard_resizeable import android.os.Build import android.os.Parcelable import androidx.annotation.CallSuper import androidx.annotation.LayoutRes import androidx.lifecycle.LifecycleObserver -import ru.touchin.roboswag.components.navigation_viewcontroller.viewcontrollers.ViewController import ru.touchin.roboswag.components.utils.UiUtils import ru.touchin.roboswag.navigation_base.activities.BaseActivity import ru.touchin.roboswag.navigation_base.activities.OnBackPressedListener +import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewController abstract class KeyboardResizeableViewController( @LayoutRes layoutRes: Int, @@ -17,6 +17,7 @@ abstract class KeyboardResizeableViewController= Build.VERSION_CODES.KITKAT_WATCH) { creationContext.container?.requestApplyInsets() @@ -85,4 +86,5 @@ abstract class KeyboardResizeableViewController Date: Wed, 29 Apr 2020 13:44:27 +0300 Subject: [PATCH 06/14] kotlinOptions to java 8 --- bottom-navigation-fragment/build.gradle | 5 +++++ bottom-navigation-viewcontroller/build.gradle | 5 +++++ navigation-base/build.gradle | 5 +++++ navigation-viewcontroller/build.gradle | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/bottom-navigation-fragment/build.gradle b/bottom-navigation-fragment/build.gradle index f24dfbf..87c56a9 100644 --- a/bottom-navigation-fragment/build.gradle +++ b/bottom-navigation-fragment/build.gradle @@ -12,6 +12,11 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + } dependencies { diff --git a/bottom-navigation-viewcontroller/build.gradle b/bottom-navigation-viewcontroller/build.gradle index 0a4487e..cdae20e 100644 --- a/bottom-navigation-viewcontroller/build.gradle +++ b/bottom-navigation-viewcontroller/build.gradle @@ -12,6 +12,11 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + } dependencies { diff --git a/navigation-base/build.gradle b/navigation-base/build.gradle index 5aa8b2b..af04146 100644 --- a/navigation-base/build.gradle +++ b/navigation-base/build.gradle @@ -13,6 +13,11 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + } dependencies { diff --git a/navigation-viewcontroller/build.gradle b/navigation-viewcontroller/build.gradle index dd1ac36..20888aa 100644 --- a/navigation-viewcontroller/build.gradle +++ b/navigation-viewcontroller/build.gradle @@ -13,6 +13,11 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + } dependencies { From 45dddff10aeec7e9536b5ab4db056521e31e88d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=91=D0=B0=D1=87?= =?UTF-8?q?=D0=B8=D0=BD=D1=81=D0=BA=D0=B8=D0=B8=CC=86?= Date: Wed, 27 May 2020 20:41:46 +0300 Subject: [PATCH 07/14] split basefragment and state saving --- .../activities/BaseActivity.kt | 2 +- .../navigation_base/fragments/BaseFragment.kt | 42 +------------- .../fragments/FragmentWithState.kt | 55 +++++++++++++++++++ .../KeyboardBehaviorDetector.kt | 2 +- 4 files changed, 60 insertions(+), 41 deletions(-) create mode 100644 navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/FragmentWithState.kt diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/BaseActivity.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/BaseActivity.kt index eda7d0c..be2244e 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/BaseActivity.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/activities/BaseActivity.kt @@ -29,7 +29,7 @@ import androidx.appcompat.app.AppCompatActivity import ru.touchin.roboswag.core.log.Lc import ru.touchin.roboswag.core.log.LcGroup import ru.touchin.roboswag.navigation_base.fragments.LifecycleLoggingObserver -import ru.touchin.roboswag.navigation_viewcontroller.keyboard_resizeable.KeyboardBehaviorDetector +import ru.touchin.roboswag.navigation_base.keyboard_resizeable.KeyboardBehaviorDetector /** * Created by Gavriil Sitnikov on 08/03/2016. diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/BaseFragment.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/BaseFragment.kt index c8a85df..b38027f 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/BaseFragment.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/BaseFragment.kt @@ -4,8 +4,6 @@ import android.content.Context import android.content.res.ColorStateList import android.graphics.drawable.Drawable import android.os.Bundle -import android.os.Parcel -import android.os.Parcelable import android.view.View import androidx.annotation.ColorInt import androidx.annotation.ColorRes @@ -15,30 +13,12 @@ import androidx.annotation.LayoutRes import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity -import ru.touchin.roboswag.navigation_base.BuildConfig -open class BaseFragment(@LayoutRes layoutRes: Int) : Fragment(layoutRes) { +open class BaseFragment : Fragment { - companion object { - private const val BASE_FRAGMENT_STATE_EXTRA = "BASE_FRAGMENT_STATE_EXTRA" + constructor() : super() - fun args(state: Parcelable?): Bundle = Bundle().also { it.putParcelable(BASE_FRAGMENT_STATE_EXTRA, state) } - - // This method used to check unique state of each fragment. - // If two fragments share same class for state, you should not pass state instance of current fragment to the one you transition to - private fun reserialize(parcelable: T): T { - var parcel = Parcel.obtain() - parcel.writeParcelable(parcelable, 0) - val serializableBytes = parcel.marshall() - parcel.recycle() - parcel = Parcel.obtain() - parcel.unmarshall(serializableBytes, 0, serializableBytes.size) - parcel.setDataPosition(0) - val result = parcel.readParcelable(Thread.currentThread().contextClassLoader) ?: throw IllegalStateException("It must not be null") - parcel.recycle() - return result - } - } + constructor(@LayoutRes layoutRes: Int) : super(layoutRes) protected val view: View @JvmName("requireViewKtx") get() = requireView() @@ -49,21 +29,10 @@ open class BaseFragment(@Layo protected val context: Context @JvmName("requireContextKtx") get() = requireContext() - protected lateinit var state: TState - private set - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setHasOptionsMenu(true) - - state = savedInstanceState?.getParcelable(BASE_FRAGMENT_STATE_EXTRA) - ?: arguments?.getParcelable(BASE_FRAGMENT_STATE_EXTRA) - ?: throw IllegalStateException("Fragment state can't be null") - - if (BuildConfig.DEBUG) { - state = reserialize(state) - } } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -72,11 +41,6 @@ open class BaseFragment(@Layo lifecycle.addObserver(LifecycleLoggingObserver(this)) } - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - outState.putParcelable(BASE_FRAGMENT_STATE_EXTRA, state) - } - fun findViewById(@IdRes id: Int): T = view.findViewById(id) @ColorInt diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/FragmentWithState.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/FragmentWithState.kt new file mode 100644 index 0000000..dedf118 --- /dev/null +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/FragmentWithState.kt @@ -0,0 +1,55 @@ +package ru.touchin.roboswag.navigation_base.fragments + +import android.os.Bundle +import android.os.Parcel +import android.os.Parcelable +import androidx.annotation.LayoutRes +import androidx.fragment.app.FragmentActivity +import ru.touchin.roboswag.navigation_base.BuildConfig + +open class FragmentWithState( + @LayoutRes layoutRes: Int +) : BaseFragment(layoutRes) { + + companion object { + private const val BASE_FRAGMENT_STATE_EXTRA = "BASE_FRAGMENT_STATE_EXTRA" + + fun args(state: Parcelable?): Bundle = Bundle().also { it.putParcelable(BASE_FRAGMENT_STATE_EXTRA, state) } + + // This method used to check unique state of each fragment. + // If two fragments share same class for state, you should not pass state instance of current fragment to the one you transition to + private fun reserialize(parcelable: T): T { + var parcel = Parcel.obtain() + parcel.writeParcelable(parcelable, 0) + val serializableBytes = parcel.marshall() + parcel.recycle() + parcel = Parcel.obtain() + parcel.unmarshall(serializableBytes, 0, serializableBytes.size) + parcel.setDataPosition(0) + val result = parcel.readParcelable(Thread.currentThread().contextClassLoader) ?: throw IllegalStateException("It must not be null") + parcel.recycle() + return result + } + } + + protected lateinit var state: TState + private set + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + state = savedInstanceState?.getParcelable(BASE_FRAGMENT_STATE_EXTRA) + ?: arguments?.getParcelable(BASE_FRAGMENT_STATE_EXTRA) + ?: throw IllegalStateException("Fragment state can't be null") + + if (BuildConfig.DEBUG) { + state = reserialize(state) + } + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putParcelable(BASE_FRAGMENT_STATE_EXTRA, state) + } + +} diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt index 7f93232..30774a2 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardBehaviorDetector.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.navigation_viewcontroller.keyboard_resizeable +package ru.touchin.roboswag.navigation_base.keyboard_resizeable import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat From f3bd3b2f694f124d12260a47024442e851b5831e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=91=D0=B0=D1=87?= =?UTF-8?q?=D0=B8=D0=BD=D1=81=D0=BA=D0=B8=D0=B8=CC=86?= Date: Wed, 27 May 2020 20:58:05 +0300 Subject: [PATCH 08/14] move logging stuff to logging module --- .../java/ru/touchin/templates/ApiModel.java | 14 ++-- logging/build.gradle | 4 ++ .../ru/touchin/roboswag/core/log/LcGroup.java | 9 ++- .../core/utils/CrashlyticsLogProcessor.java | 66 +++++++++++++++++++ navigation-base/build.gradle | 1 - .../roboswag/navigation_base/TouchinApp.java | 59 +---------------- navigation-viewcontroller/build.gradle | 1 - 7 files changed, 81 insertions(+), 73 deletions(-) create mode 100644 logging/src/main/java/ru/touchin/roboswag/core/utils/CrashlyticsLogProcessor.java diff --git a/api-logansquare/src/main/java/ru/touchin/templates/ApiModel.java b/api-logansquare/src/main/java/ru/touchin/templates/ApiModel.java index 1086021..c2eab36 100644 --- a/api-logansquare/src/main/java/ru/touchin/templates/ApiModel.java +++ b/api-logansquare/src/main/java/ru/touchin/templates/ApiModel.java @@ -19,14 +19,13 @@ package ru.touchin.templates; -import androidx.annotation.CallSuper; -import androidx.annotation.NonNull; - import java.io.IOException; import java.io.Serializable; import java.util.Collection; import java.util.Iterator; +import androidx.annotation.CallSuper; +import androidx.annotation.NonNull; import ru.touchin.roboswag.core.log.Lc; import ru.touchin.roboswag.core.log.LcGroup; @@ -38,11 +37,6 @@ public abstract class ApiModel implements Serializable { private static final long serialVersionUID = 1L; - /** - * Logging group to log API validation errors. - */ - public static final LcGroup API_VALIDATION_LC_GROUP = new LcGroup("API_VALIDATION"); - /** * Validates list of objects. Use it if objects in list extends {@link ApiModel}. * @@ -76,14 +70,14 @@ public abstract class ApiModel implements Serializable { throw exception; case EXCEPTION_IF_ALL_INVALID: iterator.remove(); - API_VALIDATION_LC_GROUP.e(exception, "Item %s is invalid at " + Lc.getCodePoint(null, 1), position); + LcGroup.API_VALIDATION.e(exception, "Item %s is invalid at " + Lc.getCodePoint(null, 1), position); if (!iterator.hasNext() && !haveValidItem) { throw new ValidationException("Whole list is invalid at " + Lc.getCodePoint(null, 1)); } break; case REMOVE_INVALID_ITEMS: iterator.remove(); - API_VALIDATION_LC_GROUP.e(exception, "Item %s is invalid at " + Lc.getCodePoint(null, 1), position); + LcGroup.API_VALIDATION.e(exception, "Item %s is invalid at " + Lc.getCodePoint(null, 1), position); break; default: Lc.assertion("Unexpected rule " + collectionValidationRule); diff --git a/logging/build.gradle b/logging/build.gradle index 21ed245..2b79ac2 100644 --- a/logging/build.gradle +++ b/logging/build.gradle @@ -15,4 +15,8 @@ android { dependencies { implementation "androidx.annotation:annotation:$versions.androidx" + + implementation("com.crashlytics.sdk.android:crashlytics:$versions.crashlytics@aar") { + transitive = true + } } diff --git a/logging/src/main/java/ru/touchin/roboswag/core/log/LcGroup.java b/logging/src/main/java/ru/touchin/roboswag/core/log/LcGroup.java index f1ea1b0..41e877f 100644 --- a/logging/src/main/java/ru/touchin/roboswag/core/log/LcGroup.java +++ b/logging/src/main/java/ru/touchin/roboswag/core/log/LcGroup.java @@ -19,12 +19,11 @@ package ru.touchin.roboswag.core.log; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - import java.text.SimpleDateFormat; import java.util.Locale; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import ru.touchin.roboswag.core.utils.ShouldNotHappenException; import ru.touchin.roboswag.core.utils.ThreadLocalValue; @@ -45,6 +44,10 @@ public class LcGroup { * Logging group to log UI lifecycle (onCreate, onStart, onResume etc.). */ public static final LcGroup UI_LIFECYCLE = new LcGroup("UI_LIFECYCLE"); + /** + * Logging group to log UI lifecycle (onCreate, onStart, onResume etc.). + */ + public static final LcGroup API_VALIDATION = new LcGroup("API_VALIDATION"); private static final ThreadLocalValue DATE_TIME_FORMATTER = new ThreadLocalValue<>(() -> new SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault())); diff --git a/logging/src/main/java/ru/touchin/roboswag/core/utils/CrashlyticsLogProcessor.java b/logging/src/main/java/ru/touchin/roboswag/core/utils/CrashlyticsLogProcessor.java new file mode 100644 index 0000000..1234660 --- /dev/null +++ b/logging/src/main/java/ru/touchin/roboswag/core/utils/CrashlyticsLogProcessor.java @@ -0,0 +1,66 @@ +package ru.touchin.roboswag.core.utils; + +import android.util.Log; + +import com.crashlytics.android.Crashlytics; + +import java.util.ArrayList; +import java.util.List; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import ru.touchin.roboswag.core.log.Lc; +import ru.touchin.roboswag.core.log.LcGroup; +import ru.touchin.roboswag.core.log.LcLevel; +import ru.touchin.roboswag.core.log.LogProcessor; + +public class CrashlyticsLogProcessor extends LogProcessor { + + @NonNull + private final Crashlytics crashlytics; + + public CrashlyticsLogProcessor(@NonNull final Crashlytics crashlytics) { + super(LcLevel.INFO); + this.crashlytics = crashlytics; + } + + @Override + public void processLogMessage(@NonNull final LcGroup group, + @NonNull final LcLevel level, + @NonNull final String tag, + @NonNull final String message, + @Nullable final Throwable throwable) { + if (group == LcGroup.UI_LIFECYCLE) { + crashlytics.core.log(level.getPriority(), tag, message); + } else if (!level.lessThan(LcLevel.ASSERT) + || (group == LcGroup.API_VALIDATION && level == LcLevel.ERROR)) { + Log.e(tag, message); + if (throwable != null) { + crashlytics.core.log(level.getPriority(), tag, message); + crashlytics.core.logException(throwable); + } else { + final ShouldNotHappenException exceptionToLog = new ShouldNotHappenException(tag + ':' + message); + reduceStackTrace(exceptionToLog); + crashlytics.core.logException(exceptionToLog); + } + } + } + + private void reduceStackTrace(@NonNull final Throwable throwable) { + final StackTraceElement[] stackTrace = throwable.getStackTrace(); + final List reducedStackTraceList = new ArrayList<>(); + for (int i = stackTrace.length - 1; i >= 0; i--) { + final StackTraceElement stackTraceElement = stackTrace[i]; + if (stackTraceElement.getClassName().contains(getClass().getSimpleName()) + || stackTraceElement.getClassName().contains(LcGroup.class.getName()) + || stackTraceElement.getClassName().contains(Lc.class.getName())) { + break; + } + reducedStackTraceList.add(0, stackTraceElement); + } + StackTraceElement[] reducedStackTrace = new StackTraceElement[reducedStackTraceList.size()]; + reducedStackTrace = reducedStackTraceList.toArray(reducedStackTrace); + throwable.setStackTrace(reducedStackTrace); + } + +} diff --git a/navigation-base/build.gradle b/navigation-base/build.gradle index af04146..2a000a0 100644 --- a/navigation-base/build.gradle +++ b/navigation-base/build.gradle @@ -23,7 +23,6 @@ android { dependencies { api project(":utils") api project(":logging") - api project(":api-logansquare") api 'androidx.multidex:multidex:2.0.1' diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/TouchinApp.java b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/TouchinApp.java index ac977ac..ca05782 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/TouchinApp.java +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/TouchinApp.java @@ -28,20 +28,14 @@ import com.crashlytics.android.Crashlytics; 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; 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; +import ru.touchin.roboswag.core.utils.CrashlyticsLogProcessor; /** * Created by Gavriil Sitnikov on 10/03/16. @@ -93,55 +87,4 @@ public abstract class TouchinApp extends Application { .build()); } - private static class CrashlyticsLogProcessor extends LogProcessor { - - @NonNull - private final Crashlytics crashlytics; - - public CrashlyticsLogProcessor(@NonNull final Crashlytics crashlytics) { - super(LcLevel.INFO); - this.crashlytics = crashlytics; - } - - @Override - public void processLogMessage(@NonNull final LcGroup group, - @NonNull final LcLevel level, - @NonNull final String tag, - @NonNull final String message, - @Nullable final Throwable throwable) { - if (group == LcGroup.UI_LIFECYCLE) { - crashlytics.core.log(level.getPriority(), tag, message); - } else if (!level.lessThan(LcLevel.ASSERT) - || (group == ApiModel.API_VALIDATION_LC_GROUP && level == LcLevel.ERROR)) { - Log.e(tag, message); - if (throwable != null) { - crashlytics.core.log(level.getPriority(), tag, message); - crashlytics.core.logException(throwable); - } else { - final ShouldNotHappenException exceptionToLog = new ShouldNotHappenException(tag + ':' + message); - reduceStackTrace(exceptionToLog); - crashlytics.core.logException(exceptionToLog); - } - } - } - - private void reduceStackTrace(@NonNull final Throwable throwable) { - final StackTraceElement[] stackTrace = throwable.getStackTrace(); - final List reducedStackTraceList = new ArrayList<>(); - for (int i = stackTrace.length - 1; i >= 0; i--) { - final StackTraceElement stackTraceElement = stackTrace[i]; - if (stackTraceElement.getClassName().contains(getClass().getSimpleName()) - || stackTraceElement.getClassName().contains(LcGroup.class.getName()) - || stackTraceElement.getClassName().contains(Lc.class.getName())) { - break; - } - reducedStackTraceList.add(0, stackTraceElement); - } - StackTraceElement[] reducedStackTrace = new StackTraceElement[reducedStackTraceList.size()]; - reducedStackTrace = reducedStackTraceList.toArray(reducedStackTrace); - throwable.setStackTrace(reducedStackTrace); - } - - } - } diff --git a/navigation-viewcontroller/build.gradle b/navigation-viewcontroller/build.gradle index 20888aa..59cbb01 100644 --- a/navigation-viewcontroller/build.gradle +++ b/navigation-viewcontroller/build.gradle @@ -23,7 +23,6 @@ android { dependencies { api project(":utils") api project(":logging") - api project(":api-logansquare") api project(":navigation-base") api 'androidx.multidex:multidex:2.0.1' From 62d3467a59e602f52eb7fde6689e452bd75419ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=91=D0=B0=D1=87?= =?UTF-8?q?=D0=B8=D0=BD=D1=81=D0=BA=D0=B8=D0=B8=CC=86?= Date: Thu, 28 May 2020 00:15:53 +0300 Subject: [PATCH 09/14] update comment to new lc group --- logging/src/main/java/ru/touchin/roboswag/core/log/LcGroup.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logging/src/main/java/ru/touchin/roboswag/core/log/LcGroup.java b/logging/src/main/java/ru/touchin/roboswag/core/log/LcGroup.java index 41e877f..6994622 100644 --- a/logging/src/main/java/ru/touchin/roboswag/core/log/LcGroup.java +++ b/logging/src/main/java/ru/touchin/roboswag/core/log/LcGroup.java @@ -45,7 +45,7 @@ public class LcGroup { */ public static final LcGroup UI_LIFECYCLE = new LcGroup("UI_LIFECYCLE"); /** - * Logging group to log UI lifecycle (onCreate, onStart, onResume etc.). + * Logging group to log api validation errors. */ public static final LcGroup API_VALIDATION = new LcGroup("API_VALIDATION"); From 2015daf5d18c32cebfe3d1af566421767c693f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=91=D0=B0=D1=87?= =?UTF-8?q?=D0=B8=D0=BD=D1=81=D0=BA=D0=B8=D0=B8=CC=86?= Date: Thu, 28 May 2020 00:26:43 +0300 Subject: [PATCH 10/14] fix errors with fragmentwithstate --- .../roboswag/navigation_base/FragmentNavigation.kt | 14 +++++++------- .../KeyboardResizeableFragment.kt | 3 ++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/FragmentNavigation.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/FragmentNavigation.kt index bb43c5e..0cb1043 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/FragmentNavigation.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/FragmentNavigation.kt @@ -28,7 +28,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction import ru.touchin.roboswag.core.log.Lc -import ru.touchin.roboswag.navigation_base.fragments.BaseFragment +import ru.touchin.roboswag.navigation_base.fragments.FragmentWithState import kotlin.reflect.KClass /** @@ -169,14 +169,14 @@ open class FragmentNavigation( * @param transactionSetup Function to setup transaction before commit. It is useful to specify transition animations or additional info. */ fun push( - fragmentClass: KClass>, + fragmentClass: KClass>, state: T, addToStack: Boolean = true, backStackName: String? = null, tag: String? = null, transactionSetup: ((FragmentTransaction) -> Unit)? = null ) { - push(fragmentClass.java, BaseFragment.args(state), addToStack, backStackName, tag, transactionSetup) + push(fragmentClass.java, FragmentWithState.args(state), addToStack, backStackName, tag, transactionSetup) } /** @@ -216,14 +216,14 @@ open class FragmentNavigation( * @param transactionSetup Function to setup transaction before commit. It is useful to specify transition animations or additional info. */ fun pushForResult( - fragmentClass: KClass>, + fragmentClass: KClass>, targetFragment: Fragment, targetRequestCode: Int, state: T, tag: String? = null, transactionSetup: ((FragmentTransaction) -> Unit)? = null ) { - pushForResult(fragmentClass.java, targetFragment, targetRequestCode, BaseFragment.args(state), tag, transactionSetup) + pushForResult(fragmentClass.java, targetFragment, targetRequestCode, FragmentWithState.args(state), tag, transactionSetup) } /** @@ -270,13 +270,13 @@ open class FragmentNavigation( * @param transactionSetup Function to setup transaction before commit. It is useful to specify transition animations or additional info. */ fun setInitial( - fragmentClass: KClass>, + fragmentClass: KClass>, state: T, tag: String? = null, transactionSetup: ((FragmentTransaction) -> Unit)? = null ) { beforeSetInitialActions() - setAsTop(fragmentClass.java, BaseFragment.args(state), false, tag, transactionSetup) + setAsTop(fragmentClass.java, FragmentWithState.args(state), false, tag, transactionSetup) } /** diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt index 7775227..13cec6d 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt @@ -10,10 +10,11 @@ import ru.touchin.roboswag.components.utils.UiUtils import ru.touchin.roboswag.navigation_base.activities.BaseActivity import ru.touchin.roboswag.navigation_base.activities.OnBackPressedListener import ru.touchin.roboswag.navigation_base.fragments.BaseFragment +import ru.touchin.roboswag.navigation_base.fragments.FragmentWithState abstract class KeyboardResizeableFragment( @LayoutRes layoutRes: Int -) : BaseFragment( +) : FragmentWithState( layoutRes ) { From 372750eee4928dfe2f67670a11db8b2e33f512c8 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 28 May 2020 13:26:54 +0300 Subject: [PATCH 11/14] viewcontroller viewModel management logic now in separate module rename FragmentWithState to StatefulFragment fix navigation class files packages --- bottom-navigation-base/build.gradle | 3 +- .../BaseBottomNavigationActivity.kt | 13 ++--- .../BaseBottomNavigationController.kt | 17 ++++--- .../BaseBottomNavigationFragment.kt | 2 +- .../BaseNavigationContainerFramgent.kt | 2 +- .../BaseNavigationTab.kt | 39 ++++----------- bottom-navigation-fragment/build.gradle | 4 +- .../BottomNavigationActivity.kt | 1 + .../BottomNavigationController.kt | 12 ++--- .../BottomNavigationFragment.kt | 2 + .../NavigationContainerFragment.kt | 6 ++- .../NavigationTab.kt | 5 +- lifecycle-viewcontroller/.gitignore | 1 + lifecycle-viewcontroller/build.gradle | 35 ++++++++++++++ .../src/main/AndroidManifest.xml | 1 + .../extensions/ViewModelLazy.kt | 37 ++++++++++++++ .../viewmodel/LifecycleViewModelProviders.kt | 30 ++++++++++++ lifecycle/build.gradle | 2 - .../BaseLifecycleViewModelProviders.kt | 47 ++++++++++++++++++ .../viewmodel/LifecycleViewModelProviders.kt | 48 +------------------ navigation-base/build.gradle | 8 ++-- .../navigation_base/FragmentNavigation.kt | 14 +++--- .../navigation_base/extensions/Parcelable.kt | 47 ++++++++++++++++++ ...agmentWithState.kt => StatefulFragment.kt} | 20 ++------ .../KeyboardResizeableFragment.kt | 5 +- navigation-viewcontroller/build.gradle | 10 ++-- 26 files changed, 268 insertions(+), 143 deletions(-) create mode 100644 lifecycle-viewcontroller/.gitignore create mode 100644 lifecycle-viewcontroller/build.gradle create mode 100644 lifecycle-viewcontroller/src/main/AndroidManifest.xml create mode 100644 lifecycle-viewcontroller/src/main/java/ru/touchin/lifecycle_viewcontroller/extensions/ViewModelLazy.kt create mode 100644 lifecycle-viewcontroller/src/main/java/ru/touchin/lifecycle_viewcontroller/viewmodel/LifecycleViewModelProviders.kt create mode 100644 lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/BaseLifecycleViewModelProviders.kt create mode 100644 navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/extensions/Parcelable.kt rename navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/{FragmentWithState.kt => StatefulFragment.kt} (55%) diff --git a/bottom-navigation-base/build.gradle b/bottom-navigation-base/build.gradle index 40be017..f97eb55 100644 --- a/bottom-navigation-base/build.gradle +++ b/bottom-navigation-base/build.gradle @@ -20,7 +20,8 @@ android { } dependencies { - api project(":navigation-base") + implementation project(":logging") + implementation project(":navigation-base") implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationActivity.kt b/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationActivity.kt index 86a185e..779602f 100644 --- a/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationActivity.kt +++ b/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationActivity.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.bottom_navigation_fragment +package ru.touchin.roboswag.bottom_navigation_base import android.os.Parcelable import androidx.annotation.IdRes @@ -6,13 +6,14 @@ import androidx.fragment.app.FragmentManager import ru.touchin.roboswag.navigation_base.FragmentNavigation import ru.touchin.roboswag.navigation_base.activities.NavigationActivity -abstract class BaseBottomNavigationActivity< - TNavigation : FragmentNavigation, - TNavigationFragment : BaseBottomNavigationFragment<*>, - TNavigationContainer : BaseNavigationContainerFragment<*, TNavigation>> : NavigationActivity() { +abstract class BaseBottomNavigationActivity : NavigationActivity() + where TNavigation : FragmentNavigation, + TNavigationFragment : BaseBottomNavigationFragment<*>, + TNavigationContainer : BaseNavigationContainerFragment<*, TNavigation> +{ val innerNavigation: TNavigation - get() = getNavigationContainer(supportFragmentManager)?.navigation ?: navigation + get() = getNavigationContainer(supportFragmentManager)?.navigation ?: navigation /** * Navigates to the given navigation tab. diff --git a/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationController.kt b/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationController.kt index ec69c76..8f831ef 100644 --- a/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationController.kt +++ b/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseBottomNavigationController.kt @@ -1,4 +1,4 @@ -package ru.touchin.roboswag.bottom_navigation_fragment +package ru.touchin.roboswag.bottom_navigation_base import android.content.Context import android.os.Bundle @@ -13,16 +13,17 @@ import androidx.core.view.children import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import ru.touchin.roboswag.core.utils.ShouldNotHappenException -import ru.touchin.roboswag.navigation_base.fragments.BaseFragment +import ru.touchin.roboswag.navigation_base.fragments.StatefulFragment abstract class BaseBottomNavigationController( private val tabs: SparseArray, private val context: Context, private val fragmentManager: FragmentManager, - @IdRes private val defaultTabId: Int = 0, // If it zero back press with empty fragment back stack would close the app - @IdRes private val contentContainerViewId: Int, @LayoutRes private val contentContainerLayoutId: Int, - private val wrapWithNavigationContainer: Boolean = false + @IdRes private val contentContainerViewId: Int, + @IdRes private val defaultTabId: Int = 0, // If it zero back press with empty fragment back stack would close the app + private val wrapWithNavigationContainer: Boolean = false, + private val onReselectListener: (() -> Unit)? = null ) { private var callback: FragmentManager.FragmentLifecycleCallbacks? = null @@ -111,7 +112,9 @@ abstract class BaseBottomNavigationController> = BaseNavigationContainerFragment::class.java - protected open fun onTabReselected() = Unit + protected open fun onTabReselected() { + onReselectListener?.invoke() + } protected open fun isTabClass(tab: TNavigationTab, fragment: Fragment?) = if (wrapWithNavigationContainer) { (fragment as BaseNavigationContainerFragment<*, *>).getContainedClass() @@ -130,7 +133,7 @@ abstract class BaseBottomNavigationController, @@ -14,31 +13,13 @@ open class BaseNavigationTab( val saveStateOnSwitching: Boolean = true ) { - /** - * It is value as class body property instead of value as constructor parameter to specify - * custom getter of this field which returns copy of Parcelable every time it be called. - * This is necessary to avoid modifying this value if it would be a value as constructor parameter - * and every getting of this value would return the same instance. - */ - val state = state - get() = field.copy() - - private fun Parcelable.copy(): Parcelable = - if (this is EmptyState) { - EmptyState - } else { - val parcel = Parcel.obtain() - - parcel.writeParcelable(this, 0) - parcel.setDataPosition(0) - - val result = parcel.readParcelable( - javaClass.classLoader ?: Thread.currentThread().contextClassLoader - ) ?: throw IllegalStateException("Failed to copy tab state") - - parcel.recycle() - - result - } + /** + * It is value as class body property instead of value as constructor parameter to specify + * custom getter of this field which returns copy of Parcelable every time it be called. + * This is necessary to avoid modifying this value if it would be a value as constructor parameter + * and every getting of this value would return the same instance. + */ + val state = state + get() = field.copy() } diff --git a/bottom-navigation-fragment/build.gradle b/bottom-navigation-fragment/build.gradle index 87c56a9..69410ca 100644 --- a/bottom-navigation-fragment/build.gradle +++ b/bottom-navigation-fragment/build.gradle @@ -20,8 +20,8 @@ android { } dependencies { - api project(":navigation-base") - api project(":bottom-navigation-base") + implementation project(":navigation-base") + implementation project(":bottom-navigation-base") implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationActivity.kt b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationActivity.kt index 214ea8f..1eae1ca 100644 --- a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationActivity.kt +++ b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationActivity.kt @@ -1,5 +1,6 @@ package ru.touchin.roboswag.bottom_navigation_fragment +import ru.touchin.roboswag.bottom_navigation_base.BaseBottomNavigationActivity import ru.touchin.roboswag.navigation_base.FragmentNavigation abstract class BottomNavigationActivity : diff --git a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationController.kt b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationController.kt index eeb51ff..de42784 100644 --- a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationController.kt +++ b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationController.kt @@ -5,21 +5,23 @@ import android.util.SparseArray import androidx.annotation.IdRes import androidx.annotation.LayoutRes import androidx.fragment.app.FragmentManager +import ru.touchin.roboswag.bottom_navigation_base.BaseBottomNavigationController class BottomNavigationController( context: Context, fragments: SparseArray, fragmentManager: FragmentManager, wrapWithNavigationContainer: Boolean = false, - @IdRes private val defaultTabId: Int = 0, // If it zero back press with empty fragment back stack would close the app - @IdRes private val contentContainerViewId: Int, @LayoutRes private val contentContainerLayoutId: Int, - private val onReselectListener: (() -> Unit)? = null + @IdRes private val contentContainerViewId: Int, + @IdRes private val defaultTabId: Int = 0, // If it zero back press with empty fragment back stack would close the app + onReselectListener: (() -> Unit)? = null ) : BaseBottomNavigationController( tabs = fragments, context = context, fragmentManager = fragmentManager, defaultTabId = defaultTabId, + onReselectListener = onReselectListener, contentContainerViewId = contentContainerViewId, contentContainerLayoutId = contentContainerLayoutId, wrapWithNavigationContainer = wrapWithNavigationContainer @@ -27,8 +29,4 @@ class BottomNavigationController( override fun getNavigationContainerClass() = NavigationContainerFragment::class.java - override fun onTabReselected() { - onReselectListener?.invoke() - } - } diff --git a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationFragment.kt b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationFragment.kt index 5445473..9a2c20e 100644 --- a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationFragment.kt +++ b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/BottomNavigationFragment.kt @@ -1,5 +1,7 @@ package ru.touchin.roboswag.bottom_navigation_fragment +import ru.touchin.roboswag.bottom_navigation_base.BaseBottomNavigationFragment + abstract class BottomNavigationFragment : BaseBottomNavigationFragment() { override fun createNavigationController() = BottomNavigationController( diff --git a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationContainerFragment.kt b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationContainerFragment.kt index 7d8356b..200b7ee 100644 --- a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationContainerFragment.kt +++ b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationContainerFragment.kt @@ -1,10 +1,12 @@ package ru.touchin.roboswag.bottom_navigation_fragment import android.os.Parcelable +import ru.touchin.roboswag.bottom_navigation_base.BaseNavigationContainerFragment import ru.touchin.roboswag.navigation_base.FragmentNavigation -import ru.touchin.roboswag.navigation_base.fragments.BaseFragment +import ru.touchin.roboswag.navigation_base.fragments.StatefulFragment -class NavigationContainerFragment : BaseNavigationContainerFragment, FragmentNavigation>() { +class NavigationContainerFragment : + BaseNavigationContainerFragment, FragmentNavigation>() { override val navigation by lazy { FragmentNavigation( diff --git a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationTab.kt b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationTab.kt index 1a78e34..81e4c6e 100644 --- a/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationTab.kt +++ b/bottom-navigation-fragment/src/main/java/ru/touchin/roboswag/bottom_navigation_fragment/NavigationTab.kt @@ -1,10 +1,11 @@ package ru.touchin.roboswag.bottom_navigation_fragment import android.os.Parcelable -import ru.touchin.roboswag.navigation_base.fragments.BaseFragment +import ru.touchin.roboswag.bottom_navigation_base.BaseNavigationTab +import ru.touchin.roboswag.navigation_base.fragments.StatefulFragment class NavigationTab( - override val cls: Class>, + override val cls: Class>, state: Parcelable, saveStateOnSwitching: Boolean = true ) : BaseNavigationTab(cls, state, saveStateOnSwitching) diff --git a/lifecycle-viewcontroller/.gitignore b/lifecycle-viewcontroller/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/lifecycle-viewcontroller/.gitignore @@ -0,0 +1 @@ +/build diff --git a/lifecycle-viewcontroller/build.gradle b/lifecycle-viewcontroller/build.gradle new file mode 100644 index 0000000..7ceb229 --- /dev/null +++ b/lifecycle-viewcontroller/build.gradle @@ -0,0 +1,35 @@ +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 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } +} + +dependencies { + implementation project(":lifecycle") + implementation project(":navigation-viewcontroller") + + compileOnly "javax.inject:javax.inject:1" + + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + + implementation "androidx.appcompat:appcompat:$versions.appcompat" + + implementation "androidx.fragment:fragment:$versions.fragment" + implementation "androidx.fragment:fragment-ktx:$versions.fragment" + + implementation "androidx.lifecycle:lifecycle-extensions:$versions.lifecycle" +} diff --git a/lifecycle-viewcontroller/src/main/AndroidManifest.xml b/lifecycle-viewcontroller/src/main/AndroidManifest.xml new file mode 100644 index 0000000..d3c02f7 --- /dev/null +++ b/lifecycle-viewcontroller/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/lifecycle-viewcontroller/src/main/java/ru/touchin/lifecycle_viewcontroller/extensions/ViewModelLazy.kt b/lifecycle-viewcontroller/src/main/java/ru/touchin/lifecycle_viewcontroller/extensions/ViewModelLazy.kt new file mode 100644 index 0000000..f402d47 --- /dev/null +++ b/lifecycle-viewcontroller/src/main/java/ru/touchin/lifecycle_viewcontroller/extensions/ViewModelLazy.kt @@ -0,0 +1,37 @@ +package ru.touchin.lifecycle_viewcontroller.extensions + +import androidx.annotation.MainThread +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.ViewModelStoreOwner +import ru.touchin.lifecycle_viewcontroller.viewmodel.LifecycleViewModelProviders +import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewController +import androidx.fragment.app.activityViewModels as androidActivityViewModels +import androidx.fragment.app.viewModels as androidViewModels + +@MainThread +inline fun ViewController<*, *>.viewModels( + noinline ownerProducer: () -> ViewModelStoreOwner = { this.fragment }, + noinline factoryProducer: () -> ViewModelProvider.Factory = { LifecycleViewModelProviders.getViewModelFactory(this) } +) = this.fragment.androidViewModels(ownerProducer, factoryProducer) + +@MainThread +inline fun ViewController<*, *>.parentViewModels( + noinline ownerProducer: () -> ViewModelStoreOwner = { this.fragment.parentFragment!! }, + noinline factoryProducer: () -> ViewModelProvider.Factory = { + LifecycleViewModelProviders.getViewModelFactory(this.fragment.parentFragment!!) + } +) = viewModels(ownerProducer, factoryProducer) + +@MainThread +inline fun ViewController<*, *>.targetViewModels( + noinline ownerProducer: () -> ViewModelStoreOwner = { this.fragment.targetFragment!! }, + noinline factoryProducer: () -> ViewModelProvider.Factory = { + LifecycleViewModelProviders.getViewModelFactory(this.fragment.targetFragment!!) + } +) = viewModels(ownerProducer, factoryProducer) + +@MainThread +inline fun ViewController<*, *>.activityViewModels( + noinline factoryProducer: () -> ViewModelProvider.Factory = { LifecycleViewModelProviders.getViewModelFactory(activity) } +) = this.fragment.androidActivityViewModels(factoryProducer) diff --git a/lifecycle-viewcontroller/src/main/java/ru/touchin/lifecycle_viewcontroller/viewmodel/LifecycleViewModelProviders.kt b/lifecycle-viewcontroller/src/main/java/ru/touchin/lifecycle_viewcontroller/viewmodel/LifecycleViewModelProviders.kt new file mode 100644 index 0000000..7d93a36 --- /dev/null +++ b/lifecycle-viewcontroller/src/main/java/ru/touchin/lifecycle_viewcontroller/viewmodel/LifecycleViewModelProviders.kt @@ -0,0 +1,30 @@ +package ru.touchin.lifecycle_viewcontroller.viewmodel + +import android.app.Activity +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import ru.touchin.lifecycle.viewmodel.BaseLifecycleViewModelProviders +import ru.touchin.lifecycle.viewmodel.ViewModelFactoryProvider +import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewController + +object LifecycleViewModelProviders : BaseLifecycleViewModelProviders() { + + /** + * Returns ViewModelProvider.Factory instance from current lifecycleOwner. + * Search #ViewModelFactoryProvider are produced according to priorities: + * 1. View controller; + * 2. Fragment; + * 3. Parent fragment recursively; + * 4. Activity; + * 5. Application. + */ + override fun getViewModelFactory(provider: Any): ViewModelProvider.Factory = + when (provider) { + is ViewModelFactoryProvider -> provider.viewModelFactory + is ViewController<*, *> -> getViewModelFactory(provider.fragment) + is Fragment -> getViewModelFactory(provider.parentFragment ?: provider.requireActivity()) + is Activity -> getViewModelFactory(provider.application) + else -> throw IllegalArgumentException("View model factory not found.") + } + +} diff --git a/lifecycle/build.gradle b/lifecycle/build.gradle index 2ad19c2..6ca35ff 100644 --- a/lifecycle/build.gradle +++ b/lifecycle/build.gradle @@ -19,8 +19,6 @@ android { } dependencies { - api project(":navigation-viewcontroller") - compileOnly "javax.inject:javax.inject:1" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/BaseLifecycleViewModelProviders.kt b/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/BaseLifecycleViewModelProviders.kt new file mode 100644 index 0000000..f03c55b --- /dev/null +++ b/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/BaseLifecycleViewModelProviders.kt @@ -0,0 +1,47 @@ +package ru.touchin.lifecycle.viewmodel + +import android.app.Activity +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.ViewModelProvider + +abstract class BaseLifecycleViewModelProviders { + + /** + * Creates a {@link ViewModelProvider}, which retains ViewModels while a scope of given + * {@code lifecycleOwner} is alive. More detailed explanation is in {@link ViewModel}. + *

+ * It uses the given {@link Factory} to instantiate new ViewModels. + * + * @param lifecycleOwner a lifecycle owner, in whose scope ViewModels should be retained (ViewController, Fragment, Activity) + * @param factory a {@code Factory} to instantiate new ViewModels + * @return a ViewModelProvider instance + */ + open fun of( + lifecycleOwner: LifecycleOwner, + factory: ViewModelProvider.Factory = LifecycleViewModelProviders.getViewModelFactory(lifecycleOwner) + ): ViewModelProvider = + when (lifecycleOwner) { + is Fragment -> ViewModelProvider(lifecycleOwner, factory) + is FragmentActivity -> ViewModelProvider(lifecycleOwner, factory) + else -> throw IllegalArgumentException("Not supported LifecycleOwner.") + } + + /** + * Returns ViewModelProvider.Factory instance from current lifecycleOwner. + * Search #ViewModelFactoryProvider are produced according to priorities: + * 1. Fragment; + * 2. Parent fragment recursively; + * 3. Activity; + * 4. Application. + */ + open fun getViewModelFactory(provider: Any): ViewModelProvider.Factory = + when (provider) { + is ViewModelFactoryProvider -> provider.viewModelFactory + is Fragment -> LifecycleViewModelProviders.getViewModelFactory(provider.parentFragment ?: provider.requireActivity()) + is Activity -> LifecycleViewModelProviders.getViewModelFactory(provider.application) + else -> throw IllegalArgumentException("View model factory not found.") + } + +} diff --git a/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/LifecycleViewModelProviders.kt b/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/LifecycleViewModelProviders.kt index 8bdb97b..438cdc4 100644 --- a/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/LifecycleViewModelProviders.kt +++ b/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/LifecycleViewModelProviders.kt @@ -1,49 +1,3 @@ package ru.touchin.lifecycle.viewmodel -import android.app.Activity -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentActivity -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.ViewModelProviders -import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewController - -object LifecycleViewModelProviders { - - /** - * Creates a {@link ViewModelProvider}, which retains ViewModels while a scope of given - * {@code lifecycleOwner} is alive. More detailed explanation is in {@link ViewModel}. - *

- * It uses the given {@link Factory} to instantiate new ViewModels. - * - * @param lifecycleOwner a lifecycle owner, in whose scope ViewModels should be retained (ViewController, Fragment, Activity) - * @param factory a {@code Factory} to instantiate new ViewModels - * @return a ViewModelProvider instance - */ - fun of(lifecycleOwner: LifecycleOwner, factory: ViewModelProvider.Factory = getViewModelFactory(lifecycleOwner)): ViewModelProvider = - when (lifecycleOwner) { - is ViewController<*, *> -> ViewModelProviders.of(lifecycleOwner.fragment, factory) - is Fragment -> ViewModelProviders.of(lifecycleOwner, factory) - is FragmentActivity -> ViewModelProviders.of(lifecycleOwner, factory) - else -> throw IllegalArgumentException("Not supported LifecycleOwner.") - } - - /** - * Returns ViewModelProvider.Factory instance from current lifecycleOwner. - * Search #ViewModelFactoryProvider are produced according to priorities: - * 1. View controller; - * 2. Fragment; - * 3. Parent fragment recursively; - * 4. Activity; - * 5. Application. - */ - fun getViewModelFactory(provider: Any): ViewModelProvider.Factory = - when (provider) { - is ViewModelFactoryProvider -> provider.viewModelFactory - is ViewController<*, *> -> getViewModelFactory(provider.fragment) - is Fragment -> getViewModelFactory(provider.parentFragment ?: provider.requireActivity()) - is Activity -> getViewModelFactory(provider.application) - else -> throw IllegalArgumentException("View model factory not found.") - } - -} +object LifecycleViewModelProviders : BaseLifecycleViewModelProviders() diff --git a/navigation-base/build.gradle b/navigation-base/build.gradle index 2a000a0..ed356be 100644 --- a/navigation-base/build.gradle +++ b/navigation-base/build.gradle @@ -21,12 +21,12 @@ android { } dependencies { - api project(":utils") - api project(":logging") + implementation project(":utils") + implementation project(":logging") - api 'androidx.multidex:multidex:2.0.1' + implementation 'androidx.multidex:multidex:2.0.1' - api 'net.danlew:android.joda:2.10.2' + implementation 'net.danlew:android.joda:2.10.2' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/FragmentNavigation.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/FragmentNavigation.kt index 0cb1043..5a1df6c 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/FragmentNavigation.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/FragmentNavigation.kt @@ -28,7 +28,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction import ru.touchin.roboswag.core.log.Lc -import ru.touchin.roboswag.navigation_base.fragments.FragmentWithState +import ru.touchin.roboswag.navigation_base.fragments.StatefulFragment import kotlin.reflect.KClass /** @@ -169,14 +169,14 @@ open class FragmentNavigation( * @param transactionSetup Function to setup transaction before commit. It is useful to specify transition animations or additional info. */ fun push( - fragmentClass: KClass>, + fragmentClass: KClass>, state: T, addToStack: Boolean = true, backStackName: String? = null, tag: String? = null, transactionSetup: ((FragmentTransaction) -> Unit)? = null ) { - push(fragmentClass.java, FragmentWithState.args(state), addToStack, backStackName, tag, transactionSetup) + push(fragmentClass.java, StatefulFragment.args(state), addToStack, backStackName, tag, transactionSetup) } /** @@ -216,14 +216,14 @@ open class FragmentNavigation( * @param transactionSetup Function to setup transaction before commit. It is useful to specify transition animations or additional info. */ fun pushForResult( - fragmentClass: KClass>, + fragmentClass: KClass>, targetFragment: Fragment, targetRequestCode: Int, state: T, tag: String? = null, transactionSetup: ((FragmentTransaction) -> Unit)? = null ) { - pushForResult(fragmentClass.java, targetFragment, targetRequestCode, FragmentWithState.args(state), tag, transactionSetup) + pushForResult(fragmentClass.java, targetFragment, targetRequestCode, StatefulFragment.args(state), tag, transactionSetup) } /** @@ -270,13 +270,13 @@ open class FragmentNavigation( * @param transactionSetup Function to setup transaction before commit. It is useful to specify transition animations or additional info. */ fun setInitial( - fragmentClass: KClass>, + fragmentClass: KClass>, state: T, tag: String? = null, transactionSetup: ((FragmentTransaction) -> Unit)? = null ) { beforeSetInitialActions() - setAsTop(fragmentClass.java, FragmentWithState.args(state), false, tag, transactionSetup) + setAsTop(fragmentClass.java, StatefulFragment.args(state), false, tag, transactionSetup) } /** diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/extensions/Parcelable.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/extensions/Parcelable.kt new file mode 100644 index 0000000..5c4f26c --- /dev/null +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/extensions/Parcelable.kt @@ -0,0 +1,47 @@ +package ru.touchin.roboswag.navigation_base.extensions + +import android.os.Parcel +import android.os.Parcelable +import ru.touchin.roboswag.navigation_base.fragments.EmptyState + +// This method used to check unique state of each fragment. +// If two fragments share same class for state, you should not pass state instance of current fragment to the one you transition to +fun Parcelable.reserialize(): T { + var parcel = Parcel.obtain() + + parcel.writeParcelable(this, 0) + + val serializableBytes = parcel.marshall() + + parcel.recycle() + + parcel = Parcel.obtain().apply { + unmarshall(serializableBytes, 0, serializableBytes.size) + setDataPosition(0) + } + + val result = parcel.readParcelable(Thread.currentThread().contextClassLoader) + ?: throw IllegalStateException("It must not be null") + + parcel.recycle() + + return result +} + +fun Parcelable.copy(): Parcelable = + if (this is EmptyState) { + EmptyState + } else { + val parcel = Parcel.obtain() + + parcel.writeParcelable(this, 0) + parcel.setDataPosition(0) + + val result = parcel.readParcelable( + javaClass.classLoader ?: Thread.currentThread().contextClassLoader + ) ?: throw IllegalStateException("Failed to copy tab state") + + parcel.recycle() + + result + } diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/FragmentWithState.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/StatefulFragment.kt similarity index 55% rename from navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/FragmentWithState.kt rename to navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/StatefulFragment.kt index dedf118..4e46f3b 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/FragmentWithState.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/fragments/StatefulFragment.kt @@ -1,13 +1,13 @@ package ru.touchin.roboswag.navigation_base.fragments import android.os.Bundle -import android.os.Parcel import android.os.Parcelable import androidx.annotation.LayoutRes import androidx.fragment.app.FragmentActivity import ru.touchin.roboswag.navigation_base.BuildConfig +import ru.touchin.roboswag.navigation_base.extensions.reserialize -open class FragmentWithState( +open class StatefulFragment( @LayoutRes layoutRes: Int ) : BaseFragment(layoutRes) { @@ -16,20 +16,6 @@ open class FragmentWithState( fun args(state: Parcelable?): Bundle = Bundle().also { it.putParcelable(BASE_FRAGMENT_STATE_EXTRA, state) } - // This method used to check unique state of each fragment. - // If two fragments share same class for state, you should not pass state instance of current fragment to the one you transition to - private fun reserialize(parcelable: T): T { - var parcel = Parcel.obtain() - parcel.writeParcelable(parcelable, 0) - val serializableBytes = parcel.marshall() - parcel.recycle() - parcel = Parcel.obtain() - parcel.unmarshall(serializableBytes, 0, serializableBytes.size) - parcel.setDataPosition(0) - val result = parcel.readParcelable(Thread.currentThread().contextClassLoader) ?: throw IllegalStateException("It must not be null") - parcel.recycle() - return result - } } protected lateinit var state: TState @@ -43,7 +29,7 @@ open class FragmentWithState( ?: throw IllegalStateException("Fragment state can't be null") if (BuildConfig.DEBUG) { - state = reserialize(state) + state = state.reserialize() } } diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt index 13cec6d..ed13fbf 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/keyboard_resizeable/KeyboardResizeableFragment.kt @@ -9,12 +9,11 @@ import androidx.lifecycle.LifecycleObserver import ru.touchin.roboswag.components.utils.UiUtils import ru.touchin.roboswag.navigation_base.activities.BaseActivity import ru.touchin.roboswag.navigation_base.activities.OnBackPressedListener -import ru.touchin.roboswag.navigation_base.fragments.BaseFragment -import ru.touchin.roboswag.navigation_base.fragments.FragmentWithState +import ru.touchin.roboswag.navigation_base.fragments.StatefulFragment abstract class KeyboardResizeableFragment( @LayoutRes layoutRes: Int -) : FragmentWithState( +) : StatefulFragment( layoutRes ) { diff --git a/navigation-viewcontroller/build.gradle b/navigation-viewcontroller/build.gradle index 59cbb01..e40ef52 100644 --- a/navigation-viewcontroller/build.gradle +++ b/navigation-viewcontroller/build.gradle @@ -21,13 +21,13 @@ android { } dependencies { - api project(":utils") - api project(":logging") - api project(":navigation-base") + implementation project(":utils") + implementation project(":logging") + implementation project(":navigation-base") - api 'androidx.multidex:multidex:2.0.1' + implementation 'androidx.multidex:multidex:2.0.1' - api 'net.danlew:android.joda:2.10.2' + implementation 'net.danlew:android.joda:2.10.2' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" From bd9accacaa3590dc1a9b15db84167e2049bc26ce Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 4 Jun 2020 19:30:45 +0300 Subject: [PATCH 12/14] view controller fixes --- bottom-navigation-viewcontroller/build.gradle | 5 ++-- .../BottomNavigationActivity.kt | 2 +- .../BottomNavigationController.kt | 2 +- .../BottomNavigationFragment.kt | 2 +- .../NavigationContainerFragment.kt | 2 +- .../NavigationTab.kt | 2 +- .../viewmodel/LifecycleViewModelProviders.kt | 26 ++++++++++++++++--- 7 files changed, 30 insertions(+), 11 deletions(-) diff --git a/bottom-navigation-viewcontroller/build.gradle b/bottom-navigation-viewcontroller/build.gradle index cdae20e..8a5beda 100644 --- a/bottom-navigation-viewcontroller/build.gradle +++ b/bottom-navigation-viewcontroller/build.gradle @@ -20,8 +20,9 @@ android { } dependencies { - api project(":navigation-viewcontroller") - api project(":bottom-navigation-base") + implementation project(":navigation-base") + implementation project(":navigation-viewcontroller") + implementation project(":bottom-navigation-base") implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationActivity.kt b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationActivity.kt index a9135fc..6361f08 100644 --- a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationActivity.kt +++ b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationActivity.kt @@ -1,6 +1,6 @@ package ru.touchin.roboswag.bottom_navigation_viewcontroller -import ru.touchin.roboswag.bottom_navigation_fragment.BaseBottomNavigationActivity +import ru.touchin.roboswag.bottom_navigation_base.BaseBottomNavigationActivity import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewControllerNavigation abstract class BottomNavigationActivity : diff --git a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationController.kt b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationController.kt index 6597ae3..babcf94 100644 --- a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationController.kt +++ b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationController.kt @@ -6,7 +6,7 @@ import androidx.annotation.IdRes import androidx.annotation.LayoutRes import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager -import ru.touchin.roboswag.bottom_navigation_fragment.BaseBottomNavigationController +import ru.touchin.roboswag.bottom_navigation_base.BaseBottomNavigationController import ru.touchin.roboswag.navigation_viewcontroller.fragments.ViewControllerFragment class BottomNavigationController( diff --git a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationFragment.kt b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationFragment.kt index 8a2f3fc..18d1643 100644 --- a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationFragment.kt +++ b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/BottomNavigationFragment.kt @@ -1,6 +1,6 @@ package ru.touchin.roboswag.bottom_navigation_viewcontroller -import ru.touchin.roboswag.bottom_navigation_fragment.BaseBottomNavigationFragment +import ru.touchin.roboswag.bottom_navigation_base.BaseBottomNavigationFragment abstract class BottomNavigationFragment : BaseBottomNavigationFragment() { diff --git a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/NavigationContainerFragment.kt b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/NavigationContainerFragment.kt index c70e1fd..bfffaf4 100644 --- a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/NavigationContainerFragment.kt +++ b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/NavigationContainerFragment.kt @@ -1,7 +1,7 @@ package ru.touchin.roboswag.bottom_navigation_viewcontroller import android.os.Parcelable -import ru.touchin.roboswag.bottom_navigation_fragment.BaseNavigationContainerFragment +import ru.touchin.roboswag.bottom_navigation_base.BaseNavigationContainerFragment import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewController import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewControllerNavigation diff --git a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/NavigationTab.kt b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/NavigationTab.kt index 7ee96ed..bc10917 100644 --- a/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/NavigationTab.kt +++ b/bottom-navigation-viewcontroller/src/main/java/ru/touchin/roboswag/bottom_navigation_viewcontroller/NavigationTab.kt @@ -1,7 +1,7 @@ package ru.touchin.roboswag.bottom_navigation_viewcontroller import android.os.Parcelable -import ru.touchin.roboswag.bottom_navigation_fragment.BaseNavigationTab +import ru.touchin.roboswag.bottom_navigation_base.BaseNavigationTab import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewController class NavigationTab( diff --git a/lifecycle-viewcontroller/src/main/java/ru/touchin/lifecycle_viewcontroller/viewmodel/LifecycleViewModelProviders.kt b/lifecycle-viewcontroller/src/main/java/ru/touchin/lifecycle_viewcontroller/viewmodel/LifecycleViewModelProviders.kt index 7d93a36..22d7448 100644 --- a/lifecycle-viewcontroller/src/main/java/ru/touchin/lifecycle_viewcontroller/viewmodel/LifecycleViewModelProviders.kt +++ b/lifecycle-viewcontroller/src/main/java/ru/touchin/lifecycle_viewcontroller/viewmodel/LifecycleViewModelProviders.kt @@ -2,13 +2,34 @@ package ru.touchin.lifecycle_viewcontroller.viewmodel import android.app.Activity import androidx.fragment.app.Fragment +import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.ViewModelProviders import ru.touchin.lifecycle.viewmodel.BaseLifecycleViewModelProviders import ru.touchin.lifecycle.viewmodel.ViewModelFactoryProvider import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewController object LifecycleViewModelProviders : BaseLifecycleViewModelProviders() { + /** + * Creates a {@link ViewModelProvider}, which retains ViewModels while a scope of given + * {@code lifecycleOwner} is alive. More detailed explanation is in {@link ViewModel}. + *

+ * It uses the given {@link Factory} to instantiate new ViewModels. + * + * @param lifecycleOwner a lifecycle owner, in whose scope ViewModels should be retained (ViewController, Fragment, Activity) + * @param factory a {@code Factory} to instantiate new ViewModels + * @return a ViewModelProvider instance + */ + override fun of( + lifecycleOwner: LifecycleOwner, + factory: ViewModelProvider.Factory + ): ViewModelProvider = + when (lifecycleOwner) { + is ViewController<*, *> -> ViewModelProviders.of(lifecycleOwner.fragment, factory) + else -> super.of(lifecycleOwner, factory) + } + /** * Returns ViewModelProvider.Factory instance from current lifecycleOwner. * Search #ViewModelFactoryProvider are produced according to priorities: @@ -20,11 +41,8 @@ object LifecycleViewModelProviders : BaseLifecycleViewModelProviders() { */ override fun getViewModelFactory(provider: Any): ViewModelProvider.Factory = when (provider) { - is ViewModelFactoryProvider -> provider.viewModelFactory is ViewController<*, *> -> getViewModelFactory(provider.fragment) - is Fragment -> getViewModelFactory(provider.parentFragment ?: provider.requireActivity()) - is Activity -> getViewModelFactory(provider.application) - else -> throw IllegalArgumentException("View model factory not found.") + else -> super.getViewModelFactory(provider) } } From 2788c6df66073d79babec930f7699fd94a3005d4 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 4 Jun 2020 20:27:43 +0300 Subject: [PATCH 13/14] truly open --- .../lifecycle/viewmodel/BaseLifecycleViewModelProviders.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/BaseLifecycleViewModelProviders.kt b/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/BaseLifecycleViewModelProviders.kt index f03c55b..7026ddd 100644 --- a/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/BaseLifecycleViewModelProviders.kt +++ b/lifecycle/src/main/java/ru/touchin/lifecycle/viewmodel/BaseLifecycleViewModelProviders.kt @@ -20,7 +20,7 @@ abstract class BaseLifecycleViewModelProviders { */ open fun of( lifecycleOwner: LifecycleOwner, - factory: ViewModelProvider.Factory = LifecycleViewModelProviders.getViewModelFactory(lifecycleOwner) + factory: ViewModelProvider.Factory = getViewModelFactory(lifecycleOwner) ): ViewModelProvider = when (lifecycleOwner) { is Fragment -> ViewModelProvider(lifecycleOwner, factory) @@ -39,8 +39,8 @@ abstract class BaseLifecycleViewModelProviders { open fun getViewModelFactory(provider: Any): ViewModelProvider.Factory = when (provider) { is ViewModelFactoryProvider -> provider.viewModelFactory - is Fragment -> LifecycleViewModelProviders.getViewModelFactory(provider.parentFragment ?: provider.requireActivity()) - is Activity -> LifecycleViewModelProviders.getViewModelFactory(provider.application) + is Fragment -> getViewModelFactory(provider.parentFragment ?: provider.requireActivity()) + is Activity -> getViewModelFactory(provider.application) else -> throw IllegalArgumentException("View model factory not found.") } From cb4000b48dc0e46f394c98d380632c1ff1007eba Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 5 Jun 2020 12:21:29 +0300 Subject: [PATCH 14/14] fix static --- ...ContainerFramgent.kt => BaseNavigationContainerFragment.kt} | 0 .../viewmodel/LifecycleViewModelProviders.kt | 3 --- .../touchin/roboswag/navigation_base/extensions/Parcelable.kt | 3 +++ 3 files changed, 3 insertions(+), 3 deletions(-) rename bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/{BaseNavigationContainerFramgent.kt => BaseNavigationContainerFragment.kt} (100%) diff --git a/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseNavigationContainerFramgent.kt b/bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseNavigationContainerFragment.kt similarity index 100% rename from bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseNavigationContainerFramgent.kt rename to bottom-navigation-base/src/main/java/ru/touchin/roboswag/bottom_navigation_base/BaseNavigationContainerFragment.kt diff --git a/lifecycle-viewcontroller/src/main/java/ru/touchin/lifecycle_viewcontroller/viewmodel/LifecycleViewModelProviders.kt b/lifecycle-viewcontroller/src/main/java/ru/touchin/lifecycle_viewcontroller/viewmodel/LifecycleViewModelProviders.kt index 22d7448..f10e7c9 100644 --- a/lifecycle-viewcontroller/src/main/java/ru/touchin/lifecycle_viewcontroller/viewmodel/LifecycleViewModelProviders.kt +++ b/lifecycle-viewcontroller/src/main/java/ru/touchin/lifecycle_viewcontroller/viewmodel/LifecycleViewModelProviders.kt @@ -1,12 +1,9 @@ package ru.touchin.lifecycle_viewcontroller.viewmodel -import android.app.Activity -import androidx.fragment.app.Fragment import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProviders import ru.touchin.lifecycle.viewmodel.BaseLifecycleViewModelProviders -import ru.touchin.lifecycle.viewmodel.ViewModelFactoryProvider import ru.touchin.roboswag.navigation_viewcontroller.viewcontrollers.ViewController object LifecycleViewModelProviders : BaseLifecycleViewModelProviders() { diff --git a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/extensions/Parcelable.kt b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/extensions/Parcelable.kt index 5c4f26c..2ec8844 100644 --- a/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/extensions/Parcelable.kt +++ b/navigation-base/src/main/java/ru/touchin/roboswag/navigation_base/extensions/Parcelable.kt @@ -1,11 +1,13 @@ package ru.touchin.roboswag.navigation_base.extensions +import android.annotation.SuppressLint import android.os.Parcel import android.os.Parcelable import ru.touchin.roboswag.navigation_base.fragments.EmptyState // This method used to check unique state of each fragment. // If two fragments share same class for state, you should not pass state instance of current fragment to the one you transition to +@SuppressLint("Recycle") fun Parcelable.reserialize(): T { var parcel = Parcel.obtain() @@ -28,6 +30,7 @@ fun Parcelable.reserialize(): T { return result } +@SuppressLint("Recycle") fun Parcelable.copy(): Parcelable = if (this is EmptyState) { EmptyState