Skip to main content

Sub New

class FlowModelsFragment : FlowBaseFragment() {

    override fun getCicerone(): Cicerone<Router>? {
        return App.mAppComponent.getCiceroneHolder().getCicerone(Navigation.MODELS_ROUTER)
    }


    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        if (savedInstanceState == null)
            getCicerone()?.router?.newRootScreen(Navigation.ModelsTabs)
    }

    override fun onBackPressed() {
        currentFragment?.onBackPressed()
    }

}

class ServerModelsFragment : BaseFragment(), ServerModelsView {

    val recyclerAdapter = ServerModelsRecyclerAdapter()

    @InjectPresenter
    lateinit var mPresenter: ServerModelsPresenter

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_server_models, container, false)
    }


    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        with(recycler_view) {
            val spanCount = 2
            val spacing = 6.toPx()

            adapter = recyclerAdapter
            layoutManager = android.support.v7.widget.GridLayoutManager(activity,spanCount)
            addItemDecoration(
                mementomori.ru.autotuningar.ui.adapters.recycler.decorators.LocalModelsRecyclerDecorator(
                    spanCount,
                    spacing,
                    true
                )
            )
            setHasFixedSize(true)

            onItemClick {
                //FullscreenModelPictureFragment.create(recyclerAdapter.modelsList[it]).show(fragmentManager,null)
            }
        }
        mPresenter.loadModels()
    }

    override fun showNoInternetScreen() {
        no_internet_root.visibility = View.VISIBLE
        loading_root.visibility = View.GONE
        retry_button.setOnClickListener {
            mPresenter.loadModels()
        }
    }

    override fun showLoadingView(){
        no_internet_root.visibility = View.GONE
        loading_root.visibility = View.VISIBLE
    }


    override fun showModels(models: List<ServerModel?>) {
        no_internet_root.visibility = View.GONE
        loading_root.visibility = View.GONE
        recyclerAdapter.setData(models as List<ServerModel>)
    }

}

class TabsModelsFragment : BaseFragment(){

    private val mCicerone : Cicerone<Router>?
        get() = App.mAppComponent.getCiceroneHolder().getCicerone(Navigation.MODELS_ROUTER)

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_tabs_models, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        view_pager.adapter = ModelsFragmentPagerAdapter(childFragmentManager)
        tab_layout.setupWithViewPager(view_pager)
    }

    override fun onBackPressed() {
        mCicerone?.router?.exit()
    }
}

@StateStrategyType(AddToEndSingleStrategy::class)
interface ServerModelsView : BaseView {

    fun showModels(models : List<ServerModel?>)

    fun showNoInternetScreen()

    fun showLoadingView()
}

@InjectViewState
class ServerModelsPresenter : BasePresenter<ServerModelsView>() {

    var modelsInteractor: ModelsInteractor = App.mAppComponent.getModelsInteractor()

    @SuppressLint("CheckResult")
    fun loadModels() {
        modelsInteractor.getModelsFromServer().doOnSubscribe {
            viewState.showLoadingView()
        }.subscribe({
            viewState.showModels(it)
        }, {
            if (it is NoInternetException) {
                viewState.showNoInternetScreen()
            } else
                Timber.e(it)
        })
    }

}

class FlowMainFragment : FlowBaseFragment() {


    override fun getCicerone(): Cicerone<Router>? {
        return null
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        return inflater.inflate(R.layout.fragment_main_flow, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        AHBottomNavigationAdapter(activity!!, R.menu.main_bottom_menu).apply {
            setupWithBottomNavigation(bottom_navigation)
        }

        with(bottom_navigation) {
            showShadow()

            accentColor = getColorFromResources(R.color.colorAccent)
            inactiveColor = getColorFromResources(R.color.inactiveTab)

            defaultBackgroundColor = getColorFromResources(R.color.colorMainBottomNavBackground)
            titleState = com.aurelhubert.ahbottomnavigation.AHBottomNavigation.TitleState.ALWAYS_SHOW

            setOnTabSelectedListener { position, wasSelected ->
                if (!wasSelected) selectTab(
                    when (position) {
                        0 -> Navigation.FlowModels
                        else -> Navigation.FlowPhotos
                    }
                )
                true
            }


        }

        selectTab(  //попробовать добавить вручную
            when (currentFragment?.tag) {
                Navigation.FlowPhotos.screenKey -> Navigation.FlowPhotos
                else -> Navigation.FlowModels
            }
        )
    }

    private fun selectTab(tab: SupportAppScreen) {
        val currentFragment = currentFragment
        val newFragment = childFragmentManager.findFragmentByTag(tab.screenKey)

        if (currentFragment != null && newFragment != null && currentFragment == newFragment) return

        childFragmentManager.beginTransaction().apply {
            if (newFragment == null)
                add(R.id.main_screen_container, tab.fragment, tab.screenKey)

            currentFragment?.let {
                hide(it)
                it.userVisibleHint = false
            }
            newFragment?.let {
                show(it)
                it.userVisibleHint = true
            }
        }.commitNow()
    }

    override fun onBackPressed() {
        currentFragment?.onBackPressed()
    }
}

class MainActivity : AppCompatActivity(), MvpView {


    private var navigator: Navigator? =
        object : SupportAppNavigator(this, supportFragmentManager, R.id.container) {
            override fun setupFragmentTransaction(
                command: Command?,
                currentFragment: Fragment?,
                nextFragment: Fragment?,
                fragmentTransaction: FragmentTransaction
            ) {
                fragmentTransaction.setReorderingAllowed(true)
                fragmentTransaction.setCustomAnimations(
                    R.anim.fade_in,
                    R.anim.fade_out,
                    R.anim.fade_in,
                    R.anim.fade_out
                )
            }
        }

    private val mCicerone: Cicerone<Router>?
        get() = App.mAppComponent.getCiceroneHolder().getCicerone(Navigation.MAIN_ROUTER)

    private val currentFragment: BaseFragment?
        get() = supportFragmentManager.findFragmentById(R.id.container) as? BaseFragment

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        App.mAppComponent.getModelsInteractor().getModelsFromAssetsAndSaveIfNeeds()

        if (savedInstanceState == null)
            mCicerone?.router?.newRootScreen(Navigation.FlowMain)

        setStatusBarColor()

    }

    override fun onResumeFragments() {
        super.onResumeFragments()
        mCicerone?.navigatorHolder?.setNavigator(navigator)
    }

    override fun onPause() {
        mCicerone?.navigatorHolder?.removeNavigator()
        super.onPause()
    }

    override fun onBackPressed() {
        currentFragment?.onBackPressed() ?: super.onBackPressed()
    }
}