diff --git a/app/src/main/java/io/timelimit/android/ui/manage/category/ManageCategoryFragment.kt b/app/src/main/java/io/timelimit/android/ui/manage/category/ManageCategoryFragment.kt index b584b2b..0fbeb0b 100644 --- a/app/src/main/java/io/timelimit/android/ui/manage/category/ManageCategoryFragment.kt +++ b/app/src/main/java/io/timelimit/android/ui/manage/category/ManageCategoryFragment.kt @@ -20,10 +20,10 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentTransaction import androidx.lifecycle.LiveData import androidx.lifecycle.Observer import androidx.navigation.Navigation -import androidx.viewpager.widget.ViewPager import io.timelimit.android.R import io.timelimit.android.data.model.Category import io.timelimit.android.data.model.User @@ -35,6 +35,11 @@ import io.timelimit.android.logic.DefaultAppLogic import io.timelimit.android.ui.main.ActivityViewModelHolder import io.timelimit.android.ui.main.AuthenticationFab import io.timelimit.android.ui.main.FragmentWithCustomTitle +import io.timelimit.android.ui.manage.category.apps.CategoryAppsFragment +import io.timelimit.android.ui.manage.category.blocked_times.BlockedTimeAreasFragment +import io.timelimit.android.ui.manage.category.settings.CategorySettingsFragment +import io.timelimit.android.ui.manage.category.timelimit_rules.CategoryTimeLimitRulesFragment +import io.timelimit.android.ui.manage.category.usagehistory.UsageHistoryFragment import kotlinx.android.synthetic.main.fragment_manage_category.* class ManageCategoryFragment : Fragment(), FragmentWithCustomTitle { @@ -47,7 +52,6 @@ class ManageCategoryFragment : Fragment(), FragmentWithCustomTitle { private val user: LiveData by lazy { logic.database.user().getUserByIdLive(params.childId) } - private val adapter: PagerAdapter by lazy { PagerAdapter(childFragmentManager, params) } private val activity: ActivityViewModelHolder by lazy { getActivity() as ActivityViewModelHolder } private var wereViewsCreated = false @@ -70,43 +74,28 @@ class ManageCategoryFragment : Fragment(), FragmentWithCustomTitle { val navigation = Navigation.findNavController(view) - pager.adapter = adapter - - bottom_navigation_view.setOnNavigationItemSelectedListener { - menuItem -> - - pager?.currentItem = when(menuItem.itemId) { - R.id.manage_category_tab_apps -> 0 - R.id.manage_category_tab_time_limit_rules -> 1 - R.id.manage_category_tab_blocked_time_areas -> 2 - R.id.manage_category_tab_usage_log -> 3 - R.id.manage_category_tab_settings -> 4 - else -> throw IllegalStateException() - } + bottom_navigation_view.setOnNavigationItemReselectedListener { /* ignore */ } + bottom_navigation_view.setOnNavigationItemSelectedListener { menuItem -> + childFragmentManager.beginTransaction() + .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) + .replace(R.id.container, when(menuItem.itemId) { + R.id.manage_category_tab_apps -> CategoryAppsFragment.newInstance(params) + R.id.manage_category_tab_time_limit_rules -> CategoryTimeLimitRulesFragment.newInstance(params) + R.id.manage_category_tab_blocked_time_areas -> BlockedTimeAreasFragment.newInstance(params) + R.id.manage_category_tab_usage_log -> UsageHistoryFragment.newInstance(params) + R.id.manage_category_tab_settings -> CategorySettingsFragment.newInstance(params) + else -> throw IllegalStateException() + }) + .commit() true } - pager.addOnPageChangeListener(object: ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - // ignore - } - - override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { - // ignore - } - - override fun onPageSelected(position: Int) { - bottom_navigation_view.selectedItemId = when(position) { - 0 -> R.id.manage_category_tab_apps - 1 -> R.id.manage_category_tab_time_limit_rules - 2 -> R.id.manage_category_tab_blocked_time_areas - 3 -> R.id.manage_category_tab_usage_log - 4 -> R.id.manage_category_tab_settings - else -> throw IllegalStateException() - } - } - }) + if (childFragmentManager.findFragmentById(R.id.container) == null) { + childFragmentManager.beginTransaction() + .replace(R.id.container, CategoryAppsFragment.newInstance(params)) + .commit() + } if (!wereViewsCreated) { wereViewsCreated = true diff --git a/app/src/main/java/io/timelimit/android/ui/manage/category/PagerAdapter.kt b/app/src/main/java/io/timelimit/android/ui/manage/category/PagerAdapter.kt deleted file mode 100644 index 58a0041..0000000 --- a/app/src/main/java/io/timelimit/android/ui/manage/category/PagerAdapter.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * TimeLimit Copyright 2019 Jonas Lochmann - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package io.timelimit.android.ui.manage.category - -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentStatePagerAdapter -import io.timelimit.android.ui.manage.category.apps.CategoryAppsFragment -import io.timelimit.android.ui.manage.category.blocked_times.BlockedTimeAreasFragment -import io.timelimit.android.ui.manage.category.settings.CategorySettingsFragment -import io.timelimit.android.ui.manage.category.timelimit_rules.CategoryTimeLimitRulesFragment -import io.timelimit.android.ui.manage.category.usagehistory.UsageHistoryFragment - -class PagerAdapter(fragmentManager: FragmentManager, private val params: ManageCategoryFragmentArgs): FragmentStatePagerAdapter(fragmentManager) { - override fun getCount() = 5 - - override fun getItem(position: Int): Fragment = when (position) { - 0 -> CategoryAppsFragment.newInstance(params) - 1 -> CategoryTimeLimitRulesFragment.newInstance(params) - 2 -> BlockedTimeAreasFragment.newInstance(params) - 3 -> UsageHistoryFragment.newInstance(params) - 4 -> CategorySettingsFragment.newInstance(params) - else -> throw IllegalStateException() - } -} diff --git a/app/src/main/java/io/timelimit/android/ui/manage/child/ManageChildFragment.kt b/app/src/main/java/io/timelimit/android/ui/manage/child/ManageChildFragment.kt index ee637c0..1f13f29 100644 --- a/app/src/main/java/io/timelimit/android/ui/manage/child/ManageChildFragment.kt +++ b/app/src/main/java/io/timelimit/android/ui/manage/child/ManageChildFragment.kt @@ -20,10 +20,10 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentTransaction import androidx.lifecycle.LiveData import androidx.lifecycle.Observer import androidx.navigation.Navigation -import androidx.viewpager.widget.ViewPager import io.timelimit.android.R import io.timelimit.android.data.model.User import io.timelimit.android.data.model.UserType @@ -34,11 +34,13 @@ import io.timelimit.android.logic.DefaultAppLogic import io.timelimit.android.ui.main.ActivityViewModelHolder import io.timelimit.android.ui.main.AuthenticationFab import io.timelimit.android.ui.main.FragmentWithCustomTitle +import io.timelimit.android.ui.manage.child.advanced.ManageChildAdvancedFragment +import io.timelimit.android.ui.manage.child.apps.ChildAppsFragment +import io.timelimit.android.ui.manage.child.category.ManageChildCategoriesFragment import kotlinx.android.synthetic.main.fragment_manage_child.* class ManageChildFragment : Fragment(), FragmentWithCustomTitle { private val params: ManageChildFragmentArgs by lazy { ManageChildFragmentArgs.fromBundle(arguments!!) } - private val adapter: PagerAdapter by lazy { PagerAdapter(childFragmentManager, params) } private val logic: AppLogic by lazy { DefaultAppLogic.with(context!!) } private val child: LiveData by lazy { logic.database.user().getUserByIdLive(params.childId) } private val activity: ActivityViewModelHolder by lazy { getActivity() as ActivityViewModelHolder } @@ -74,39 +76,26 @@ class ManageChildFragment : Fragment(), FragmentWithCustomTitle { }) } - pager.adapter = adapter - - bottom_navigation_view.setOnNavigationItemSelectedListener { - menuItem -> - - pager?.currentItem = when (menuItem.itemId) { - R.id.manage_child_tab_categories -> 0 - R.id.manage_child_tab_apps -> 1 - R.id.manage_child_tab_manage -> 2 - else -> throw IllegalStateException() - } + bottom_navigation_view.setOnNavigationItemReselectedListener { /* ignore */ } + bottom_navigation_view.setOnNavigationItemSelectedListener { menuItem -> + childFragmentManager.beginTransaction() + .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) + .replace(R.id.container, when (menuItem.itemId) { + R.id.manage_child_tab_categories -> ManageChildCategoriesFragment.newInstance(params) + R.id.manage_child_tab_apps -> ChildAppsFragment.newInstance(params) + R.id.manage_child_tab_manage -> ManageChildAdvancedFragment.newInstance(params) + else -> throw IllegalStateException() + }) + .commit() true } - pager.addOnPageChangeListener(object: ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - // ignore - } - - override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { - // ignore - } - - override fun onPageSelected(position: Int) { - bottom_navigation_view.selectedItemId = when(position) { - 0 -> R.id.manage_child_tab_categories - 1 -> R.id.manage_child_tab_apps - 2 -> R.id.manage_child_tab_manage - else -> throw IllegalStateException() - } - } - }) + if (childFragmentManager.findFragmentById(R.id.container) == null) { + childFragmentManager.beginTransaction() + .replace(R.id.container, ManageChildCategoriesFragment.newInstance(params)) + .commit() + } } override fun getCustomTitle() = child.map { it?.name } diff --git a/app/src/main/java/io/timelimit/android/ui/manage/child/PagerAdapter.kt b/app/src/main/java/io/timelimit/android/ui/manage/child/PagerAdapter.kt deleted file mode 100644 index c6bf673..0000000 --- a/app/src/main/java/io/timelimit/android/ui/manage/child/PagerAdapter.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * TimeLimit Copyright 2019 Jonas Lochmann - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package io.timelimit.android.ui.manage.child - -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentStatePagerAdapter -import io.timelimit.android.ui.manage.child.advanced.ManageChildAdvancedFragment -import io.timelimit.android.ui.manage.child.apps.ChildAppsFragment -import io.timelimit.android.ui.manage.child.category.ManageChildCategoriesFragment - -class PagerAdapter(fragmentManager: FragmentManager, private val params: ManageChildFragmentArgs): FragmentStatePagerAdapter(fragmentManager) { - override fun getCount() = 3 - - override fun getItem(position: Int) = when(position) { - 0 -> ManageChildCategoriesFragment.newInstance(params) - 1 -> ChildAppsFragment.newInstance(params) - 2 -> ManageChildAdvancedFragment.newInstance(params) - else -> throw IllegalStateException() - } -} diff --git a/app/src/main/java/io/timelimit/android/ui/overview/main/MainFragment.kt b/app/src/main/java/io/timelimit/android/ui/overview/main/MainFragment.kt index 3d5b9ac..2b31731 100644 --- a/app/src/main/java/io/timelimit/android/ui/overview/main/MainFragment.kt +++ b/app/src/main/java/io/timelimit/android/ui/overview/main/MainFragment.kt @@ -20,11 +20,11 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentTransaction import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Observer import androidx.navigation.NavController import androidx.navigation.Navigation -import androidx.viewpager.widget.ViewPager import io.timelimit.android.BuildConfig import io.timelimit.android.R import io.timelimit.android.coroutines.runAsync @@ -39,15 +39,17 @@ import io.timelimit.android.logic.DefaultAppLogic import io.timelimit.android.ui.main.ActivityViewModelHolder import io.timelimit.android.ui.main.AuthenticationFab import io.timelimit.android.ui.manage.device.add.AddDeviceFragment +import io.timelimit.android.ui.overview.about.AboutFragment import io.timelimit.android.ui.overview.about.AboutFragmentParentHandlers import io.timelimit.android.ui.overview.overview.CanNotAddDevicesInLocalModeDialogFragmentListener +import io.timelimit.android.ui.overview.overview.OverviewFragment import io.timelimit.android.ui.overview.overview.OverviewFragmentParentHandlers +import io.timelimit.android.ui.overview.uninstall.UninstallFragment import kotlinx.android.synthetic.main.fragment_main.* class MainFragment : Fragment(), OverviewFragmentParentHandlers, AboutFragmentParentHandlers, CanNotAddDevicesInLocalModeDialogFragmentListener { - private val adapter: PagerAdapter by lazy { PagerAdapter(childFragmentManager) } private val logic: AppLogic by lazy { DefaultAppLogic.with(context!!) } private lateinit var navigation: NavController private val showAuthButtonLive = MutableLiveData() @@ -84,7 +86,7 @@ class MainFragment : Fragment(), OverviewFragmentParentHandlers, AboutFragmentPa } }.observe(this, Observer { shouldShowSetup -> if (shouldShowSetup == true) { - pager.post { + fab.post { navigation.safeNavigate( MainFragmentDirections.actionOverviewFragmentToSetupTermsFragment(), R.id.overviewFragment @@ -108,52 +110,39 @@ class MainFragment : Fragment(), OverviewFragmentParentHandlers, AboutFragmentPa }) } - pager.adapter = adapter - - bottom_navigation_view.setOnNavigationItemSelectedListener { - menuItem -> - - pager?.currentItem = when(menuItem.itemId) { - R.id.main_tab_overview -> 0 - R.id.main_tab_uninstall -> 1 - R.id.main_tab_about -> 2 + fun updateShowFab(selectedItemId: Int) { + showAuthButtonLive.value = when (selectedItemId) { + R.id.main_tab_overview -> true + R.id.main_tab_uninstall -> !BuildConfig.storeCompilant + R.id.main_tab_about -> false else -> throw IllegalStateException() } + } + + bottom_navigation_view.setOnNavigationItemReselectedListener { /* ignore */ } + bottom_navigation_view.setOnNavigationItemSelectedListener { menuItem -> + childFragmentManager.beginTransaction() + .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) + .replace(R.id.container, when(menuItem.itemId) { + R.id.main_tab_overview -> OverviewFragment() + R.id.main_tab_uninstall -> UninstallFragment() + R.id.main_tab_about -> AboutFragment() + else -> throw IllegalStateException() + }) + .commit() + + updateShowFab(menuItem.itemId) true } - fun updateShowFab(selectedPage: Int) { - showAuthButtonLive.value = when (selectedPage) { - 0 -> true - 1 -> !BuildConfig.storeCompilant - 2 -> false - else -> throw IllegalStateException() - } + if (childFragmentManager.findFragmentById(R.id.container) == null) { + childFragmentManager.beginTransaction() + .replace(R.id.container, OverviewFragment()) + .commit() } - updateShowFab(pager.currentItem) - - pager.addOnPageChangeListener(object: ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - // ignore - } - - override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { - // ignore - } - - override fun onPageSelected(position: Int) { - updateShowFab(position) - - bottom_navigation_view.selectedItemId = when(pager.currentItem) { - 0 -> R.id.main_tab_overview - 1 -> R.id.main_tab_uninstall - 2 -> R.id.main_tab_about - else -> throw IllegalStateException() - } - } - }) + updateShowFab(bottom_navigation_view.selectedItemId) } override fun openAddDeviceScreen() { diff --git a/app/src/main/java/io/timelimit/android/ui/overview/main/PagerAdapter.kt b/app/src/main/java/io/timelimit/android/ui/overview/main/PagerAdapter.kt deleted file mode 100644 index 82420b7..0000000 --- a/app/src/main/java/io/timelimit/android/ui/overview/main/PagerAdapter.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * TimeLimit Copyright 2019 Jonas Lochmann - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package io.timelimit.android.ui.overview.main - -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentStatePagerAdapter -import io.timelimit.android.ui.overview.about.AboutFragment -import io.timelimit.android.ui.overview.overview.OverviewFragment -import io.timelimit.android.ui.overview.uninstall.UninstallFragment - -class PagerAdapter(fragmentManager: FragmentManager): FragmentStatePagerAdapter(fragmentManager) { - override fun getCount() = 3 - - override fun getItem(position: Int) = when(position) { - 0 -> OverviewFragment() - 1 -> UninstallFragment() - 2 -> AboutFragment() - else -> throw IllegalStateException() - } -} diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index c5826b3..84f8874 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -25,8 +25,8 @@ android:layout_weight="1" android:layout_height="0dp"> - diff --git a/app/src/main/res/layout/fragment_manage_category.xml b/app/src/main/res/layout/fragment_manage_category.xml index 6199f99..d8e34b9 100644 --- a/app/src/main/res/layout/fragment_manage_category.xml +++ b/app/src/main/res/layout/fragment_manage_category.xml @@ -26,8 +26,8 @@ android:layout_weight="1" android:layout_height="0dp"> - diff --git a/app/src/main/res/layout/fragment_manage_child.xml b/app/src/main/res/layout/fragment_manage_child.xml index 92f7916..dacbec8 100644 --- a/app/src/main/res/layout/fragment_manage_child.xml +++ b/app/src/main/res/layout/fragment_manage_child.xml @@ -26,8 +26,8 @@ android:layout_weight="1" android:layout_height="0dp"> -