From 7d7786e3eab8925fa06728f298bafb88870f582f Mon Sep 17 00:00:00 2001 From: Isaiah Collins Abetong Date: Tue, 20 Apr 2021 22:12:54 +0800 Subject: [PATCH] Fixed editors not exiting --- .../features/core/activities/MainActivity.kt | 57 +-------------- .../fokus/features/event/EventFragment.kt | 73 +++++++++++++++++-- .../fokus/features/event/EventViewModel.kt | 4 +- .../features/event/editor/EventEditor.kt | 11 ++- .../features/subject/editor/SubjectEditor.kt | 11 ++- .../fokus/features/task/editor/TaskEditor.kt | 11 ++- app/src/main/res/drawable/ic_hero_eye_24.xml | 21 ++++++ app/src/main/res/layout/fragment_event.xml | 3 +- app/src/main/res/menu/menu_events.xml | 23 ++++++ app/src/main/res/values/strings.xml | 4 + 10 files changed, 148 insertions(+), 70 deletions(-) create mode 100644 app/src/main/res/drawable/ic_hero_eye_24.xml create mode 100644 app/src/main/res/menu/menu_events.xml diff --git a/app/src/main/java/com/isaiahvonrundstedt/fokus/features/core/activities/MainActivity.kt b/app/src/main/java/com/isaiahvonrundstedt/fokus/features/core/activities/MainActivity.kt index 2c307361..5c756cac 100644 --- a/app/src/main/java/com/isaiahvonrundstedt/fokus/features/core/activities/MainActivity.kt +++ b/app/src/main/java/com/isaiahvonrundstedt/fokus/features/core/activities/MainActivity.kt @@ -122,62 +122,7 @@ class MainActivity : BaseActivity() { } } - override fun onSupportNavigateUp(): Boolean = controller?.navigateUp() == true -// -// override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { -// super.onActivityResult(requestCode, resultCode, data) -// if (resultCode == Activity.RESULT_OK) { -// when (requestCode) { -// TaskEditor.REQUEST_CODE_INSERT, TaskEditor.REQUEST_CODE_UPDATE -> { -// val task: Task? = -// data?.getParcelableExtra(TaskEditor.EXTRA_TASK) -// val attachments: List? = -// data?.getParcelableListExtra(TaskEditor.EXTRA_ATTACHMENTS) -// -// task?.also { -// if (requestCode == TaskEditor.REQUEST_CODE_INSERT) -// tasksViewModel.insert(it, attachments ?: emptyList()) -// else if (requestCode == TaskEditor.REQUEST_CODE_UPDATE) -// tasksViewModel.update(it, attachments ?: emptyList()) -// } -// } -// EventEditor.REQUEST_CODE_INSERT, EventEditor.REQUEST_CODE_UPDATE -> { -// val event: Event? = data?.getParcelableExtra(EventEditor.EXTRA_EVENT) -// -// event?.also { -// if (requestCode == EventEditor.REQUEST_CODE_INSERT) -// eventsViewModel.insert(it) -// else eventsViewModel.update(it) -// } -// } -// SubjectEditor.REQUEST_CODE_INSERT, SubjectEditor.REQUEST_CODE_UPDATE -> { -// val subject: Subject? -// = data?.getParcelableExtra(SubjectEditor.EXTRA_SUBJECT) -// val schedules: List? -// = data?.getParcelableListExtra(SubjectEditor.EXTRA_SCHEDULE) -// -// subject?.also { -// if (requestCode == SubjectEditor.REQUEST_CODE_INSERT) -// subjectsViewModel.insert(it, schedules ?: emptyList()) -// else if (requestCode == SubjectEditor.REQUEST_CODE_UPDATE) -// subjectsViewModel.update(it, schedules ?: emptyList()) -// } -// } -// } -// } -// } -// -// private val tasksViewModel by lazy { -// ViewModelProvider(this).get(TaskViewModel::class.java) -// } -// -// private val eventsViewModel by lazy { -// ViewModelProvider(this).get(EventViewModel::class.java) -// } -// -// private val subjectsViewModel by lazy { -// ViewModelProvider(this).get(SubjectViewModel::class.java) -// } + override fun onSupportNavigateUp(): Boolean = controller?.navigateUp() ?: false companion object { const val ACTION_SHORTCUT_TASK = "action:shortcut:task" diff --git a/app/src/main/java/com/isaiahvonrundstedt/fokus/features/event/EventFragment.kt b/app/src/main/java/com/isaiahvonrundstedt/fokus/features/event/EventFragment.kt index 0f9f385f..63e66cc7 100644 --- a/app/src/main/java/com/isaiahvonrundstedt/fokus/features/event/EventFragment.kt +++ b/app/src/main/java/com/isaiahvonrundstedt/fokus/features/event/EventFragment.kt @@ -1,15 +1,20 @@ package com.isaiahvonrundstedt.fokus.features.event +import android.animation.ValueAnimator import android.os.Bundle import android.view.LayoutInflater +import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import android.widget.TextView +import androidx.core.animation.doOnEnd +import androidx.core.animation.doOnStart import androidx.core.os.bundleOf import androidx.core.view.children import androidx.core.view.doOnPreDraw import androidx.core.view.isVisible +import androidx.core.view.updateLayoutParams import androidx.fragment.app.viewModels import androidx.navigation.NavController import androidx.navigation.Navigation @@ -30,10 +35,12 @@ import com.isaiahvonrundstedt.fokus.features.subject.Subject import com.kizitonwose.calendarview.model.CalendarDay import com.kizitonwose.calendarview.model.CalendarMonth import com.kizitonwose.calendarview.model.DayOwner +import com.kizitonwose.calendarview.model.InDateStyle import com.kizitonwose.calendarview.ui.DayBinder import com.kizitonwose.calendarview.ui.MonthHeaderFooterBinder import com.kizitonwose.calendarview.ui.ViewContainer import dagger.hilt.android.AndroidEntryPoint +import me.saket.cascade.overrideOverflowMenu import java.time.DayOfWeek import java.time.LocalDate import java.time.format.DateTimeFormatter @@ -67,6 +74,8 @@ class EventFragment : BaseFragment(), BaseAdapter.ActionListener, BaseAdapter.Ar getParentToolbar()?.run { title = viewModel.currentMonth.format(monthYearFormatter) menu?.clear() + overrideOverflowMenu(::customPopupProvider) + setOnMenuItemClickListener(::onMenuItemClicked) } with(binding.recyclerView) { @@ -83,10 +92,9 @@ class EventFragment : BaseFragment(), BaseAdapter.ActionListener, BaseAdapter.Ar daysOfWeek = daysOfWeekFromLocale() binding.calendarView.apply { - setup(viewModel.currentMonth, viewModel.currentMonth, - daysOfWeek.first()) - setupAsync(viewModel.startMonth, viewModel.endMonth, + setup(viewModel.startMonth, viewModel.endMonth, daysOfWeek.first()) + scrollToMonth(viewModel.currentMonth) } if (savedInstanceState == null) @@ -161,13 +169,13 @@ class EventFragment : BaseFragment(), BaseAdapter.ActionListener, BaseAdapter.Ar // The user is two months away from the starting month in the CalendarView // we'll need to add more months at the start viewModel.startMonth = viewModel.startMonth.minusMonths(2) - binding.calendarView.updateMonthRangeAsync(startMonth = viewModel.startMonth) + binding.calendarView.updateMonthRange(startMonth = viewModel.startMonth) } else if (it.yearMonth.plusMonths(2) == viewModel.endMonth) { // The user is two months away from the ending month in the CalendarView // we'll need to add more months at the end viewModel.endMonth = viewModel.endMonth.plusMonths(2) - binding.calendarView.updateMonthRangeAsync(endMonth = viewModel.endMonth) + binding.calendarView.updateMonthRange(endMonth = viewModel.endMonth) } } @@ -191,6 +199,9 @@ class EventFragment : BaseFragment(), BaseAdapter.ActionListener, BaseAdapter.Ar super.onResume() binding.calendarView.scrollToMonth(viewModel.currentMonth) + binding.calendarView.scrollToDate(viewModel.today) + setCurrentDate(viewModel.today) + binding.actionButton.setOnClickListener { it.transitionName = TRANSITION_ELEMENT_ROOT @@ -234,6 +245,58 @@ class EventFragment : BaseFragment(), BaseAdapter.ActionListener, BaseAdapter.Ar } } + private fun onMenuItemClicked(item: MenuItem): Boolean { + val firstDate = binding.calendarView.findFirstVisibleDay()?.date ?: return false + val lastDate = binding.calendarView.findLastVisibleDay()?.date ?: return false + + val oneWeekHeight = binding.calendarView.daySize.height + val oneMonthHeight = oneWeekHeight * 6 + + when(item.itemId) { + R.id.action_view_week -> { + + val animator = ValueAnimator.ofInt(oneMonthHeight, oneWeekHeight) + animator.addUpdateListener { anim -> + binding.calendarView.updateLayoutParams { + height = anim.animatedValue as Int + } + } + + animator.doOnEnd { + binding.calendarView.updateMonthConfiguration( + inDateStyle = InDateStyle.FIRST_MONTH, + maxRowCount = 1, + hasBoundaries = false + ) + } + + animator.duration = 250 + animator.start() + } + R.id.action_view_month -> { + + val animator = ValueAnimator.ofInt(oneMonthHeight, oneWeekHeight) + animator.addUpdateListener { anim -> + binding.calendarView.updateLayoutParams { + height = anim.animatedValue as Int + } + } + + animator.doOnStart { + binding.calendarView.updateMonthConfiguration( + inDateStyle = InDateStyle.ALL_MONTHS, + maxRowCount = 6, + hasBoundaries = true + ) + } + + animator.duration = 250 + animator.start() + } + } + return true + } + private fun bindToCalendar(day: CalendarDay, textView: TextView, view: View, dates: List = emptyList()) { diff --git a/app/src/main/java/com/isaiahvonrundstedt/fokus/features/event/EventViewModel.kt b/app/src/main/java/com/isaiahvonrundstedt/fokus/features/event/EventViewModel.kt index 9d2f63f9..92c98549 100644 --- a/app/src/main/java/com/isaiahvonrundstedt/fokus/features/event/EventViewModel.kt +++ b/app/src/main/java/com/isaiahvonrundstedt/fokus/features/event/EventViewModel.kt @@ -32,8 +32,8 @@ class EventViewModel @Inject constructor( events.value = _events.value?.filter { it.event.schedule!!.toLocalDate() == selectedDate } } - var startMonth: YearMonth = currentMonth.minusMonths(5) - var endMonth: YearMonth = currentMonth.plusMonths(5) + var startMonth: YearMonth = currentMonth.minusMonths(1) + var endMonth: YearMonth = currentMonth.plusMonths(1) init { events.addSource(_events) { items -> diff --git a/app/src/main/java/com/isaiahvonrundstedt/fokus/features/event/editor/EventEditor.kt b/app/src/main/java/com/isaiahvonrundstedt/fokus/features/event/editor/EventEditor.kt index 766d42d6..2ad64491 100644 --- a/app/src/main/java/com/isaiahvonrundstedt/fokus/features/event/editor/EventEditor.kt +++ b/app/src/main/java/com/isaiahvonrundstedt/fokus/features/event/editor/EventEditor.kt @@ -110,7 +110,12 @@ class EventEditor: BaseEditor(), FragmentResultListener { with(binding.appBarLayout.toolbar) { inflateMenu(R.menu.menu_editor) - setNavigationOnClickListener { controller?.navigateUp() } + setNavigationOnClickListener { + if (controller?.graph?.id == R.id.navigation_container_event) + requireActivity().finish() + else controller?.navigateUp() + } + overrideOverflowMenu(::customPopupProvider) setOnMenuItemClickListener(::onMenuItemClicked) } @@ -324,7 +329,9 @@ class EventEditor: BaseEditor(), FragmentResultListener { viewModel.insert() else viewModel.update() - controller?.navigateUp() + if (controller?.graph?.id == R.id.navigation_container_event) + requireActivity().finish() + else controller?.navigateUp() } } diff --git a/app/src/main/java/com/isaiahvonrundstedt/fokus/features/subject/editor/SubjectEditor.kt b/app/src/main/java/com/isaiahvonrundstedt/fokus/features/subject/editor/SubjectEditor.kt index 44ffbad3..2bcfcf8b 100644 --- a/app/src/main/java/com/isaiahvonrundstedt/fokus/features/subject/editor/SubjectEditor.kt +++ b/app/src/main/java/com/isaiahvonrundstedt/fokus/features/subject/editor/SubjectEditor.kt @@ -101,7 +101,12 @@ class SubjectEditor : BaseEditor(), BaseAdapter.ActionListener, FragmentResultLi with(binding.appBarLayout.toolbar) { inflateMenu(R.menu.menu_editor) - setNavigationOnClickListener { controller?.navigateUp() } + setNavigationOnClickListener { + if (controller?.graph?.id == R.id.navigation_container_subject) + requireActivity().finish() + else controller?.navigateUp() + } + overrideOverflowMenu(::customPopupProvider) setOnMenuItemClickListener(::onMenuItemClicked) } @@ -235,7 +240,9 @@ class SubjectEditor : BaseEditor(), BaseAdapter.ActionListener, FragmentResultLi viewModel.insert() else viewModel.update() - controller?.navigateUp() + if (controller?.graph?.id == R.id.navigation_container_subject) + requireActivity().finish() + else controller?.navigateUp() } } diff --git a/app/src/main/java/com/isaiahvonrundstedt/fokus/features/task/editor/TaskEditor.kt b/app/src/main/java/com/isaiahvonrundstedt/fokus/features/task/editor/TaskEditor.kt index 478b8b21..1fcc991a 100644 --- a/app/src/main/java/com/isaiahvonrundstedt/fokus/features/task/editor/TaskEditor.kt +++ b/app/src/main/java/com/isaiahvonrundstedt/fokus/features/task/editor/TaskEditor.kt @@ -175,7 +175,12 @@ class TaskEditor : BaseEditor(), BaseAdapter.ActionListener, FragmentResultListe with(binding.appBarLayout.toolbar) { inflateMenu(R.menu.menu_editor) - setNavigationOnClickListener { controller?.navigateUp() } + setNavigationOnClickListener { + if (controller?.graph?.id == R.id.navigation_container_task) + requireActivity().finish() + else controller?.navigateUp() + } + overrideOverflowMenu(::customPopupProvider) setOnMenuItemClickListener(::onMenuItemClicked) } @@ -417,7 +422,9 @@ class TaskEditor : BaseEditor(), BaseAdapter.ActionListener, FragmentResultListe viewModel.insert() else viewModel.update() - controller?.navigateUp() + if (controller?.graph?.id == R.id.navigation_container_task) + requireActivity().finish() + else controller?.navigateUp() } } diff --git a/app/src/main/res/drawable/ic_hero_eye_24.xml b/app/src/main/res/drawable/ic_hero_eye_24.xml new file mode 100644 index 00000000..c5bb7c58 --- /dev/null +++ b/app/src/main/res/drawable/ic_hero_eye_24.xml @@ -0,0 +1,21 @@ + + + + diff --git a/app/src/main/res/layout/fragment_event.xml b/app/src/main/res/layout/fragment_event.xml index fe11d814..c0377e92 100644 --- a/app/src/main/res/layout/fragment_event.xml +++ b/app/src/main/res/layout/fragment_event.xml @@ -23,7 +23,8 @@ app:cv_dayViewResource="@layout/layout_calendar_day" app:cv_monthHeaderResource="@layout/layout_calendar_week_days" app:cv_orientation="horizontal" - app:cv_scrollMode="paged"/> + app:cv_scrollMode="paged" + app:cv_outDateStyle="endOfRow"/> + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2e5de4ab..1e631171 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -24,6 +24,7 @@ Sort Filter Share + View as Import Clear Logs Export to file @@ -138,6 +139,9 @@ Today only Tomorrow only + Month + Week + Subject Code Description Days of Week