From 00864d1b54277400f5e602919778519753f616cd Mon Sep 17 00:00:00 2001 From: Nazar Sukhovych Date: Wed, 8 Jan 2025 20:13:06 +0100 Subject: [PATCH 01/25] REM-914 - Add develop branch to test CI --- .github/workflows/build_and_test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 335b0c381..1278a0d73 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -4,6 +4,7 @@ on: push: branches: - 'master' + - 'develop' - 'feature/**' - 'release/**' From 8a6bdd973fc938de93887413075872f6205c71bb Mon Sep 17 00:00:00 2001 From: Nazar Sukhovych Date: Wed, 8 Jan 2025 22:04:04 +0100 Subject: [PATCH 02/25] REM-920 - Move edit group screen to fragment --- app/src/main/AndroidManifest.xml | 7 - .../globalsearch/GlobalSearchViewModel.kt | 11 +- .../groups/create/CreateGroupViewModel.kt | 4 + ...eGroupActivity.kt => EditGroupFragment.kt} | 126 +++++++++--------- .../tasks/groups/list/GroupsFragment.kt | 13 +- .../tasks/home/BottomNavActivity.kt | 10 ++ .../navigation/DataNavigationDispatcher.kt | 22 ++- .../main/res/layout/activity_create_group.xml | 102 -------------- .../main/res/layout/fragment_edit_group.xml | 80 +++++++++++ ...eate_group.xml => fragment_edit_group.xml} | 0 app/src/main/res/navigation/home_nav.xml | 14 +- .../naz013/navigation/DeepLinkDestination.kt | 5 + .../naz013/navigation/IntentDataHolder.kt | 4 +- 13 files changed, 212 insertions(+), 186 deletions(-) rename app/src/main/java/com/elementary/tasks/groups/create/{CreateGroupActivity.kt => EditGroupFragment.kt} (58%) delete mode 100644 app/src/main/res/layout/activity_create_group.xml create mode 100644 app/src/main/res/layout/fragment_edit_group.xml rename app/src/main/res/menu/{activity_create_group.xml => fragment_edit_group.xml} (100%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1102f8381..c5dcc5535 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -241,13 +241,6 @@ - - .isFragment(): Boolean { - return this == PreviewBirthdayFragment::class.java + return this == PreviewBirthdayFragment::class.java || + this == EditGroupFragment::class.java } private fun Class<*>.destinationId(): Int? { @@ -107,6 +108,10 @@ class GlobalSearchViewModel( R.id.previewBirthdayFragment } + this == EditGroupFragment::class.java -> { + R.id.editGroupFragment + } + else -> null } } @@ -170,7 +175,7 @@ class GlobalSearchViewModel( private fun ObjectType.toTargetClass(): Class<*> { return when (this) { - ObjectType.GROUP -> CreateGroupActivity::class.java + ObjectType.GROUP -> EditGroupFragment::class.java ObjectType.PLACE -> CreatePlaceActivity::class.java ObjectType.GOOGLE_TASK -> GoogleTaskPreviewActivity::class.java ObjectType.NOTE -> NotePreviewActivity::class.java diff --git a/app/src/main/java/com/elementary/tasks/groups/create/CreateGroupViewModel.kt b/app/src/main/java/com/elementary/tasks/groups/create/CreateGroupViewModel.kt index e1be55af2..40a531a66 100644 --- a/app/src/main/java/com/elementary/tasks/groups/create/CreateGroupViewModel.kt +++ b/app/src/main/java/com/elementary/tasks/groups/create/CreateGroupViewModel.kt @@ -52,6 +52,10 @@ class CreateGroupViewModel( private var localGroup: ReminderGroup? = null + fun hasId(): Boolean { + return id.isNotEmpty() + } + fun onPositionChanged(position: Int) { sliderPosition = position } diff --git a/app/src/main/java/com/elementary/tasks/groups/create/CreateGroupActivity.kt b/app/src/main/java/com/elementary/tasks/groups/create/EditGroupFragment.kt similarity index 58% rename from app/src/main/java/com/elementary/tasks/groups/create/CreateGroupActivity.kt rename to app/src/main/java/com/elementary/tasks/groups/create/EditGroupFragment.kt index c84515766..707f577ed 100644 --- a/app/src/main/java/com/elementary/tasks/groups/create/CreateGroupActivity.kt +++ b/app/src/main/java/com/elementary/tasks/groups/create/EditGroupFragment.kt @@ -1,38 +1,53 @@ package com.elementary.tasks.groups.create import android.os.Bundle -import androidx.activity.enableEdgeToEdge +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import com.elementary.tasks.R import com.elementary.tasks.core.data.Commands import com.elementary.tasks.core.data.ui.group.UiGroupEdit -import com.elementary.tasks.databinding.ActivityCreateGroupBinding +import com.elementary.tasks.databinding.FragmentEditGroupBinding +import com.elementary.tasks.navigation.toolbarfragment.BaseToolbarFragment import com.github.naz013.common.intent.IntentKeys import com.github.naz013.feature.common.livedata.nonNullObserve -import com.github.naz013.ui.common.Dialogues -import com.github.naz013.ui.common.activity.BindingActivity +import com.github.naz013.logging.Logger import com.github.naz013.ui.common.theme.ThemeProvider -import com.github.naz013.ui.common.view.applyBottomInsets -import com.github.naz013.ui.common.view.applyTopInsets -import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf -class CreateGroupActivity : BindingActivity() { +class EditGroupFragment : BaseToolbarFragment() { - private val dialogues by inject() - private val viewModel by viewModel { parametersOf(getId()) } + private val viewModel by viewModel { parametersOf(idFromIntent()) } - override fun inflateBinding() = ActivityCreateGroupBinding.inflate(layoutInflater) + private fun idFromIntent(): String = arguments?.getString(IntentKeys.INTENT_ID) ?: "" + + override fun getTitle(): String { + return if (viewModel.hasId()) { + getString(R.string.change_group) + } else { + getString(R.string.create_group) + } + } + + override fun inflate( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): FragmentEditGroupBinding { + return FragmentEditGroupBinding.inflate(inflater, container, false) + } override fun onCreate(savedInstanceState: Bundle?) { - enableEdgeToEdge() super.onCreate(savedInstanceState) - initActionBar() + Logger.i(TAG, "Opening the group screen for id: ${idFromIntent()}") + } - binding.scrollView.applyBottomInsets() - binding.colorSlider.setColors(ThemeProvider.colorsForSliderThemed(this)) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.colorSlider.setColors(ThemeProvider.colorsForSliderThemed(requireContext())) binding.colorSlider.setSelectorColorResource( - if (isDarkMode) { + if (isDark) { R.color.pureWhite } else { R.color.pureBlack @@ -43,57 +58,38 @@ class CreateGroupActivity : BindingActivity() { viewModel.onPositionChanged(position) } - initViewModel() - loadGroup() - } - - override fun requireLogin() = true - - private fun getId(): String = intentString(IntentKeys.INTENT_ID) - - private fun initActionBar() { - binding.appBar.applyTopInsets() - binding.toolbar.setTitle(R.string.create_group) - binding.toolbar.setNavigationOnClickListener { finish() } - binding.toolbar.setOnMenuItemClickListener { menuItem -> - when (menuItem.itemId) { - R.id.action_add -> { - askCopySaving() - true - } + addMenu( + menuRes = R.menu.fragment_edit_group, + onMenuItemListener = { menuItem -> + return@addMenu when (menuItem.itemId) { + R.id.action_add -> { + askCopySaving() + true + } - R.id.action_delete -> { - dialogues.askConfirmation(this, getString(R.string.delete)) { - if (it) { - viewModel.deleteGroup() + R.id.action_delete -> { + dialogues.askConfirmation(requireContext(), getString(R.string.delete)) { + if (it) { + viewModel.deleteGroup() + } } + true } - true - } - else -> false + else -> false + } + }, + menuModifier = { menu -> + menu.getItem(1).isVisible = !viewModel.isFromFile && viewModel.canBeDeleted } - } - updateMenu() - } - - private fun updateMenu() { - binding.toolbar.menu.also { - it.getItem(1).isVisible = !viewModel.isFromFile && viewModel.canBeDeleted - } - } + ) - private fun showGroup(group: UiGroupEdit) { - binding.nameInput.setText(group.title) - binding.colorSlider.setSelection(group.colorPosition) - binding.defaultCheck.isEnabled = !group.isDefault - binding.defaultCheck.isChecked = group.isDefault - binding.toolbar.setTitle(R.string.change_group) - updateMenu() + initViewModel() + loadGroup() } private fun loadGroup() { - if (intent.getBooleanExtra(IntentKeys.INTENT_ITEM, false)) { + if (arguments?.getBoolean(IntentKeys.INTENT_ITEM, false) == true) { viewModel.loadFromIntent() } } @@ -102,7 +98,7 @@ class CreateGroupActivity : BindingActivity() { viewModel.reminderGroup.nonNullObserve(this) { showGroup(it) } viewModel.result.nonNullObserve(this) { when (it) { - Commands.SAVED, Commands.DELETED -> finish() + Commands.SAVED, Commands.DELETED -> moveBack() else -> { } } @@ -110,6 +106,14 @@ class CreateGroupActivity : BindingActivity() { lifecycle.addObserver(viewModel) } + private fun showGroup(group: UiGroupEdit) { + binding.nameInput.setText(group.title) + binding.colorSlider.setSelection(group.colorPosition) + binding.defaultCheck.isEnabled = !group.isDefault + binding.defaultCheck.isChecked = group.isDefault + invalidateOptionsMenu() + } + private fun saveGroup(newId: Boolean = false) { val text = binding.nameInput.text.toString().trim() if (text.isEmpty()) { @@ -127,7 +131,7 @@ class CreateGroupActivity : BindingActivity() { private fun askCopySaving() { if (viewModel.isFromFile && viewModel.hasSameInDb) { - dialogues.getMaterialDialog(this) + dialogues.getMaterialDialog(requireContext()) .setMessage(R.string.same_group_message) .setPositiveButton(R.string.keep) { dialogInterface, _ -> dialogInterface.dismiss() @@ -148,6 +152,6 @@ class CreateGroupActivity : BindingActivity() { } companion object { - private const val MENU_ITEM_DELETE = 12 + private const val TAG = "EditGroupFragment" } } diff --git a/app/src/main/java/com/elementary/tasks/groups/list/GroupsFragment.kt b/app/src/main/java/com/elementary/tasks/groups/list/GroupsFragment.kt index f9d493c98..53dfaf12a 100644 --- a/app/src/main/java/com/elementary/tasks/groups/list/GroupsFragment.kt +++ b/app/src/main/java/com/elementary/tasks/groups/list/GroupsFragment.kt @@ -10,17 +10,15 @@ import com.elementary.tasks.R import com.elementary.tasks.core.data.ui.group.UiGroupList import com.elementary.tasks.core.interfaces.ActionsListener import com.elementary.tasks.core.utils.ListActions -import com.github.naz013.ui.common.Dialogues -import com.github.naz013.ui.common.view.ViewUtils import com.elementary.tasks.databinding.FragmentGroupsBinding -import com.elementary.tasks.groups.create.CreateGroupActivity import com.elementary.tasks.navigation.toolbarfragment.BaseToolbarFragment import com.github.naz013.analytics.Screen import com.github.naz013.analytics.ScreenUsedEvent import com.github.naz013.common.intent.IntentKeys import com.github.naz013.feature.common.livedata.nonNullObserve -import com.github.naz013.ui.common.login.LoginApi +import com.github.naz013.ui.common.Dialogues import com.github.naz013.ui.common.theme.ThemeProvider +import com.github.naz013.ui.common.view.ViewUtils import com.github.naz013.ui.common.view.applyBottomInsets import com.github.naz013.ui.common.view.applyBottomInsetsMargin import org.koin.androidx.viewmodel.ext.android.viewModel @@ -48,7 +46,7 @@ class GroupsFragment : BaseToolbarFragment() { } private fun addGroup() { - LoginApi.openLogged(requireContext(), CreateGroupActivity::class.java) + navigate { navigate(R.id.editGroupFragment) } } private fun initViewModel() { @@ -137,9 +135,10 @@ class GroupsFragment : BaseToolbarFragment() { } private fun editGroup(id: String) { - LoginApi.openLogged(requireContext(), CreateGroupActivity::class.java) { - putExtra(IntentKeys.INTENT_ID, id) + val bundle = Bundle().apply { + putString(IntentKeys.INTENT_ID, id) } + navigate { navigate(R.id.editGroupFragment, bundle) } } override fun getTitle(): String = getString(R.string.groups) diff --git a/app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt b/app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt index efe352637..7dc0870a8 100644 --- a/app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt +++ b/app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt @@ -33,6 +33,7 @@ import com.github.naz013.navigation.DayViewScreen import com.github.naz013.navigation.DeepLinkDestination import com.github.naz013.navigation.Destination import com.github.naz013.navigation.EditBirthdayScreen +import com.github.naz013.navigation.EditGroupScreen import com.github.naz013.navigation.SettingsScreen import com.github.naz013.navigation.ViewBirthdayScreen import com.github.naz013.ui.common.activity.BindingActivity @@ -119,6 +120,15 @@ class BottomNavActivity : .startActivities() } + is EditGroupScreen -> { + NavDeepLinkBuilder(this) + .setGraph(R.navigation.home_nav) + .setDestination(R.id.editGroupFragment) + .setArguments(deepLinkDestination.extras) + .createTaskStackBuilder() + .startActivities() + } + else -> { Logger.e("BottomNavActivity", "Unknown deep link destination: $deepLinkDestination") } diff --git a/app/src/main/java/com/elementary/tasks/navigation/DataNavigationDispatcher.kt b/app/src/main/java/com/elementary/tasks/navigation/DataNavigationDispatcher.kt index 425cca61a..a70c6eeba 100644 --- a/app/src/main/java/com/elementary/tasks/navigation/DataNavigationDispatcher.kt +++ b/app/src/main/java/com/elementary/tasks/navigation/DataNavigationDispatcher.kt @@ -3,7 +3,6 @@ package com.elementary.tasks.navigation import android.content.Context import android.content.Intent import android.os.Bundle -import com.elementary.tasks.groups.create.CreateGroupActivity import com.elementary.tasks.home.BottomNavActivity import com.elementary.tasks.notes.create.CreateNoteActivity import com.elementary.tasks.places.create.CreatePlaceActivity @@ -18,6 +17,7 @@ import com.github.naz013.logging.Logger import com.github.naz013.navigation.DataDestination import com.github.naz013.navigation.DeepLinkDestination import com.github.naz013.navigation.EditBirthdayScreen +import com.github.naz013.navigation.EditGroupScreen import com.github.naz013.navigation.intent.IntentDataWriter import com.github.naz013.ui.common.context.buildIntent @@ -64,7 +64,21 @@ class DataNavigationDispatcher( } } - is Reminder, is ReminderGroup, is NoteWithImages, is Place -> { + is ReminderGroup -> { + Bundle().apply { + putParcelable( + DeepLinkDestination.KEY, + EditGroupScreen( + Bundle().apply { + putBoolean(IntentKeys.INTENT_ITEM, true) + putBoolean(IntentKeys.INTENT_DEEP_LINK, true) + } + ) + ) + } + } + + is Reminder, is NoteWithImages, is Place -> { Bundle().apply { putBoolean(IntentKeys.INTENT_ITEM, true) } @@ -80,7 +94,7 @@ class DataNavigationDispatcher( private fun getAction(data: Any): String? { return when (data) { - is Birthday -> Intent.ACTION_VIEW + is Birthday, is ReminderGroup -> Intent.ACTION_VIEW else -> null } } @@ -89,7 +103,7 @@ class DataNavigationDispatcher( return when (data) { is Birthday -> BottomNavActivity::class.java is Reminder -> BuildReminderActivity::class.java - is ReminderGroup -> CreateGroupActivity::class.java + is ReminderGroup -> BottomNavActivity::class.java is NoteWithImages -> CreateNoteActivity::class.java is Place -> CreatePlaceActivity::class.java else -> null diff --git a/app/src/main/res/layout/activity_create_group.xml b/app/src/main/res/layout/activity_create_group.xml deleted file mode 100644 index 85343697a..000000000 --- a/app/src/main/res/layout/activity_create_group.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_edit_group.xml b/app/src/main/res/layout/fragment_edit_group.xml new file mode 100644 index 000000000..b2293f9c4 --- /dev/null +++ b/app/src/main/res/layout/fragment_edit_group.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/activity_create_group.xml b/app/src/main/res/menu/fragment_edit_group.xml similarity index 100% rename from app/src/main/res/menu/activity_create_group.xml rename to app/src/main/res/menu/fragment_edit_group.xml diff --git a/app/src/main/res/navigation/home_nav.xml b/app/src/main/res/navigation/home_nav.xml index dc9d1a0dc..a0fb05628 100644 --- a/app/src/main/res/navigation/home_nav.xml +++ b/app/src/main/res/navigation/home_nav.xml @@ -37,6 +37,9 @@ + + tools:layout="@layout/fragment_groups" > + + + diff --git a/navigation-api/src/main/kotlin/com/github/naz013/navigation/DeepLinkDestination.kt b/navigation-api/src/main/kotlin/com/github/naz013/navigation/DeepLinkDestination.kt index 73b058636..e2b39ceec 100644 --- a/navigation-api/src/main/kotlin/com/github/naz013/navigation/DeepLinkDestination.kt +++ b/navigation-api/src/main/kotlin/com/github/naz013/navigation/DeepLinkDestination.kt @@ -28,3 +28,8 @@ data class ViewBirthdayScreen( @Parcelize data object SettingsScreen : DeepLinkDestination() + +@Parcelize +data class EditGroupScreen( + val extras: Bundle +) : DeepLinkDestination() diff --git a/navigation-api/src/main/kotlin/com/github/naz013/navigation/IntentDataHolder.kt b/navigation-api/src/main/kotlin/com/github/naz013/navigation/IntentDataHolder.kt index 9eab6cc36..9c9a375a6 100644 --- a/navigation-api/src/main/kotlin/com/github/naz013/navigation/IntentDataHolder.kt +++ b/navigation-api/src/main/kotlin/com/github/naz013/navigation/IntentDataHolder.kt @@ -9,7 +9,9 @@ internal class IntentDataHolder : IntentDataWriter, IntentDataReader { @Suppress("UNCHECKED_CAST") override fun get(key: String, clazz: Class): T? { - return map[key]?.takeIf { it.javaClass == clazz } as? T + return (map[key]?.takeIf { it.javaClass == clazz } as? T).also { + remove(key) + } } override fun hasKey(key: String): Boolean { From 4a7f2a3e05669e47bed8f4002255b204ae6e81e9 Mon Sep 17 00:00:00 2001 From: Nazar Sukhovych Date: Thu, 9 Jan 2025 20:28:11 +0100 Subject: [PATCH 03/25] REM-917 - Move Place edit to the Fragment --- app/src/main/AndroidManifest.xml | 7 - .../globalsearch/GlobalSearchViewModel.kt | 11 +- .../tasks/home/BottomNavActivity.kt | 14 +- .../navigation/DataNavigationDispatcher.kt | 20 ++- ...ePlaceActivity.kt => EditPlaceFragment.kt} | 123 ++++++++++-------- .../tasks/places/create/PlaceViewModel.kt | 4 + .../tasks/places/list/PlacesFragment.kt | 22 ++-- .../tasks/simplemap/SimpleMapFragment.kt | 17 --- ...eate_place.xml => fragment_edit_place.xml} | 10 -- ...eate_place.xml => fragment_edit_place.xml} | 0 app/src/main/res/navigation/home_nav.xml | 21 +-- .../naz013/navigation/DeepLinkDestination.kt | 5 + .../ui/common/activity/LightThemedActivity.kt | 1 + 13 files changed, 137 insertions(+), 118 deletions(-) rename app/src/main/java/com/elementary/tasks/places/create/{CreatePlaceActivity.kt => EditPlaceFragment.kt} (63%) rename app/src/main/res/layout/{activity_create_place.xml => fragment_edit_place.xml} (83%) rename app/src/main/res/menu/{activity_create_place.xml => fragment_edit_place.xml} (100%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5dcc5535..fd6de72c2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -241,13 +241,6 @@ - - .isFragment(): Boolean { return this == PreviewBirthdayFragment::class.java || - this == EditGroupFragment::class.java + this == EditGroupFragment::class.java || + this == EditPlaceFragment::class.java } private fun Class<*>.destinationId(): Int? { @@ -112,6 +113,10 @@ class GlobalSearchViewModel( R.id.editGroupFragment } + this == EditPlaceFragment::class.java -> { + R.id.editPlaceFragment + } + else -> null } } @@ -176,7 +181,7 @@ class GlobalSearchViewModel( private fun ObjectType.toTargetClass(): Class<*> { return when (this) { ObjectType.GROUP -> EditGroupFragment::class.java - ObjectType.PLACE -> CreatePlaceActivity::class.java + ObjectType.PLACE -> EditPlaceFragment::class.java ObjectType.GOOGLE_TASK -> GoogleTaskPreviewActivity::class.java ObjectType.NOTE -> NotePreviewActivity::class.java ObjectType.BIRTHDAY -> PreviewBirthdayFragment::class.java diff --git a/app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt b/app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt index 7dc0870a8..5aa731aec 100644 --- a/app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt +++ b/app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt @@ -34,6 +34,7 @@ import com.github.naz013.navigation.DeepLinkDestination import com.github.naz013.navigation.Destination import com.github.naz013.navigation.EditBirthdayScreen import com.github.naz013.navigation.EditGroupScreen +import com.github.naz013.navigation.EditPlaceScreen import com.github.naz013.navigation.SettingsScreen import com.github.naz013.navigation.ViewBirthdayScreen import com.github.naz013.ui.common.activity.BindingActivity @@ -129,6 +130,15 @@ class BottomNavActivity : .startActivities() } + is EditPlaceScreen -> { + NavDeepLinkBuilder(this) + .setGraph(R.navigation.home_nav) + .setDestination(R.id.editPlaceFragment) + .setArguments(deepLinkDestination.extras) + .createTaskStackBuilder() + .startActivities() + } + else -> { Logger.e("BottomNavActivity", "Unknown deep link destination: $deepLinkDestination") } @@ -181,10 +191,10 @@ class BottomNavActivity : } override fun handleBackPress(): Boolean { - Logger.d("handleBackPress: $currentResumedFragment") + Logger.i("NavActivity", "Handle back press, current fragment: $currentResumedFragment") if (currentResumedFragment is HomeFragment) { finishAffinity() - } else { + } else if (currentResumedFragment?.canGoBack() == true) { navController.popBackStack() } return true diff --git a/app/src/main/java/com/elementary/tasks/navigation/DataNavigationDispatcher.kt b/app/src/main/java/com/elementary/tasks/navigation/DataNavigationDispatcher.kt index a70c6eeba..2ccf05d8b 100644 --- a/app/src/main/java/com/elementary/tasks/navigation/DataNavigationDispatcher.kt +++ b/app/src/main/java/com/elementary/tasks/navigation/DataNavigationDispatcher.kt @@ -5,7 +5,6 @@ import android.content.Intent import android.os.Bundle import com.elementary.tasks.home.BottomNavActivity import com.elementary.tasks.notes.create.CreateNoteActivity -import com.elementary.tasks.places.create.CreatePlaceActivity import com.elementary.tasks.reminder.build.BuildReminderActivity import com.github.naz013.common.intent.IntentKeys import com.github.naz013.domain.Birthday @@ -18,6 +17,7 @@ import com.github.naz013.navigation.DataDestination import com.github.naz013.navigation.DeepLinkDestination import com.github.naz013.navigation.EditBirthdayScreen import com.github.naz013.navigation.EditGroupScreen +import com.github.naz013.navigation.EditPlaceScreen import com.github.naz013.navigation.intent.IntentDataWriter import com.github.naz013.ui.common.context.buildIntent @@ -78,7 +78,21 @@ class DataNavigationDispatcher( } } - is Reminder, is NoteWithImages, is Place -> { + is Place -> { + Bundle().apply { + putParcelable( + DeepLinkDestination.KEY, + EditPlaceScreen( + Bundle().apply { + putBoolean(IntentKeys.INTENT_ITEM, true) + putBoolean(IntentKeys.INTENT_DEEP_LINK, true) + } + ) + ) + } + } + + is Reminder, is NoteWithImages -> { Bundle().apply { putBoolean(IntentKeys.INTENT_ITEM, true) } @@ -105,7 +119,7 @@ class DataNavigationDispatcher( is Reminder -> BuildReminderActivity::class.java is ReminderGroup -> BottomNavActivity::class.java is NoteWithImages -> CreateNoteActivity::class.java - is Place -> CreatePlaceActivity::class.java + is Place -> BottomNavActivity::class.java else -> null } } diff --git a/app/src/main/java/com/elementary/tasks/places/create/CreatePlaceActivity.kt b/app/src/main/java/com/elementary/tasks/places/create/EditPlaceFragment.kt similarity index 63% rename from app/src/main/java/com/elementary/tasks/places/create/CreatePlaceActivity.kt rename to app/src/main/java/com/elementary/tasks/places/create/EditPlaceFragment.kt index ed08d0b29..86ec788a6 100644 --- a/app/src/main/java/com/elementary/tasks/places/create/CreatePlaceActivity.kt +++ b/app/src/main/java/com/elementary/tasks/places/create/EditPlaceFragment.kt @@ -1,36 +1,54 @@ package com.elementary.tasks.places.create import android.os.Bundle -import androidx.activity.enableEdgeToEdge +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import com.elementary.tasks.R import com.elementary.tasks.core.data.Commands import com.elementary.tasks.core.data.ui.place.UiPlaceEdit import com.elementary.tasks.core.utils.ui.trimmedText -import com.elementary.tasks.databinding.ActivityCreatePlaceBinding +import com.elementary.tasks.databinding.FragmentEditPlaceBinding +import com.elementary.tasks.navigation.toolbarfragment.BaseToolbarFragment import com.elementary.tasks.simplemap.SimpleMapFragment import com.github.naz013.common.intent.IntentKeys import com.github.naz013.feature.common.livedata.nonNullObserve -import com.github.naz013.ui.common.Dialogues -import com.github.naz013.ui.common.activity.BindingActivity -import com.github.naz013.ui.common.activity.toast -import com.github.naz013.ui.common.view.applyTopInsets +import com.github.naz013.logging.Logger +import com.github.naz013.ui.common.fragment.toast import com.google.android.gms.maps.model.LatLng -import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf -class CreatePlaceActivity : BindingActivity() { +class EditPlaceFragment : BaseToolbarFragment() { - private val dialogues by inject() - private val viewModel by viewModel { parametersOf(getId()) } + private val viewModel by viewModel { parametersOf(idFromIntent()) } private var googleMap: SimpleMapFragment? = null - override fun inflateBinding() = ActivityCreatePlaceBinding.inflate(layoutInflater) + private fun idFromIntent(): String = arguments?.getString(IntentKeys.INTENT_ID) ?: "" + + override fun getTitle(): String { + return if (viewModel.hasId()) { + getString(R.string.edit_place) + } else { + getString(R.string.new_place) + } + } + + override fun inflate( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): FragmentEditPlaceBinding { + return FragmentEditPlaceBinding.inflate(inflater, container, false) + } override fun onCreate(savedInstanceState: Bundle?) { - enableEdgeToEdge() super.onCreate(savedInstanceState) - initActionBar() + Logger.i(TAG, "Opening the place screen for id: ${idFromIntent()}") + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) googleMap = SimpleMapFragment.newInstance( SimpleMapFragment.MapParams( isPlaces = false, @@ -63,42 +81,43 @@ class CreatePlaceActivity : BindingActivity() { } } - supportFragmentManager.beginTransaction() + childFragmentManager.beginTransaction() .replace(R.id.fragment_container, googleMap!!) - .addToBackStack(null) .commit() - loadPlace() - } - - private fun initActionBar() { - binding.appBar.applyTopInsets() - binding.toolbar.setNavigationOnClickListener { finish() } - binding.toolbar.setOnMenuItemClickListener { menuItem -> - when (menuItem.itemId) { - R.id.action_add -> { - askCopySaving() - true - } + addMenu( + menuRes = R.menu.fragment_edit_place, + onMenuItemListener = { menuItem -> + return@addMenu when (menuItem.itemId) { + R.id.action_add -> { + askCopySaving() + true + } - R.id.action_delete -> { - dialogues.askConfirmation(this, getString(R.string.delete)) { - if (it) { - viewModel.deletePlace() + R.id.action_delete -> { + dialogues.askConfirmation(requireContext(), getString(R.string.delete)) { + if (it) { + viewModel.deletePlace() + } } + true } - true - } - else -> false + else -> false + } + }, + menuModifier = { menu -> + menu.getItem(1).isVisible = viewModel.canDelete } - } - updateMenu() + ) + + initViewModel() + loadPlace() } - private fun updateMenu() { - binding.toolbar.menu.also { - it.getItem(1).isVisible = viewModel.canDelete + private fun loadPlace() { + if (arguments?.getBoolean(IntentKeys.INTENT_ITEM, false) == true) { + viewModel.loadFromIntent() } } @@ -107,27 +126,17 @@ class CreatePlaceActivity : BindingActivity() { viewModel.place.nonNullObserve(this) { showPlace(it) } viewModel.result.nonNullObserve(this) { when (it) { - Commands.SAVED, Commands.DELETED -> finish() + Commands.SAVED, Commands.DELETED -> moveBack() else -> { } } } } - private fun getId(): String = intentString(IntentKeys.INTENT_ID) - - private fun loadPlace() { - initViewModel() - if (intent.getBooleanExtra(IntentKeys.INTENT_ITEM, false)) { - viewModel.loadFromIntent() - } - } - private fun showPlace(place: UiPlaceEdit) { - binding.toolbar.title = getString(R.string.edit_place) binding.placeName.setText(place.name) showPlaceOnMap(place) - updateMenu() + invalidateOptionsMenu() } private fun savePlace(newId: Boolean = false) { @@ -148,7 +157,7 @@ class CreatePlaceActivity : BindingActivity() { private fun askCopySaving() { if (viewModel.hasLatLng()) { if (viewModel.isFromFile && viewModel.hasSameInDb) { - dialogues.getMaterialDialog(this) + dialogues.getMaterialDialog(requireContext()) .setMessage(R.string.same_place_message) .setPositiveButton(R.string.keep) { dialogInterface, _ -> dialogInterface.dismiss() @@ -184,7 +193,13 @@ class CreatePlaceActivity : BindingActivity() { } } - override fun requireLogin(): Boolean { - return true + override fun canGoBack(): Boolean { + val canCloseMap = googleMap?.onBackPressed() + Logger.i(TAG, "Map can be closed: $canCloseMap") + return canCloseMap == true + } + + companion object { + private const val TAG = "EditGroupFragment" } } diff --git a/app/src/main/java/com/elementary/tasks/places/create/PlaceViewModel.kt b/app/src/main/java/com/elementary/tasks/places/create/PlaceViewModel.kt index 99bcd984d..f97d7b456 100644 --- a/app/src/main/java/com/elementary/tasks/places/create/PlaceViewModel.kt +++ b/app/src/main/java/com/elementary/tasks/places/create/PlaceViewModel.kt @@ -54,6 +54,10 @@ class PlaceViewModel( load() } + fun hasId(): Boolean { + return id.isNotEmpty() + } + fun hasLatLng(): Boolean { return lat != 0.0 && lng != 0.0 } diff --git a/app/src/main/java/com/elementary/tasks/places/list/PlacesFragment.kt b/app/src/main/java/com/elementary/tasks/places/list/PlacesFragment.kt index b9d869312..81299eacd 100644 --- a/app/src/main/java/com/elementary/tasks/places/list/PlacesFragment.kt +++ b/app/src/main/java/com/elementary/tasks/places/list/PlacesFragment.kt @@ -11,19 +11,20 @@ import com.elementary.tasks.core.data.Commands import com.elementary.tasks.core.data.models.ShareFile import com.elementary.tasks.core.data.ui.place.UiPlaceList import com.elementary.tasks.core.interfaces.ActionsListener -import com.github.naz013.feature.common.android.SystemServiceProvider -import com.github.naz013.ui.common.fragment.toast import com.elementary.tasks.core.utils.ListActions import com.elementary.tasks.core.utils.TelephonyUtil +import com.elementary.tasks.core.utils.ui.SearchMenuHandler +import com.elementary.tasks.databinding.FragmentPlacesBinding +import com.elementary.tasks.navigation.fragments.BaseSettingsFragment +import com.github.naz013.common.intent.IntentKeys +import com.github.naz013.feature.common.android.SystemServiceProvider import com.github.naz013.feature.common.livedata.nonNullObserve import com.github.naz013.ui.common.Dialogues -import com.elementary.tasks.core.utils.ui.SearchMenuHandler +import com.github.naz013.ui.common.fragment.toast import com.github.naz013.ui.common.view.ViewUtils import com.github.naz013.ui.common.view.applyBottomInsets import com.github.naz013.ui.common.view.applyBottomInsetsMargin import com.github.naz013.ui.common.view.visibleGone -import com.elementary.tasks.databinding.FragmentPlacesBinding -import com.elementary.tasks.navigation.fragments.BaseSettingsFragment import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel @@ -71,7 +72,7 @@ class PlacesFragment : BaseSettingsFragment() { } private fun addPlace() { - safeNavigation(PlacesFragmentDirections.actionPlacesFragmentToCreatePlaceActivity("", true)) + navigate { navigate(R.id.editPlaceFragment) } } private fun initViewModel() { @@ -144,8 +145,13 @@ class PlacesFragment : BaseSettingsFragment() { } private fun openPlace(place: UiPlaceList) { - safeNavigation { - PlacesFragmentDirections.actionPlacesFragmentToCreatePlaceActivity(place.id, true) + navigate { + navigate( + R.id.editPlaceFragment, + Bundle().apply { + putString(IntentKeys.INTENT_ID, place.id) + } + ) } } diff --git a/app/src/main/java/com/elementary/tasks/simplemap/SimpleMapFragment.kt b/app/src/main/java/com/elementary/tasks/simplemap/SimpleMapFragment.kt index 4257434ed..d44145940 100644 --- a/app/src/main/java/com/elementary/tasks/simplemap/SimpleMapFragment.kt +++ b/app/src/main/java/com/elementary/tasks/simplemap/SimpleMapFragment.kt @@ -157,23 +157,6 @@ class SimpleMapFragment : BaseMapFragment() { ) } - fun addMarker( - latLng: com.github.naz013.domain.place.LatLng, - title: String? = null, - clear: Boolean = true, - animate: Boolean = true - ) { - val old = LatLng(latLng.latitude, latLng.longitude) - addMarker( - markerState = (markerState ?: createMarkerState(latLng = old)).copy( - title = title ?: geocodeAddress(old), - latLng = old - ), - clearMap = clear, - animate = animate - ) - } - fun addMarker( latLng: LatLng, title: String?, diff --git a/app/src/main/res/layout/activity_create_place.xml b/app/src/main/res/layout/fragment_edit_place.xml similarity index 83% rename from app/src/main/res/layout/activity_create_place.xml rename to app/src/main/res/layout/fragment_edit_place.xml index 8cde1c627..b7be60d10 100644 --- a/app/src/main/res/layout/activity_create_place.xml +++ b/app/src/main/res/layout/fragment_edit_place.xml @@ -10,22 +10,12 @@ android:layout_height="wrap_content" app:elevation="0dp"> - - + android:id="@+id/action_placesFragment_to_editPlaceFragment" + app:destination="@id/editPlaceFragment" /> - - - - @@ -587,4 +575,9 @@ android:name="com.elementary.tasks.groups.create.EditGroupFragment" tools:layout="@layout/fragment_edit_group" android:label="@string/create_group" /> + diff --git a/navigation-api/src/main/kotlin/com/github/naz013/navigation/DeepLinkDestination.kt b/navigation-api/src/main/kotlin/com/github/naz013/navigation/DeepLinkDestination.kt index e2b39ceec..89266f8b1 100644 --- a/navigation-api/src/main/kotlin/com/github/naz013/navigation/DeepLinkDestination.kt +++ b/navigation-api/src/main/kotlin/com/github/naz013/navigation/DeepLinkDestination.kt @@ -33,3 +33,8 @@ data object SettingsScreen : DeepLinkDestination() data class EditGroupScreen( val extras: Bundle ) : DeepLinkDestination() + +@Parcelize +data class EditPlaceScreen( + val extras: Bundle +) : DeepLinkDestination() diff --git a/ui-common/src/main/kotlin/com/github/naz013/ui/common/activity/LightThemedActivity.kt b/ui-common/src/main/kotlin/com/github/naz013/ui/common/activity/LightThemedActivity.kt index 2fa788f68..ef0bfd3f9 100644 --- a/ui-common/src/main/kotlin/com/github/naz013/ui/common/activity/LightThemedActivity.kt +++ b/ui-common/src/main/kotlin/com/github/naz013/ui/common/activity/LightThemedActivity.kt @@ -82,6 +82,7 @@ abstract class LightThemedActivity : AppCompatActivity() { } fun invokeBackPress() { + Logger.i("LightThemedActivity", "Back pressed from callback") if (!handleBackPress()) finish() } From 6d5f8ccb9e1abf421baf30f055059c36dbce8eaf Mon Sep 17 00:00:00 2001 From: Nazar Sukhovych Date: Thu, 9 Jan 2025 21:15:09 +0100 Subject: [PATCH 04/25] REM-922 - Move Google task preview to the Fragment --- app/src/main/AndroidManifest.xml | 3 - .../globalsearch/GlobalSearchViewModel.kt | 11 +- .../tasks/googletasks/GoogleTasksFragment.kt | 12 +- .../googletasks/list/TaskListFragment.kt | 12 +- .../preview/GoogleTaskPreviewViewModel.kt | 2 +- ...tivity.kt => PreviewGoogleTaskFragment.kt} | 94 +++--- .../tasks/home/BottomNavActivity.kt | 10 + .../com/elementary/tasks/home/HomeFragment.kt | 10 +- .../ActivityNavigationDispatcher.kt | 11 +- .../layout/activity_google_task_preview.xml | 297 ------------------ .../layout/fragment_google_task_preview.xml | 274 ++++++++++++++++ ...w.xml => fragment_google_task_preview.xml} | 0 app/src/main/res/navigation/home_nav.xml | 15 + .../naz013/navigation/DeepLinkDestination.kt | 5 + 14 files changed, 395 insertions(+), 361 deletions(-) rename app/src/main/java/com/elementary/tasks/googletasks/preview/{GoogleTaskPreviewActivity.kt => PreviewGoogleTaskFragment.kt} (68%) delete mode 100644 app/src/main/res/layout/activity_google_task_preview.xml create mode 100644 app/src/main/res/layout/fragment_google_task_preview.xml rename app/src/main/res/menu/{activity_google_task_preview.xml => fragment_google_task_preview.xml} (100%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd6de72c2..0444783d7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -302,9 +302,6 @@ - .isFragment(): Boolean { return this == PreviewBirthdayFragment::class.java || this == EditGroupFragment::class.java || - this == EditPlaceFragment::class.java + this == EditPlaceFragment::class.java || + this == PreviewGoogleTaskFragment::class.java } private fun Class<*>.destinationId(): Int? { @@ -117,6 +118,10 @@ class GlobalSearchViewModel( R.id.editPlaceFragment } + this == PreviewGoogleTaskFragment::class.java -> { + R.id.previewGoogleTaskFragment + } + else -> null } } @@ -182,7 +187,7 @@ class GlobalSearchViewModel( return when (this) { ObjectType.GROUP -> EditGroupFragment::class.java ObjectType.PLACE -> EditPlaceFragment::class.java - ObjectType.GOOGLE_TASK -> GoogleTaskPreviewActivity::class.java + ObjectType.GOOGLE_TASK -> PreviewGoogleTaskFragment::class.java ObjectType.NOTE -> NotePreviewActivity::class.java ObjectType.BIRTHDAY -> PreviewBirthdayFragment::class.java ObjectType.REMINDER -> ReminderPreviewActivity::class.java diff --git a/app/src/main/java/com/elementary/tasks/googletasks/GoogleTasksFragment.kt b/app/src/main/java/com/elementary/tasks/googletasks/GoogleTasksFragment.kt index 53cec63ed..d91b1a3e1 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/GoogleTasksFragment.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/GoogleTasksFragment.kt @@ -15,12 +15,10 @@ import com.elementary.tasks.core.data.ui.google.UiGoogleTaskList import com.elementary.tasks.core.interfaces.ActionsListener import com.elementary.tasks.core.utils.ListActions import com.elementary.tasks.core.utils.SuperUtil -import com.github.naz013.ui.common.view.ViewUtils import com.elementary.tasks.core.views.recyclerview.SpaceBetweenItemDecoration import com.elementary.tasks.databinding.FragmentGoogleTasksBinding import com.elementary.tasks.googletasks.list.ListsRecyclerAdapter import com.elementary.tasks.googletasks.list.TasksRecyclerAdapter -import com.elementary.tasks.googletasks.preview.GoogleTaskPreviewActivity import com.elementary.tasks.googletasks.task.GoogleTaskActivity import com.elementary.tasks.googletasks.tasklist.GoogleTaskListActivity import com.elementary.tasks.navigation.topfragment.BaseTopToolbarFragment @@ -36,6 +34,7 @@ import com.github.naz013.ui.common.fragment.startActivity import com.github.naz013.ui.common.isColorDark import com.github.naz013.ui.common.login.LoginApi import com.github.naz013.ui.common.theme.ThemeProvider +import com.github.naz013.ui.common.view.ViewUtils import com.github.naz013.ui.common.view.applyBottomInsets import com.github.naz013.ui.common.view.gone import com.github.naz013.ui.common.view.visible @@ -251,8 +250,13 @@ class GoogleTasksFragment : BaseTopToolbarFragment() } private fun openTask(taskId: String) { - LoginApi.openLogged(requireContext(), GoogleTaskPreviewActivity::class.java) { - putExtra(IntentKeys.INTENT_ID, taskId) + navigate { + navigate( + R.id.previewGoogleTaskFragment, + Bundle().apply { + putString(IntentKeys.INTENT_ID, taskId) + } + ) } } diff --git a/app/src/main/java/com/elementary/tasks/googletasks/list/TaskListFragment.kt b/app/src/main/java/com/elementary/tasks/googletasks/list/TaskListFragment.kt index f3cf53800..73cf60021 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/list/TaskListFragment.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/list/TaskListFragment.kt @@ -15,10 +15,8 @@ import com.elementary.tasks.core.data.Commands import com.elementary.tasks.core.data.ui.google.UiGoogleTaskList import com.elementary.tasks.core.interfaces.ActionsListener import com.elementary.tasks.core.utils.ListActions -import com.github.naz013.ui.common.view.ViewUtils import com.elementary.tasks.core.views.recyclerview.SpaceBetweenItemDecoration import com.elementary.tasks.databinding.FragmentGoogleListBinding -import com.elementary.tasks.googletasks.preview.GoogleTaskPreviewActivity import com.elementary.tasks.googletasks.task.GoogleTaskActivity import com.elementary.tasks.googletasks.tasklist.GoogleTaskListActivity import com.elementary.tasks.navigation.toolbarfragment.BaseToolbarFragment @@ -30,6 +28,7 @@ import com.github.naz013.ui.common.fragment.startActivity import com.github.naz013.ui.common.isColorDark import com.github.naz013.ui.common.login.LoginApi import com.github.naz013.ui.common.theme.ThemeProvider +import com.github.naz013.ui.common.view.ViewUtils import com.github.naz013.ui.common.view.applyBottomInsets import com.github.naz013.ui.common.view.applyBottomInsetsMargin import com.github.naz013.ui.common.view.visible @@ -170,7 +169,7 @@ class TaskListFragment : BaseToolbarFragment() { adapter.actionsListener = object : ActionsListener { override fun onAction(view: View, position: Int, t: UiGoogleTaskList?, actions: ListActions) { when (actions) { - ListActions.EDIT -> if (t != null) openTask(t.id) + ListActions.OPEN -> if (t != null) openTask(t.id) ListActions.SWITCH -> if (t != null) viewModel.toggleTask(t.id) else -> { } @@ -190,9 +189,10 @@ class TaskListFragment : BaseToolbarFragment() { } private fun openTask(taskId: String) { - LoginApi.openLogged(requireContext(), GoogleTaskPreviewActivity::class.java) { - putExtra(IntentKeys.INTENT_ID, taskId) - putExtra(TasksIntentKeys.INTENT_ACTION, TasksIntentKeys.EDIT) + navigate { + navigate( + TaskListFragmentDirections.actionTaskListFragmentToPreviewGoogleTaskFragment(taskId) + ) } } diff --git a/app/src/main/java/com/elementary/tasks/googletasks/preview/GoogleTaskPreviewViewModel.kt b/app/src/main/java/com/elementary/tasks/googletasks/preview/GoogleTaskPreviewViewModel.kt index 00a38bd25..e4ec3b408 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/preview/GoogleTaskPreviewViewModel.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/preview/GoogleTaskPreviewViewModel.kt @@ -2,7 +2,6 @@ package com.elementary.tasks.googletasks.preview import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.viewModelScope -import com.github.naz013.appwidgets.AppWidgetUpdater import com.elementary.tasks.core.arch.BaseProgressViewModel import com.elementary.tasks.core.data.Commands import com.elementary.tasks.core.data.adapter.google.UiGoogleTaskPreviewAdapter @@ -11,6 +10,7 @@ import com.elementary.tasks.core.utils.withUIContext import com.github.naz013.analytics.AnalyticsEventSender import com.github.naz013.analytics.Feature import com.github.naz013.analytics.FeatureUsedEvent +import com.github.naz013.appwidgets.AppWidgetUpdater import com.github.naz013.cloudapi.googletasks.GoogleTasksApi import com.github.naz013.domain.GoogleTask import com.github.naz013.feature.common.coroutine.DispatcherProvider diff --git a/app/src/main/java/com/elementary/tasks/googletasks/preview/GoogleTaskPreviewActivity.kt b/app/src/main/java/com/elementary/tasks/googletasks/preview/PreviewGoogleTaskFragment.kt similarity index 68% rename from app/src/main/java/com/elementary/tasks/googletasks/preview/GoogleTaskPreviewActivity.kt rename to app/src/main/java/com/elementary/tasks/googletasks/preview/PreviewGoogleTaskFragment.kt index fed96ae3c..378b17e74 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/preview/GoogleTaskPreviewActivity.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/preview/PreviewGoogleTaskFragment.kt @@ -2,48 +2,80 @@ package com.elementary.tasks.googletasks.preview import android.content.res.ColorStateList import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import android.widget.TextView -import androidx.activity.enableEdgeToEdge import com.elementary.tasks.AdsProvider import com.elementary.tasks.R import com.elementary.tasks.core.data.Commands import com.elementary.tasks.core.data.ui.google.UiGoogleTaskPreview import com.elementary.tasks.core.utils.BuildParams -import com.github.naz013.ui.common.Dialogues -import com.elementary.tasks.databinding.ActivityGoogleTaskPreviewBinding +import com.elementary.tasks.databinding.FragmentGoogleTaskPreviewBinding import com.elementary.tasks.googletasks.task.GoogleTaskActivity +import com.elementary.tasks.navigation.toolbarfragment.BaseToolbarFragment import com.github.naz013.common.intent.IntentKeys import com.github.naz013.feature.common.livedata.nonNullObserve -import com.github.naz013.ui.common.activity.BindingActivity +import com.github.naz013.logging.Logger import com.github.naz013.ui.common.login.LoginApi -import com.github.naz013.ui.common.view.applyBottomInsets -import com.github.naz013.ui.common.view.applyBottomInsetsMargin -import com.github.naz013.ui.common.view.applyTopInsets import com.github.naz013.ui.common.view.gone import com.github.naz013.ui.common.view.visible import com.github.naz013.ui.common.view.visibleGone import com.github.naz013.usecase.googletasks.TasksIntentKeys -import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf -class GoogleTaskPreviewActivity : BindingActivity() { +class PreviewGoogleTaskFragment : BaseToolbarFragment() { - private val dialogues by inject() private val viewModel by viewModel { parametersOf(idFromIntent()) } private val adsProvider = AdsProvider() - override fun inflateBinding() = ActivityGoogleTaskPreviewBinding.inflate(layoutInflater) + private fun idFromIntent(): String = arguments?.getString(IntentKeys.INTENT_ID) ?: "" + + override fun getTitle(): String { + return getString(R.string.details) + } + + override fun inflate( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): FragmentGoogleTaskPreviewBinding { + return FragmentGoogleTaskPreviewBinding.inflate(inflater, container, false) + } override fun onCreate(savedInstanceState: Bundle?) { - enableEdgeToEdge() super.onCreate(savedInstanceState) + Logger.i(TAG, "Opening the Google Task preview screen for id: ${idFromIntent()}") + } - binding.scrollView.applyBottomInsets() - binding.buttonComplete.applyBottomInsetsMargin() - initTopAppBar() + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) binding.buttonComplete.setOnClickListener { viewModel.onComplete() } + loadAds() + + addMenu( + menuRes = R.menu.fragment_google_task_preview, + onMenuItemListener = { menuItem -> + return@addMenu when (menuItem.itemId) { + R.id.action_edit -> { + editGoogleTask() + true + } + + R.id.action_delete -> { + dialogues.askConfirmation(requireContext(), getString(R.string.delete)) { + if (it) viewModel.onDelete() + } + true + } + + else -> false + } + } + ) + initViewModel() } @@ -56,30 +88,8 @@ class GoogleTaskPreviewActivity : BindingActivity - return@setOnMenuItemClickListener when (menuItem.itemId) { - R.id.action_edit -> { - editGoogleTask() - true - } - - R.id.action_delete -> { - dialogues.askConfirmation(this, getString(R.string.delete)) { - if (it) viewModel.onDelete() - } - true - } - - else -> false - } - } - binding.toolbar.setNavigationOnClickListener { finish() } - } - private fun editGoogleTask() { - LoginApi.openLogged(this, GoogleTaskActivity::class.java) { + LoginApi.openLogged(requireContext(), GoogleTaskActivity::class.java) { putExtra(IntentKeys.INTENT_ID, idFromIntent()) putExtra(TasksIntentKeys.INTENT_ACTION, TasksIntentKeys.EDIT) } @@ -90,14 +100,12 @@ class GoogleTaskPreviewActivity : BindingActivity finishAfterTransition() + Commands.DELETED -> moveBack() else -> { } } @@ -148,5 +156,7 @@ class GoogleTaskPreviewActivity : BindingActivity { + NavDeepLinkBuilder(this) + .setGraph(R.navigation.home_nav) + .setDestination(R.id.previewGoogleTaskFragment) + .setArguments(deepLinkDestination.extras) + .createTaskStackBuilder() + .startActivities() + } + else -> { Logger.e("BottomNavActivity", "Unknown deep link destination: $deepLinkDestination") } diff --git a/app/src/main/java/com/elementary/tasks/home/HomeFragment.kt b/app/src/main/java/com/elementary/tasks/home/HomeFragment.kt index 1dffc4d8b..e575e4aff 100644 --- a/app/src/main/java/com/elementary/tasks/home/HomeFragment.kt +++ b/app/src/main/java/com/elementary/tasks/home/HomeFragment.kt @@ -18,7 +18,6 @@ import com.elementary.tasks.globalsearch.FragmentNavigation import com.elementary.tasks.globalsearch.GlobalSearchViewModel import com.elementary.tasks.globalsearch.NavigationAction import com.elementary.tasks.globalsearch.adapter.SearchAdapter -import com.elementary.tasks.googletasks.preview.GoogleTaskPreviewActivity import com.elementary.tasks.googletasks.task.GoogleTaskActivity import com.elementary.tasks.home.scheduleview.HeaderTimeType import com.elementary.tasks.home.scheduleview.ScheduleAdapter @@ -74,8 +73,13 @@ class HomeFragment : } }, onGoogleTaskClickListener = { _, id -> - LoginApi.openLogged(requireContext(), GoogleTaskPreviewActivity::class.java) { - putExtra(IntentKeys.INTENT_ID, id) + navigate { + navigate( + R.id.previewGoogleTaskFragment, + Bundle().apply { + putString(IntentKeys.INTENT_ID, id) + } + ) } }, onBirthdayClickListener = { _, id -> diff --git a/app/src/main/java/com/elementary/tasks/navigation/ActivityNavigationDispatcher.kt b/app/src/main/java/com/elementary/tasks/navigation/ActivityNavigationDispatcher.kt index 5fd71684d..bd308f11a 100644 --- a/app/src/main/java/com/elementary/tasks/navigation/ActivityNavigationDispatcher.kt +++ b/app/src/main/java/com/elementary/tasks/navigation/ActivityNavigationDispatcher.kt @@ -2,7 +2,6 @@ package com.elementary.tasks.navigation import android.content.Context import android.os.Bundle -import com.elementary.tasks.googletasks.preview.GoogleTaskPreviewActivity import com.elementary.tasks.googletasks.task.GoogleTaskActivity import com.elementary.tasks.home.BottomNavActivity import com.elementary.tasks.notes.create.CreateNoteActivity @@ -15,6 +14,7 @@ import com.github.naz013.navigation.DeepLinkDestination import com.github.naz013.navigation.DestinationScreen import com.github.naz013.navigation.EditBirthdayScreen import com.github.naz013.navigation.ViewBirthdayScreen +import com.github.naz013.navigation.ViewGoogleTaskScreen import com.github.naz013.ui.common.context.buildIntent import com.github.naz013.ui.common.login.LoginApi @@ -63,6 +63,13 @@ class ActivityNavigationDispatcher( } } + DestinationScreen.GoogleTaskPreview -> { + val deepLinkDestination = ViewGoogleTaskScreen(bundle) + Bundle(bundle).apply { + putParcelable(DeepLinkDestination.KEY, deepLinkDestination) + } + } + else -> bundle } } @@ -75,7 +82,7 @@ class ActivityNavigationDispatcher( DestinationScreen.NoteCreate -> CreateNoteActivity::class.java DestinationScreen.BirthdayPreview -> BottomNavActivity::class.java DestinationScreen.BirthdayCreate -> BottomNavActivity::class.java - DestinationScreen.GoogleTaskPreview -> GoogleTaskPreviewActivity::class.java + DestinationScreen.GoogleTaskPreview -> BottomNavActivity::class.java DestinationScreen.GoogleTaskCreate -> GoogleTaskActivity::class.java DestinationScreen.Main -> BottomNavActivity::class.java } diff --git a/app/src/main/res/layout/activity_google_task_preview.xml b/app/src/main/res/layout/activity_google_task_preview.xml deleted file mode 100644 index 276166fcc..000000000 --- a/app/src/main/res/layout/activity_google_task_preview.xml +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_google_task_preview.xml b/app/src/main/res/layout/fragment_google_task_preview.xml new file mode 100644 index 000000000..14a1f30eb --- /dev/null +++ b/app/src/main/res/layout/fragment_google_task_preview.xml @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/activity_google_task_preview.xml b/app/src/main/res/menu/fragment_google_task_preview.xml similarity index 100% rename from app/src/main/res/menu/activity_google_task_preview.xml rename to app/src/main/res/menu/fragment_google_task_preview.xml diff --git a/app/src/main/res/navigation/home_nav.xml b/app/src/main/res/navigation/home_nav.xml index d040e7c82..756655632 100644 --- a/app/src/main/res/navigation/home_nav.xml +++ b/app/src/main/res/navigation/home_nav.xml @@ -102,6 +102,9 @@ app:exitAnim="@anim/nav_default_exit_anim" app:popEnterAnim="@anim/nav_default_pop_enter_anim" app:popExitAnim="@anim/nav_default_pop_exit_anim" /> + + + + + diff --git a/navigation-api/src/main/kotlin/com/github/naz013/navigation/DeepLinkDestination.kt b/navigation-api/src/main/kotlin/com/github/naz013/navigation/DeepLinkDestination.kt index 89266f8b1..1cb98ce4e 100644 --- a/navigation-api/src/main/kotlin/com/github/naz013/navigation/DeepLinkDestination.kt +++ b/navigation-api/src/main/kotlin/com/github/naz013/navigation/DeepLinkDestination.kt @@ -38,3 +38,8 @@ data class EditGroupScreen( data class EditPlaceScreen( val extras: Bundle ) : DeepLinkDestination() + +@Parcelize +data class ViewGoogleTaskScreen( + val extras: Bundle +) : DeepLinkDestination() From 1b6dad88c10d45319f66faab65366c682289a70c Mon Sep 17 00:00:00 2001 From: Nazar Sukhovych Date: Sun, 12 Jan 2025 12:51:18 +0100 Subject: [PATCH 05/25] REM-918 - Move Google task edit to the Fragment --- app/src/main/AndroidManifest.xml | 5 - .../elementary/tasks/birthdays/KoinModule.kt | 8 +- .../birthdays/create/EditBirthdayFragment.kt | 2 +- ...yViewModel.kt => EditBirthdayViewModel.kt} | 2 +- .../preview/PreviewBirthdayFragment.kt | 2 +- ...ewModel.kt => PreviewBirthdayViewModel.kt} | 2 +- .../com/elementary/tasks/core/utils/DI.kt | 4 +- .../tasks/googletasks/GoogleTasksFragment.kt | 15 +- .../tasks/googletasks/KoinModule.kt | 14 +- .../googletasks/list/TaskListFragment.kt | 13 +- .../preview/PreviewGoogleTaskFragment.kt | 17 +- ...Model.kt => PreviewGoogleTaskViewModel.kt} | 2 +- ...kActivity.kt => EditGoogleTaskFragment.kt} | 251 +++++++----------- ...iewModel.kt => EditGoogleTaskViewModel.kt} | 248 +++++++++++------ .../tasks/groups/create/EditGroupFragment.kt | 2 +- ...roupViewModel.kt => EditGroupViewModel.kt} | 2 +- .../tasks/home/BottomNavActivity.kt | 98 ++----- .../com/elementary/tasks/home/HomeFragment.kt | 14 +- .../tasks/home/ScreenDestinationIdResolver.kt | 30 +++ .../ActivityNavigationDispatcher.kt | 11 +- .../preview/ReminderPreviewActivity.kt | 16 +- .../tasks/splash/ShortcutDestination.kt | 34 +++ .../tasks/splash/SplashScreenActivity.kt | 9 +- app/src/main/res/layout/a_components.xml | 2 +- .../layout/activity_create_google_task.xml | 223 ---------------- .../res/layout/fragment_google_task_edit.xml | 200 ++++++++++++++ ...task.xml => fragment_google_task_edit.xml} | 0 app/src/main/res/navigation/home_nav.xml | 11 + ...elTest.kt => EditBirthdayViewModelTest.kt} | 6 +- .../appwidgets/AppWidgetActionActivity.kt | 13 +- .../appwidgets/googletasks/TasksFactory.kt | 4 +- .../appwidgets/googletasks/TasksWidget.kt | 9 +- gradle/libs.versions.toml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../naz013/navigation/DeepLinkDestination.kt | 25 +- .../github/naz013/common/intent/IntentKeys.kt | 1 + .../ui/common/fragment/FragmentExtensions.kt | 29 ++ .../googletasks/GetGoogleTaskByIdUseCase.kt | 13 + .../naz013/usecase/googletasks/KoinModule.kt | 2 + .../usecase/googletasks/TasksIntentKeys.kt | 9 - 40 files changed, 712 insertions(+), 640 deletions(-) rename app/src/main/java/com/elementary/tasks/birthdays/create/{AddBirthdayViewModel.kt => EditBirthdayViewModel.kt} (99%) rename app/src/main/java/com/elementary/tasks/birthdays/preview/{BirthdayPreviewViewModel.kt => PreviewBirthdayViewModel.kt} (98%) rename app/src/main/java/com/elementary/tasks/googletasks/preview/{GoogleTaskPreviewViewModel.kt => PreviewGoogleTaskViewModel.kt} (99%) rename app/src/main/java/com/elementary/tasks/googletasks/task/{GoogleTaskActivity.kt => EditGoogleTaskFragment.kt} (50%) rename app/src/main/java/com/elementary/tasks/googletasks/task/{GoogleTaskViewModel.kt => EditGoogleTaskViewModel.kt} (69%) rename app/src/main/java/com/elementary/tasks/groups/create/{CreateGroupViewModel.kt => EditGroupViewModel.kt} (99%) create mode 100644 app/src/main/java/com/elementary/tasks/home/ScreenDestinationIdResolver.kt create mode 100644 app/src/main/java/com/elementary/tasks/splash/ShortcutDestination.kt delete mode 100644 app/src/main/res/layout/activity_create_google_task.xml create mode 100644 app/src/main/res/layout/fragment_google_task_edit.xml rename app/src/main/res/menu/{activity_create_task.xml => fragment_google_task_edit.xml} (100%) rename app/src/test/java/com/elementary/tasks/birthdays/create/{AddBirthdayViewModelTest.kt => EditBirthdayViewModelTest.kt} (98%) create mode 100644 usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/GetGoogleTaskByIdUseCase.kt delete mode 100644 usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/TasksIntentKeys.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0444783d7..d2209031b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -285,11 +285,6 @@ android:configChanges="keyboardHidden" android:exported="false" android:windowSoftInputMode="stateUnchanged" /> - - AddBirthdayViewModel( + EditBirthdayViewModel( id, get(), get(), @@ -48,7 +48,7 @@ val birthdaysModule = module { } viewModel { BirthdaysViewModel(get(), get(), get(), get(), get(), get()) } viewModel { BirthdaySettingsViewModel(get(), get(), get(), get(), get(), get()) } - viewModel { BirthdayPreviewViewModel(get(), get(), get(), get(), get(), get(), get(), get()) } + viewModel { PreviewBirthdayViewModel(get(), get(), get(), get(), get(), get(), get(), get()) } worker { BirthdayDeleteBackupWorker(get(), get(), get(), get()) } worker { CheckBirthdaysWorker(get(), get(), get(), get(), get(), get()) } diff --git a/app/src/main/java/com/elementary/tasks/birthdays/create/EditBirthdayFragment.kt b/app/src/main/java/com/elementary/tasks/birthdays/create/EditBirthdayFragment.kt index a3c5f3258..494f248a9 100644 --- a/app/src/main/java/com/elementary/tasks/birthdays/create/EditBirthdayFragment.kt +++ b/app/src/main/java/com/elementary/tasks/birthdays/create/EditBirthdayFragment.kt @@ -27,7 +27,7 @@ import org.threeten.bp.LocalDate class EditBirthdayFragment : BaseToolbarFragment() { - private val viewModel by viewModel { parametersOf(idFromIntent()) } + private val viewModel by viewModel { parametersOf(idFromIntent()) } private val dateTimePickerProvider by inject() private fun idFromIntent(): String = arguments?.getString(IntentKeys.INTENT_ID) ?: "" diff --git a/app/src/main/java/com/elementary/tasks/birthdays/create/AddBirthdayViewModel.kt b/app/src/main/java/com/elementary/tasks/birthdays/create/EditBirthdayViewModel.kt similarity index 99% rename from app/src/main/java/com/elementary/tasks/birthdays/create/AddBirthdayViewModel.kt rename to app/src/main/java/com/elementary/tasks/birthdays/create/EditBirthdayViewModel.kt index b701bde95..52c0ba88c 100644 --- a/app/src/main/java/com/elementary/tasks/birthdays/create/AddBirthdayViewModel.kt +++ b/app/src/main/java/com/elementary/tasks/birthdays/create/EditBirthdayViewModel.kt @@ -32,7 +32,7 @@ import kotlinx.coroutines.launch import org.threeten.bp.LocalDate import java.util.UUID -class AddBirthdayViewModel( +class EditBirthdayViewModel( private val id: String, private val birthdayRepository: BirthdayRepository, dispatcherProvider: DispatcherProvider, diff --git a/app/src/main/java/com/elementary/tasks/birthdays/preview/PreviewBirthdayFragment.kt b/app/src/main/java/com/elementary/tasks/birthdays/preview/PreviewBirthdayFragment.kt index 92005cc93..82097930b 100644 --- a/app/src/main/java/com/elementary/tasks/birthdays/preview/PreviewBirthdayFragment.kt +++ b/app/src/main/java/com/elementary/tasks/birthdays/preview/PreviewBirthdayFragment.kt @@ -25,7 +25,7 @@ import org.koin.core.parameter.parametersOf class PreviewBirthdayFragment : BaseToolbarFragment() { - private val viewModel by viewModel { parametersOf(idFromIntent()) } + private val viewModel by viewModel { parametersOf(idFromIntent()) } private val adsProvider = AdsProvider() private fun idFromIntent(): String = arguments?.getString(IntentKeys.INTENT_ID) ?: "" diff --git a/app/src/main/java/com/elementary/tasks/birthdays/preview/BirthdayPreviewViewModel.kt b/app/src/main/java/com/elementary/tasks/birthdays/preview/PreviewBirthdayViewModel.kt similarity index 98% rename from app/src/main/java/com/elementary/tasks/birthdays/preview/BirthdayPreviewViewModel.kt rename to app/src/main/java/com/elementary/tasks/birthdays/preview/PreviewBirthdayViewModel.kt index c848448e0..98e759352 100644 --- a/app/src/main/java/com/elementary/tasks/birthdays/preview/BirthdayPreviewViewModel.kt +++ b/app/src/main/java/com/elementary/tasks/birthdays/preview/PreviewBirthdayViewModel.kt @@ -20,7 +20,7 @@ import com.github.naz013.feature.common.viewmodel.mutableLiveDataOf import com.github.naz013.repository.BirthdayRepository import kotlinx.coroutines.launch -class BirthdayPreviewViewModel( +class PreviewBirthdayViewModel( private val id: String, private val birthdayRepository: BirthdayRepository, dispatcherProvider: DispatcherProvider, diff --git a/app/src/main/java/com/elementary/tasks/core/utils/DI.kt b/app/src/main/java/com/elementary/tasks/core/utils/DI.kt index 20c2e77f0..b5924a148 100644 --- a/app/src/main/java/com/elementary/tasks/core/utils/DI.kt +++ b/app/src/main/java/com/elementary/tasks/core/utils/DI.kt @@ -51,7 +51,7 @@ import com.elementary.tasks.core.utils.work.WorkerLauncher import com.elementary.tasks.googletasks.work.SaveNewTaskWorker import com.elementary.tasks.googletasks.work.UpdateTaskWorker import com.elementary.tasks.groups.GroupsUtil -import com.elementary.tasks.groups.create.CreateGroupViewModel +import com.elementary.tasks.groups.create.EditGroupViewModel import com.elementary.tasks.groups.list.GroupsViewModel import com.elementary.tasks.groups.work.GroupDeleteBackupWorker import com.elementary.tasks.groups.work.GroupSingleBackupWorker @@ -98,7 +98,7 @@ val viewModelModule = module { viewModel { (id: String) -> PlaceViewModel(id, get(), get(), get(), get(), get(), get(), get()) } viewModel { (id: String) -> - CreateGroupViewModel( + EditGroupViewModel( id, get(), get(), diff --git a/app/src/main/java/com/elementary/tasks/googletasks/GoogleTasksFragment.kt b/app/src/main/java/com/elementary/tasks/googletasks/GoogleTasksFragment.kt index d91b1a3e1..cccdfb0eb 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/GoogleTasksFragment.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/GoogleTasksFragment.kt @@ -19,7 +19,6 @@ import com.elementary.tasks.core.views.recyclerview.SpaceBetweenItemDecoration import com.elementary.tasks.databinding.FragmentGoogleTasksBinding import com.elementary.tasks.googletasks.list.ListsRecyclerAdapter import com.elementary.tasks.googletasks.list.TasksRecyclerAdapter -import com.elementary.tasks.googletasks.task.GoogleTaskActivity import com.elementary.tasks.googletasks.tasklist.GoogleTaskListActivity import com.elementary.tasks.navigation.topfragment.BaseTopToolbarFragment import com.github.naz013.analytics.Screen @@ -32,14 +31,12 @@ import com.github.naz013.logging.Logger import com.github.naz013.ui.common.fragment.dp2px import com.github.naz013.ui.common.fragment.startActivity import com.github.naz013.ui.common.isColorDark -import com.github.naz013.ui.common.login.LoginApi import com.github.naz013.ui.common.theme.ThemeProvider import com.github.naz013.ui.common.view.ViewUtils import com.github.naz013.ui.common.view.applyBottomInsets import com.github.naz013.ui.common.view.gone import com.github.naz013.ui.common.view.visible import com.github.naz013.ui.common.view.visibleGone -import com.github.naz013.usecase.googletasks.TasksIntentKeys import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf @@ -154,11 +151,13 @@ class GoogleTasksFragment : BaseTopToolbarFragment() private fun addNewTask() { val defId = viewModel.defTaskList.value?.listId ?: return - withContext { - LoginApi.openLogged(it, GoogleTaskActivity::class.java) { - putExtra(IntentKeys.INTENT_ID, defId) - putExtra(TasksIntentKeys.INTENT_ACTION, TasksIntentKeys.CREATE) - } + navigate { + navigate( + R.id.editGoogleTaskFragment, + Bundle().apply { + putString(IntentKeys.INTENT_ID, defId) + } + ) } } diff --git a/app/src/main/java/com/elementary/tasks/googletasks/KoinModule.kt b/app/src/main/java/com/elementary/tasks/googletasks/KoinModule.kt index 1823111fd..e605d01b1 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/KoinModule.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/KoinModule.kt @@ -1,8 +1,9 @@ package com.elementary.tasks.googletasks +import android.os.Bundle import com.elementary.tasks.googletasks.list.TaskListViewModel -import com.elementary.tasks.googletasks.preview.GoogleTaskPreviewViewModel -import com.elementary.tasks.googletasks.task.GoogleTaskViewModel +import com.elementary.tasks.googletasks.preview.PreviewGoogleTaskViewModel +import com.elementary.tasks.googletasks.task.EditGoogleTaskViewModel import com.elementary.tasks.googletasks.tasklist.GoogleTaskListViewModel import com.elementary.tasks.googletasks.usecase.GoogleTaskListFactory import com.elementary.tasks.googletasks.usecase.db.DeleteGoogleTaskList @@ -32,10 +33,9 @@ val googleTaskModule = module { get() ) } - viewModel { (id: String) -> - GoogleTaskViewModel( - id, - get(), + viewModel { (arguments: Bundle?) -> + EditGoogleTaskViewModel( + arguments, get(), get(), get(), @@ -50,7 +50,7 @@ val googleTaskModule = module { ) } viewModel { (id: String) -> - GoogleTaskPreviewViewModel( + PreviewGoogleTaskViewModel( id, get(), get(), diff --git a/app/src/main/java/com/elementary/tasks/googletasks/list/TaskListFragment.kt b/app/src/main/java/com/elementary/tasks/googletasks/list/TaskListFragment.kt index 73cf60021..b594ae203 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/list/TaskListFragment.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/list/TaskListFragment.kt @@ -17,7 +17,6 @@ import com.elementary.tasks.core.interfaces.ActionsListener import com.elementary.tasks.core.utils.ListActions import com.elementary.tasks.core.views.recyclerview.SpaceBetweenItemDecoration import com.elementary.tasks.databinding.FragmentGoogleListBinding -import com.elementary.tasks.googletasks.task.GoogleTaskActivity import com.elementary.tasks.googletasks.tasklist.GoogleTaskListActivity import com.elementary.tasks.navigation.toolbarfragment.BaseToolbarFragment import com.github.naz013.common.intent.IntentKeys @@ -26,14 +25,12 @@ import com.github.naz013.feature.common.livedata.nonNullObserve import com.github.naz013.ui.common.fragment.dp2px import com.github.naz013.ui.common.fragment.startActivity import com.github.naz013.ui.common.isColorDark -import com.github.naz013.ui.common.login.LoginApi import com.github.naz013.ui.common.theme.ThemeProvider import com.github.naz013.ui.common.view.ViewUtils import com.github.naz013.ui.common.view.applyBottomInsets import com.github.naz013.ui.common.view.applyBottomInsetsMargin import com.github.naz013.ui.common.view.visible import com.github.naz013.ui.common.view.visibleGone -import com.github.naz013.usecase.googletasks.TasksIntentKeys import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf @@ -114,9 +111,13 @@ class TaskListFragment : BaseToolbarFragment() { private fun addNewTask() { viewModel.currentTaskList?.also { - LoginApi.openLogged(requireContext(), GoogleTaskActivity::class.java) { - putExtra(IntentKeys.INTENT_ID, it.listId) - putExtra(TasksIntentKeys.INTENT_ACTION, TasksIntentKeys.CREATE) + navigate { + navigate( + R.id.editGoogleTaskFragment, + Bundle().apply { + putString(IntentKeys.INTENT_LIST_ID, it.listId) + } + ) } } } diff --git a/app/src/main/java/com/elementary/tasks/googletasks/preview/PreviewGoogleTaskFragment.kt b/app/src/main/java/com/elementary/tasks/googletasks/preview/PreviewGoogleTaskFragment.kt index 378b17e74..998ba634f 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/preview/PreviewGoogleTaskFragment.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/preview/PreviewGoogleTaskFragment.kt @@ -12,22 +12,19 @@ import com.elementary.tasks.core.data.Commands import com.elementary.tasks.core.data.ui.google.UiGoogleTaskPreview import com.elementary.tasks.core.utils.BuildParams import com.elementary.tasks.databinding.FragmentGoogleTaskPreviewBinding -import com.elementary.tasks.googletasks.task.GoogleTaskActivity import com.elementary.tasks.navigation.toolbarfragment.BaseToolbarFragment import com.github.naz013.common.intent.IntentKeys import com.github.naz013.feature.common.livedata.nonNullObserve import com.github.naz013.logging.Logger -import com.github.naz013.ui.common.login.LoginApi import com.github.naz013.ui.common.view.gone import com.github.naz013.ui.common.view.visible import com.github.naz013.ui.common.view.visibleGone -import com.github.naz013.usecase.googletasks.TasksIntentKeys import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf class PreviewGoogleTaskFragment : BaseToolbarFragment() { - private val viewModel by viewModel { parametersOf(idFromIntent()) } + private val viewModel by viewModel { parametersOf(idFromIntent()) } private val adsProvider = AdsProvider() private fun idFromIntent(): String = arguments?.getString(IntentKeys.INTENT_ID) ?: "" @@ -89,9 +86,13 @@ class PreviewGoogleTaskFragment : BaseToolbarFragment() { +class EditGoogleTaskFragment : BaseToolbarFragment() { - private val dialogues by inject() private val dateTimePickerProvider by inject() private val appWidgetUpdater by inject() - private val viewModel by viewModel { parametersOf(getId()) } + private val viewModel by viewModel { parametersOf(arguments) } + + override fun getTitle(): String { + return if (viewModel.hasId()) { + getString(R.string.edit_task) + } else { + getString(R.string.new_task) + } + } - override fun inflateBinding() = ActivityCreateGoogleTaskBinding.inflate(layoutInflater) + override fun inflate( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): FragmentGoogleTaskEditBinding { + return FragmentGoogleTaskEditBinding.inflate(inflater, container, false) + } override fun onCreate(savedInstanceState: Bundle?) { - enableEdgeToEdge() super.onCreate(savedInstanceState) - if (!viewModel.isLogged) { - finish() - return - } - - binding.scrollView.applyBottomInsets() + Logger.i(TAG, "Opening the Google Task edit screen for id: ${viewModel.id}") + } - initToolbar() + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) initFields() binding.progressMessageView.text = getString(R.string.please_wait) - if (savedInstanceState == null) { - viewModel.action = intentString(TasksIntentKeys.INTENT_ACTION).also { - if (it.isEmpty()) viewModel.action = TasksIntentKeys.CREATE - } - viewModel.initDefaults() - } - - if (viewModel.action == TasksIntentKeys.CREATE) { - val tmp = if (savedInstanceState != null) { - savedInstanceState.getString(ARG_LIST, "") - } else { - getId() + addMenu( + menuRes = R.menu.fragment_google_task_edit, + onMenuItemListener = { menuItem -> + return@addMenu when (menuItem.itemId) { + R.id.action_delete -> { + deleteDialog() + true + } + R.id.action_move -> { + doIfPossible { selectList(true) } + true + } + R.id.action_add -> { + doIfPossible { saveTask() } + true + } + else -> false + } + }, + menuModifier = { menu -> + menu.getItem(1).isVisible = viewModel.editedTask != null + menu.getItem(2).isVisible = viewModel.editedTask != null } - initViewModel(tmp) - checkDeepLink() - } else { - initViewModel("") - } - } + ) - private fun checkDeepLink() { - if (intent.getBooleanExtra(IntentKeys.INTENT_DEEP_LINK, false)) { - runCatching { - val parser = DeepLinkDataParser() - viewModel.initFromDeepLink(parser.readDeepLinkData(intent)) - } - } + initViewModel() + viewModel.onCreated(arguments, savedInstanceState) } - private fun getId() = intentString(IntentKeys.INTENT_ID) - - override fun onSaveInstanceState(outState: Bundle) { - outState.putString(ARG_LIST, viewModel.listId) - super.onSaveInstanceState(outState) + override fun onDestroyView() { + super.onDestroyView() + hideKeyboard() + appWidgetUpdater.updateScheduleWidget() } - private fun initViewModel(listId: String) { - viewModel.listId = listId - viewModel.isInProgress.nonNullObserve(this) { binding.progressView.visibleGone(it) } - viewModel.result.nonNullObserve(this) { commands -> + private fun initViewModel() { + viewModel.isInProgress.nonNullObserve(viewLifecycleOwner) { + binding.progressView.visibleGone(it) + } + viewModel.result.nonNullObserve(viewLifecycleOwner) { commands -> when (commands) { - Commands.SAVED, Commands.DELETED -> handleBackPress() + Commands.SAVED, Commands.DELETED -> moveBack() else -> { } } } - viewModel.googleTask.nullObserve(this) { editTask(it) } - viewModel.googleTaskLists.nonNullObserve(this) { selectCurrent(it) } - viewModel.defaultTaskList.observe(this) { googleTaskList -> - if (googleTaskList != null && listId == "") { - showTaskList(googleTaskList) - } - } - - viewModel.timeState.nonNullObserve(this) { showTimeState(it) } - viewModel.dateState.nonNullObserve(this) { showDateState(it) } - viewModel.taskList.nonNullObserve(this) { showTaskList(it) } + viewModel.task.nullObserve(viewLifecycleOwner) { showTask(it) } + viewModel.timeState.nonNullObserve(viewLifecycleOwner) { showTimeState(it) } + viewModel.dateState.nonNullObserve(viewLifecycleOwner) { showDateState(it) } + viewModel.taskList.nonNullObserve(viewLifecycleOwner) { showTaskList(it) } + viewModel.toast.nonNullObserve(viewLifecycleOwner) { toast(it) } lifecycle.addObserver(viewModel) } private fun showTaskList(googleTaskList: GoogleTaskList) { - viewModel.listId = googleTaskList.listId binding.listText.text = googleTaskList.title } - private fun selectCurrent(googleTaskLists: List) { - for (googleTaskList in googleTaskLists) { - if (googleTaskList.listId == viewModel.listId) { - showTaskList(googleTaskList) - break - } - } - } - - private fun editTask(googleTask: GoogleTask) { - viewModel.onEditTask(googleTask) - binding.toolbar.setTitle(R.string.edit_task) + private fun showTask(googleTask: GoogleTask) { if (binding.editField.trimmedText().isEmpty()) { binding.editField.setText(googleTask.title) } @@ -140,7 +128,7 @@ class GoogleTaskActivity : BindingActivity() { binding.detailsField.setSelection(binding.detailsField.trimmedText().length) } } - updateMenu() + invalidateOptionsMenu() } private fun initFields() { @@ -149,46 +137,15 @@ class GoogleTaskActivity : BindingActivity() { binding.timeField.setOnClickListener { selectDateAction(2) } } - private fun initToolbar() { - binding.appBar.applyTopInsets() - binding.toolbar.setTitle(R.string.new_task) - binding.toolbar.setNavigationOnClickListener { handleBackPress() } - binding.toolbar.setOnMenuItemClickListener { - when (it.itemId) { - R.id.action_delete -> { - deleteDialog() - true - } - R.id.action_move -> { - doIfPossible { selectList(true) } - true - } - R.id.action_add -> { - doIfPossible { saveTask() } - true - } - else -> false - } - } - updateMenu() - } - - private fun updateMenu() { - binding.toolbar.menu.also { - it.getItem(1).isVisible = viewModel.editedTask != null - it.getItem(2).isVisible = viewModel.editedTask != null - } - } - private fun selectDateAction(type: Int) { - val builder = dialogues.getMaterialDialog(this) + val builder = dialogues.getMaterialDialog(requireContext()) val types = if (type == 2) { arrayOf(getString(R.string.no_time), getString(R.string.select_time)) } else { arrayOf(getString(R.string.no_date), getString(R.string.select_date)) } val adapter = ArrayAdapter( - this, + requireContext(), android.R.layout.simple_list_item_single_choice, types ) @@ -225,47 +182,35 @@ class GoogleTaskActivity : BindingActivity() { builder.create().show() } - private fun showDateState(dateState: GoogleTaskViewModel.DateState) { - Logger.d("showDateState: $dateState") + private fun showDateState(dateState: EditGoogleTaskViewModel.DateState) { + Logger.d(TAG, "Show date state: $dateState") when (dateState) { - is GoogleTaskViewModel.DateState.SelectedDate -> { + is EditGoogleTaskViewModel.DateState.SelectedDate -> { binding.dateField.text = dateState.formattedDate } - is GoogleTaskViewModel.DateState.NoDate -> { + is EditGoogleTaskViewModel.DateState.NoDate -> { binding.dateField.text = getString(R.string.no_date) } } - binding.timeContainer.visibleGone(dateState is GoogleTaskViewModel.DateState.SelectedDate) + binding.timeContainer.visibleGone(dateState is EditGoogleTaskViewModel.DateState.SelectedDate) } - private fun showTimeState(timeState: GoogleTaskViewModel.TimeState) { - Logger.d("showTimeState: $timeState") + private fun showTimeState(timeState: EditGoogleTaskViewModel.TimeState) { + Logger.d(TAG, "Show time state: $timeState") when (timeState) { - is GoogleTaskViewModel.TimeState.SelectedTime -> { + is EditGoogleTaskViewModel.TimeState.SelectedTime -> { binding.timeField.text = timeState.formattedTime } - is GoogleTaskViewModel.TimeState.NoTime -> { + is EditGoogleTaskViewModel.TimeState.NoTime -> { binding.timeField.text = getString(R.string.no_time) } } } - private fun moveTask(listId: String) { - viewModel.editedTask?.also { - val initListId = it.listId - if (!listId.matches(initListId.toRegex())) { - it.listId = listId - viewModel.moveGoogleTask(it, initListId) - } else { - toast(R.string.this_is_same_list) - } - } - } - private fun selectList(move: Boolean) { - val list = viewModel.googleTaskLists.value.orEmpty() + val list = viewModel.googleTaskLists if (list.isEmpty()) return val names = mutableListOf() var position = 0 @@ -275,14 +220,14 @@ class GoogleTaskActivity : BindingActivity() { position = index } } - dialogues.getMaterialDialog(this) + dialogues.getMaterialDialog(requireContext()) .setTitle(R.string.choose_list) .setSingleChoiceItems(names.toTypedArray(), position) { dialog, which -> dialog.dismiss() if (move) { - moveTask(list[which].listId) + viewModel.moveTask(list[which].listId) } else { - showTaskList(list[which]) + viewModel.onListSelected(list[which].listId) } } .create().show() @@ -300,7 +245,7 @@ class GoogleTaskActivity : BindingActivity() { private fun deleteDialog() { doIfPossible { - dialogues.getMaterialDialog(this) + dialogues.getMaterialDialog(requireContext()) .setMessage(getString(R.string.delete_this_task)) .setPositiveButton(getString(R.string.yes)) { dialog, _ -> dialog.dismiss() @@ -317,7 +262,7 @@ class GoogleTaskActivity : BindingActivity() { private fun dateDialog() { dateTimePickerProvider.showDatePicker( - fragmentManager = supportFragmentManager, + fragmentManager = childFragmentManager, date = viewModel.date, title = getString(R.string.select_date) ) { viewModel.onDateSet(it) } @@ -325,26 +270,12 @@ class GoogleTaskActivity : BindingActivity() { private fun timeDialog() { dateTimePickerProvider.showTimePicker( - fragmentManager = supportFragmentManager, + fragmentManager = childFragmentManager, time = viewModel.time, title = getString(R.string.select_time) ) { viewModel.onTimeSet(it) } } - override fun onDestroy() { - super.onDestroy() - runCatching { - lifecycle.removeObserver(viewModel) - } - hideKeyboard() - appWidgetUpdater.updateScheduleWidget() - } - - override fun handleBackPress(): Boolean { - doIfPossible { finish() } - return true - } - private fun doIfPossible(f: () -> Unit) { if (viewModel.isInProgress.value == true) { toast(R.string.please_wait) @@ -353,9 +284,7 @@ class GoogleTaskActivity : BindingActivity() { } } - override fun requireLogin() = true - companion object { - private const val ARG_LIST = "arg_list" + private const val TAG = "EditGoogleTaskFragment" } } diff --git a/app/src/main/java/com/elementary/tasks/googletasks/task/GoogleTaskViewModel.kt b/app/src/main/java/com/elementary/tasks/googletasks/task/EditGoogleTaskViewModel.kt similarity index 69% rename from app/src/main/java/com/elementary/tasks/googletasks/task/GoogleTaskViewModel.kt rename to app/src/main/java/com/elementary/tasks/googletasks/task/EditGoogleTaskViewModel.kt index 1e3cfdaed..110a6e333 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/task/GoogleTaskViewModel.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/task/EditGoogleTaskViewModel.kt @@ -1,20 +1,24 @@ package com.elementary.tasks.googletasks.task +import android.os.Bundle +import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.viewModelScope +import com.elementary.tasks.R import com.elementary.tasks.core.arch.BaseProgressViewModel import com.elementary.tasks.core.controller.EventControlFactory import com.elementary.tasks.core.data.Commands -import com.elementary.tasks.core.data.observeTable +import com.elementary.tasks.core.deeplink.DeepLinkDataParser import com.elementary.tasks.core.deeplink.GoogleTaskDateTimeDeepLinkData import com.elementary.tasks.core.utils.Configs -import com.github.naz013.common.datetime.DateTimeManager +import com.elementary.tasks.core.utils.withUIContext import com.elementary.tasks.core.utils.work.WorkerLauncher import com.elementary.tasks.reminder.work.ReminderSingleBackupWorker import com.github.naz013.analytics.AnalyticsEventSender import com.github.naz013.analytics.Feature import com.github.naz013.analytics.FeatureUsedEvent +import com.github.naz013.appwidgets.AppWidgetUpdater import com.github.naz013.cloudapi.googletasks.GoogleTasksApi -import com.github.naz013.cloudapi.googletasks.GoogleTasksAuthManager +import com.github.naz013.common.datetime.DateTimeManager import com.github.naz013.common.intent.IntentKeys import com.github.naz013.domain.GoogleTask import com.github.naz013.domain.GoogleTaskList @@ -23,33 +27,31 @@ import com.github.naz013.feature.common.coroutine.DispatcherProvider import com.github.naz013.feature.common.livedata.toLiveData import com.github.naz013.feature.common.viewmodel.mutableLiveDataOf import com.github.naz013.logging.Logger -import com.github.naz013.repository.GoogleTaskListRepository +import com.github.naz013.navigation.DeepLinkData import com.github.naz013.repository.GoogleTaskRepository import com.github.naz013.repository.ReminderGroupRepository import com.github.naz013.repository.ReminderRepository -import com.github.naz013.repository.observer.TableChangeListenerFactory -import com.github.naz013.repository.table.Table -import com.github.naz013.navigation.DeepLinkData -import com.github.naz013.usecase.googletasks.TasksIntentKeys +import com.github.naz013.usecase.googletasks.GetAllGoogleTaskListsUseCase +import com.github.naz013.usecase.googletasks.GetGoogleTaskByIdUseCase import kotlinx.coroutines.launch import org.threeten.bp.LocalDate import org.threeten.bp.LocalDateTime import org.threeten.bp.LocalTime -class GoogleTaskViewModel( - id: String, +class EditGoogleTaskViewModel( + private val arguments: Bundle?, private val googleTasksApi: GoogleTasksApi, private val eventControlFactory: EventControlFactory, dispatcherProvider: DispatcherProvider, private val workerLauncher: WorkerLauncher, private val googleTaskRepository: GoogleTaskRepository, - private val googleTaskListRepository: GoogleTaskListRepository, private val reminderRepository: ReminderRepository, private val reminderGroupRepository: ReminderGroupRepository, private val dateTimeManager: DateTimeManager, private val analyticsEventSender: AnalyticsEventSender, - tableChangeListenerFactory: TableChangeListenerFactory, - googleTasksAuthManager: GoogleTasksAuthManager + private val getAllGoogleTaskListsUseCase: GetAllGoogleTaskListsUseCase, + private val getGoogleTaskByIdUseCase: GetGoogleTaskByIdUseCase, + private val appWidgetUpdater: AppWidgetUpdater ) : BaseProgressViewModel(dispatcherProvider) { private val _dateState = mutableLiveDataOf() @@ -61,35 +63,77 @@ class GoogleTaskViewModel( private val _taskList = mutableLiveDataOf() val taskList = _taskList.toLiveData() + private val _task = mutableLiveDataOf() + val task = _task.toLiveData() + + private val _toast = mutableLiveDataOf() + val toast = _toast.toLiveData() + + var id = "" + private set private var isEdited = false private var isReminderEdited = false var listId: String = "" - var action: String = "" + private set + var date: LocalDate = LocalDate.now() private set var time: LocalTime = LocalTime.now() private set var editedTask: GoogleTask? = null + private set private var editedReminder: Reminder? = null - val googleTask = viewModelScope.observeTable( - table = Table.GoogleTask, - tableChangeListenerFactory = tableChangeListenerFactory, - queryProducer = { googleTaskRepository.getById(id) } - ) - val defaultTaskList = viewModelScope.observeTable( - table = Table.GoogleTaskList, - tableChangeListenerFactory = tableChangeListenerFactory, - queryProducer = { googleTaskListRepository.defaultGoogleTaskList() } - ) - val googleTaskLists = viewModelScope.observeTable( - table = Table.GoogleTaskList, - tableChangeListenerFactory = tableChangeListenerFactory, - queryProducer = { googleTaskListRepository.getAll() } - ) - - val isLogged = googleTasksAuthManager.isAuthorized() + var googleTaskLists: List = emptyList() + private set + + init { + id = arguments?.getString(IntentKeys.INTENT_ID) ?: "" + viewModelScope.launch(dispatcherProvider.default()) { + googleTaskLists = getAllGoogleTaskListsUseCase() + editedTask = getGoogleTaskByIdUseCase(id) + + val bundleListId = arguments?.getString(IntentKeys.INTENT_LIST_ID) + val googleTaskList = if (bundleListId.isNullOrEmpty()) { + // Load default list + googleTaskLists.firstOrNull { it.isDefault() } + } else { + // Load list by id + googleTaskLists.firstOrNull { it.listId == bundleListId } + ?: googleTaskLists.firstOrNull { it.isDefault() } + } + + listId = googleTaskList?.listId ?: "" + googleTaskList?.also { + _taskList.postValue(it) + } + Logger.i(TAG, "Opening Google Task id=$id, listId=$listId") + + editedTask?.also { + withUIContext { onEditTask(it) } + } + } + } + + override fun onDestroy(owner: LifecycleOwner) { + super.onDestroy(owner) + appWidgetUpdater.updateAllWidgets() + } + + fun onCreated( + arguments: Bundle?, + savedInstanceState: Bundle? + ) { + if (savedInstanceState == null) { + initDefaults() + checkDeepLink(arguments) + } + } + + fun hasId(): Boolean { + return id.isNotEmpty() + } fun onDateSet(localDate: LocalDate) { date = localDate @@ -104,10 +148,10 @@ class GoogleTaskViewModel( fun save(summary: String, note: String) { val reminder = createReminder(summary).takeIf { isTimeSelected() } val item = editedTask - if (action == TasksIntentKeys.EDIT && item != null) { + if (item != null) { val initListId = item.listId val newItem = update(item, summary, note, reminder) - if (listId.isNotEmpty()) { + if (listId.isNotEmpty() && listId != initListId) { updateAndMoveGoogleTask(newItem, initListId, reminder) } else { updateGoogleTask(newItem, reminder) @@ -118,10 +162,80 @@ class GoogleTaskViewModel( } } - fun onEditTask(googleTask: GoogleTask) { + fun onDateStateChanged(enabled: Boolean) { + if (enabled) { + onDateSet(date) + } else { + _dateState.postValue(DateState.NoDate) + onTimeStateChanged(false) + } + } + + fun onTimeStateChanged(enabled: Boolean) { + if (enabled) { + onTimeSet(time) + } else { + _timeState.postValue(TimeState.NoTime) + } + } + + fun moveTask(listId: String) { + editedTask?.also { + val initListId = it.listId + if (!listId.matches(initListId.toRegex())) { + it.listId = listId + moveGoogleTask(it, initListId) + } else { + _toast.postValue(R.string.this_is_same_list) + } + } + } + + fun deleteGoogleTask(googleTask: GoogleTask) { + postInProgress(true) + Logger.i(TAG, "Deleting Google Task (${googleTask.taskId}), listId=${googleTask.listId}") + viewModelScope.launch(dispatcherProvider.default()) { + if (googleTasksApi.deleteTask(googleTask)) { + googleTaskRepository.delete(googleTask.taskId) + postInProgress(false) + postCommand(Commands.DELETED) + } else { + postInProgress(false) + postCommand(Commands.FAILED) + } + } + } + + fun onListSelected(listId: String) { + this.listId = listId + googleTaskLists.firstOrNull { it.listId == listId } + ?.also { + _taskList.postValue(it) + } + } + + fun isDateSelected(): Boolean { + return dateState.value is DateState.SelectedDate + } + + fun isTimeSelected(): Boolean { + return timeState.value is TimeState.SelectedTime + } + + private fun checkDeepLink(arguments: Bundle?) { + if (arguments?.getBoolean(IntentKeys.INTENT_DEEP_LINK, false) == true) { + runCatching { + val parser = DeepLinkDataParser() + initFromDeepLink(parser.readDeepLinkData(arguments)) + } + } + } + + private fun onEditTask(googleTask: GoogleTask) { editedTask = googleTask listId = googleTask.listId if (!isEdited) { + Logger.d(TAG, "Editing Google Task id=${googleTask.taskId}, listId=${googleTask.listId}") googleTask.dueDate .takeIf { it != 0L } ?.let { dateTimeManager.fromMillis(it) } @@ -130,8 +244,9 @@ class GoogleTaskViewModel( onDateStateChanged(true) } isEdited = true + _task.postValue(googleTask) viewModelScope.launch(dispatcherProvider.default()) { - googleTaskListRepository.getAll().firstOrNull { it.listId == googleTask.listId }?.also { + googleTaskLists.firstOrNull { it.listId == googleTask.listId }?.also { _taskList.postValue(it) } } @@ -139,7 +254,7 @@ class GoogleTaskViewModel( loadReminder(googleTask.uuId) } - fun initFromDeepLink(deepLinkData: DeepLinkData?) { + private fun initFromDeepLink(deepLinkData: DeepLinkData?) { if (deepLinkData is GoogleTaskDateTimeDeepLinkData) { onDateStateChanged(true) onDateSet(deepLinkData.date) @@ -150,30 +265,17 @@ class GoogleTaskViewModel( } } - fun initDefaults() { + private fun initDefaults() { _dateState.postValue(DateState.NoDate) _timeState.postValue(TimeState.NoTime) } - fun onDateStateChanged(enabled: Boolean) { - if (enabled) { - onDateSet(date) - } else { - _dateState.postValue(DateState.NoDate) - onTimeStateChanged(false) - } - } - - fun onTimeStateChanged(enabled: Boolean) { - if (enabled) { - onTimeSet(time) - } else { - _timeState.postValue(TimeState.NoTime) - } - } - - fun moveGoogleTask(googleTask: GoogleTask, oldListId: String) { + private fun moveGoogleTask(googleTask: GoogleTask, oldListId: String) { postInProgress(true) + Logger.i( + TAG, + "Moving Google Task (${googleTask.taskId}) from $oldListId to ${googleTask.listId}" + ) viewModelScope.launch(dispatcherProvider.default()) { googleTasksApi.moveTask(googleTask, oldListId)?.let { googleTaskRepository.save(it) @@ -186,20 +288,6 @@ class GoogleTaskViewModel( } } - fun deleteGoogleTask(googleTask: GoogleTask) { - postInProgress(true) - viewModelScope.launch(dispatcherProvider.default()) { - if (googleTasksApi.deleteTask(googleTask)) { - googleTaskRepository.delete(googleTask.taskId) - postInProgress(false) - postCommand(Commands.DELETED) - } else { - postInProgress(false) - postCommand(Commands.FAILED) - } - } - } - private fun loadReminder(uuId: String) { postInProgress(true) viewModelScope.launch(dispatcherProvider.default()) { @@ -219,7 +307,7 @@ class GoogleTaskViewModel( } private fun saveReminder(reminder: Reminder?) { - Logger.d("saveReminder: $reminder") + Logger.d(TAG, "Saving reminder: $reminder") if (reminder != null) { viewModelScope.launch(dispatcherProvider.default()) { val group = reminderGroupRepository.defaultGroup() @@ -243,6 +331,7 @@ class GoogleTaskViewModel( private fun newGoogleTask(googleTask: GoogleTask, reminder: Reminder?) { postInProgress(true) + Logger.i(TAG, "Creating Google Task (${googleTask.taskId}), listId=${googleTask.listId}") viewModelScope.launch(dispatcherProvider.default()) { googleTasksApi.saveTask(googleTask)?.let { googleTaskRepository.save(it) @@ -258,6 +347,7 @@ class GoogleTaskViewModel( private fun updateGoogleTask(googleTask: GoogleTask, reminder: Reminder?) { postInProgress(true) + Logger.i(TAG, "Updating Google Task (${googleTask.taskId}), listId=${googleTask.listId}") viewModelScope.launch(dispatcherProvider.default()) { googleTasksApi.updateTask(googleTask)?.let { googleTaskRepository.save(it) @@ -277,6 +367,11 @@ class GoogleTaskViewModel( reminder: Reminder? ) { postInProgress(true) + Logger.i( + TAG, + "Updating and moving Google Task (${googleTask.taskId}) " + + "to ${googleTask.listId} from $oldListId" + ) viewModelScope.launch(dispatcherProvider.default()) { googleTasksApi.updateTask(googleTask)?.let { googleTasksApi.moveTask(it, oldListId) @@ -310,7 +405,6 @@ class GoogleTaskViewModel( note: String, reminder: Reminder? ): GoogleTask { - Logger.d("update: date=$date, time=$time") return googleTask.copy( listId = listId, status = GoogleTask.TASKS_NEED_ACTION, @@ -322,14 +416,6 @@ class GoogleTaskViewModel( ) } - fun isDateSelected(): Boolean { - return dateState.value is DateState.SelectedDate - } - - fun isTimeSelected(): Boolean { - return timeState.value is TimeState.SelectedTime - } - private fun String.normalizeSummary(): String { return if (length > Configs.MAX_REMINDER_SUMMARY_LENGTH) { substring(0, Configs.MAX_REMINDER_SUMMARY_LENGTH) @@ -353,4 +439,8 @@ class GoogleTaskViewModel( data object NoTime : TimeState() } + + companion object { + private const val TAG = "EditGoogleTaskViewModel" + } } diff --git a/app/src/main/java/com/elementary/tasks/groups/create/EditGroupFragment.kt b/app/src/main/java/com/elementary/tasks/groups/create/EditGroupFragment.kt index 707f577ed..602966d8a 100644 --- a/app/src/main/java/com/elementary/tasks/groups/create/EditGroupFragment.kt +++ b/app/src/main/java/com/elementary/tasks/groups/create/EditGroupFragment.kt @@ -18,7 +18,7 @@ import org.koin.core.parameter.parametersOf class EditGroupFragment : BaseToolbarFragment() { - private val viewModel by viewModel { parametersOf(idFromIntent()) } + private val viewModel by viewModel { parametersOf(idFromIntent()) } private fun idFromIntent(): String = arguments?.getString(IntentKeys.INTENT_ID) ?: "" diff --git a/app/src/main/java/com/elementary/tasks/groups/create/CreateGroupViewModel.kt b/app/src/main/java/com/elementary/tasks/groups/create/EditGroupViewModel.kt similarity index 99% rename from app/src/main/java/com/elementary/tasks/groups/create/CreateGroupViewModel.kt rename to app/src/main/java/com/elementary/tasks/groups/create/EditGroupViewModel.kt index 40a531a66..2375c8479 100644 --- a/app/src/main/java/com/elementary/tasks/groups/create/CreateGroupViewModel.kt +++ b/app/src/main/java/com/elementary/tasks/groups/create/EditGroupViewModel.kt @@ -25,7 +25,7 @@ import com.github.naz013.repository.ReminderGroupRepository import kotlinx.coroutines.launch import java.util.UUID -class CreateGroupViewModel( +class EditGroupViewModel( private val id: String, dispatcherProvider: DispatcherProvider, private val workerLauncher: WorkerLauncher, diff --git a/app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt b/app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt index 2d5ab17cf..7daadc4a0 100644 --- a/app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt +++ b/app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt @@ -27,17 +27,11 @@ import com.elementary.tasks.navigation.SearchableFragmentCallback import com.elementary.tasks.navigation.SearchableFragmentQueryObserver import com.elementary.tasks.navigation.fragments.BaseNavigationFragment import com.elementary.tasks.navigation.topfragment.BaseTopFragment +import com.elementary.tasks.splash.ShortcutDestination import com.github.naz013.feature.common.android.readParcelable import com.github.naz013.logging.Logger -import com.github.naz013.navigation.DayViewScreen import com.github.naz013.navigation.DeepLinkDestination import com.github.naz013.navigation.Destination -import com.github.naz013.navigation.EditBirthdayScreen -import com.github.naz013.navigation.EditGroupScreen -import com.github.naz013.navigation.EditPlaceScreen -import com.github.naz013.navigation.SettingsScreen -import com.github.naz013.navigation.ViewBirthdayScreen -import com.github.naz013.navigation.ViewGoogleTaskScreen import com.github.naz013.ui.common.activity.BindingActivity import com.github.naz013.ui.common.view.visibleGone import com.google.android.material.search.SearchView @@ -70,10 +64,9 @@ class BottomNavActivity : override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() super.onCreate(savedInstanceState) - Logger.d( - "BottomNavActivity", - "onCreate: ${intent.action}, ${intent.data?.toString()}, ${intent.extras?.keySet()}" - ) + Logger.i(TAG, "Starting with action: ${intent.action}") + Logger.i(TAG, "Starting with data: ${intent.data}") + Logger.i(TAG, "Starting with extras: ${intent.extras?.keySet()?.toList()}") val navHostFragment = supportFragmentManager.findFragmentById(R.id.mainNavigationFragment) as NavHostFragment @@ -86,72 +79,35 @@ class BottomNavActivity : DeepLinkDestination.KEY, DeepLinkDestination::class.java ) - when (deepLinkDestination) { - is DayViewScreen -> { + Logger.i(TAG, "Deep link destination: $deepLinkDestination") + deepLinkDestination + ?.let { ScreenDestinationIdResolver().resolve(deepLinkDestination) } + ?.also { NavDeepLinkBuilder(this) .setGraph(R.navigation.home_nav) .setArguments(deepLinkDestination.extras) - .setDestination(R.id.dayViewFragment) + .setDestination(it) .createTaskStackBuilder() .startActivities() } - - is SettingsScreen -> { - NavDeepLinkBuilder(this) - .setGraph(R.navigation.home_nav) - .setDestination(R.id.settingsFragment) - .createTaskStackBuilder() - .startActivities() + } else if (ShortcutDestination.hasShortcut(intent.extras)) { + val shortcut = ShortcutDestination.getShortcut(intent.extras) + val destinationId = when (shortcut) { + ShortcutDestination.Shortcut.GoogleTask -> { + R.id.editGoogleTaskFragment } - is EditBirthdayScreen -> { - NavDeepLinkBuilder(this) - .setGraph(R.navigation.home_nav) - .setDestination(R.id.editBirthdayFragment) - .setArguments(deepLinkDestination.extras) - .createTaskStackBuilder() - .startActivities() - } - - is ViewBirthdayScreen -> { - NavDeepLinkBuilder(this) - .setGraph(R.navigation.home_nav) - .setDestination(R.id.previewBirthdayFragment) - .setArguments(deepLinkDestination.extras) - .createTaskStackBuilder() - .startActivities() - } - - is EditGroupScreen -> { - NavDeepLinkBuilder(this) - .setGraph(R.navigation.home_nav) - .setDestination(R.id.editGroupFragment) - .setArguments(deepLinkDestination.extras) - .createTaskStackBuilder() - .startActivities() - } - - is EditPlaceScreen -> { - NavDeepLinkBuilder(this) - .setGraph(R.navigation.home_nav) - .setDestination(R.id.editPlaceFragment) - .setArguments(deepLinkDestination.extras) - .createTaskStackBuilder() - .startActivities() - } - - is ViewGoogleTaskScreen -> { - NavDeepLinkBuilder(this) - .setGraph(R.navigation.home_nav) - .setDestination(R.id.previewGoogleTaskFragment) - .setArguments(deepLinkDestination.extras) - .createTaskStackBuilder() - .startActivities() - } - - else -> { - Logger.e("BottomNavActivity", "Unknown deep link destination: $deepLinkDestination") - } + ShortcutDestination.Shortcut.Reminder -> TODO() + ShortcutDestination.Shortcut.Note -> TODO() + null -> null + } + destinationId?.also { + NavDeepLinkBuilder(this) + .setGraph(R.navigation.home_nav) + .setArguments(intent.extras) + .setDestination(it) + .createTaskStackBuilder() + .startActivities() } } @@ -258,4 +214,8 @@ class BottomNavActivity : fragmentSearchView = searchView } + + companion object { + private const val TAG = "BottomNavActivity" + } } diff --git a/app/src/main/java/com/elementary/tasks/home/HomeFragment.kt b/app/src/main/java/com/elementary/tasks/home/HomeFragment.kt index e575e4aff..24f631997 100644 --- a/app/src/main/java/com/elementary/tasks/home/HomeFragment.kt +++ b/app/src/main/java/com/elementary/tasks/home/HomeFragment.kt @@ -18,7 +18,6 @@ import com.elementary.tasks.globalsearch.FragmentNavigation import com.elementary.tasks.globalsearch.GlobalSearchViewModel import com.elementary.tasks.globalsearch.NavigationAction import com.elementary.tasks.globalsearch.adapter.SearchAdapter -import com.elementary.tasks.googletasks.task.GoogleTaskActivity import com.elementary.tasks.home.scheduleview.HeaderTimeType import com.elementary.tasks.home.scheduleview.ScheduleAdapter import com.elementary.tasks.home.scheduleview.ScheduleHomeViewModel @@ -40,7 +39,6 @@ import com.github.naz013.ui.common.view.applyTopInsets import com.github.naz013.ui.common.view.gone import com.github.naz013.ui.common.view.visible import com.github.naz013.ui.common.view.visibleGone -import com.github.naz013.usecase.googletasks.TasksIntentKeys import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel import org.threeten.bp.LocalDate @@ -185,10 +183,14 @@ class HomeFragment : date = LocalDate.now(), time = time ) - withActivity { - LoginApi.openLogged(it, GoogleTaskActivity::class.java, deepLinkData) { - putExtra(TasksIntentKeys.INTENT_ACTION, TasksIntentKeys.CREATE) - } + navigate { + navigate( + R.id.editGoogleTaskFragment, + Bundle().apply { + putParcelable(deepLinkData.intentKey, deepLinkData) + putBoolean(IntentKeys.INTENT_DEEP_LINK, true) + } + ) } } diff --git a/app/src/main/java/com/elementary/tasks/home/ScreenDestinationIdResolver.kt b/app/src/main/java/com/elementary/tasks/home/ScreenDestinationIdResolver.kt new file mode 100644 index 000000000..c3a5b0866 --- /dev/null +++ b/app/src/main/java/com/elementary/tasks/home/ScreenDestinationIdResolver.kt @@ -0,0 +1,30 @@ +package com.elementary.tasks.home + +import androidx.annotation.IdRes +import com.elementary.tasks.R +import com.github.naz013.navigation.DayViewScreen +import com.github.naz013.navigation.DeepLinkDestination +import com.github.naz013.navigation.EditBirthdayScreen +import com.github.naz013.navigation.EditGoogleTaskScreen +import com.github.naz013.navigation.EditGroupScreen +import com.github.naz013.navigation.EditPlaceScreen +import com.github.naz013.navigation.SettingsScreen +import com.github.naz013.navigation.ViewBirthdayScreen +import com.github.naz013.navigation.ViewGoogleTaskScreen + +class ScreenDestinationIdResolver { + + @IdRes + fun resolve(destination: DeepLinkDestination): Int { + return when (destination) { + is DayViewScreen -> R.id.dayViewFragment + is SettingsScreen -> R.id.settingsFragment + is EditBirthdayScreen -> R.id.editBirthdayFragment + is ViewBirthdayScreen -> R.id.previewBirthdayFragment + is EditGroupScreen -> R.id.editGroupFragment + is EditPlaceScreen -> R.id.editPlaceFragment + is ViewGoogleTaskScreen -> R.id.previewGoogleTaskFragment + is EditGoogleTaskScreen -> R.id.editGoogleTaskFragment + } + } +} diff --git a/app/src/main/java/com/elementary/tasks/navigation/ActivityNavigationDispatcher.kt b/app/src/main/java/com/elementary/tasks/navigation/ActivityNavigationDispatcher.kt index bd308f11a..bfea1e5f7 100644 --- a/app/src/main/java/com/elementary/tasks/navigation/ActivityNavigationDispatcher.kt +++ b/app/src/main/java/com/elementary/tasks/navigation/ActivityNavigationDispatcher.kt @@ -2,7 +2,6 @@ package com.elementary.tasks.navigation import android.content.Context import android.os.Bundle -import com.elementary.tasks.googletasks.task.GoogleTaskActivity import com.elementary.tasks.home.BottomNavActivity import com.elementary.tasks.notes.create.CreateNoteActivity import com.elementary.tasks.notes.preview.NotePreviewActivity @@ -13,6 +12,7 @@ import com.github.naz013.navigation.ActivityDestination import com.github.naz013.navigation.DeepLinkDestination import com.github.naz013.navigation.DestinationScreen import com.github.naz013.navigation.EditBirthdayScreen +import com.github.naz013.navigation.EditGoogleTaskScreen import com.github.naz013.navigation.ViewBirthdayScreen import com.github.naz013.navigation.ViewGoogleTaskScreen import com.github.naz013.ui.common.context.buildIntent @@ -70,6 +70,13 @@ class ActivityNavigationDispatcher( } } + DestinationScreen.GoogleTaskCreate -> { + val deepLinkDestination = EditGoogleTaskScreen(bundle) + Bundle(bundle).apply { + putParcelable(DeepLinkDestination.KEY, deepLinkDestination) + } + } + else -> bundle } } @@ -83,7 +90,7 @@ class ActivityNavigationDispatcher( DestinationScreen.BirthdayPreview -> BottomNavActivity::class.java DestinationScreen.BirthdayCreate -> BottomNavActivity::class.java DestinationScreen.GoogleTaskPreview -> BottomNavActivity::class.java - DestinationScreen.GoogleTaskCreate -> GoogleTaskActivity::class.java + DestinationScreen.GoogleTaskCreate -> BottomNavActivity::class.java DestinationScreen.Main -> BottomNavActivity::class.java } } diff --git a/app/src/main/java/com/elementary/tasks/reminder/preview/ReminderPreviewActivity.kt b/app/src/main/java/com/elementary/tasks/reminder/preview/ReminderPreviewActivity.kt index 3f1e3caf4..172b1ba6c 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/preview/ReminderPreviewActivity.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/preview/ReminderPreviewActivity.kt @@ -12,27 +12,24 @@ import com.elementary.tasks.R import com.elementary.tasks.core.data.Commands import com.elementary.tasks.core.data.ui.note.UiNoteList import com.elementary.tasks.core.utils.TelephonyUtil -import com.github.naz013.common.datetime.DateTimeManager import com.elementary.tasks.core.utils.params.Prefs -import com.github.naz013.ui.common.Dialogues import com.elementary.tasks.databinding.ActivityReminderPreviewBinding -import com.elementary.tasks.googletasks.task.GoogleTaskActivity import com.elementary.tasks.notes.preview.ImagePreviewActivity import com.elementary.tasks.notes.preview.ImagesSingleton import com.elementary.tasks.notes.preview.NotePreviewActivity import com.elementary.tasks.reminder.ReminderBuilderLauncher import com.elementary.tasks.reminder.preview.adapter.ReminderPreviewDataAdapter +import com.github.naz013.common.datetime.DateTimeManager import com.github.naz013.common.intent.IntentKeys import com.github.naz013.feature.common.livedata.nonNullObserve import com.github.naz013.logging.Logger +import com.github.naz013.ui.common.Dialogues import com.github.naz013.ui.common.activity.BindingActivity import com.github.naz013.ui.common.activity.toast import com.github.naz013.ui.common.context.buildIntent import com.github.naz013.ui.common.context.startActivity -import com.github.naz013.ui.common.login.LoginApi import com.github.naz013.ui.common.view.applyBottomInsets import com.github.naz013.ui.common.view.applyTopInsets -import com.github.naz013.usecase.googletasks.TasksIntentKeys import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf @@ -103,10 +100,11 @@ class ReminderPreviewActivity : BindingActivity( } private fun onGoogleTaskClicked(id: String) { - LoginApi.openLogged(this, GoogleTaskActivity::class.java) { - putExtra(IntentKeys.INTENT_ID, id) - putExtra(TasksIntentKeys.INTENT_ACTION, TasksIntentKeys.EDIT) - } + // TODO Move to Edit Google Task fragment +// LoginApi.openLogged(this, GoogleTaskActivity::class.java) { +// putExtra(IntentKeys.INTENT_ID, id) +// putExtra(TasksIntentKeys.INTENT_ACTION, TasksIntentKeys.EDIT) +// } } private fun openNote(id: String) { diff --git a/app/src/main/java/com/elementary/tasks/splash/ShortcutDestination.kt b/app/src/main/java/com/elementary/tasks/splash/ShortcutDestination.kt new file mode 100644 index 000000000..ea393bba8 --- /dev/null +++ b/app/src/main/java/com/elementary/tasks/splash/ShortcutDestination.kt @@ -0,0 +1,34 @@ +package com.elementary.tasks.splash + +import android.os.Bundle + +object ShortcutDestination { + + private const val KEY_HAS_SHORTCUT = "key_has_shortcut" + private const val KEY_SHORTCUT_TYPE = "key_shortcut_type" + + fun hasShortcut(bundle: Bundle?): Boolean { + return bundle?.getBoolean(KEY_HAS_SHORTCUT, false) ?: false + } + + fun getShortcut(bundle: Bundle?): Shortcut? { + return bundle?.getString(KEY_SHORTCUT_TYPE) + ?.let { Shortcut.valueOf(it) } + } + + fun createBundle( + shortcut: Shortcut, + bundle: Bundle? = null + ): Bundle { + return (bundle?.let { Bundle(it) } ?: Bundle()).apply { + putBoolean(KEY_HAS_SHORTCUT, true) + putString(KEY_SHORTCUT_TYPE, shortcut.name) + } + } + + enum class Shortcut { + Reminder, + Note, + GoogleTask + } +} diff --git a/app/src/main/java/com/elementary/tasks/splash/SplashScreenActivity.kt b/app/src/main/java/com/elementary/tasks/splash/SplashScreenActivity.kt index 5fad1bbf2..4439ce139 100644 --- a/app/src/main/java/com/elementary/tasks/splash/SplashScreenActivity.kt +++ b/app/src/main/java/com/elementary/tasks/splash/SplashScreenActivity.kt @@ -9,7 +9,6 @@ import android.os.Bundle import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import com.elementary.tasks.R import com.elementary.tasks.core.os.ContextSwitcher -import com.elementary.tasks.googletasks.task.GoogleTaskActivity import com.elementary.tasks.home.BottomNavActivity import com.elementary.tasks.notes.create.CreateNoteActivity import com.elementary.tasks.reminder.ReminderBuilderLauncher @@ -76,6 +75,9 @@ class SplashScreenActivity : LightThemedActivity() { .build() if (viewModel.isGoogleTasksEnabled) { + val bundle = ShortcutDestination.createBundle( + shortcut = ShortcutDestination.Shortcut.GoogleTask + ) val shortcut3 = ShortcutInfo.Builder(this, "id.google.tasks") .setShortLabel(getString(R.string.add_google_task)) .setLongLabel(getString(R.string.add_google_task)) @@ -83,9 +85,8 @@ class SplashScreenActivity : LightThemedActivity() { .setIntents( arrayOf( Intent(Intent.ACTION_MAIN) - .setClass(this, BottomNavActivity::class.java), - Intent(Intent.ACTION_VIEW) - .setClass(this, GoogleTaskActivity::class.java) + .setClass(this, BottomNavActivity::class.java) + .putExtras(bundle) ) ) .build() diff --git a/app/src/main/res/layout/a_components.xml b/app/src/main/res/layout/a_components.xml index 793b031c8..dc8fb3abd 100644 --- a/app/src/main/res/layout/a_components.xml +++ b/app/src/main/res/layout/a_components.xml @@ -18,7 +18,7 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" - app:menu="@menu/activity_create_task" + app:menu="@menu/fragment_google_task_edit" app:navigationIcon="@drawable/ic_builder_arrow_left" app:navigationIconTint="?colorOnSurface" app:title="Components page" /> diff --git a/app/src/main/res/layout/activity_create_google_task.xml b/app/src/main/res/layout/activity_create_google_task.xml deleted file mode 100644 index af8920a1f..000000000 --- a/app/src/main/res/layout/activity_create_google_task.xml +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_google_task_edit.xml b/app/src/main/res/layout/fragment_google_task_edit.xml new file mode 100644 index 000000000..afee19899 --- /dev/null +++ b/app/src/main/res/layout/fragment_google_task_edit.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/activity_create_task.xml b/app/src/main/res/menu/fragment_google_task_edit.xml similarity index 100% rename from app/src/main/res/menu/activity_create_task.xml rename to app/src/main/res/menu/fragment_google_task_edit.xml diff --git a/app/src/main/res/navigation/home_nav.xml b/app/src/main/res/navigation/home_nav.xml index 756655632..0c9dd007d 100644 --- a/app/src/main/res/navigation/home_nav.xml +++ b/app/src/main/res/navigation/home_nav.xml @@ -158,6 +158,9 @@ + + + diff --git a/app/src/test/java/com/elementary/tasks/birthdays/create/AddBirthdayViewModelTest.kt b/app/src/test/java/com/elementary/tasks/birthdays/create/EditBirthdayViewModelTest.kt similarity index 98% rename from app/src/test/java/com/elementary/tasks/birthdays/create/AddBirthdayViewModelTest.kt rename to app/src/test/java/com/elementary/tasks/birthdays/create/EditBirthdayViewModelTest.kt index 4dfeb7394..2915822f3 100644 --- a/app/src/test/java/com/elementary/tasks/birthdays/create/AddBirthdayViewModelTest.kt +++ b/app/src/test/java/com/elementary/tasks/birthdays/create/EditBirthdayViewModelTest.kt @@ -24,9 +24,9 @@ import org.junit.Assert.assertEquals import org.junit.Test import org.threeten.bp.LocalDate -class AddBirthdayViewModelTest : BaseTest() { +class EditBirthdayViewModelTest : BaseTest() { - private lateinit var viewModel: AddBirthdayViewModel + private lateinit var viewModel: EditBirthdayViewModel private val birthdayRepository = mockk() private val workerLauncher = mockk() @@ -44,7 +44,7 @@ class AddBirthdayViewModelTest : BaseTest() { super.setUp() every { dateTimeManager.getCurrentDate() }.returns(LocalDate.now()) - viewModel = AddBirthdayViewModel( + viewModel = EditBirthdayViewModel( id = ID, birthdayRepository = birthdayRepository, dispatcherProvider = mockDispatcherProvider(), diff --git a/appwidgets/src/main/kotlin/com/github/naz013/appwidgets/AppWidgetActionActivity.kt b/appwidgets/src/main/kotlin/com/github/naz013/appwidgets/AppWidgetActionActivity.kt index 61aec6de4..203426ccd 100644 --- a/appwidgets/src/main/kotlin/com/github/naz013/appwidgets/AppWidgetActionActivity.kt +++ b/appwidgets/src/main/kotlin/com/github/naz013/appwidgets/AppWidgetActionActivity.kt @@ -6,12 +6,11 @@ import android.os.Bundle import com.github.naz013.common.intent.IntentKeys import com.github.naz013.feature.common.android.readSerializable import com.github.naz013.logging.Logger -import com.github.naz013.navigation.DestinationScreen import com.github.naz013.navigation.ActivityDestination +import com.github.naz013.navigation.DestinationScreen import com.github.naz013.navigation.Navigator import com.github.naz013.ui.common.activity.LightThemedActivity import com.github.naz013.ui.common.context.intentForClass -import com.github.naz013.usecase.googletasks.TasksIntentKeys import org.koin.android.ext.android.inject internal class AppWidgetActionActivity : LightThemedActivity() { @@ -114,15 +113,14 @@ internal class AppWidgetActionActivity : LightThemedActivity() { ) } Direction.GOOGLE_TASK -> { - val action = data?.extra?.get(TasksIntentKeys.INTENT_ACTION) as? String ?: return - bundle.putString(TasksIntentKeys.INTENT_ACTION, action) - if (action == TasksIntentKeys.CREATE) { + if (id.isNullOrEmpty()) { navigator.navigate( ActivityDestination( screen = DestinationScreen.GoogleTaskCreate, extras = bundle, flags = Intent.FLAG_ACTIVITY_NEW_TASK, - isLoggedIn = true + isLoggedIn = true, + action = Intent.ACTION_VIEW ) ) } else { @@ -131,7 +129,8 @@ internal class AppWidgetActionActivity : LightThemedActivity() { screen = DestinationScreen.GoogleTaskPreview, extras = bundle, flags = Intent.FLAG_ACTIVITY_NEW_TASK, - isLoggedIn = true + isLoggedIn = true, + action = Intent.ACTION_VIEW ) ) } diff --git a/appwidgets/src/main/kotlin/com/github/naz013/appwidgets/googletasks/TasksFactory.kt b/appwidgets/src/main/kotlin/com/github/naz013/appwidgets/googletasks/TasksFactory.kt index c5f17593c..613c3f29e 100644 --- a/appwidgets/src/main/kotlin/com/github/naz013/appwidgets/googletasks/TasksFactory.kt +++ b/appwidgets/src/main/kotlin/com/github/naz013/appwidgets/googletasks/TasksFactory.kt @@ -19,7 +19,6 @@ import com.github.naz013.ui.common.theme.ThemeProvider import com.github.naz013.ui.common.view.ViewUtils import com.github.naz013.usecase.googletasks.GetAllGoogleTaskListsUseCase import com.github.naz013.usecase.googletasks.GetAllGoogleTasksUseCase -import com.github.naz013.usecase.googletasks.TasksIntentKeys import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale @@ -126,8 +125,7 @@ internal class TasksFactory( val data = WidgetIntentProtocol( mapOf( - Pair(IntentKeys.INTENT_ID, task.taskId), - Pair(TasksIntentKeys.INTENT_ACTION, TasksIntentKeys.EDIT) + Pair(IntentKeys.INTENT_ID, task.taskId) ) ) diff --git a/appwidgets/src/main/kotlin/com/github/naz013/appwidgets/googletasks/TasksWidget.kt b/appwidgets/src/main/kotlin/com/github/naz013/appwidgets/googletasks/TasksWidget.kt index 403deab34..38245c9dd 100644 --- a/appwidgets/src/main/kotlin/com/github/naz013/appwidgets/googletasks/TasksWidget.kt +++ b/appwidgets/src/main/kotlin/com/github/naz013/appwidgets/googletasks/TasksWidget.kt @@ -13,9 +13,7 @@ import com.github.naz013.appwidgets.R import com.github.naz013.appwidgets.RandomRequestCode import com.github.naz013.appwidgets.WidgetIntentProtocol import com.github.naz013.appwidgets.WidgetUtils -import com.github.naz013.common.intent.IntentKeys import com.github.naz013.common.intent.PendingIntentWrapper -import com.github.naz013.usecase.googletasks.TasksIntentKeys internal class TasksWidget : AppWidgetProvider() { @@ -44,12 +42,7 @@ internal class TasksWidget : AppWidgetProvider() { rv.setInt(R.id.headerBg, "setBackgroundResource", WidgetUtils.newWidgetBg(headerBgColor)) val createTaskIntent = AppWidgetActionActivity.createIntent(context).apply { - val data = WidgetIntentProtocol( - mapOf( - Pair(IntentKeys.INTENT_ID, ""), - Pair(TasksIntentKeys.INTENT_ACTION, TasksIntentKeys.CREATE) - ) - ) + val data = WidgetIntentProtocol(mapOf()) putExtra(AppWidgetActionActivity.DATA, data) putExtra(AppWidgetActionActivity.DIRECTION, Direction.GOOGLE_TASK) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2acbccc99..21a634083 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ targetSdk = "35" kotlinTargetJvm = "17" # Plugins -agp = "8.7.3" +agp = "8.8.0" kotlin = "2.1.0" google-services = "4.4.2" navigation-safeargs = "2.8.5" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 19cfad969..1e2fbf0d4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/navigation-api/src/main/kotlin/com/github/naz013/navigation/DeepLinkDestination.kt b/navigation-api/src/main/kotlin/com/github/naz013/navigation/DeepLinkDestination.kt index 1cb98ce4e..4ea4baac8 100644 --- a/navigation-api/src/main/kotlin/com/github/naz013/navigation/DeepLinkDestination.kt +++ b/navigation-api/src/main/kotlin/com/github/naz013/navigation/DeepLinkDestination.kt @@ -2,10 +2,13 @@ package com.github.naz013.navigation import android.os.Bundle import android.os.Parcelable +import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.Parcelize sealed class DeepLinkDestination : Parcelable { + abstract val extras: Bundle? + companion object { const val KEY = "deep_link_destination" } @@ -13,33 +16,41 @@ sealed class DeepLinkDestination : Parcelable { @Parcelize data class DayViewScreen( - val extras: Bundle + override val extras: Bundle ) : DeepLinkDestination() @Parcelize data class EditBirthdayScreen( - val extras: Bundle + override val extras: Bundle ) : DeepLinkDestination() @Parcelize data class ViewBirthdayScreen( - val extras: Bundle + override val extras: Bundle ) : DeepLinkDestination() @Parcelize -data object SettingsScreen : DeepLinkDestination() +data object SettingsScreen : DeepLinkDestination() { + @IgnoredOnParcel + override val extras: Bundle? = null +} @Parcelize data class EditGroupScreen( - val extras: Bundle + override val extras: Bundle ) : DeepLinkDestination() @Parcelize data class EditPlaceScreen( - val extras: Bundle + override val extras: Bundle ) : DeepLinkDestination() @Parcelize data class ViewGoogleTaskScreen( - val extras: Bundle + override val extras: Bundle +) : DeepLinkDestination() + +@Parcelize +data class EditGoogleTaskScreen( + override val extras: Bundle ) : DeepLinkDestination() diff --git a/platform-common/src/main/kotlin/com/github/naz013/common/intent/IntentKeys.kt b/platform-common/src/main/kotlin/com/github/naz013/common/intent/IntentKeys.kt index 042bf2135..ff07f2197 100644 --- a/platform-common/src/main/kotlin/com/github/naz013/common/intent/IntentKeys.kt +++ b/platform-common/src/main/kotlin/com/github/naz013/common/intent/IntentKeys.kt @@ -3,6 +3,7 @@ package com.github.naz013.common.intent object IntentKeys { const val INTENT_ID = "item_id" + const val INTENT_LIST_ID = "item_list_id" const val INTENT_JSON = "item_json" const val INTENT_STATUS = "item_status" const val INTENT_POSITION = "item_position" diff --git a/ui-common/src/main/kotlin/com/github/naz013/ui/common/fragment/FragmentExtensions.kt b/ui-common/src/main/kotlin/com/github/naz013/ui/common/fragment/FragmentExtensions.kt index e4136098d..e8734c75e 100644 --- a/ui-common/src/main/kotlin/com/github/naz013/ui/common/fragment/FragmentExtensions.kt +++ b/ui-common/src/main/kotlin/com/github/naz013/ui/common/fragment/FragmentExtensions.kt @@ -1,6 +1,9 @@ package com.github.naz013.ui.common.fragment +import android.content.Context import android.content.Intent +import android.os.IBinder +import android.view.inputmethod.InputMethodManager import android.widget.Toast import androidx.annotation.ColorRes import androidx.annotation.StringRes @@ -29,3 +32,29 @@ fun Fragment.toast(message: String, duration: Int = Toast.LENGTH_SHORT) { fun Fragment.toast(@StringRes message: Int, duration: Int = Toast.LENGTH_SHORT) { Toast.makeText(requireContext(), message, duration).show() } + +fun Fragment.argumentsString(key: String): String? { + return arguments?.getString(key) +} + +fun Fragment.argumentsString(key: String, default: String): String { + return arguments?.getString(key, default) ?: default +} + +fun Fragment.argumentsBoolean(key: String): Boolean? { + return arguments?.getBoolean(key) +} + +fun Fragment.argumentsBoolean(key: String, default: Boolean): Boolean { + return arguments?.getBoolean(key, default) ?: default +} + +fun Fragment.hideKeyboard(token: IBinder? = null) { + val imm = requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager? + if (token == null) { + val currentToken = activity?.window?.currentFocus?.windowToken + currentToken?.let { imm?.hideSoftInputFromWindow(token, 0) } + } else { + imm?.hideSoftInputFromWindow(token, 0) + } +} diff --git a/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/GetGoogleTaskByIdUseCase.kt b/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/GetGoogleTaskByIdUseCase.kt new file mode 100644 index 000000000..09e6858fc --- /dev/null +++ b/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/GetGoogleTaskByIdUseCase.kt @@ -0,0 +1,13 @@ +package com.github.naz013.usecase.googletasks + +import com.github.naz013.domain.GoogleTask +import com.github.naz013.repository.GoogleTaskRepository + +class GetGoogleTaskByIdUseCase( + private val googleTaskRepository: GoogleTaskRepository +) { + + suspend operator fun invoke(taskId: String): GoogleTask? { + return googleTaskRepository.getById(taskId) + } +} diff --git a/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/KoinModule.kt b/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/KoinModule.kt index 0ea998184..fcecee23d 100644 --- a/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/KoinModule.kt +++ b/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/KoinModule.kt @@ -4,5 +4,7 @@ import org.koin.dsl.module val googleTasksUseCaseModule = module { factory { GetAllGoogleTaskListsUseCase(get()) } + factory { GetAllGoogleTasksUseCase(get()) } + factory { GetGoogleTaskByIdUseCase(get()) } } diff --git a/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/TasksIntentKeys.kt b/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/TasksIntentKeys.kt deleted file mode 100644 index 0d6021ef0..000000000 --- a/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/TasksIntentKeys.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.github.naz013.usecase.googletasks - -object TasksIntentKeys { - - // action types - const val INTENT_ACTION = "action" - const val EDIT = "edit" - const val CREATE = "create" -} From daa2925036da8c735d151ec2170e4cfe6d125e96 Mon Sep 17 00:00:00 2001 From: Nazar Sukhovych Date: Sun, 12 Jan 2025 14:03:48 +0100 Subject: [PATCH 06/25] REM-918 - Move Google task list edit to the Fragment --- app/src/main/AndroidManifest.xml | 5 - .../tasks/googletasks/GoogleTasksFragment.kt | 4 +- .../tasks/googletasks/KoinModule.kt | 9 +- .../googletasks/list/TaskListFragment.kt | 11 +- .../tasklist/EditGoogleTaskListFragment.kt | 177 +++++++++++++++++ ...odel.kt => EditGoogleTaskListViewModel.kt} | 75 +++++-- .../tasklist/GoogleTaskListActivity.kt | 188 ------------------ ...xml => fragment_google_task_list_edit.xml} | 18 -- ...xml => fragment_google_task_list_edit.xml} | 0 app/src/main/res/navigation/home_nav.xml | 11 + .../GetGoogleTaskListByIdUseCase.kt | 13 ++ .../naz013/usecase/googletasks/KoinModule.kt | 1 + 12 files changed, 271 insertions(+), 241 deletions(-) create mode 100644 app/src/main/java/com/elementary/tasks/googletasks/tasklist/EditGoogleTaskListFragment.kt rename app/src/main/java/com/elementary/tasks/googletasks/tasklist/{GoogleTaskListViewModel.kt => EditGoogleTaskListViewModel.kt} (64%) delete mode 100644 app/src/main/java/com/elementary/tasks/googletasks/tasklist/GoogleTaskListActivity.kt rename app/src/main/res/layout/{activity_create_task_list.xml => fragment_google_task_list_edit.xml} (87%) rename app/src/main/res/menu/{activity_create_google_tasklist.xml => fragment_google_task_list_edit.xml} (100%) create mode 100644 usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/GetGoogleTaskListByIdUseCase.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2209031b..6ad0ed67f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -280,11 +280,6 @@ - () { when (it.itemId) { R.id.action_add -> { - startActivity(GoogleTaskListActivity::class.java) + navigate { navigate(R.id.editGoogleTaskListFragment) } } } true diff --git a/app/src/main/java/com/elementary/tasks/googletasks/KoinModule.kt b/app/src/main/java/com/elementary/tasks/googletasks/KoinModule.kt index e605d01b1..078fa6642 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/KoinModule.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/KoinModule.kt @@ -4,7 +4,7 @@ import android.os.Bundle import com.elementary.tasks.googletasks.list.TaskListViewModel import com.elementary.tasks.googletasks.preview.PreviewGoogleTaskViewModel import com.elementary.tasks.googletasks.task.EditGoogleTaskViewModel -import com.elementary.tasks.googletasks.tasklist.GoogleTaskListViewModel +import com.elementary.tasks.googletasks.tasklist.EditGoogleTaskListViewModel import com.elementary.tasks.googletasks.usecase.GoogleTaskListFactory import com.elementary.tasks.googletasks.usecase.db.DeleteGoogleTaskList import com.elementary.tasks.googletasks.usecase.db.DeleteGoogleTasks @@ -22,9 +22,9 @@ import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module val googleTaskModule = module { - viewModel { (listId: String) -> - GoogleTaskListViewModel( - listId, + viewModel { (arguments: Bundle?) -> + EditGoogleTaskListViewModel( + arguments, get(), get(), get(), @@ -46,6 +46,7 @@ val googleTaskModule = module { get(), get(), get(), + get(), get() ) } diff --git a/app/src/main/java/com/elementary/tasks/googletasks/list/TaskListFragment.kt b/app/src/main/java/com/elementary/tasks/googletasks/list/TaskListFragment.kt index b594ae203..7ddfccc05 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/list/TaskListFragment.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/list/TaskListFragment.kt @@ -17,13 +17,11 @@ import com.elementary.tasks.core.interfaces.ActionsListener import com.elementary.tasks.core.utils.ListActions import com.elementary.tasks.core.views.recyclerview.SpaceBetweenItemDecoration import com.elementary.tasks.databinding.FragmentGoogleListBinding -import com.elementary.tasks.googletasks.tasklist.GoogleTaskListActivity import com.elementary.tasks.navigation.toolbarfragment.BaseToolbarFragment import com.github.naz013.common.intent.IntentKeys import com.github.naz013.domain.GoogleTaskList import com.github.naz013.feature.common.livedata.nonNullObserve import com.github.naz013.ui.common.fragment.dp2px -import com.github.naz013.ui.common.fragment.startActivity import com.github.naz013.ui.common.isColorDark import com.github.naz013.ui.common.theme.ThemeProvider import com.github.naz013.ui.common.view.ViewUtils @@ -91,8 +89,13 @@ class TaskListFragment : BaseToolbarFragment() { private fun editListClick() { viewModel.currentTaskList?.also { - startActivity(GoogleTaskListActivity::class.java) { - putExtra(IntentKeys.INTENT_ID, it.listId) + navigate { + navigate( + R.id.editGoogleTaskListFragment, + Bundle().apply { + putString(IntentKeys.INTENT_ID, it.listId) + } + ) } } } diff --git a/app/src/main/java/com/elementary/tasks/googletasks/tasklist/EditGoogleTaskListFragment.kt b/app/src/main/java/com/elementary/tasks/googletasks/tasklist/EditGoogleTaskListFragment.kt new file mode 100644 index 000000000..809e26ce8 --- /dev/null +++ b/app/src/main/java/com/elementary/tasks/googletasks/tasklist/EditGoogleTaskListFragment.kt @@ -0,0 +1,177 @@ +package com.elementary.tasks.googletasks.tasklist + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.elementary.tasks.R +import com.elementary.tasks.core.data.Commands +import com.elementary.tasks.core.utils.ui.showError +import com.elementary.tasks.core.utils.ui.trimmedText +import com.elementary.tasks.databinding.FragmentGoogleTaskListEditBinding +import com.elementary.tasks.navigation.toolbarfragment.BaseToolbarFragment +import com.github.naz013.appwidgets.AppWidgetUpdater +import com.github.naz013.domain.GoogleTaskList +import com.github.naz013.feature.common.livedata.nonNullObserve +import com.github.naz013.logging.Logger +import com.github.naz013.ui.common.fragment.hideKeyboard +import com.github.naz013.ui.common.fragment.toast +import com.github.naz013.ui.common.theme.ThemeProvider +import com.github.naz013.ui.common.view.visibleGone +import org.koin.android.ext.android.inject +import org.koin.androidx.viewmodel.ext.android.viewModel +import org.koin.core.parameter.parametersOf + +class EditGoogleTaskListFragment : BaseToolbarFragment() { + + private val appWidgetUpdater by inject() + private val viewModel by viewModel { parametersOf(arguments) } + + override fun getTitle(): String { + return if (viewModel.hasId()) { + getString(R.string.edit_task_list) + } else { + getString(R.string.new_tasks_list) + } + } + + override fun inflate( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): FragmentGoogleTaskListEditBinding { + return FragmentGoogleTaskListEditBinding.inflate(inflater, container, false) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + Logger.i(TAG, "Opening the Google Task List edit screen for id: ${viewModel.listId}") + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.progressMessageView.text = getString(R.string.please_wait) + updateProgress(false) + + binding.colorSlider.setColors(ThemeProvider.colorsForSliderThemed(requireContext())) + binding.colorSlider.setSelectorColorResource( + if (isDark) { + R.color.pureWhite + } else { + R.color.pureBlack + } + ) + binding.colorSlider.setListener { position, _ -> + viewModel.onColorChanged(position) + } + + addMenu( + menuRes = R.menu.fragment_google_task_list_edit, + onMenuItemListener = { menuItem -> + return@addMenu when (menuItem.itemId) { + R.id.action_delete -> { + doIfPossible { deleteDialog() } + true + } + + R.id.action_add -> { + doIfPossible { saveTaskList() } + true + } + + else -> false + } + }, + menuModifier = { menu -> + menu.getItem(1).isVisible = viewModel.canDelete() + } + ) + + initViewModel() + viewModel.onCreated(savedInstanceState) + } + + override fun onDestroyView() { + super.onDestroyView() + hideKeyboard() + appWidgetUpdater.updateScheduleWidget() + } + + private fun initViewModel() { + viewModel.googleTaskList.nonNullObserve(this) { showTaskList(it) } + viewModel.isInProgress.nonNullObserve(this) { updateProgress(it) } + viewModel.result.nonNullObserve(this) { commands -> + if (commands == Commands.DELETED || commands == Commands.SAVED) { + moveBack() + } + } + viewModel.colorChanged.nonNullObserve(viewLifecycleOwner) { + binding.colorSlider.setSelection(it) + } + + lifecycle.addObserver(viewModel) + } + + private fun showTaskList(googleTaskList: GoogleTaskList) { + viewModel.editedTaskList = googleTaskList + if (!viewModel.isEdited) { + binding.editField.setText(googleTaskList.title) + if (googleTaskList.def == 1) { + binding.defaultCheck.isChecked = true + binding.defaultCheck.isEnabled = false + } + binding.colorSlider.setSelection(googleTaskList.color) + } + invalidateOptionsMenu() + } + + private fun updateProgress(b: Boolean) { + binding.progressView.visibleGone(b) + } + + private fun saveTaskList() { + val listName = binding.editField.trimmedText() + if (listName.isEmpty()) { + binding.nameLayout.showError(R.string.must_be_not_empty) + return + } + var isNew = false + val item = (viewModel.editedTaskList ?: GoogleTaskList().also { isNew = true }).apply { + title = listName + color = binding.colorSlider.selectedItem + updated = System.currentTimeMillis() + } + if (binding.defaultCheck.isChecked) { + item.def = 1 + } + + if (isNew) { + viewModel.newGoogleTaskList(item) + } else { + viewModel.updateGoogleTaskList(item) + } + } + + private fun deleteDialog() { + dialogues.getMaterialDialog(requireContext()) + .setMessage(getString(R.string.delete_this_list)) + .setPositiveButton(getString(R.string.yes)) { dialog, _ -> + dialog.dismiss() + viewModel.deleteGoogleTaskList() + } + .setNegativeButton(getString(R.string.no)) { dialog, _ -> dialog.dismiss() } + .create().show() + } + + private fun doIfPossible(f: () -> Unit) { + if (viewModel.isInProgress.value == true) { + toast(R.string.please_wait) + } else { + f.invoke() + } + } + + companion object { + private const val TAG = "EditGoogleTaskFragment" + } +} diff --git a/app/src/main/java/com/elementary/tasks/googletasks/tasklist/GoogleTaskListViewModel.kt b/app/src/main/java/com/elementary/tasks/googletasks/tasklist/EditGoogleTaskListViewModel.kt similarity index 64% rename from app/src/main/java/com/elementary/tasks/googletasks/tasklist/GoogleTaskListViewModel.kt rename to app/src/main/java/com/elementary/tasks/googletasks/tasklist/EditGoogleTaskListViewModel.kt index 9e0509217..46ae45354 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/tasklist/GoogleTaskListViewModel.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/tasklist/EditGoogleTaskListViewModel.kt @@ -1,55 +1,83 @@ package com.elementary.tasks.googletasks.tasklist +import android.os.Bundle import androidx.lifecycle.viewModelScope import com.elementary.tasks.core.arch.BaseProgressViewModel import com.elementary.tasks.core.data.Commands -import com.elementary.tasks.core.data.observeTable import com.github.naz013.analytics.AnalyticsEventSender import com.github.naz013.analytics.Feature import com.github.naz013.analytics.FeatureUsedEvent import com.github.naz013.cloudapi.googletasks.GoogleTasksApi +import com.github.naz013.common.intent.IntentKeys import com.github.naz013.domain.GoogleTaskList import com.github.naz013.feature.common.coroutine.DispatcherProvider +import com.github.naz013.feature.common.livedata.toLiveData +import com.github.naz013.feature.common.viewmodel.mutableLiveDataOf +import com.github.naz013.logging.Logger import com.github.naz013.repository.GoogleTaskListRepository import com.github.naz013.repository.GoogleTaskRepository -import com.github.naz013.repository.observer.TableChangeListenerFactory -import com.github.naz013.repository.table.Table +import com.github.naz013.usecase.googletasks.GetGoogleTaskListByIdUseCase import kotlinx.coroutines.launch -class GoogleTaskListViewModel( - listId: String, +class EditGoogleTaskListViewModel( + arguments: Bundle?, private val googleTasksApi: GoogleTasksApi, dispatcherProvider: DispatcherProvider, private val googleTaskRepository: GoogleTaskRepository, private val googleTaskListRepository: GoogleTaskListRepository, private val analyticsEventSender: AnalyticsEventSender, - tableChangeListenerFactory: TableChangeListenerFactory + private val getGoogleTaskListByIdUseCase: GetGoogleTaskListByIdUseCase ) : BaseProgressViewModel(dispatcherProvider) { - var googleTaskList = viewModelScope.observeTable( - table = Table.GoogleTaskList, - tableChangeListenerFactory = tableChangeListenerFactory, - queryProducer = { googleTaskListRepository.getById(listId) } - ) - var googleTask = viewModelScope.observeTable( - table = Table.GoogleTask, - tableChangeListenerFactory = tableChangeListenerFactory, - queryProducer = { googleTaskRepository.getAllByList(listId) } - ) + private val _googleTaskList = mutableLiveDataOf() + val googleTaskList = _googleTaskList.toLiveData() + + private val _colorChanged = mutableLiveDataOf() + val colorChanged = _colorChanged.toLiveData() var isEdited = false + private set var listId: String = "" - var action: String = "" + private set - var isLoading = false + private var color: Int = 0 var editedTaskList: GoogleTaskList? = null + init { + val id = arguments?.getString(IntentKeys.INTENT_ID) ?: "" + listId = id + viewModelScope.launch(dispatcherProvider.default()) { + postInProgress(true) + editedTaskList = getGoogleTaskListByIdUseCase(id) + editedTaskList?.also { + _googleTaskList.postValue(it) + } + postInProgress(false) + } + } + + fun onColorChanged(color: Int) { + this.color = color + } + + fun hasId(): Boolean { + return listId.isNotEmpty() + } + + fun onCreated(savedInstanceState: Bundle?) { + if (savedInstanceState != null) { + _colorChanged.postValue(color) + } + } + fun canDelete(): Boolean { return editedTaskList?.let { !it.isDefault() } ?: false } - fun deleteGoogleTaskList(googleTaskList: GoogleTaskList) { + fun deleteGoogleTaskList() { + val googleTaskList = editedTaskList ?: return postInProgress(true) + Logger.i(TAG, "Deleting Google Task List (${googleTaskList.listId})") viewModelScope.launch(dispatcherProvider.default()) { if (googleTasksApi.deleteTaskList(googleTaskList.listId)) { googleTaskListRepository.delete(googleTaskList.listId) @@ -73,6 +101,10 @@ class GoogleTaskListViewModel( fun newGoogleTaskList(googleTaskList: GoogleTaskList) { postInProgress(true) + Logger.i( + TAG, + "Creating Google Task List (${googleTaskList.listId}), default=${googleTaskList.isDefault()}" + ) viewModelScope.launch(dispatcherProvider.default()) { if (googleTaskList.isDefault()) { googleTaskListRepository.getDefault().forEach { @@ -94,6 +126,7 @@ class GoogleTaskListViewModel( fun updateGoogleTaskList(googleTaskList: GoogleTaskList) { postInProgress(true) + Logger.i(TAG, "Updating Google Task List (${googleTaskList.listId})") viewModelScope.launch(dispatcherProvider.default()) { if (googleTaskList.isDefault()) { googleTaskListRepository.getDefault().forEach { @@ -111,4 +144,8 @@ class GoogleTaskListViewModel( } } } + + companion object { + private const val TAG = "EditGoogleTaskViewModel" + } } diff --git a/app/src/main/java/com/elementary/tasks/googletasks/tasklist/GoogleTaskListActivity.kt b/app/src/main/java/com/elementary/tasks/googletasks/tasklist/GoogleTaskListActivity.kt deleted file mode 100644 index f90d445d6..000000000 --- a/app/src/main/java/com/elementary/tasks/googletasks/tasklist/GoogleTaskListActivity.kt +++ /dev/null @@ -1,188 +0,0 @@ -package com.elementary.tasks.googletasks.tasklist - -import android.os.Bundle -import android.view.View -import androidx.activity.enableEdgeToEdge -import com.elementary.tasks.R -import com.github.naz013.appwidgets.AppWidgetUpdater -import com.elementary.tasks.core.data.Commands -import com.github.naz013.ui.common.Dialogues -import com.elementary.tasks.core.utils.ui.showError -import com.elementary.tasks.core.utils.ui.trimmedText -import com.elementary.tasks.databinding.ActivityCreateTaskListBinding -import com.github.naz013.common.intent.IntentKeys -import com.github.naz013.domain.GoogleTaskList -import com.github.naz013.feature.common.livedata.nonNullObserve -import com.github.naz013.feature.common.livedata.nullObserve -import com.github.naz013.ui.common.activity.BindingActivity -import com.github.naz013.ui.common.activity.toast -import com.github.naz013.ui.common.theme.ThemeProvider -import com.github.naz013.ui.common.view.applyBottomInsets -import com.github.naz013.ui.common.view.applyTopInsets -import org.koin.android.ext.android.inject -import org.koin.androidx.viewmodel.ext.android.viewModel -import org.koin.core.parameter.parametersOf - -class GoogleTaskListActivity : BindingActivity() { - - private val appWidgetUpdater by inject() - private val dialogues by inject() - private val viewModel by viewModel { parametersOf(getId()) } - - override fun inflateBinding() = ActivityCreateTaskListBinding.inflate(layoutInflater) - - override fun onCreate(savedInstanceState: Bundle?) { - enableEdgeToEdge() - super.onCreate(savedInstanceState) - - binding.scrollView.applyBottomInsets() - binding.progressMessageView.text = getString(R.string.please_wait) - updateProgress(false) - - initActionBar() - binding.colorSlider.setColors(ThemeProvider.colorsForSliderThemed(this)) - binding.colorSlider.setSelectorColorResource( - if (isDarkMode) { - R.color.pureWhite - } else { - R.color.pureBlack - } - ) - - if (savedInstanceState != null) { - binding.colorSlider.setSelection(savedInstanceState.getInt(ARG_COLOR, 0)) - updateProgress(savedInstanceState.getBoolean(ARG_LOADING, false)) - } - - initViewModel() - } - - private fun getId(): String = intent.getStringExtra(IntentKeys.INTENT_ID) ?: "" - - override fun onSaveInstanceState(outState: Bundle) { - outState.putInt(ARG_COLOR, binding.colorSlider.selectedItem) - outState.putBoolean(ARG_LOADING, viewModel.isLoading) - super.onSaveInstanceState(outState) - } - - private fun updateProgress(b: Boolean) { - viewModel.isLoading = b - if (b) { - binding.progressView.visibility = View.VISIBLE - } else { - binding.progressView.visibility = View.GONE - } - } - - private fun initActionBar() { - binding.appBar.applyTopInsets() - binding.toolbar.setTitle(R.string.new_tasks_list) - binding.toolbar.setNavigationOnClickListener { handleBackPress() } - binding.toolbar.setOnMenuItemClickListener { menuItem -> - when (menuItem.itemId) { - R.id.action_delete -> { - doIfPossible { deleteDialog() } - true - } - - R.id.action_add -> { - doIfPossible { saveTaskList() } - true - } - - else -> false - } - } - updateMenu() - } - - private fun updateMenu() { - binding.toolbar.menu.also { - it.getItem(1).isVisible = viewModel.canDelete() - } - } - - private fun initViewModel() { - viewModel.googleTaskList.nullObserve(this) { editTaskList(it) } - viewModel.isInProgress.nonNullObserve(this) { updateProgress(it) } - viewModel.result.nonNullObserve(this) { commands -> - handleBackPress().takeIf { commands == Commands.DELETED || commands == Commands.SAVED } - } - } - - private fun editTaskList(googleTaskList: GoogleTaskList) { - binding.toolbar.title = getString(R.string.edit_task_list) - viewModel.editedTaskList = googleTaskList - if (!viewModel.isEdited) { - binding.editField.setText(googleTaskList.title) - if (googleTaskList.def == 1) { - binding.defaultCheck.isChecked = true - binding.defaultCheck.isEnabled = false - } - binding.colorSlider.setSelection(googleTaskList.color) - viewModel.isEdited = true - } - updateMenu() - } - - private fun saveTaskList() { - val listName = binding.editField.trimmedText() - if (listName.isEmpty()) { - binding.nameLayout.showError(R.string.must_be_not_empty) - return - } - var isNew = false - val item = (viewModel.editedTaskList ?: GoogleTaskList().also { isNew = true }).apply { - title = listName - color = binding.colorSlider.selectedItem - updated = System.currentTimeMillis() - } - if (binding.defaultCheck.isChecked) { - item.def = 1 - } - - if (isNew) { - viewModel.newGoogleTaskList(item) - } else { - viewModel.updateGoogleTaskList(item) - } - } - - private fun deleteDialog() { - dialogues.getMaterialDialog(this) - .setMessage(getString(R.string.delete_this_list)) - .setPositiveButton(getString(R.string.yes)) { dialog, _ -> - dialog.dismiss() - deleteList() - } - .setNegativeButton(getString(R.string.no)) { dialog, _ -> dialog.dismiss() } - .create().show() - } - - private fun deleteList() { - viewModel.editedTaskList?.let { viewModel.deleteGoogleTaskList(it) } - } - - override fun onDestroy() { - super.onDestroy() - appWidgetUpdater.updateScheduleWidget() - } - - override fun handleBackPress(): Boolean { - doIfPossible { finish() } - return true - } - - private fun doIfPossible(f: () -> Unit) { - if (viewModel.isLoading) { - toast(R.string.please_wait) - } else { - f.invoke() - } - } - - companion object { - private const val ARG_COLOR = "arg_color" - private const val ARG_LOADING = "arg_loading" - } -} diff --git a/app/src/main/res/layout/activity_create_task_list.xml b/app/src/main/res/layout/fragment_google_task_list_edit.xml similarity index 87% rename from app/src/main/res/layout/activity_create_task_list.xml rename to app/src/main/res/layout/fragment_google_task_list_edit.xml index 48f30cc3c..3ebf127bb 100644 --- a/app/src/main/res/layout/activity_create_task_list.xml +++ b/app/src/main/res/layout/fragment_google_task_list_edit.xml @@ -6,24 +6,6 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - + + + diff --git a/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/GetGoogleTaskListByIdUseCase.kt b/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/GetGoogleTaskListByIdUseCase.kt new file mode 100644 index 000000000..95177f24a --- /dev/null +++ b/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/GetGoogleTaskListByIdUseCase.kt @@ -0,0 +1,13 @@ +package com.github.naz013.usecase.googletasks + +import com.github.naz013.domain.GoogleTaskList +import com.github.naz013.repository.GoogleTaskListRepository + +class GetGoogleTaskListByIdUseCase( + private val googleTaskListRepository: GoogleTaskListRepository +) { + + suspend operator fun invoke(listId: String): GoogleTaskList? { + return googleTaskListRepository.getById(listId) + } +} diff --git a/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/KoinModule.kt b/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/KoinModule.kt index fcecee23d..9a7354dae 100644 --- a/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/KoinModule.kt +++ b/usecase/googletasks/src/main/kotlin/com/github/naz013/usecase/googletasks/KoinModule.kt @@ -4,6 +4,7 @@ import org.koin.dsl.module val googleTasksUseCaseModule = module { factory { GetAllGoogleTaskListsUseCase(get()) } + factory { GetGoogleTaskListByIdUseCase(get()) } factory { GetAllGoogleTasksUseCase(get()) } factory { GetGoogleTaskByIdUseCase(get()) } From 24e4bf25526538e29df70734e97f6aa21511956f Mon Sep 17 00:00:00 2001 From: Nazar Sukhovych Date: Sun, 12 Jan 2025 15:33:05 +0100 Subject: [PATCH 07/25] REM-930 - Remove old reminder builder --- app/src/main/AndroidManifest.xml | 15 +- .../tasks/calendar/BaseCalendarFragment.kt | 7 +- .../dayview/day/DayEventsListFragment.kt | 3 - .../dialogs/DialogExclusionPickerBinding.kt | 44 -- .../dialogs/DialogSelectExtraBinding.kt | 14 - .../core/binding/views/DateTimeViewBinding.kt | 11 - .../core/os/datapicker/ApplicationPicker.kt | 4 +- .../com/elementary/tasks/core/utils/DI.kt | 4 - .../tasks/core/utils/ExtFunctions.kt | 202 ------ .../elementary/tasks/core/utils/Notifier.kt | 6 +- .../tasks/core/utils/PresetInitProcessor.kt | 13 +- .../elementary/tasks/core/utils/SuperUtil.kt | 46 +- .../tasks/core/utils/params/Prefs.kt | 16 - .../tasks/core/utils/params/PrefsConstants.kt | 4 - .../elementary/tasks/core/views/ActionView.kt | 150 ---- .../tasks/core/views/AttachmentView.kt | 111 --- .../tasks/core/views/BeforePickerView.kt | 158 ---- ...ClosableLegacyBuilderRemovalWarningView.kt | 40 - .../tasks/core/views/ClosableTooltipView.kt | 56 -- .../tasks/core/views/DateTimeView.kt | 145 ---- .../tasks/core/views/ExclusionPickerView.kt | 239 ------ .../tasks/core/views/ExportToCalendarView.kt | 114 --- .../core/views/ExportToGoogleTasksView.kt | 136 ---- .../elementary/tasks/core/views/GroupView.kt | 55 -- .../tasks/core/views/LedPickerView.kt | 79 -- .../tasks/core/views/PriorityPickerView.kt | 99 --- .../tasks/core/views/RadiusPickerView.kt | 65 -- .../tasks/core/views/RepeatLimitView.kt | 63 -- .../elementary/tasks/core/views/RepeatView.kt | 214 ------ .../tasks/core/views/TuneExtraView.kt | 137 ---- .../core/views/viewgroup/UiSelectorView.kt | 208 ------ .../com/elementary/tasks/home/HomeFragment.kt | 5 +- .../notes/preview/NotePreviewActivity.kt | 7 +- .../elementary/tasks/reminder/KoinModule.kt | 27 +- .../tasks/reminder/ReminderBuilderLauncher.kt | 48 -- .../tasks/reminder/ReminderResolver.kt | 11 +- .../reminder/build/BuildReminderActivity.kt | 8 - .../build/adapter/BiTypeForUiAdapter.kt | 1 - .../adapter/ParamToTextAdapter.kt | 55 +- .../tasks/reminder/build/bi/BiFactoryICal.kt | 2 +- .../formatter/ical/ICalDayValueFormatter.kt | 2 +- .../build/formatter/ical/ICalFreqFormatter.kt | 2 +- .../ical/ICalListDayValueFormatter.kt | 2 +- .../recur => build}/preset/PresetAdapter.kt | 5 +- .../preset/PresetDiffCallback.kt | 3 +- .../reminder/build/reminder/EventData.kt | 8 + .../build/reminder/ICalDateTimeCalculator.kt | 21 +- .../reminder/compose/ICalDateTimeInjector.kt | 4 +- .../build/selectordialog/SelectorDialog.kt | 2 +- .../controller/ValueControllerFactory.kt | 2 +- .../controller/ical/ICalDateController.kt | 3 +- .../ical/ICalDayValueListController.kt | 4 +- .../controller/ical/ICalFreqController.kt | 4 +- .../controller/ical/ICalIntController.kt | 2 +- .../controller/ical/ICalIntListController.kt | 2 +- .../controller/ical/ICalTimeController.kt | 2 +- .../ical/ICalWeekStartController.kt | 4 +- .../reminder/create/ConfigureActivity.kt | 86 --- .../reminder/create/CreateReminderActivity.kt | 622 ---------------- .../reminder/create/EditReminderViewModel.kt | 175 ----- .../reminder/create/ReminderStateViewModel.kt | 76 -- .../create/fragments/ApplicationFragment.kt | 185 ----- .../reminder/create/fragments/DateFragment.kt | 124 ---- .../create/fragments/EmailFragment.kt | 121 ---- .../create/fragments/LocationFragment.kt | 405 ----------- .../create/fragments/MonthFragment.kt | 241 ------ .../create/fragments/RadiusTypeFragment.kt | 16 - .../create/fragments/ReminderInterface.kt | 22 - .../fragments/RepeatableTypeFragment.kt | 21 - .../reminder/create/fragments/ShopFragment.kt | 167 ----- .../create/fragments/TimerFragment.kt | 224 ------ .../reminder/create/fragments/TypeFragment.kt | 384 ---------- .../reminder/create/fragments/WeekFragment.kt | 223 ------ .../reminder/create/fragments/YearFragment.kt | 161 ---- .../create/fragments/recur/BuilderParam.kt | 30 - .../fragments/recur/BuilderParamLogic.kt | 48 -- .../create/fragments/recur/ByDayValidator.kt | 96 --- .../fragments/recur/RecurBuilderViewModel.kt | 557 -------------- .../create/fragments/recur/RecurFragment.kt | 685 ------------------ .../recur/adapter/BuilderParamDiffCallback.kt | 16 - .../recur/adapter/ParamBuilderAdapter.kt | 55 -- .../recur/intdialog/IntListAdapter.kt | 87 --- .../fragments/recur/intdialog/Number.kt | 7 - .../recur/preset/PresetSelectionActivity.kt | 107 --- .../fragments/recur/preset/PresetViewModel.kt | 40 - .../fragments/recur/preview/PreviewData.kt | 17 - .../recur/preview/PreviewDataAdapter.kt | 49 -- .../recur/preview/PreviewItemDiffCallback.kt | 15 - .../timer/UiUsedTimeListDiffCallback.kt | 15 - .../fragments/timer/UsedTimeViewModel.kt | 40 - .../dialog/ReminderDialog29Activity.kt | 10 +- .../reminder/lists/ReminderActionResolver.kt | 12 +- .../lists/active/RemindersFragment.kt | 7 +- .../reminder/lists/removed/ArchiveFragment.kt | 3 - .../lists/todo/TodoRemindersFragment.kt | 11 +- .../preview/ReminderPreviewActivity.kt | 6 +- .../fragments => }/recur/RecurHelpActivity.kt | 2 +- .../reminders/ManagePresetsFragment.kt | 2 +- .../reminders/RemindersSettingsFragment.kt | 51 +- .../tasks/splash/SplashScreenActivity.kt | 5 +- .../fragment_reminder_application.xml | 260 ------- .../fragment_reminder_date.xml | 187 ----- .../fragment_reminder_email.xml | 225 ------ .../fragment_reminder_location.xml | 260 ------- .../fragment_reminder_month.xml | 309 -------- .../fragment_reminder_shop.xml | 225 ------ .../fragment_reminder_timer.xml | 203 ------ .../fragment_reminder_weekdays.xml | 342 --------- .../fragment_reminder_year.xml | 177 ----- .../fragment_reminder_application.xml | 235 ------ .../layout-sw600dp/fragment_reminder_date.xml | 161 ---- .../fragment_reminder_email.xml | 199 ----- .../fragment_reminder_location.xml | 258 ------- .../fragment_reminder_month.xml | 284 -------- .../layout-sw600dp/fragment_reminder_shop.xml | 193 ----- .../fragment_reminder_timer.xml | 177 ----- .../fragment_reminder_weekdays.xml | 318 -------- .../layout-sw600dp/fragment_reminder_year.xml | 152 ---- app/src/main/res/layout/a_components.xml | 6 - .../res/layout/activity_create_reminder.xml | 43 -- .../res/layout/activity_recur_preset_list.xml | 66 -- .../res/layout/dialog_bottom_color_slider.xml | 18 - .../layout/dialog_bottom_seek_and_title.xml | 29 - .../res/layout/dialog_exclusion_picker.xml | 377 ---------- app/src/main/res/layout/dialog_recur_day.xml | 56 -- .../res/layout/dialog_recur_day_advanced.xml | 35 - .../main/res/layout/dialog_recur_int_list.xml | 45 -- .../res/layout/dialog_recur_single_int.xml | 13 - .../main/res/layout/dialog_select_extra.xml | 51 -- .../layout/fragment_reminder_application.xml | 233 ------ .../res/layout/fragment_reminder_date.xml | 161 ---- .../res/layout/fragment_reminder_email.xml | 196 ----- .../res/layout/fragment_reminder_location.xml | 259 ------- .../res/layout/fragment_reminder_month.xml | 281 ------- .../res/layout/fragment_reminder_recur.xml | 307 -------- .../res/layout/fragment_reminder_shop.xml | 191 ----- .../res/layout/fragment_reminder_timer.xml | 175 ----- .../res/layout/fragment_reminder_weekdays.xml | 316 -------- .../res/layout/fragment_reminder_year.xml | 150 ---- .../layout/fragment_settings_reminders.xml | 9 - .../fragment_settings_theme_preview.xml | 6 - .../res/layout/list_item_recur_builder.xml | 40 - .../res/layout/list_item_recur_int_dialog.xml | 13 - .../res/layout/list_item_recur_preview.xml | 12 - .../main/res/layout/list_item_used_time.xml | 12 - app/src/main/res/layout/view_action.xml | 112 --- app/src/main/res/layout/view_attachment.xml | 79 -- .../main/res/layout/view_calendar_export.xml | 66 -- .../main/res/layout/view_closable_tooltip.xml | 43 -- app/src/main/res/layout/view_date_time.xml | 43 -- .../main/res/layout/view_exclusion_picker.xml | 68 -- app/src/main/res/layout/view_group.xml | 69 -- app/src/main/res/layout/view_led_color.xml | 106 --- .../layout/view_legacy_builder_removal.xml | 67 -- app/src/main/res/layout/view_priority.xml | 98 --- .../main/res/layout/view_radius_picker.xml | 77 -- .../main/res/layout/view_remind_before.xml | 85 --- app/src/main/res/layout/view_repeat.xml | 101 --- app/src/main/res/layout/view_repeat_limit.xml | 40 - app/src/main/res/layout/view_selector.xml | 42 -- app/src/main/res/layout/view_tasks_export.xml | 66 -- app/src/main/res/layout/view_tune_extra.xml | 68 -- .../res/menu/activity_builder_reminder.xml | 5 - .../res/menu/activity_create_reminder.xml | 26 - .../fragments/recur/BuilderParamLogicTest.kt | 216 ------ .../github/naz013/ui/common/login/LoginApi.kt | 6 +- 166 files changed, 99 insertions(+), 16569 deletions(-) delete mode 100644 app/src/main/java/com/elementary/tasks/core/binding/dialogs/DialogExclusionPickerBinding.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/binding/dialogs/DialogSelectExtraBinding.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/binding/views/DateTimeViewBinding.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/ActionView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/AttachmentView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/BeforePickerView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/ClosableLegacyBuilderRemovalWarningView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/ClosableTooltipView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/DateTimeView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/ExclusionPickerView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/ExportToCalendarView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/ExportToGoogleTasksView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/GroupView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/LedPickerView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/PriorityPickerView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/RadiusPickerView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/RepeatLimitView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/RepeatView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/TuneExtraView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/core/views/viewgroup/UiSelectorView.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/ReminderBuilderLauncher.kt rename app/src/main/java/com/elementary/tasks/reminder/{create/fragments/recur => build}/adapter/ParamToTextAdapter.kt (61%) rename app/src/main/java/com/elementary/tasks/reminder/{create/fragments/recur => build}/preset/PresetAdapter.kt (94%) rename app/src/main/java/com/elementary/tasks/reminder/{create/fragments/recur => build}/preset/PresetDiffCallback.kt (81%) create mode 100644 app/src/main/java/com/elementary/tasks/reminder/build/reminder/EventData.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/ConfigureActivity.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/CreateReminderActivity.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/EditReminderViewModel.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/ReminderStateViewModel.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/ApplicationFragment.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/DateFragment.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/EmailFragment.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/LocationFragment.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/MonthFragment.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/RadiusTypeFragment.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/ReminderInterface.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/RepeatableTypeFragment.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/ShopFragment.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/TimerFragment.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/TypeFragment.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/WeekFragment.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/YearFragment.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/BuilderParam.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/BuilderParamLogic.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/ByDayValidator.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/RecurBuilderViewModel.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/RecurFragment.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/adapter/BuilderParamDiffCallback.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/adapter/ParamBuilderAdapter.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/intdialog/IntListAdapter.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/intdialog/Number.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preset/PresetSelectionActivity.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preset/PresetViewModel.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preview/PreviewData.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preview/PreviewDataAdapter.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preview/PreviewItemDiffCallback.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/timer/UiUsedTimeListDiffCallback.kt delete mode 100644 app/src/main/java/com/elementary/tasks/reminder/create/fragments/timer/UsedTimeViewModel.kt rename app/src/main/java/com/elementary/tasks/reminder/{create/fragments => }/recur/RecurHelpActivity.kt (94%) delete mode 100644 app/src/main/res/layout-sw600dp-land/fragment_reminder_application.xml delete mode 100644 app/src/main/res/layout-sw600dp-land/fragment_reminder_date.xml delete mode 100644 app/src/main/res/layout-sw600dp-land/fragment_reminder_email.xml delete mode 100644 app/src/main/res/layout-sw600dp-land/fragment_reminder_location.xml delete mode 100644 app/src/main/res/layout-sw600dp-land/fragment_reminder_month.xml delete mode 100644 app/src/main/res/layout-sw600dp-land/fragment_reminder_shop.xml delete mode 100644 app/src/main/res/layout-sw600dp-land/fragment_reminder_timer.xml delete mode 100644 app/src/main/res/layout-sw600dp-land/fragment_reminder_weekdays.xml delete mode 100644 app/src/main/res/layout-sw600dp-land/fragment_reminder_year.xml delete mode 100644 app/src/main/res/layout-sw600dp/fragment_reminder_application.xml delete mode 100644 app/src/main/res/layout-sw600dp/fragment_reminder_date.xml delete mode 100644 app/src/main/res/layout-sw600dp/fragment_reminder_email.xml delete mode 100644 app/src/main/res/layout-sw600dp/fragment_reminder_location.xml delete mode 100644 app/src/main/res/layout-sw600dp/fragment_reminder_month.xml delete mode 100644 app/src/main/res/layout-sw600dp/fragment_reminder_shop.xml delete mode 100644 app/src/main/res/layout-sw600dp/fragment_reminder_timer.xml delete mode 100644 app/src/main/res/layout-sw600dp/fragment_reminder_weekdays.xml delete mode 100644 app/src/main/res/layout-sw600dp/fragment_reminder_year.xml delete mode 100644 app/src/main/res/layout/activity_create_reminder.xml delete mode 100644 app/src/main/res/layout/activity_recur_preset_list.xml delete mode 100644 app/src/main/res/layout/dialog_bottom_color_slider.xml delete mode 100644 app/src/main/res/layout/dialog_bottom_seek_and_title.xml delete mode 100644 app/src/main/res/layout/dialog_exclusion_picker.xml delete mode 100644 app/src/main/res/layout/dialog_recur_day.xml delete mode 100644 app/src/main/res/layout/dialog_recur_day_advanced.xml delete mode 100644 app/src/main/res/layout/dialog_recur_int_list.xml delete mode 100644 app/src/main/res/layout/dialog_recur_single_int.xml delete mode 100644 app/src/main/res/layout/dialog_select_extra.xml delete mode 100644 app/src/main/res/layout/fragment_reminder_application.xml delete mode 100644 app/src/main/res/layout/fragment_reminder_date.xml delete mode 100644 app/src/main/res/layout/fragment_reminder_email.xml delete mode 100644 app/src/main/res/layout/fragment_reminder_location.xml delete mode 100644 app/src/main/res/layout/fragment_reminder_month.xml delete mode 100644 app/src/main/res/layout/fragment_reminder_recur.xml delete mode 100644 app/src/main/res/layout/fragment_reminder_shop.xml delete mode 100644 app/src/main/res/layout/fragment_reminder_timer.xml delete mode 100644 app/src/main/res/layout/fragment_reminder_weekdays.xml delete mode 100644 app/src/main/res/layout/fragment_reminder_year.xml delete mode 100644 app/src/main/res/layout/list_item_recur_builder.xml delete mode 100644 app/src/main/res/layout/list_item_recur_int_dialog.xml delete mode 100644 app/src/main/res/layout/list_item_recur_preview.xml delete mode 100644 app/src/main/res/layout/list_item_used_time.xml delete mode 100644 app/src/main/res/layout/view_action.xml delete mode 100644 app/src/main/res/layout/view_attachment.xml delete mode 100644 app/src/main/res/layout/view_calendar_export.xml delete mode 100644 app/src/main/res/layout/view_closable_tooltip.xml delete mode 100644 app/src/main/res/layout/view_date_time.xml delete mode 100644 app/src/main/res/layout/view_exclusion_picker.xml delete mode 100644 app/src/main/res/layout/view_group.xml delete mode 100644 app/src/main/res/layout/view_led_color.xml delete mode 100644 app/src/main/res/layout/view_legacy_builder_removal.xml delete mode 100644 app/src/main/res/layout/view_priority.xml delete mode 100644 app/src/main/res/layout/view_radius_picker.xml delete mode 100644 app/src/main/res/layout/view_remind_before.xml delete mode 100644 app/src/main/res/layout/view_repeat.xml delete mode 100644 app/src/main/res/layout/view_repeat_limit.xml delete mode 100644 app/src/main/res/layout/view_selector.xml delete mode 100644 app/src/main/res/layout/view_tasks_export.xml delete mode 100644 app/src/main/res/layout/view_tune_extra.xml delete mode 100644 app/src/main/res/menu/activity_create_reminder.xml delete mode 100644 app/src/test/java/com/elementary/tasks/reminder/create/fragments/recur/BuilderParamLogicTest.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6ad0ed67f..91837f7c8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -221,12 +221,6 @@ - - - : BaseTopToolbarFragment() { protected val dateTimeManager by inject() - private val reminderBuilderLauncher by inject() protected var date: LocalDate = LocalDate.now() private var mDialog: AlertDialog? = null @@ -54,7 +54,6 @@ abstract class BaseCalendarFragment : BaseTopToolbarFragment ) private val reminderResolver = ReminderResolver( dialogAction = { dialogues }, - reminderBuilderLauncher = reminderBuilderLauncher, toggleAction = { }, deleteAction = { }, skipAction = { } @@ -78,7 +77,7 @@ abstract class BaseCalendarFragment : BaseTopToolbarFragment dateTime = LocalDateTime.of(date, LocalTime.now()) ) withActivity { - reminderBuilderLauncher.openDeepLink(it, deepLinkData) { } + LoginApi.openLogged(it, BuildReminderActivity::class.java, deepLinkData) } } } diff --git a/app/src/main/java/com/elementary/tasks/calendar/dayview/day/DayEventsListFragment.kt b/app/src/main/java/com/elementary/tasks/calendar/dayview/day/DayEventsListFragment.kt index 94df057cb..a918d5bae 100644 --- a/app/src/main/java/com/elementary/tasks/calendar/dayview/day/DayEventsListFragment.kt +++ b/app/src/main/java/com/elementary/tasks/calendar/dayview/day/DayEventsListFragment.kt @@ -17,7 +17,6 @@ import com.elementary.tasks.core.arch.BindingFragment import com.elementary.tasks.core.interfaces.ActionsListener import com.elementary.tasks.core.utils.ListActions import com.elementary.tasks.databinding.FragmentEventsListBinding -import com.elementary.tasks.reminder.ReminderBuilderLauncher import com.elementary.tasks.reminder.ReminderResolver import com.github.naz013.common.intent.IntentKeys import com.github.naz013.feature.common.livedata.nonNullObserve @@ -30,7 +29,6 @@ class DayEventsListFragment : BindingFragment() { private val themeProvider by inject() private val viewModel by inject() - private val reminderBuilderLauncher by inject() private val dayEventsAdapter = DayEventsAdapter(isDark = themeProvider.isDark) private val birthdayResolver = BirthdayResolver( @@ -55,7 +53,6 @@ class DayEventsListFragment : BindingFragment() { ) private val reminderResolver = ReminderResolver( dialogAction = { dialogues }, - reminderBuilderLauncher = reminderBuilderLauncher, toggleAction = { }, deleteAction = { reminder -> viewModel.moveToTrash(reminder) }, skipAction = { reminder -> viewModel.skip(reminder) } diff --git a/app/src/main/java/com/elementary/tasks/core/binding/dialogs/DialogExclusionPickerBinding.kt b/app/src/main/java/com/elementary/tasks/core/binding/dialogs/DialogExclusionPickerBinding.kt deleted file mode 100644 index 4299d4975..000000000 --- a/app/src/main/java/com/elementary/tasks/core/binding/dialogs/DialogExclusionPickerBinding.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.elementary.tasks.core.binding.dialogs - -import android.view.View -import android.widget.RadioButton -import android.widget.RadioGroup -import android.widget.TextView -import android.widget.ToggleButton -import com.elementary.tasks.R -import com.github.naz013.ui.common.view.Binding - -class DialogExclusionPickerBinding(view: View) : Binding(view) { - val radioGroup: RadioGroup by bindView(R.id.radioGroup) - val selectInterval: RadioButton by bindView(R.id.selectInterval) - val selectHours: RadioButton by bindView(R.id.selectHours) - val intervalContainer: View by bindView(R.id.intervalContainer) - val hoursContainer: View by bindView(R.id.hoursContainer) - val from: TextView by bindView(R.id.from) - val to: TextView by bindView(R.id.to) - - val zero: ToggleButton by bindView(R.id.zero) - val one: ToggleButton by bindView(R.id.one) - val two: ToggleButton by bindView(R.id.two) - val three: ToggleButton by bindView(R.id.three) - val four: ToggleButton by bindView(R.id.four) - val five: ToggleButton by bindView(R.id.five) - val six: ToggleButton by bindView(R.id.six) - val seven: ToggleButton by bindView(R.id.seven) - val eight: ToggleButton by bindView(R.id.eight) - val nine: ToggleButton by bindView(R.id.nine) - val ten: ToggleButton by bindView(R.id.ten) - val eleven: ToggleButton by bindView(R.id.eleven) - val twelve: ToggleButton by bindView(R.id.twelve) - val thirteen: ToggleButton by bindView(R.id.thirteen) - val fourteen: ToggleButton by bindView(R.id.fourteen) - val fifteen: ToggleButton by bindView(R.id.fifteen) - val sixteen: ToggleButton by bindView(R.id.sixteen) - val seventeen: ToggleButton by bindView(R.id.seventeen) - val eighteen: ToggleButton by bindView(R.id.eighteen) - val nineteen: ToggleButton by bindView(R.id.nineteen) - val twenty: ToggleButton by bindView(R.id.twenty) - val twentyOne: ToggleButton by bindView(R.id.twentyOne) - val twentyTwo: ToggleButton by bindView(R.id.twentyTwo) - val twentyThree: ToggleButton by bindView(R.id.twentyThree) -} diff --git a/app/src/main/java/com/elementary/tasks/core/binding/dialogs/DialogSelectExtraBinding.kt b/app/src/main/java/com/elementary/tasks/core/binding/dialogs/DialogSelectExtraBinding.kt deleted file mode 100644 index a9e1eb4ce..000000000 --- a/app/src/main/java/com/elementary/tasks/core/binding/dialogs/DialogSelectExtraBinding.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.elementary.tasks.core.binding.dialogs - -import android.view.View -import android.widget.CheckBox -import androidx.appcompat.widget.SwitchCompat -import com.elementary.tasks.R -import com.github.naz013.ui.common.view.Binding - -class DialogSelectExtraBinding(view: View) : Binding(view) { - val extraSwitch: SwitchCompat by bindView(R.id.extraSwitch) - val vibrationCheck: CheckBox by bindView(R.id.vibrationCheck) - val voiceCheck: CheckBox by bindView(R.id.voiceCheck) - val repeatCheck: CheckBox by bindView(R.id.repeatCheck) -} diff --git a/app/src/main/java/com/elementary/tasks/core/binding/views/DateTimeViewBinding.kt b/app/src/main/java/com/elementary/tasks/core/binding/views/DateTimeViewBinding.kt deleted file mode 100644 index 513f87e53..000000000 --- a/app/src/main/java/com/elementary/tasks/core/binding/views/DateTimeViewBinding.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.elementary.tasks.core.binding.views - -import android.view.View -import android.widget.TextView -import com.elementary.tasks.R -import com.github.naz013.ui.common.view.Binding - -class DateTimeViewBinding(view: View) : Binding(view) { - val dateField: TextView by bindView(R.id.dateField) - val timeField: TextView by bindView(R.id.timeField) -} diff --git a/app/src/main/java/com/elementary/tasks/core/os/datapicker/ApplicationPicker.kt b/app/src/main/java/com/elementary/tasks/core/os/datapicker/ApplicationPicker.kt index 0b6efca2b..0e177f212 100644 --- a/app/src/main/java/com/elementary/tasks/core/os/datapicker/ApplicationPicker.kt +++ b/app/src/main/java/com/elementary/tasks/core/os/datapicker/ApplicationPicker.kt @@ -9,10 +9,10 @@ import androidx.fragment.app.Fragment import com.elementary.tasks.core.apps.SelectApplicationActivity import com.github.naz013.common.intent.ActivityLauncherCreator import com.github.naz013.common.intent.FragmentLauncherCreator -import com.github.naz013.ui.common.context.intentForClass import com.github.naz013.common.intent.IntentKeys import com.github.naz013.common.intent.IntentPicker import com.github.naz013.common.intent.LauncherCreator +import com.github.naz013.ui.common.context.intentForClass class ApplicationPicker private constructor( launcherCreator: LauncherCreator, @@ -32,7 +32,7 @@ class ApplicationPicker private constructor( resultCallback: (String) -> Unit ) : this(FragmentLauncherCreator(fragment), resultCallback) - fun pickApplication() { + private fun pickApplication() { launch(getIntent()) } diff --git a/app/src/main/java/com/elementary/tasks/core/utils/DI.kt b/app/src/main/java/com/elementary/tasks/core/utils/DI.kt index b5924a148..0e3039865 100644 --- a/app/src/main/java/com/elementary/tasks/core/utils/DI.kt +++ b/app/src/main/java/com/elementary/tasks/core/utils/DI.kt @@ -61,8 +61,6 @@ import com.elementary.tasks.places.create.PlaceViewModel import com.elementary.tasks.places.list.PlacesViewModel import com.elementary.tasks.places.work.PlaceDeleteBackupWorker import com.elementary.tasks.places.work.PlaceSingleBackupWorker -import com.elementary.tasks.reminder.create.ReminderStateViewModel -import com.elementary.tasks.reminder.create.fragments.timer.UsedTimeViewModel import com.elementary.tasks.reminder.work.CheckEventsWorker import com.elementary.tasks.reminder.work.ReminderDeleteBackupWorker import com.elementary.tasks.reminder.work.ReminderSingleBackupWorker @@ -114,10 +112,8 @@ val viewModelModule = module { viewModel { SelectApplicationViewModel(get(), get()) } viewModel { PlacesViewModel(get(), get(), get(), get(), get()) } - viewModel { UsedTimeViewModel(get(), get(), get(), get()) } viewModel { CloudViewModel(get(), get(), get(), get(), get()) } - viewModel { ReminderStateViewModel(get(), get()) } viewModel { SplashViewModel( diff --git a/app/src/main/java/com/elementary/tasks/core/utils/ExtFunctions.kt b/app/src/main/java/com/elementary/tasks/core/utils/ExtFunctions.kt index 5321c1552..8ab90ac2f 100644 --- a/app/src/main/java/com/elementary/tasks/core/utils/ExtFunctions.kt +++ b/app/src/main/java/com/elementary/tasks/core/utils/ExtFunctions.kt @@ -1,22 +1,5 @@ package com.elementary.tasks.core.utils -import android.text.Editable -import android.text.TextWatcher -import android.widget.EditText -import androidx.appcompat.widget.AppCompatEditText -import com.elementary.tasks.core.views.ActionView -import com.elementary.tasks.core.views.AttachmentView -import com.elementary.tasks.core.views.BeforePickerView -import com.elementary.tasks.core.views.ExclusionPickerView -import com.elementary.tasks.core.views.ExportToCalendarView -import com.elementary.tasks.core.views.ExportToGoogleTasksView -import com.elementary.tasks.core.views.LedPickerView -import com.elementary.tasks.core.views.PriorityPickerView -import com.elementary.tasks.core.views.RepeatLimitView -import com.elementary.tasks.core.views.RepeatView -import com.elementary.tasks.core.views.TuneExtraView -import com.github.naz013.domain.Reminder -import com.github.naz013.logging.Logger import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Dispatchers @@ -40,188 +23,3 @@ fun launchIo( start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> Unit ): Job = GlobalScope.launch(Dispatchers.IO, start, block) - -@Deprecated("Will be removed in the future") -fun EditText.onChanged(function: (String) -> Unit) { - this.addTextChangedListener(object : TextWatcher { - override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { - function.invoke(s.toString().trim()) - } - - override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { - } - - override fun afterTextChanged(s: Editable?) { - } - }) -} - -@Deprecated("Will be removed in the future") -fun TuneExtraView.Extra.fromReminder(reminder: Reminder): TuneExtraView.Extra { - this.useGlobal = reminder.useGlobal - this.vibrate = reminder.vibrate - this.repeatNotification = reminder.repeatNotification - this.notifyByVoice = reminder.notifyByVoice - return this -} - -@Deprecated("Will be removed in the future") -fun TuneExtraView.Extra.toReminder(reminder: Reminder): Reminder { - reminder.useGlobal = this.useGlobal - reminder.vibrate = this.vibrate - reminder.repeatNotification = this.repeatNotification - reminder.notifyByVoice = this.notifyByVoice - return reminder -} - -@Deprecated("Will be removed in the future") -fun Reminder.copyExtra(reminder: Reminder) { - this.useGlobal = reminder.useGlobal - this.vibrate = reminder.vibrate - this.repeatNotification = reminder.repeatNotification - this.notifyByVoice = reminder.notifyByVoice - this.awake = reminder.awake - this.unlock = reminder.unlock - this.auto = reminder.auto -} - -@Deprecated("Will be removed in the future") -fun AppCompatEditText.bindProperty(value: String, listener: ((String) -> Unit)) { - this.setText(value) - this.addTextChangedListener(object : TextWatcher { - override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { - if (s != null) { - listener.invoke(s.toString()) - } - } - - override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { - } - - override fun afterTextChanged(s: Editable?) { - } - }) -} - -@Deprecated("Will be removed in the future") -fun ExportToCalendarView.bindProperty( - enabled: Boolean, - calendarId: Long, - listener: ((Boolean, Long) -> Unit) -) { - this.calendarState = if (enabled) { - ExportToCalendarView.State.YES - } else { - ExportToCalendarView.State.NO - } - this.calendarId = calendarId - this.listener = object : ExportToCalendarView.SelectionListener { - override fun onChanged(enabled: Boolean, calendarId: Long) { - listener.invoke(enabled, calendarId) - } - } -} - -@Deprecated("Will be removed in the future") -fun ExportToGoogleTasksView.bindProperty( - enabled: Boolean, - listId: String?, - listener: ((Boolean, String) -> Unit) -) { - this.tasksState = if (enabled) { - ExportToGoogleTasksView.State.YES - } else { - ExportToGoogleTasksView.State.NO - } - this.taskListId = listId - this.listener = object : ExportToGoogleTasksView.SelectionListener { - override fun onChanged(enabled: Boolean, taskListId: String) { - listener.invoke(enabled, taskListId) - } - } -} - -@Deprecated("Will be removed in the future") -fun RepeatView.bindProperty(value: Long, listener: ((Long) -> Unit)) { - this.repeat = value - this.onRepeatChangeListener = object : RepeatView.OnRepeatChangeListener { - override fun onChanged(repeat: Long) { - Logger.d("onChanged: $repeat") - listener.invoke(repeat) - } - } -} - -@Deprecated("Will be removed in the future") -fun BeforePickerView.bindProperty(value: Long, listener: ((Long) -> Unit)?) { - this.setBefore(value) - this.onBeforeChangedListener = object : BeforePickerView.OnBeforeChangedListener { - override fun onChanged(beforeMills: Long) { - listener?.invoke(beforeMills) - } - } -} - -@Deprecated("Will be removed in the future") -fun PriorityPickerView.bindProperty(value: Int, listener: ((Int) -> Unit)) { - this.priority = value - this.onPriorityChaneListener = { - listener.invoke(it) - } -} - -@Deprecated("Will be removed in the future") -fun ActionView.bindProperty(value: String, listener: ((String) -> Unit)) { - this.number = value - this.setListener(object : ActionView.OnActionListener { - override fun onStateChanged(state: ActionView.ActionState, phone: String) { - listener.invoke(phone) - } - }) -} - -@Deprecated("Will be removed in the future") -fun AttachmentView.bindProperty(value: String, listener: ((String) -> Unit)) { - this.content = value - this.onFileUpdateListener = { - listener.invoke(it) - } -} - -@Deprecated("Will be removed in the future") -fun RepeatLimitView.bindProperty(value: Int, listener: ((Int) -> Unit)) { - this.setLimit(value) - this.onLevelUpdateListener = { - listener.invoke(it) - } -} - -@Deprecated("Will be removed in the future") -fun LedPickerView.bindProperty(value: Int, listener: ((Int) -> Unit)) { - this.led = value - this.onLedChangeListener = { - listener.invoke(it) - } -} - -@Deprecated("Will be removed in the future") -fun TuneExtraView.bindProperty(value: Reminder, listener: ((Reminder) -> Unit)) { - this.extra = TuneExtraView.Extra().fromReminder(value) - this.onExtraUpdateListener = { - listener.invoke(it.toReminder(value)) - } -} - -@Deprecated("Will be removed in the future") -fun ExclusionPickerView.bindProperty( - v1: List, - v2: String, - v3: String, - listener: ((List, String, String) -> Unit) -) { - this.setHours(v1) - this.setRangeHours(v2, v3) - this.onExclusionUpdateListener = { a1, a2, a3 -> - listener.invoke(a1, a2, a3) - } -} diff --git a/app/src/main/java/com/elementary/tasks/core/utils/Notifier.kt b/app/src/main/java/com/elementary/tasks/core/utils/Notifier.kt index 58f33712f..0e399a997 100644 --- a/app/src/main/java/com/elementary/tasks/core/utils/Notifier.kt +++ b/app/src/main/java/com/elementary/tasks/core/utils/Notifier.kt @@ -22,7 +22,7 @@ import com.elementary.tasks.core.services.PermanentReminderReceiver import com.elementary.tasks.core.utils.params.Prefs import com.elementary.tasks.core.utils.params.PrefsConstants.WEAR_NOTIFICATION import com.elementary.tasks.notes.create.CreateNoteActivity -import com.elementary.tasks.reminder.ReminderBuilderLauncher +import com.elementary.tasks.reminder.build.BuildReminderActivity import com.elementary.tasks.splash.SplashScreenActivity import com.github.naz013.common.Permissions import com.github.naz013.common.datetime.DateTimeManager @@ -187,10 +187,10 @@ class Notifier( } else { builder.priority = NotificationCompat.PRIORITY_MIN } - val resultIntent = Intent(context, ReminderBuilderLauncher.PENDING_INTENT_CLASS) + val resultIntent = Intent(context, BuildReminderActivity::class.java) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) val stackBuilder = TaskStackBuilder.create(context) - stackBuilder.addParentStack(ReminderBuilderLauncher.PENDING_INTENT_CLASS) + stackBuilder.addParentStack(BuildReminderActivity::class.java) stackBuilder.addNextIntentWithParentStack(resultIntent) val resultPendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { stackBuilder.getPendingIntent(0, PendingIntent.FLAG_IMMUTABLE) diff --git a/app/src/main/java/com/elementary/tasks/core/utils/PresetInitProcessor.kt b/app/src/main/java/com/elementary/tasks/core/utils/PresetInitProcessor.kt index 232226386..bf125bd08 100644 --- a/app/src/main/java/com/elementary/tasks/core/utils/PresetInitProcessor.kt +++ b/app/src/main/java/com/elementary/tasks/core/utils/PresetInitProcessor.kt @@ -1,13 +1,13 @@ package com.elementary.tasks.core.utils import com.elementary.tasks.R -import com.github.naz013.common.PackageManagerWrapper import com.elementary.tasks.core.utils.params.Prefs import com.elementary.tasks.reminder.build.preset.BuilderPresetsGenerateUseCase import com.elementary.tasks.reminder.build.preset.DefaultPresetsGenerateUseCase +import com.github.naz013.common.PackageManagerWrapper +import com.github.naz013.common.TextProvider import com.github.naz013.domain.PresetType import com.github.naz013.domain.RecurPreset -import com.github.naz013.common.TextProvider import com.github.naz013.repository.RecurPresetRepository import org.threeten.bp.LocalDateTime @@ -38,9 +38,6 @@ class PresetInitProcessor( val prefsVersionCode = prefs.lastVersionCode if (prefsVersionCode < versionCode) { // Updated app - prefs.useLegacyBuilder = true - prefs.canChangeBuilder = true - prefs.reminderCreatorParams.apply { setICalendarEnabled(true) setPhoneCallEnabled(true) @@ -51,12 +48,6 @@ class PresetInitProcessor( }.also { prefs.reminderCreatorParams = it } - } else if (prefsVersionCode == Long.MAX_VALUE) { - // Fresh install - prefs.useLegacyBuilder = false - prefs.canChangeBuilder = false - } else { - // Do nothing } } diff --git a/app/src/main/java/com/elementary/tasks/core/utils/SuperUtil.kt b/app/src/main/java/com/elementary/tasks/core/utils/SuperUtil.kt index 12ec3d9a5..052649cd8 100644 --- a/app/src/main/java/com/elementary/tasks/core/utils/SuperUtil.kt +++ b/app/src/main/java/com/elementary/tasks/core/utils/SuperUtil.kt @@ -7,19 +7,15 @@ import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent import android.content.pm.PackageManager -import android.location.LocationManager import android.media.AudioManager import android.net.Uri -import android.provider.Settings import android.util.Base64 import android.widget.Toast import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import com.elementary.tasks.R -import com.github.naz013.common.Permissions import com.elementary.tasks.core.services.GeolocationService -import com.github.naz013.ui.common.Dialogues -import com.elementary.tasks.reminder.create.fragments.ReminderInterface +import com.github.naz013.common.Permissions import com.github.naz013.logging.Logger import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.GoogleApiAvailability @@ -90,46 +86,6 @@ object SuperUtil { } } - fun checkNotificationPermission(activity: Context): Boolean { - val notificationManager = - activity.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager - return notificationManager.isNotificationPolicyAccessGranted - } - - fun askNotificationPermission(activity: Activity, dialogues: Dialogues) { - val builder = dialogues.getMaterialDialog(activity) - builder.setMessage(R.string.for_correct_work_of_application) - builder.setPositiveButton(R.string.grant) { dialog, _ -> - dialog.dismiss() - val intent = Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS) - try { - activity.startActivity(intent) - } catch (ignored: ActivityNotFoundException) { - } - } - builder.setNegativeButton(R.string.cancel) { dialog, _ -> dialog.dismiss() } - builder.create().show() - } - - fun checkLocationEnable(context: Context): Boolean { - val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager - val isGPSEnabled = locationManager - .isProviderEnabled(LocationManager.GPS_PROVIDER) - val isNetworkEnabled = locationManager - .isProviderEnabled(LocationManager.NETWORK_PROVIDER) - return !(!isGPSEnabled && !isNetworkEnabled) - } - - fun showLocationAlert(context: Context, callbacks: ReminderInterface) { - callbacks.showSnackbar( - context.getString(R.string.gps_not_enabled), - context.getString(R.string.action_settings) - ) { - val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) - context.startActivity(intent) - } - } - fun isGooglePlayServicesAvailable(a: Context): Boolean { val resultCode = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(a) return resultCode == ConnectionResult.SUCCESS diff --git a/app/src/main/java/com/elementary/tasks/core/utils/params/Prefs.kt b/app/src/main/java/com/elementary/tasks/core/utils/params/Prefs.kt index 1ef519a0b..e3f5f072f 100644 --- a/app/src/main/java/com/elementary/tasks/core/utils/params/Prefs.kt +++ b/app/src/main/java/com/elementary/tasks/core/utils/params/Prefs.kt @@ -52,22 +52,6 @@ class Prefs( } } - var showLegacyBuilderWarning: Boolean - get() = getBoolean(PrefsConstants.SHOW_LEGACY_BUILDER_WARNING, def = true) - set(value) = putBoolean(PrefsConstants.SHOW_LEGACY_BUILDER_WARNING, value) - - var showLegacyBuilderRemovalWarning: Boolean - get() = getBoolean(PrefsConstants.SHOW_LEGACY_BUILDER_REMOVAL_WARNING, def = true) - set(value) = putBoolean(PrefsConstants.SHOW_LEGACY_BUILDER_REMOVAL_WARNING, value) - - var useLegacyBuilder: Boolean - get() = getBoolean(PrefsConstants.USE_LEGACY_BUILDER, def = false) - set(value) = putBoolean(PrefsConstants.USE_LEGACY_BUILDER, value) - - var canChangeBuilder: Boolean - get() = getBoolean(PrefsConstants.CAN_CHANGE_BUILDER, def = false) - set(value) = putBoolean(PrefsConstants.CAN_CHANGE_BUILDER, value) - var lastVersionCode: Long get() = getLong(PrefsConstants.LAST_VERSION_CODE, def = Long.MAX_VALUE) set(value) = putLong(PrefsConstants.LAST_VERSION_CODE, value) diff --git a/app/src/main/java/com/elementary/tasks/core/utils/params/PrefsConstants.kt b/app/src/main/java/com/elementary/tasks/core/utils/params/PrefsConstants.kt index d99a909da..29c3a3772 100644 --- a/app/src/main/java/com/elementary/tasks/core/utils/params/PrefsConstants.kt +++ b/app/src/main/java/com/elementary/tasks/core/utils/params/PrefsConstants.kt @@ -109,10 +109,6 @@ object PrefsConstants { const val APP_RUNS_COUNT = "app_runs" const val LAST_VERSION_CODE = "last_version_code" - const val CAN_CHANGE_BUILDER = "can_change_builder" - const val USE_LEGACY_BUILDER = "use_legacy_builder" - const val SHOW_LEGACY_BUILDER_WARNING = "show_legacy_builder_warning" - const val SHOW_LEGACY_BUILDER_REMOVAL_WARNING = "show_legacy_builder_removal_warning" // birthdays reminder notification constants const val BIRTHDAY_USE_GLOBAL = "use_global" diff --git a/app/src/main/java/com/elementary/tasks/core/views/ActionView.kt b/app/src/main/java/com/elementary/tasks/core/views/ActionView.kt deleted file mode 100644 index a1d715770..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/ActionView.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.elementary.tasks.core.views - -import android.content.Context -import android.text.Editable -import android.text.TextWatcher -import android.util.AttributeSet -import android.view.View -import android.view.inputmethod.InputMethodManager -import android.widget.LinearLayout -import com.elementary.tasks.R -import com.elementary.tasks.core.os.PermissionFlow -import com.github.naz013.common.Permissions -import com.elementary.tasks.core.utils.ui.trimmedText -import com.elementary.tasks.databinding.ViewActionBinding -import com.github.naz013.logging.Logger - -class ActionView : LinearLayout, TextWatcher { - - private var mImm: InputMethodManager? = null - private var listener: OnActionListener? = null - private var permissionFlow: PermissionFlow? = null - private lateinit var binding: ViewActionBinding - private var internalState: ActionState = ActionState.NO_ACTION - - var actionState: ActionState - get() = internalState - set(value) { - selectButton(value) - setState(value) - } - - var number: String - get() = binding.numberView.trimmedText() - set(number) = binding.numberView.setText(number) - - constructor(context: Context) : super(context) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context) - } - - constructor( - context: Context, - attrs: AttributeSet, - defStyle: Int - ) : super(context, attrs, defStyle) { - init(context) - } - - private fun init(context: Context) { - View.inflate(context, R.layout.view_action, this) - orientation = VERTICAL - binding = ViewActionBinding.bind(this) - - binding.numberView.isFocusableInTouchMode = true - binding.numberView.setOnFocusChangeListener { _, hasFocus -> - mImm = getContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager? - if (!hasFocus) { - mImm?.hideSoftInputFromWindow(binding.numberView.windowToken, 0) - } else { - mImm?.showSoftInput(binding.numberView, 0) - } - } - binding.numberView.setOnClickListener { - mImm = getContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager? - if (mImm?.isActive(binding.numberView) == false) { - mImm?.showSoftInput(binding.numberView, 0) - } - } - binding.numberView.addTextChangedListener(this) - binding.actionGroup.addOnButtonCheckedListener { _, checkedId, isChecked -> - if (isChecked) { - if (checkedId == R.id.noAction) { - setState(ActionState.NO_ACTION) - } else { - val state = if (checkedId == R.id.callAction) { - ActionState.CALL - } else { - ActionState.SMS - } - permissionFlow?.askPermission(Permissions.READ_CONTACTS) { - setState(state) - } ?: run { - selectButton(ActionState.NO_ACTION) - } - } - } - } - selectButton(ActionState.NO_ACTION) - setState(ActionState.NO_ACTION) - } - - private fun selectButton(state: ActionState) { - val buttonId = when (state) { - ActionState.NO_ACTION -> R.id.noAction - ActionState.CALL -> R.id.callAction - ActionState.SMS -> R.id.smsAction - } - binding.actionGroup.check(buttonId) - } - - private fun setState(state: ActionState) { - Logger.d("setState: $state") - this.internalState = state - enableViews(state != ActionState.NO_ACTION) - listener?.onStateChanged(state, number) - } - - private fun enableViews(isEnabled: Boolean) { - binding.numberLayout.isEnabled = isEnabled - binding.selectNumber.isEnabled = isEnabled - binding.numberView.isEnabled = isEnabled - } - - fun setPermissionHandle(permissionFlow: PermissionFlow) { - this.permissionFlow = permissionFlow - } - - fun setContactClickListener(contactClickListener: OnClickListener) { - binding.selectNumber.setOnClickListener(contactClickListener) - } - - fun setListener(listener: OnActionListener) { - this.listener = listener - } - - fun hasAction(): Boolean { - return internalState != ActionState.NO_ACTION - } - - override fun afterTextChanged(s: Editable?) { - } - - override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { - } - - override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { - listener?.onStateChanged(internalState, number) - } - - interface OnActionListener { - fun onStateChanged(state: ActionState, phone: String) - } - - enum class ActionState(val value: Int) { - NO_ACTION(0), CALL(1), SMS(2) - } -} diff --git a/app/src/main/java/com/elementary/tasks/core/views/AttachmentView.kt b/app/src/main/java/com/elementary/tasks/core/views/AttachmentView.kt deleted file mode 100644 index 4691fd80f..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/AttachmentView.kt +++ /dev/null @@ -1,111 +0,0 @@ -package com.elementary.tasks.core.views - -import android.content.Context -import android.net.Uri -import android.util.AttributeSet -import android.view.View -import android.widget.LinearLayout -import androidx.annotation.RequiresPermission -import com.elementary.tasks.R -import com.elementary.tasks.core.utils.io.CacheUtil -import com.elementary.tasks.core.utils.launchDefault -import com.elementary.tasks.core.utils.withUIContext -import com.elementary.tasks.databinding.ViewAttachmentBinding -import com.github.naz013.common.Permissions -import com.github.naz013.logging.Logger -import com.github.naz013.ui.common.view.gone -import com.github.naz013.ui.common.view.visible -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject - -class AttachmentView : LinearLayout, KoinComponent { - - private val cacheUtil by inject() - - private lateinit var binding: ViewAttachmentBinding - var onFileUpdateListener: ((path: String) -> Unit)? = null - var onFileSelectListener: (() -> Unit)? = null - var content: String = "" - set(value) { - field = value - if (value != "") { - binding.text.text = value - binding.removeButton.visible() - binding.selectButton.gone() - onFileUpdateListener?.invoke(value) - } else { - noFile() - } - } - - constructor(context: Context) : super(context) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( - context, - attrs, - defStyle - ) { - init(context) - } - - fun setUri(uri: Uri) { - Logger.d("setUri: ${uri.path}") - content = uri.toString() - if (Permissions.checkPermission(context, Permissions.READ_EXTERNAL)) { - obtainPath(cacheUtil, uri) { success, path -> - Logger.d("setUri: $success, $path") - content = if (success && path != null) { - path - } else { - "" - } - } - } - } - - private fun noFile() { - binding.removeButton.gone() - binding.selectButton.visible() - binding.text.text = context.getString(R.string.not_selected) - } - - private fun init(context: Context) { - View.inflate(context, R.layout.view_attachment, this) - orientation = VERTICAL - binding = ViewAttachmentBinding.bind(this) - - binding.removeButton.setOnClickListener { - content = "" - } - binding.selectButton.setOnClickListener { addClick() } - content = "" - } - - private fun addClick() { - if (content == "") { - onFileSelectListener?.invoke() - } - } - - @RequiresPermission(Permissions.READ_EXTERNAL) - private fun obtainPath(cacheUtil: CacheUtil, uri: Uri, onReady: (Boolean, String?) -> Unit) { - launchDefault { - try { - val path = cacheUtil.cacheFile(uri) - if (path == null) { - withUIContext { onReady.invoke(false, null) } - } else { - withUIContext { onReady.invoke(true, path) } - } - } catch (e: Throwable) { - withUIContext { onReady.invoke(false, null) } - } - } - } -} diff --git a/app/src/main/java/com/elementary/tasks/core/views/BeforePickerView.kt b/app/src/main/java/com/elementary/tasks/core/views/BeforePickerView.kt deleted file mode 100644 index 7dd6c49c1..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/BeforePickerView.kt +++ /dev/null @@ -1,158 +0,0 @@ -package com.elementary.tasks.core.views - -import android.content.Context -import android.text.Editable -import android.text.TextWatcher -import android.util.AttributeSet -import android.view.View -import android.view.inputmethod.InputMethodManager -import android.widget.AdapterView -import android.widget.LinearLayout -import com.elementary.tasks.R -import com.github.naz013.common.datetime.DateTimeManager -import com.elementary.tasks.databinding.ViewRemindBeforeBinding -import com.github.naz013.logging.Logger - -class BeforePickerView : LinearLayout, TextWatcher, AdapterView.OnItemSelectedListener { - - private lateinit var binding: ViewRemindBeforeBinding - - private var mImm: InputMethodManager? = null - var onBeforeChangedListener: OnBeforeChangedListener? = null - - private var mState = DateTimeManager.MultiplierType.MINUTE.index - private var mRepeatValue: Int = 0 - - private val multiplier: Long - get() { - return when (mState) { - DateTimeManager.MultiplierType.SECOND.index -> DateTimeManager.SECOND - DateTimeManager.MultiplierType.MINUTE.index -> DateTimeManager.MINUTE - DateTimeManager.MultiplierType.HOUR.index -> DateTimeManager.HOUR - DateTimeManager.MultiplierType.DAY.index -> DateTimeManager.DAY - DateTimeManager.MultiplierType.WEEK.index -> DateTimeManager.DAY * 7 - DateTimeManager.MultiplierType.MONTH.index -> DateTimeManager.DAY * 30 - else -> DateTimeManager.DAY - } - } - - private val beforeValue: Long - get() { - val rep = mRepeatValue * multiplier - Logger.d("getBeforeValue: $rep") - return rep - } - - constructor(context: Context) : super(context) { - init(context, null) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context, attrs) - } - - constructor( - context: Context, - attrs: AttributeSet, - defStyle: Int - ) : super(context, attrs, defStyle) { - init(context, attrs) - } - - private fun init(context: Context, attrs: AttributeSet?) { - View.inflate(context, R.layout.view_remind_before, this) - orientation = VERTICAL - binding = ViewRemindBeforeBinding.bind(this) - - mImm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager? - - binding.beforeTypeView.onItemSelectedListener = this - binding.beforeValueView.addTextChangedListener(this) - binding.beforeValueView.setOnFocusChangeListener { _, hasFocus -> - if (mImm == null) return@setOnFocusChangeListener - if (!hasFocus) { - mImm?.hideSoftInputFromWindow(binding.beforeValueView.windowToken, 0) - } else { - mImm?.showSoftInput(binding.beforeValueView, 0) - } - } - binding.beforeValueView.setOnClickListener { - if (mImm == null) return@setOnClickListener - if (!mImm!!.isActive(binding.beforeValueView)) { - mImm?.showSoftInput(binding.beforeValueView, 0) - } - } - mRepeatValue = 0 - binding.beforeValueView.setText(mRepeatValue.toString()) - if (attrs != null) { - val a = context.theme.obtainStyledAttributes(attrs, R.styleable.BeforePickerView, 0, 0) - try { - mState = a.getInt( - /* index = */ R.styleable.BeforePickerView_before_type, - /* defValue = */ DateTimeManager.MultiplierType.MINUTE.index - ) - } catch (e: Exception) { - Logger.d("init: ${e.message}") - } finally { - a.recycle() - } - } - binding.beforeTypeView.setSelection(mState) - } - - private fun setState(state: Int) { - this.mState = state - onBeforeChangedListener?.onChanged(beforeValue) - } - - private fun updateEditField() { - binding.beforeValueView.setSelection(binding.beforeValueView.text.toString().length) - } - - fun setBefore(mills: Long) { - if (mills == 0L) { - setProgress(0) - return - } - val beforeTime = DateTimeManager.parseBeforeTime(mills) - setProgress(beforeTime.value.toInt()) - binding.beforeTypeView.setSelection(beforeTime.type.index) - } - - private fun setProgress(i: Int) { - mRepeatValue = i - binding.beforeValueView.setText(i.toString()) - updateEditField() - } - - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { - } - - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { - try { - mRepeatValue = Integer.parseInt(s.toString()) - if (mRepeatValue > 0 && s.toString().startsWith("0")) { - binding.beforeValueView.setText(mRepeatValue.toString()) - binding.beforeValueView.setSelection(binding.beforeValueView.text.toString().length) - return - } - } catch (e: NumberFormatException) { - binding.beforeValueView.setText("0") - } - onBeforeChangedListener?.onChanged(beforeValue) - } - - override fun afterTextChanged(s: Editable) { - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - } - - override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { - setState(position) - } - - interface OnBeforeChangedListener { - fun onChanged(beforeMills: Long) - } -} diff --git a/app/src/main/java/com/elementary/tasks/core/views/ClosableLegacyBuilderRemovalWarningView.kt b/app/src/main/java/com/elementary/tasks/core/views/ClosableLegacyBuilderRemovalWarningView.kt deleted file mode 100644 index 12b801088..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/ClosableLegacyBuilderRemovalWarningView.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.elementary.tasks.core.views - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import android.widget.FrameLayout -import com.elementary.tasks.R -import com.elementary.tasks.databinding.ViewLegacyBuilderRemovalBinding -import org.koin.core.component.KoinComponent - -class ClosableLegacyBuilderRemovalWarningView : FrameLayout, KoinComponent { - - private lateinit var binding: ViewLegacyBuilderRemovalBinding - var onTryClicked: (() -> Unit)? = null - var onCloseClicked: (() -> Unit)? = null - - constructor(context: Context) : super(context) { - init(context, null) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context, attrs) - } - - constructor( - context: Context, - attrs: AttributeSet, - defStyle: Int - ) : super(context, attrs, defStyle) { - init(context, attrs) - } - - private fun init(context: Context, attrs: AttributeSet?) { - View.inflate(context, R.layout.view_legacy_builder_removal, this) - binding = ViewLegacyBuilderRemovalBinding.bind(this) - - binding.tryButton.setOnClickListener { onTryClicked?.invoke() } - binding.closeButton.setOnClickListener { onCloseClicked?.invoke() } - } -} diff --git a/app/src/main/java/com/elementary/tasks/core/views/ClosableTooltipView.kt b/app/src/main/java/com/elementary/tasks/core/views/ClosableTooltipView.kt deleted file mode 100644 index 1c693094b..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/ClosableTooltipView.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.elementary.tasks.core.views - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import android.widget.FrameLayout -import com.elementary.tasks.R -import com.elementary.tasks.databinding.ViewClosableTooltipBinding -import com.github.naz013.logging.Logger - -class ClosableTooltipView : FrameLayout { - - private lateinit var binding: ViewClosableTooltipBinding - - constructor(context: Context) : super(context) { - init(context, null) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context, attrs) - } - - constructor( - context: Context, - attrs: AttributeSet, - defStyle: Int - ) : super(context, attrs, defStyle) { - init(context, attrs) - } - - private fun init(context: Context, attrs: AttributeSet?) { - View.inflate(context, R.layout.view_closable_tooltip, this) - binding = ViewClosableTooltipBinding.bind(this) - - if (attrs != null) { - val a = context.theme.obtainStyledAttributes(attrs, R.styleable.ClosableTooltipView, 0, 0) - var text = "" - try { - text = a.getString(R.styleable.ClosableTooltipView_text) ?: "" - } catch (e: Exception) { - Logger.d("init: ${e.message}") - } finally { - a.recycle() - } - binding.textView.text = text - } - } - - fun setText(text: String) { - binding.textView.text = text - } - - override fun setOnClickListener(l: OnClickListener?) { - binding.closeIconView.setOnClickListener(l) - } -} diff --git a/app/src/main/java/com/elementary/tasks/core/views/DateTimeView.kt b/app/src/main/java/com/elementary/tasks/core/views/DateTimeView.kt deleted file mode 100644 index 2cd31976d..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/DateTimeView.kt +++ /dev/null @@ -1,145 +0,0 @@ -package com.elementary.tasks.core.views - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import android.view.ViewGroup -import android.widget.LinearLayout -import com.elementary.tasks.R -import com.elementary.tasks.core.binding.views.DateTimeViewBinding -import com.github.naz013.common.datetime.DateTimeManager -import com.elementary.tasks.core.utils.ui.DateTimePickerProvider -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDateTime -import org.threeten.bp.LocalTime -import org.threeten.bp.format.DateTimeFormatter - -class DateTimeView : LinearLayout, KoinComponent { - - private val dateTimeManager by inject() - private val dateTimePickerProvider by inject() - - private lateinit var binding: DateTimeViewBinding - private var date: LocalDate = LocalDate.now() - private var time: LocalTime = LocalTime.now() - private var isSingleMode = false - private var onSelectListener: OnSelectListener? = null - private val onDateChangeListeners = mutableListOf() - private var dateTimeFormatter = dateTimeManager.fullDateFormatter() - - var selectedDateTime: LocalDateTime - get() = LocalDateTime.of(date, time) - set(value) = updateDateTime(value) - - constructor(context: Context) : super(context) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( - context, - attrs, - defStyle - ) { - init(context) - } - - fun setDateFormat(formatter: DateTimeFormatter) { - this.dateTimeFormatter = formatter - this.invalidate() - } - - fun setDateTime(dateTime: String) { - updateDateTime(dateTimeManager.fromGmtToLocal(dateTime) ?: LocalDateTime.now()) - } - - fun setOnSelectListener(listener: OnSelectListener) { - onSelectListener = listener - } - - fun addOnDateChangeListener(listener: OnDateChangeListener) { - onDateChangeListeners.add(listener) - } - - fun removeOnDateChangeListener(listener: OnDateChangeListener) { - onDateChangeListeners.remove(listener) - } - - private fun init(context: Context) { - orientation = VERTICAL - View.inflate(context, R.layout.view_date_time, this) - binding = DateTimeViewBinding(this) - - descendantFocusability = ViewGroup.FOCUS_BLOCK_DESCENDANTS - val params = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) - layoutParams = params - setDateFormat(dateTimeManager.fullDateFormatter()) - - binding.dateField.setOnClickListener { selectDate() } - binding.timeField.setOnClickListener { selectTime() } - updateDateTime(LocalDateTime.now()) - } - - override fun setOnClickListener(l: OnClickListener?) { - if (isSingleMode) binding.dateField.setOnClickListener(l) - } - - override fun setOnLongClickListener(l: OnLongClickListener?) { - binding.dateField.setOnLongClickListener(l) - binding.timeField.setOnLongClickListener(l) - } - - private fun updateDateTime(localDateTime: LocalDateTime) { - date = localDateTime.toLocalDate() - time = localDateTime.toLocalTime() - updateTime(time) - updateDate(date) - } - - private fun updateDate(localDate: LocalDate) { - binding.dateField.text = localDate.format(dateTimeFormatter) - onSelectListener?.onDateSelect(localDate) - notifyOnDateChange(LocalDateTime.of(date, time)) - } - - private fun updateTime(localTime: LocalTime) { - binding.timeField.text = dateTimeManager.getTime(localTime) - onSelectListener?.onTimeSelect(localTime) - notifyOnDateChange(LocalDateTime.of(date, time)) - } - - private fun notifyOnDateChange(localDateTime: LocalDateTime) { - onDateChangeListeners.forEach { - it.onChanged(localDateTime) - } - } - - private fun selectDate() { - dateTimePickerProvider.showDatePicker(context, date) { - this.date = it - updateDate(it) - } - } - - private fun selectTime() { - dateTimePickerProvider.showTimePicker(context, time) { - this.time = it - updateTime(it) - } - } - - interface OnSelectListener { - fun onDateSelect(date: LocalDate) - - fun onTimeSelect(time: LocalTime) - } - - interface OnDateChangeListener { - fun onChanged(dateTime: LocalDateTime) - } -} diff --git a/app/src/main/java/com/elementary/tasks/core/views/ExclusionPickerView.kt b/app/src/main/java/com/elementary/tasks/core/views/ExclusionPickerView.kt deleted file mode 100644 index 2f1452c30..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/ExclusionPickerView.kt +++ /dev/null @@ -1,239 +0,0 @@ -package com.elementary.tasks.core.views - -import android.annotation.SuppressLint -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.View -import android.widget.LinearLayout -import android.widget.TextView -import android.widget.ToggleButton -import com.elementary.tasks.R -import com.elementary.tasks.core.binding.dialogs.DialogExclusionPickerBinding -import com.github.naz013.common.datetime.DateTimeManager -import com.elementary.tasks.core.utils.ui.DateTimePickerProvider -import com.github.naz013.ui.common.Dialogues -import com.elementary.tasks.databinding.ViewExclusionPickerBinding -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject -import org.threeten.bp.LocalTime -import java.util.* - -class ExclusionPickerView : LinearLayout, KoinComponent { - - private val dateTimePickerProvider by inject() - private val dateTimeManager by inject() - private val dialogues by inject() - - private lateinit var binding: ViewExclusionPickerBinding - var onExclusionUpdateListener: ((hours: List, from: String, to: String) -> Unit)? = null - private val mHours = mutableListOf() - private var mFrom: String = "" - private var mTo: String = "" - - private var fromTime: LocalTime = LocalTime.now() - private var toTime: LocalTime = fromTime.plusHours(3) - - private val buttons = mutableListOf() - - private val selectedList: MutableList - @SuppressLint("ResourceType") - get() { - val ids = ArrayList() - for (button in buttons) { - if (button.isChecked) ids.add(button.id - 100) - } - return ids - } - - private val customizationView: DialogExclusionPickerBinding - get() { - val binding = DialogExclusionPickerBinding( - LayoutInflater.from(context).inflate(R.layout.dialog_exclusion_picker, null) - ) - binding.selectInterval.isChecked = true - - showFromTime(binding.from, fromTime) - showToTime(binding.to, toTime) - - binding.from.setOnClickListener { fromTime(binding.from) } - binding.to.setOnClickListener { toTime(binding.to) } - - initButtons(binding) - if (mFrom.isNotEmpty() && mTo.isNotEmpty()) { - fromTime = dateTimeManager.toLocalTime(mFrom) ?: LocalTime.now() - toTime = dateTimeManager.toLocalTime(mTo) ?: LocalTime.now() - binding.selectInterval.isChecked = true - } - if (mHours.isNotEmpty()) { - binding.selectHours.isChecked = true - } - return binding - } - - constructor(context: Context) : super(context) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( - context, - attrs, - defStyle - ) { - init(context) - } - - fun setRangeHours(fromHour: String, toHour: String) { - mFrom = fromHour - mTo = toHour - showRange() - } - - fun setHours(hours: List) { - mHours.clear() - mHours.addAll(hours) - showHours() - } - - private fun init(context: Context) { - View.inflate(context, R.layout.view_exclusion_picker, this) - orientation = VERTICAL - binding = ViewExclusionPickerBinding.bind(this) - - binding.selectButton.setOnClickListener { - openExclusionDialog() - } - } - - private fun openExclusionDialog() { - val builder = dialogues.getMaterialDialog(context) - builder.setTitle(R.string.exclusion) - val b = customizationView - builder.setView(b.view) - builder.setPositiveButton(R.string.ok) { _, _ -> saveExclusion(b) } - builder.setNegativeButton(R.string.remove_exclusion) { _, _ -> clearExclusion() } - builder.create().show() - } - - private fun clearExclusion() { - mHours.clear() - mFrom = "" - mTo = "" - fromTime = LocalTime.now() - toTime = fromTime.plusHours(3) - showNoExclusion() - binding.selectButton.setText(R.string.select) - onExclusionUpdateListener?.invoke(mHours, mFrom, mTo) - } - - private fun saveExclusion(b: DialogExclusionPickerBinding) { - when { - b.selectHours.isChecked -> { - mHours.clear() - mHours.addAll(selectedList) - showHours() - binding.selectButton.setText(R.string.change) - onExclusionUpdateListener?.invoke(mHours, mFrom, mTo) - } - - b.selectInterval.isChecked -> { - mFrom = getHour(fromTime) - mTo = getHour(toTime) - showRange() - binding.selectButton.setText(R.string.change) - onExclusionUpdateListener?.invoke(mHours, mFrom, mTo) - } - - else -> { - clearExclusion() - showNoExclusion() - } - } - } - - private fun showNoExclusion() { - if (mHours.isEmpty() && mFrom == "" && mTo == "") { - binding.text.text = context.getString(R.string.not_selected) - } - } - - private fun showRange() { - if (mFrom != "" && mTo != "") { - var message = context.getString(R.string.from) + " " - message += "$mFrom " - message += context.getString(R.string.to) + " " - message += mTo - binding.text.text = message - } else { - showNoExclusion() - } - } - - private fun showHours() { - if (mHours.isNotEmpty()) { - val message = mHours.joinToString(separator = ", ") - binding.text.text = message - } else { - showNoExclusion() - } - } - - private fun getHour(time: LocalTime): String { - return dateTimeManager.to24HourString(time) - } - - private fun initButtons(b: DialogExclusionPickerBinding) { - setId( - b.zero, b.one, b.two, b.three, b.four, b.five, b.six, b.seven, b.eight, b.nine, b.ten, - b.eleven, b.twelve, b.thirteen, b.fourteen, b.fifteen, b.sixteen, b.seventeen, - b.eighteen, b.nineteen, b.twenty, b.twentyOne, b.twentyThree, b.twentyTwo - ) - } - - private fun setId(vararg buttons: ToggleButton) { - var i = 100 - this.buttons.clear() - val selected = mutableListOf() - selected.addAll(mHours) - for (button in buttons) { - button.id = i - button.setBackgroundResource(R.drawable.toggle_weekday_tertiary) - this.buttons.add(button) - if (selected.contains(i - 100)) button.isChecked = true - i++ - } - } - - @SuppressLint("SetTextI18n") - private fun fromTime(textView: TextView) { - dateTimePickerProvider.showTimePicker(context, fromTime) { - fromTime = it - showFromTime(textView, it) - } - } - - @SuppressLint("SetTextI18n") - private fun toTime(textView: TextView) { - dateTimePickerProvider.showTimePicker(context, toTime) { - toTime = it - showToTime(textView, it) - } - } - - private fun showFromTime(textView: TextView, time: LocalTime) { - showTime(textView, context.getString(R.string.from), time) - } - - private fun showToTime(textView: TextView, time: LocalTime) { - showTime(textView, context.getString(R.string.to), time) - } - - @SuppressLint("SetTextI18n") - private fun showTime(textView: TextView, prefix: String, time: LocalTime) { - textView.text = "$prefix ${dateTimeManager.getTime(time)}" - } -} diff --git a/app/src/main/java/com/elementary/tasks/core/views/ExportToCalendarView.kt b/app/src/main/java/com/elementary/tasks/core/views/ExportToCalendarView.kt deleted file mode 100644 index 553e107f2..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/ExportToCalendarView.kt +++ /dev/null @@ -1,114 +0,0 @@ -package com.elementary.tasks.core.views - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import android.widget.LinearLayout -import com.elementary.tasks.R -import com.elementary.tasks.core.utils.GoogleCalendarUtils -import com.elementary.tasks.databinding.ViewCalendarExportBinding -import com.github.naz013.logging.Logger -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject - -class ExportToCalendarView : LinearLayout, KoinComponent { - - private val calendars = if (isInEditMode) { - emptyList() - } else { - val googleCalendarUtils by inject() - googleCalendarUtils.getCalendarsList() - } - - private lateinit var binding: ViewCalendarExportBinding - private var internalState: State = State.NO - - var listener: SelectionListener? = null - - var calendarState: State - get() = internalState - set(value) { - selectButton(value) - } - - var calendarId: Long - get() = calendars[binding.calendarSelector.selectedPosition].id - set(value) { - var index = 0 - for (c in calendars) { - if (c.id == value) { - index = calendars.indexOf(c) - break - } - } - binding.calendarSelector.selectItem(index) - } - - constructor(context: Context) : super(context) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( - context, - attrs, - defStyle - ) { - init(context) - } - - private fun init(context: Context) { - View.inflate(context, R.layout.view_calendar_export, this) - orientation = VERTICAL - binding = ViewCalendarExportBinding.bind(this) - - binding.calendarSelector.pickerProvider = { - calendars.map { calendarItem -> calendarItem.name } - } - binding.calendarSelector.titleProvider = { pointer -> calendars[pointer].name } - binding.calendarSelector.dataSize = calendars.size - binding.calendarSelector.selectListener = { pointer, _ -> - listener?.onChanged(internalState == State.YES, calendars[pointer].id) - } - - binding.calendarOptionGroup.addOnButtonCheckedListener { _, checkedId, isChecked -> - if (isChecked) { - if (checkedId == R.id.calendarDisabled) { - setState(State.NO) - } else { - setState(State.YES) - } - } - } - selectButton(State.NO) - setState(State.NO) - } - - private fun selectButton(state: State) { - val buttonId = when (state) { - State.NO -> R.id.calendarDisabled - State.YES -> R.id.calendarEnabled - } - binding.calendarOptionGroup.check(buttonId) - } - - private fun setState(state: State) { - Logger.d("setState: $state") - this.internalState = state - enableViews(state != State.NO) - listener?.onChanged(state == State.YES, calendarId) - } - - private fun enableViews(isEnabled: Boolean) { - binding.calendarSelector.isEnabled = isEnabled - } - - interface SelectionListener { - fun onChanged(enabled: Boolean, calendarId: Long) - } - - enum class State { NO, YES } -} diff --git a/app/src/main/java/com/elementary/tasks/core/views/ExportToGoogleTasksView.kt b/app/src/main/java/com/elementary/tasks/core/views/ExportToGoogleTasksView.kt deleted file mode 100644 index ede70c96f..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/ExportToGoogleTasksView.kt +++ /dev/null @@ -1,136 +0,0 @@ -package com.elementary.tasks.core.views - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import android.widget.LinearLayout -import com.elementary.tasks.R -import com.elementary.tasks.databinding.ViewTasksExportBinding -import com.github.naz013.domain.GoogleTaskList -import com.github.naz013.logging.Logger -import com.github.naz013.repository.GoogleTaskListRepository -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject - -@Deprecated("Should be removed") -class ExportToGoogleTasksView : LinearLayout, KoinComponent { - - private val googleTaskListRepository by inject() - private val viewScope = CoroutineScope(Dispatchers.Default) - private var taskLists: List = emptyList() - - private lateinit var binding: ViewTasksExportBinding - private var internalState: State = State.NO - private var listIdToSelect: String? = null - - var listener: SelectionListener? = null - - var tasksState: State - get() = internalState - set(value) { - selectButton(value) - } - - var taskListId: String? - get() { - return try { - taskLists[binding.selector.selectedPosition].listId - } catch (t: Throwable) { - null - } - } - set(value) { - listIdToSelect = value - val index = taskLists.indexOfFirst { it.listId == value } - .takeIf { it != -1 } - ?: 0 - if (taskLists.isNotEmpty()) { - binding.selector.selectItem(index) - } - } - - constructor(context: Context) : super(context) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( - context, - attrs, - defStyle - ) { - init(context) - } - - private fun loadGoogleTaskLists() { - viewScope.launch { - taskLists = googleTaskListRepository.getAll() - - withContext(Dispatchers.Main) { - binding.selector.pickerProvider = { - taskLists.map { item -> item.title } - } - binding.selector.titleProvider = { pointer -> taskLists[pointer].title } - binding.selector.dataSize = taskLists.size - binding.selector.selectListener = { pointer, _ -> - listener?.onChanged(internalState == State.YES, taskLists[pointer].listId) - } - listIdToSelect?.also { taskListId = it } ?: run { binding.selector.selectItem(0) } - } - } - } - - private fun init(context: Context) { - View.inflate(context, R.layout.view_tasks_export, this) - orientation = VERTICAL - binding = ViewTasksExportBinding.bind(this) - - if (!isInEditMode) { - loadGoogleTaskLists() - } - - binding.optionGroup.addOnButtonCheckedListener { _, checkedId, isChecked -> - if (isChecked) { - if (checkedId == R.id.tasksDisabled) { - setState(State.NO) - } else { - setState(State.YES) - } - } - } - selectButton(State.NO) - setState(State.NO) - } - - private fun selectButton(state: State) { - val buttonId = when (state) { - State.NO -> R.id.tasksDisabled - State.YES -> R.id.tasksEnabled - } - binding.optionGroup.check(buttonId) - } - - private fun setState(state: State) { - Logger.d("setState: $state") - this.internalState = state - enableViews(state != State.NO) - taskListId?.also { listener?.onChanged(state == State.YES, it) } - } - - private fun enableViews(isEnabled: Boolean) { - binding.selector.isEnabled = isEnabled - } - - interface SelectionListener { - fun onChanged(enabled: Boolean, taskListId: String) - } - - enum class State { NO, YES } -} diff --git a/app/src/main/java/com/elementary/tasks/core/views/GroupView.kt b/app/src/main/java/com/elementary/tasks/core/views/GroupView.kt deleted file mode 100644 index 14f22af5f..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/GroupView.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.elementary.tasks.core.views - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import android.widget.LinearLayout -import com.elementary.tasks.R -import com.github.naz013.domain.ReminderGroup -import com.elementary.tasks.databinding.ViewGroupBinding - -class GroupView : LinearLayout { - - private lateinit var binding: ViewGroupBinding - var onGroupSelectListener: (() -> Unit)? = null - var reminderGroup: ReminderGroup? = null - set(value) { - if (value != null && value.groupUuId != "") { - field = value - binding.text.text = value.groupTitle - } else { - noGroup() - } - } - - constructor(context: Context) : super(context) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( - context, - attrs, - defStyle - ) { - init(context) - } - - private fun noGroup() { - binding.text.text = context.getString(R.string.not_selected) - } - - private fun init(context: Context) { - View.inflate(context, R.layout.view_group, this) - orientation = VERTICAL - binding = ViewGroupBinding.bind(this) - - binding.selectButton.setOnClickListener { - onGroupSelectListener?.invoke() - } - reminderGroup = null - } -} diff --git a/app/src/main/java/com/elementary/tasks/core/views/LedPickerView.kt b/app/src/main/java/com/elementary/tasks/core/views/LedPickerView.kt deleted file mode 100644 index 139c57824..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/LedPickerView.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.elementary.tasks.core.views - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import android.widget.LinearLayout -import com.elementary.tasks.R -import com.elementary.tasks.core.utils.LED -import com.elementary.tasks.databinding.ViewLedColorBinding - -class LedPickerView : LinearLayout { - - private lateinit var binding: ViewLedColorBinding - var onLedChangeListener: ((Int) -> Unit)? = null - var led: Int = LED.BLUE - set(value) { - field = value - binding.ledGroup.check(chipIdFromLed(value)) - } - get() { - return ledFromChip(binding.ledGroup.checkedRadioButtonId) - } - - constructor(context: Context) : super(context) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( - context, - attrs, - defStyle - ) { - init(context) - } - - private fun chipIdFromLed(id: Int): Int { - return when (id) { - 0 -> R.id.ledRed - 1 -> R.id.ledGreen - 2 -> R.id.ledBlue - 3 -> R.id.ledYellow - 4 -> R.id.ledPink - 5 -> R.id.ledOrange - 6 -> R.id.ledTeal - else -> R.id.ledBlue - } - } - - private fun ledFromChip(id: Int): Int { - return when (id) { - R.id.ledRed -> 0 - R.id.ledGreen -> 1 - R.id.ledBlue -> 2 - R.id.ledYellow -> 3 - R.id.ledPink -> 4 - R.id.ledOrange -> 5 - R.id.ledTeal -> 6 - else -> 2 - } - } - - private fun init(context: Context) { - View.inflate(context, R.layout.view_led_color, this) - orientation = VERTICAL - binding = ViewLedColorBinding.bind(this) - - binding.ledGroup.setOnCheckedChangeListener { _, checkedId -> - updateState(ledFromChip(checkedId)) - } - } - - private fun updateState(led: Int) { - onLedChangeListener?.invoke(led) - } -} diff --git a/app/src/main/java/com/elementary/tasks/core/views/PriorityPickerView.kt b/app/src/main/java/com/elementary/tasks/core/views/PriorityPickerView.kt deleted file mode 100644 index 0e6307ba3..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/PriorityPickerView.kt +++ /dev/null @@ -1,99 +0,0 @@ -package com.elementary.tasks.core.views - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import android.widget.LinearLayout -import androidx.annotation.IdRes -import com.elementary.tasks.R -import com.elementary.tasks.databinding.ViewPriorityBinding -import com.google.android.material.chip.Chip - -class PriorityPickerView : LinearLayout { - - private lateinit var binding: ViewPriorityBinding - var onPriorityChaneListener: ((Int) -> Unit)? = null - var priority: Int = 2 - set(value) { - field = value - binding.chipGroup.check(chipIdFromPriority(value)) - } - get() { - return priorityFromChip(binding.chipGroup.checkedChipId) - } - private var mLastIdRes: Int = R.id.chipNormal - - constructor(context: Context) : super(context) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( - context, - attrs, - defStyle - ) { - init(context) - } - - private fun chipIdFromPriority(id: Int): Int { - return when (id) { - 0 -> R.id.chipLowest - 1 -> R.id.chipLow - 2 -> R.id.chipNormal - 3 -> R.id.chipHigh - 4 -> R.id.chipHighest - else -> R.id.chipNormal - } - } - - private fun priorityFromChip(id: Int): Int { - mLastIdRes = id - return when (id) { - R.id.chipLowest -> 0 - R.id.chipLow -> 1 - R.id.chipNormal -> 2 - R.id.chipHigh -> 3 - R.id.chipHighest -> 4 - else -> 2 - } - } - - private fun init(context: Context) { - View.inflate(context, R.layout.view_priority, this) - orientation = VERTICAL - binding = ViewPriorityBinding.bind(this) - - binding.chipGroup.setOnCheckedStateChangeListener { _, checkedIds -> - if (isAnyChecked()) { - updateState(priorityFromChip(checkedIds.first())) - } else { - chipView(mLastIdRes).isChecked = true - updateState(priorityFromChip(mLastIdRes)) - } - } - } - - private fun chipView(@IdRes id: Int): Chip { - return when (id) { - R.id.chipLowest -> binding.chipLowest - R.id.chipLow -> binding.chipLow - R.id.chipNormal -> binding.chipNormal - R.id.chipHigh -> binding.chipHigh - R.id.chipHighest -> binding.chipHighest - else -> binding.chipNormal - } - } - - private fun isAnyChecked(): Boolean { - return binding.chipLowest.isChecked || binding.chipLow.isChecked || - binding.chipNormal.isChecked || binding.chipHigh.isChecked || binding.chipHighest.isChecked - } - - private fun updateState(priority: Int) { - onPriorityChaneListener?.invoke(priority) - } -} diff --git a/app/src/main/java/com/elementary/tasks/core/views/RadiusPickerView.kt b/app/src/main/java/com/elementary/tasks/core/views/RadiusPickerView.kt deleted file mode 100644 index df13d319c..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/RadiusPickerView.kt +++ /dev/null @@ -1,65 +0,0 @@ -package com.elementary.tasks.core.views - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import android.widget.LinearLayout -import com.elementary.tasks.R -import com.elementary.tasks.core.utils.ui.radius.DefaultRadiusFormatter -import com.elementary.tasks.core.utils.ui.radius.RadiusSliderBehaviour -import com.elementary.tasks.databinding.ViewRadiusPickerBinding - -class RadiusPickerView : LinearLayout { - - private lateinit var radiusFormatter: DefaultRadiusFormatter - private lateinit var binding: ViewRadiusPickerBinding - private lateinit var behaviour: RadiusSliderBehaviour - - private var shouldNotify = true - - var onRadiusChangeListener: ((radius: Int) -> Unit)? = null - var radiusInM: Int - get() = behaviour.getRadius() - set(value) { - binding.labelView.text = radiusFormatter.format(value) - shouldNotify = false - binding.sliderView.value = value.toFloat() - shouldNotify = true - } - var useMetric: Boolean = true - set(value) { - field = value - radiusFormatter.useMetric = value - binding.labelView.text = radiusFormatter.format(radiusInM) - } - - constructor(context: Context) : super(context) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( - context, - attrs, - defStyle - ) { - init(context) - } - - private fun init(context: Context) { - View.inflate(context, R.layout.view_radius_picker, this) - orientation = HORIZONTAL - - binding = ViewRadiusPickerBinding.bind(this) - radiusFormatter = DefaultRadiusFormatter(context, useMetric) - behaviour = RadiusSliderBehaviour(binding.sliderView, 0) { - binding.labelView.text = radiusFormatter.format(it) - if (shouldNotify) { - onRadiusChangeListener?.invoke(it) - } - } - } -} diff --git a/app/src/main/java/com/elementary/tasks/core/views/RepeatLimitView.kt b/app/src/main/java/com/elementary/tasks/core/views/RepeatLimitView.kt deleted file mode 100644 index f5b3a2422..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/RepeatLimitView.kt +++ /dev/null @@ -1,63 +0,0 @@ -package com.elementary.tasks.core.views - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import android.widget.LinearLayout -import com.elementary.tasks.R -import com.elementary.tasks.core.views.common.ValueSliderView -import com.elementary.tasks.databinding.ViewRepeatLimitBinding - -class RepeatLimitView : LinearLayout { - - private lateinit var binding: ViewRepeatLimitBinding - var onLevelUpdateListener: ((level: Int) -> Unit)? = null - - constructor(context: Context) : super(context) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( - context, - attrs, - defStyle - ) { - init(context) - } - - override fun setEnabled(enabled: Boolean) { - super.setEnabled(enabled) - binding.valueSlider.isEnabled = enabled - } - - fun setLimit(level: Int) { - binding.valueSlider.value = level.toFloat() - } - - private fun init(context: Context) { - View.inflate(context, R.layout.view_repeat_limit, this) - orientation = HORIZONTAL - binding = ViewRepeatLimitBinding.bind(this) - - binding.valueSlider.valueFormatter = object : ValueSliderView.ValueFormatter { - override fun apply(value: Float): String { - val int = value.toInt() - return if (int < 0) { - context.getString(R.string.no_limits) - } else { - "$int" - } - } - } - binding.valueSlider.setRange(-1f, 365f, 1f) - binding.valueSlider.onValueChangeListener = object : ValueSliderView.OnValueChangeListener { - override fun onChanged(value: Float, displayValue: String) { - onLevelUpdateListener?.invoke(value.toInt()) - } - } - } -} diff --git a/app/src/main/java/com/elementary/tasks/core/views/RepeatView.kt b/app/src/main/java/com/elementary/tasks/core/views/RepeatView.kt deleted file mode 100644 index 070ca7d24..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/RepeatView.kt +++ /dev/null @@ -1,214 +0,0 @@ -package com.elementary.tasks.core.views - -import android.content.Context -import android.text.Editable -import android.text.TextWatcher -import android.util.AttributeSet -import android.view.View -import android.view.inputmethod.InputMethodManager -import android.widget.AdapterView -import android.widget.ArrayAdapter -import android.widget.LinearLayout -import com.elementary.tasks.R -import com.github.naz013.common.datetime.DateTimeManager -import com.elementary.tasks.databinding.ViewRepeatBinding -import com.github.naz013.logging.Logger - -class RepeatView : LinearLayout, TextWatcher { - - private lateinit var binding: ViewRepeatBinding - var onRepeatChangeListener: OnRepeatChangeListener? = null - private var mImm: InputMethodManager? = null - - private var mState = DateTimeManager.MultiplierType.DAY.index - private var mRepeatValue: Int = 0 - private var mIsLocked = false - - private val multiplier: Long - get() { - return when (mState) { - DateTimeManager.MultiplierType.SECOND.index -> DateTimeManager.SECOND - DateTimeManager.MultiplierType.MINUTE.index -> DateTimeManager.MINUTE - DateTimeManager.MultiplierType.HOUR.index -> DateTimeManager.HOUR - DateTimeManager.MultiplierType.DAY.index -> DateTimeManager.DAY - DateTimeManager.MultiplierType.WEEK.index -> DateTimeManager.DAY * 7 - DateTimeManager.MultiplierType.MONTH.index -> DateTimeManager.DAY * 30 - else -> DateTimeManager.DAY - } - } - - var defaultValue: Int = 0 - set(value) { - field = value - setDefaultField() - } - var repeat: Long - get() { - return if (mState == MONTHS) { - mRepeatValue.toLong() - } else { - mRepeatValue * multiplier - } - } - set(mills) { - if (mills == 0L) { - setProgress(0) - return - } - val repeatTime = DateTimeManager.parseRepeatTime(mills) - setProgress(repeatTime.value.toInt()) - selectState(repeatTime.type.index) - } - - private fun selectState(state: Int) { - if (state < binding.repeatType.adapter.count) { - binding.repeatType.setSelection(state) - } - } - - constructor(context: Context) : super(context) { - init(context, null) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context, attrs) - } - - constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( - context, - attrs, - defStyle - ) { - init(context, attrs) - } - - private fun init(context: Context, attrs: AttributeSet?) { - View.inflate(context, R.layout.view_repeat, this) - orientation = HORIZONTAL - binding = ViewRepeatBinding.bind(this) - - mImm = getContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - - binding.repeatType.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected(adapterView: AdapterView<*>?, view: View?, i: Int, l: Long) { - if (!mIsLocked) { - setState(i) - } - } - - override fun onNothingSelected(adapterView: AdapterView<*>) { - } - } - binding.repeatTitle.addTextChangedListener(this) - binding.repeatTitle.setOnFocusChangeListener { _, hasFocus -> - if (mImm == null) return@setOnFocusChangeListener - if (!hasFocus) { - mImm?.hideSoftInputFromWindow(binding.repeatTitle.windowToken, 0) - } else { - mImm?.showSoftInput(binding.repeatTitle, 0) - } - } - binding.repeatTitle.setOnClickListener { - if (mImm == null) return@setOnClickListener - if (mImm?.isActive(binding.repeatTitle) == false) { - mImm?.showSoftInput(binding.repeatTitle, 0) - } - } - if (attrs != null) { - val a = context.theme.obtainStyledAttributes(attrs, R.styleable.RepeatView, 0, 0) - try { - mState = a.getInt( - /* index = */ R.styleable.RepeatView_repeatType, - /* defValue = */ DateTimeManager.MultiplierType.DAY.index - ) - mIsLocked = a.getBoolean(R.styleable.RepeatView_isLocked, false) - } catch (e: Exception) { - Logger.d("init: ${e.message}") - } finally { - a.recycle() - } - } - mRepeatValue = defaultValue - setDefaultField() - if (mState == MONTHS && mIsLocked) { - binding.repeatType.adapter = ArrayAdapter( - context, - android.R.layout.simple_spinner_item, - resources.getStringArray(R.array.repeat_times_month) - ) - binding.repeatType.isEnabled = false - } else { - binding.repeatType.adapter = ArrayAdapter( - context, - android.R.layout.simple_spinner_item, - resources.getStringArray(R.array.repeat_times) - ) - binding.repeatType.isEnabled = true - } - setState(mState) - } - - private fun setState(state: Int) { - if (mState == state) return - this.mState = state - onRepeatChangeListener?.onChanged(repeat) - } - - private fun updateEditField() { - binding.repeatTitle.setSelection(binding.repeatTitle.text.toString().length) - } - - private fun setProgress(i: Int) { - if (mState == MONTHS && mIsLocked) { - if (i < defaultValue) { - setDefaultField() - } else { - mRepeatValue = i - binding.repeatTitle.setText(i.toString()) - updateEditField() - } - } else { - mRepeatValue = i - binding.repeatTitle.setText(i.toString()) - updateEditField() - } - } - - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { - } - - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { - try { - mRepeatValue = Integer.parseInt(s.toString()) - if (mRepeatValue > 0 && s.toString().startsWith("0")) { - binding.repeatTitle.setText(mRepeatValue.toString()) - binding.repeatTitle.setSelection(binding.repeatTitle.text.toString().length) - return - } - if (mState == MONTHS && mRepeatValue < defaultValue) { - setDefaultField() - return - } - } catch (e: NumberFormatException) { - setDefaultField() - } - onRepeatChangeListener?.onChanged(repeat) - } - - private fun setDefaultField() { - mRepeatValue = defaultValue - binding.repeatTitle.setText(defaultValue.toString()) - binding.repeatTitle.setSelection(binding.repeatTitle.text.toString().length) - } - - override fun afterTextChanged(s: Editable) { - } - - interface OnRepeatChangeListener { - fun onChanged(repeat: Long) - } - - companion object { - private const val MONTHS = 5 - } -} diff --git a/app/src/main/java/com/elementary/tasks/core/views/TuneExtraView.kt b/app/src/main/java/com/elementary/tasks/core/views/TuneExtraView.kt deleted file mode 100644 index 9ea4eeccc..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/TuneExtraView.kt +++ /dev/null @@ -1,137 +0,0 @@ -package com.elementary.tasks.core.views - -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.View -import android.widget.LinearLayout -import com.elementary.tasks.R -import com.elementary.tasks.core.binding.dialogs.DialogSelectExtraBinding -import com.github.naz013.domain.Reminder -import com.elementary.tasks.core.utils.fromReminder -import com.github.naz013.ui.common.Dialogues -import com.elementary.tasks.databinding.ViewTuneExtraBinding - -class TuneExtraView : LinearLayout { - - private lateinit var binding: ViewTuneExtraBinding - var onExtraUpdateListener: ((extra: Extra) -> Unit)? = null - var extra: Extra = Extra() - set(value) { - field = value - if (!value.useGlobal) { - field = value - binding.text.text = fromExtra(value) - onExtraUpdateListener?.invoke(value) - } else { - noExtra() - } - } - var hint: String = "" - var hasAutoExtra: Boolean = false - set(value) { - field = value - binding.text.text = fromExtra(extra) - onExtraUpdateListener?.invoke(extra) - } - var dialogues: Dialogues? = null - - private val customizationView: DialogSelectExtraBinding - get() { - val binding = DialogSelectExtraBinding( - LayoutInflater.from(context).inflate(R.layout.dialog_select_extra, null) - ) - binding.extraSwitch.setOnCheckedChangeListener { _, isChecked -> - binding.repeatCheck.isEnabled = !isChecked - binding.vibrationCheck.isEnabled = !isChecked - binding.voiceCheck.isEnabled = !isChecked - } - binding.voiceCheck.isChecked = extra.notifyByVoice - binding.vibrationCheck.isChecked = extra.vibrate - binding.repeatCheck.isChecked = extra.repeatNotification - binding.extraSwitch.isChecked = extra.useGlobal - - binding.repeatCheck.isEnabled = !extra.useGlobal - binding.vibrationCheck.isEnabled = !extra.useGlobal - binding.voiceCheck.isEnabled = !extra.useGlobal - return binding - } - - constructor(context: Context) : super(context) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( - context, - attrs, - defStyle - ) { - init(context) - } - - private fun fromExtra(extra: Extra): String { - if (extra.useGlobal) { - return context.getString(R.string.default_string) - } - var res = "" - res += toSign(extra.vibrate) - res += toSign(extra.notifyByVoice) - res += toSign(extra.repeatNotification) - res = res.trim() - if (res.endsWith(",")) res = res.substring(0, res.length - 1) - return res - } - - private fun toSign(b: Boolean): String { - return if (b) { - "[+], " - } else { - "[-], " - } - } - - private fun noExtra() { - binding.text.text = context.getString(R.string.default_string) - } - - private fun init(context: Context) { - View.inflate(context, R.layout.view_tune_extra, this) - orientation = VERTICAL - binding = ViewTuneExtraBinding.bind(this) - - binding.selectButton.setOnClickListener { - openCustomizationDialog() - } - extra = Extra().fromReminder(Reminder()) - } - - private fun openCustomizationDialog() { - val dialogues = dialogues ?: return - val builder = dialogues.getMaterialDialog(context) - builder.setTitle(R.string.personalization) - val b = customizationView - builder.setView(b.view) - builder.setPositiveButton(R.string.ok) { _, _ -> saveExtraResults(b) } - builder.create().show() - } - - private fun saveExtraResults(b: DialogSelectExtraBinding) { - val extra = extra - extra.useGlobal = b.extraSwitch.isChecked - extra.repeatNotification = b.repeatCheck.isChecked - extra.notifyByVoice = b.voiceCheck.isChecked - extra.vibrate = b.vibrationCheck.isChecked - this.extra = extra - } - - data class Extra( - var useGlobal: Boolean = false, - var vibrate: Boolean = false, - var repeatNotification: Boolean = false, - var notifyByVoice: Boolean = false - ) -} diff --git a/app/src/main/java/com/elementary/tasks/core/views/viewgroup/UiSelectorView.kt b/app/src/main/java/com/elementary/tasks/core/views/viewgroup/UiSelectorView.kt deleted file mode 100644 index f3525cf6f..000000000 --- a/app/src/main/java/com/elementary/tasks/core/views/viewgroup/UiSelectorView.kt +++ /dev/null @@ -1,208 +0,0 @@ -package com.elementary.tasks.core.views.viewgroup - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import android.view.ViewGroup -import android.widget.LinearLayout -import android.widget.TextView -import androidx.appcompat.widget.AppCompatImageView -import androidx.core.graphics.BlendModeColorFilterCompat -import androidx.core.graphics.BlendModeCompat -import androidx.core.graphics.drawable.DrawableCompat -import com.elementary.tasks.R -import com.github.naz013.logging.Logger -import com.google.android.material.dialog.MaterialAlertDialogBuilder - -class UiSelectorView : LinearLayout { - - var onItemSelectedListener: OnItemSelectedListener? = null - - private var index = 0 - private var emptyText = "" - private val items = mutableListOf() - - private lateinit var buttonLeft: AppCompatImageView - private lateinit var buttonRight: AppCompatImageView - private lateinit var labelView: TextView - - constructor(context: Context) : super(context) { - init(context, null) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context, attrs) - } - - constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( - context, - attrs, - defStyle - ) { - init(context, attrs) - } - - fun setEmptyText(text: String) { - this.emptyText = text - updateSelection() - } - - fun setItems(items: List) { - this.items.clear() - this.items.addAll(items) - if (index < 0 || index >= items.size) { - index = 0 - } - updateSelection() - updateButtons() - } - - private fun init(context: Context, attrs: AttributeSet?) { - View.inflate(context, R.layout.view_selector, this) - - orientation = HORIZONTAL - descendantFocusability = ViewGroup.FOCUS_BLOCK_DESCENDANTS - - buttonLeft = findViewById(R.id.left_button) - buttonRight = findViewById(R.id.right_button) - labelView = findViewById(R.id.label_view) - - buttonLeft.setOnClickListener { moveLeft() } - buttonRight.setOnClickListener { moveRight() } - labelView.setOnClickListener { showSelectionDialog() } - - if (attrs != null) { - val a = context.theme.obtainStyledAttributes(attrs, R.styleable.UiSelectorView, 0, 0) - try { - val showDialog = a.getBoolean(R.styleable.UiSelectorView_selector_canShowDialog, true) - emptyText = a.getString(R.styleable.UiSelectorView_selector_emptyText) ?: "" - val leftBackgroundColor = - a.getColor(R.styleable.UiSelectorView_selector_leftButtonBackground, 0) - val rightBackgroundColor = - a.getColor(R.styleable.UiSelectorView_selector_rightButtonBackground, 0) - val labelBackgroundColor = a.getColor(R.styleable.UiSelectorView_selector_textBackground, 0) - - val leftIconColor = a.getColor(R.styleable.UiSelectorView_selector_leftIconTintColor, 0) - val rightIconColor = a.getColor(R.styleable.UiSelectorView_selector_rightIconTintColor, 0) - - val textColor = a.getColor(R.styleable.UiSelectorView_selector_textColor, 0) - - a.getDrawable(R.styleable.UiSelectorView_selector_leftIcon) - ?.let { DrawableCompat.wrap(it).mutate() } - ?.also { - if (leftIconColor != 0) { - it.colorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat( - leftIconColor, - BlendModeCompat.SRC_ATOP - ) - } - } - ?.also { buttonLeft.setImageDrawable(it) } - a.getDrawable(R.styleable.UiSelectorView_selector_rightIcon) - ?.let { DrawableCompat.wrap(it).mutate() } - ?.also { - if (rightIconColor != 0) { - it.colorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat( - rightIconColor, - BlendModeCompat.SRC_ATOP - ) - } - } - ?.also { buttonRight.setImageDrawable(it) } - - if (leftBackgroundColor != 0) { - buttonLeft.setBackgroundColor(leftBackgroundColor) - } - if (rightBackgroundColor != 0) { - buttonRight.setBackgroundColor(rightBackgroundColor) - } - if (labelBackgroundColor != 0) { - labelView.setBackgroundColor(labelBackgroundColor) - } - if (textColor != 0) { - labelView.setTextColor(textColor) - } - - labelView.isEnabled = showDialog - } catch (e: Exception) { - Logger.d("init: ${e.message}") - } finally { - a.recycle() - } - } - updateSelection() - updateButtons() - } - - fun setSelectedItemPosition(position: Int) { - if (isIndexValid(position)) { - index = position - updateSelection() - updateButtons() - onItemSelectedListener?.onItemSelected(this, position) - } - } - - fun selectedItemPosition(): Int { - return index - } - - private fun showSelectionDialog() { - if (items.isEmpty()) return - - MaterialAlertDialogBuilder(context) - .setItems(items.toTypedArray()) { dialog, which -> - dialog.dismiss() - setSelectedItemPosition(which) - } - .create() - .show() - } - - private fun moveLeft() { - if (canMoveLeft()) { - index-- - updateSelection() - updateButtons() - onItemSelectedListener?.onItemSelected(this, index) - } - } - - private fun moveRight() { - if (canMoveRight()) { - index++ - updateSelection() - updateButtons() - onItemSelectedListener?.onItemSelected(this, index) - } - } - - private fun canMoveLeft(): Boolean { - return index > 0 - } - - private fun canMoveRight(): Boolean { - return index < items.size - 1 - } - - private fun updateSelection() { - if (isIndexValid(index)) { - labelView.text = items[index] - } else { - labelView.text = emptyText - } - } - - private fun isIndexValid(index: Int): Boolean { - return index >= 0 && index < items.size - } - - private fun updateButtons() { - buttonLeft.isEnabled = canMoveLeft() - buttonRight.isEnabled = canMoveRight() - } - - interface OnItemSelectedListener { - fun onItemSelected(view: UiSelectorView, position: Int) - } -} diff --git a/app/src/main/java/com/elementary/tasks/home/HomeFragment.kt b/app/src/main/java/com/elementary/tasks/home/HomeFragment.kt index 24f631997..336d39e23 100644 --- a/app/src/main/java/com/elementary/tasks/home/HomeFragment.kt +++ b/app/src/main/java/com/elementary/tasks/home/HomeFragment.kt @@ -25,7 +25,7 @@ import com.elementary.tasks.home.scheduleview.ScheduleModel import com.elementary.tasks.navigation.topfragment.BaseSearchableFragment import com.elementary.tasks.notes.preview.NotePreviewActivity import com.elementary.tasks.other.PrivacyPolicyActivity -import com.elementary.tasks.reminder.ReminderBuilderLauncher +import com.elementary.tasks.reminder.build.BuildReminderActivity import com.elementary.tasks.reminder.preview.ReminderPreviewActivity import com.elementary.tasks.whatsnew.WhatsNewManager import com.github.naz013.analytics.Screen @@ -53,7 +53,6 @@ class HomeFragment : private val featureManager by inject() private val whatsNewManager by inject() private val searchViewModel by viewModel() - private val reminderBuilderLauncher by inject() private val viewModel by viewModel() private val scheduleAdapter = ScheduleAdapter( @@ -175,7 +174,7 @@ class HomeFragment : type = Reminder.BY_DATE, dateTime = dateTime ) - reminderBuilderLauncher.openDeepLink(requireContext(), deepLinkData) { } + LoginApi.openLogged(requireContext(), BuildReminderActivity::class.java, deepLinkData) } private fun openGoogleTaskCreateScreen(time: LocalTime?) { diff --git a/app/src/main/java/com/elementary/tasks/notes/preview/NotePreviewActivity.kt b/app/src/main/java/com/elementary/tasks/notes/preview/NotePreviewActivity.kt index faa37e662..956577625 100644 --- a/app/src/main/java/com/elementary/tasks/notes/preview/NotePreviewActivity.kt +++ b/app/src/main/java/com/elementary/tasks/notes/preview/NotePreviewActivity.kt @@ -18,18 +18,18 @@ import com.elementary.tasks.core.os.PermissionFlowDelegateImpl import com.elementary.tasks.core.utils.BuildParams import com.elementary.tasks.core.utils.ListActions import com.elementary.tasks.core.utils.TelephonyUtil -import com.github.naz013.ui.common.Dialogues import com.elementary.tasks.core.utils.ui.tintOverflowButton import com.elementary.tasks.databinding.ActivityNotePreviewBinding import com.elementary.tasks.notes.create.CreateNoteActivity import com.elementary.tasks.notes.preview.carousel.ImagesCarouselAdapter import com.elementary.tasks.notes.preview.reminders.AttachedRemindersAdapter import com.elementary.tasks.notes.preview.reminders.UiNoteAttachedReminder -import com.elementary.tasks.reminder.ReminderBuilderLauncher +import com.elementary.tasks.reminder.build.BuildReminderActivity import com.github.naz013.common.Permissions import com.github.naz013.common.intent.IntentKeys import com.github.naz013.domain.note.NoteWithImages import com.github.naz013.feature.common.livedata.nonNullObserve +import com.github.naz013.ui.common.Dialogues import com.github.naz013.ui.common.activity.BindingActivity import com.github.naz013.ui.common.activity.toast import com.github.naz013.ui.common.context.colorOf @@ -59,7 +59,6 @@ class NotePreviewActivity : BindingActivity() { ) private val viewModel by viewModel { parametersOf(getId()) } - private val reminderBuilderLauncher by inject() private val dialogues by inject() private val uiHandler = Handler(Looper.getMainLooper()) @@ -126,7 +125,7 @@ class NotePreviewActivity : BindingActivity() { } private fun editReminder(id: String) { - reminderBuilderLauncher.openLogged(this) { + LoginApi.openLogged(this, BuildReminderActivity::class.java) { putExtra(IntentKeys.INTENT_ID, id) } } diff --git a/app/src/main/java/com/elementary/tasks/reminder/KoinModule.kt b/app/src/main/java/com/elementary/tasks/reminder/KoinModule.kt index ce0c7d435..8b807aeba 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/KoinModule.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/KoinModule.kt @@ -4,6 +4,7 @@ import com.elementary.tasks.reminder.build.BuildReminderViewModel import com.elementary.tasks.reminder.build.adapter.BiErrorForUiAdapter import com.elementary.tasks.reminder.build.adapter.BiTypeForUiAdapter import com.elementary.tasks.reminder.build.adapter.BiValueForUiAdapter +import com.elementary.tasks.reminder.build.adapter.ParamToTextAdapter import com.elementary.tasks.reminder.build.bi.BiFactory import com.elementary.tasks.reminder.build.bi.BiFactoryICal import com.elementary.tasks.reminder.build.bi.BiFilter @@ -62,10 +63,6 @@ import com.elementary.tasks.reminder.build.selectordialog.SelectorDialogViewMode import com.elementary.tasks.reminder.build.valuedialog.ValueDialogDataHolder import com.elementary.tasks.reminder.build.valuedialog.controller.ValueControllerFactory import com.elementary.tasks.reminder.build.valuedialog.controller.attachments.UriToAttachmentFileAdapter -import com.elementary.tasks.reminder.create.EditReminderViewModel -import com.elementary.tasks.reminder.create.fragments.recur.RecurBuilderViewModel -import com.elementary.tasks.reminder.create.fragments.recur.adapter.ParamToTextAdapter -import com.elementary.tasks.reminder.create.fragments.recur.preset.PresetViewModel import com.elementary.tasks.reminder.dialog.ReminderViewModel import com.elementary.tasks.reminder.lists.active.ActiveGpsRemindersViewModel import com.elementary.tasks.reminder.lists.active.ActiveRemindersViewModel @@ -84,9 +81,6 @@ import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module val reminderModule = module { - viewModel { RecurBuilderViewModel(get(), get(), get(), get(), get(), get(), get(), get()) } - viewModel { PresetViewModel(get(), get(), get()) } - viewModel { ActiveGpsRemindersViewModel(get(), get(), get()) } viewModel { ActiveRemindersViewModel(get(), get(), get(), get(), get()) } viewModel { ActiveTodoRemindersViewModel(get(), get(), get(), get(), get()) } @@ -155,25 +149,10 @@ val reminderModule = module { viewModel { (id: String) -> ReminderViewModel(id, get(), get(), get(), get(), get()) } viewModel { (id: String) -> FullScreenMapViewModel(id, get(), get(), get()) } - viewModel { (id: String) -> - EditReminderViewModel( - id, - get(), - get(), - get(), - get(), - get(), - get(), - get(), - get(), - get(), - get() - ) - } factory { UriToAttachmentFileAdapter(get()) } - factory { ParamToTextAdapter(get(), get()) } + factory { ParamToTextAdapter(get()) } factory { BuilderItemsHolder() } factory { BuilderItemsLogic(get()) } @@ -281,8 +260,6 @@ val reminderModule = module { factory { DefaultPresetsGenerateUseCase(get(), get(), get(), get()) } - single { ReminderBuilderLauncher(get()) } - factory { ShopItemsFormatter(get()) } single { RadiusFormatterFactory(get(), get()) } diff --git a/app/src/main/java/com/elementary/tasks/reminder/ReminderBuilderLauncher.kt b/app/src/main/java/com/elementary/tasks/reminder/ReminderBuilderLauncher.kt deleted file mode 100644 index 75a433705..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/ReminderBuilderLauncher.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.elementary.tasks.reminder - -import android.app.Activity -import android.content.Context -import android.content.Intent -import com.elementary.tasks.core.utils.params.Prefs -import com.elementary.tasks.reminder.build.BuildReminderActivity -import com.elementary.tasks.reminder.create.CreateReminderActivity -import com.github.naz013.navigation.DeepLinkData -import com.github.naz013.ui.common.login.LoginApi - -class ReminderBuilderLauncher(private val prefs: Prefs) { - - init { - PENDING_INTENT_CLASS = getActivityClass() - } - - fun openLogged(context: Context, builder: Intent.() -> Unit) { - LoginApi.openLogged(context, getActivityClass(), builder) - } - - fun toggleBuilder(activity: Activity) { - prefs.useLegacyBuilder = !prefs.useLegacyBuilder - PENDING_INTENT_CLASS = getActivityClass() - LoginApi.openLogged(activity, getActivityClass()) { } - activity.finish() - } - - fun openDeepLink( - context: Context, - deepLinkData: DeepLinkData, - builder: Intent.() -> Unit = { } - ) { - LoginApi.openLogged(context, getActivityClass(), deepLinkData, builder) - } - - fun getActivityClass(): Class<*> { - return if (prefs.useLegacyBuilder) { - CreateReminderActivity::class.java - } else { - BuildReminderActivity::class.java - } - } - - companion object { - var PENDING_INTENT_CLASS: Class<*> = BuildReminderActivity::class.java - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/ReminderResolver.kt b/app/src/main/java/com/elementary/tasks/reminder/ReminderResolver.kt index b7791ed8b..0a61fbb8d 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/ReminderResolver.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/ReminderResolver.kt @@ -3,15 +3,16 @@ package com.elementary.tasks.reminder import android.view.View import com.elementary.tasks.R import com.elementary.tasks.core.data.ui.UiReminderListData -import com.github.naz013.ui.common.context.startActivity -import com.github.naz013.common.intent.IntentKeys import com.elementary.tasks.core.utils.ListActions -import com.github.naz013.ui.common.Dialogues +import com.elementary.tasks.reminder.build.BuildReminderActivity import com.elementary.tasks.reminder.preview.ReminderPreviewActivity +import com.github.naz013.common.intent.IntentKeys +import com.github.naz013.ui.common.Dialogues +import com.github.naz013.ui.common.context.startActivity +import com.github.naz013.ui.common.login.LoginApi class ReminderResolver( private val dialogAction: () -> Dialogues, - private val reminderBuilderLauncher: ReminderBuilderLauncher, private val deleteAction: (reminder: UiReminderListData) -> Unit, private val toggleAction: (reminder: UiReminderListData) -> Unit, private val skipAction: (reminder: UiReminderListData) -> Unit @@ -89,7 +90,7 @@ class ReminderResolver( private fun editReminder(view: View, reminder: UiReminderListData) { view.context.run { - reminderBuilderLauncher.openLogged(this) { + LoginApi.openLogged(this, BuildReminderActivity::class.java) { putExtra(IntentKeys.INTENT_ID, reminder.id) } } diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/BuildReminderActivity.kt b/app/src/main/java/com/elementary/tasks/reminder/build/BuildReminderActivity.kt index a660e0a15..291f64100 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/BuildReminderActivity.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/BuildReminderActivity.kt @@ -18,7 +18,6 @@ import com.elementary.tasks.core.os.PermissionFlowDelegateImpl import com.elementary.tasks.core.utils.params.Prefs import com.elementary.tasks.core.utils.ui.onTextChanged import com.elementary.tasks.databinding.ActivityReminderBuilderBinding -import com.elementary.tasks.reminder.ReminderBuilderLauncher import com.elementary.tasks.reminder.build.adapter.BuilderAdapter import com.elementary.tasks.reminder.build.logic.builderstate.ReminderPrediction import com.elementary.tasks.reminder.build.selectordialog.SelectorDialog @@ -42,7 +41,6 @@ class BuildReminderActivity : ValueDialogCallback { private val viewModel by viewModel() - private val reminderBuilderLauncher by inject() private val prefs by inject() private val dialogues by inject() private val permissionFlowDelegate = PermissionFlowDelegateImpl(this) @@ -129,11 +127,6 @@ class BuildReminderActivity : true } - R.id.action_legacy_builder -> { - reminderBuilderLauncher.toggleBuilder(this) - true - } - else -> false } } @@ -145,7 +138,6 @@ class BuildReminderActivity : private fun updateMenu() { val menu = binding.toolbar.menu menu[1].isVisible = viewModel.canRemove - menu[3].isVisible = prefs.canChangeBuilder } private fun initViewModel() { diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/adapter/BiTypeForUiAdapter.kt b/app/src/main/java/com/elementary/tasks/reminder/build/adapter/BiTypeForUiAdapter.kt index 4723bd4ce..4c0cec9ce 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/adapter/BiTypeForUiAdapter.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/adapter/BiTypeForUiAdapter.kt @@ -5,7 +5,6 @@ import com.elementary.tasks.R import com.github.naz013.icalendar.RecurParamType import com.elementary.tasks.reminder.build.bi.BiGroup import com.github.naz013.domain.reminder.BiType -import com.elementary.tasks.reminder.create.fragments.recur.adapter.ParamToTextAdapter class BiTypeForUiAdapter( private val context: Context, diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/adapter/ParamToTextAdapter.kt b/app/src/main/java/com/elementary/tasks/reminder/build/adapter/ParamToTextAdapter.kt similarity index 61% rename from app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/adapter/ParamToTextAdapter.kt rename to app/src/main/java/com/elementary/tasks/reminder/build/adapter/ParamToTextAdapter.kt index 5aa835df5..f33c4cc17 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/adapter/ParamToTextAdapter.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/adapter/ParamToTextAdapter.kt @@ -1,28 +1,16 @@ -package com.elementary.tasks.reminder.create.fragments.recur.adapter +package com.elementary.tasks.reminder.build.adapter import com.elementary.tasks.R -import com.github.naz013.common.datetime.DateTimeManager +import com.github.naz013.common.TextProvider import com.github.naz013.icalendar.Day import com.github.naz013.icalendar.DayValue import com.github.naz013.icalendar.FreqType import com.github.naz013.icalendar.RecurParamType -import com.github.naz013.icalendar.UtcDateTime -import com.elementary.tasks.reminder.create.fragments.recur.BuilderParam -import com.github.naz013.common.TextProvider class ParamToTextAdapter( - private val textProvider: TextProvider, - private val dateTimeManager: DateTimeManager + private val textProvider: TextProvider ) { - fun createTextWithValues(param: BuilderParam<*>): String { - return "${getTypeText(param.recurParamType)}: ${getValueText(param.value)}" - } - - fun createText(param: BuilderParam<*>): String { - return getTypeText(param.recurParamType) - } - fun getTypeText(recurParamType: RecurParamType): String { return when (recurParamType) { RecurParamType.COUNT -> textProvider.getText(R.string.recur_count) @@ -41,43 +29,6 @@ class ParamToTextAdapter( } } - private fun getValueText(value: Any?): String { - if (value == null) return "" - - return when (value) { - is FreqType -> getFreqText(value) - is Int -> getIntText(value) - is UtcDateTime -> getDateTimeText(value) - is List<*> -> getListText(value) - is DayValue -> getDayText(value) - else -> value.toString() - } - } - - private fun getListText(list: List<*>): String { - return list.joinToString(",") { - when (it) { - is Int -> getIntText(it) - is DayValue -> getDayText(it) - else -> it.toString() - } - } - } - - private fun getDateTimeText(utcDateTime: UtcDateTime): String { - return utcDateTime.dateTime?.let { - dateTimeManager.getFullDateTime(it) - } ?: textProvider.getText(R.string.recur_not_set) - } - - private fun getIntText(int: Int): String { - return int.toString() - } - - private fun getDayText(dayValue: DayValue): String { - return dayValue.value - } - fun getDayFullText(dayValue: DayValue): String { return when (dayValue.day) { Day.MO -> textProvider.getText(R.string.recur_monday) diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/bi/BiFactoryICal.kt b/app/src/main/java/com/elementary/tasks/reminder/build/bi/BiFactoryICal.kt index c0e8ee8a6..e31eafea6 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/bi/BiFactoryICal.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/bi/BiFactoryICal.kt @@ -29,7 +29,7 @@ import com.elementary.tasks.reminder.build.formatter.ical.ICalFreqFormatter import com.elementary.tasks.reminder.build.formatter.ical.ICalGenericIntFormatter import com.elementary.tasks.reminder.build.formatter.ical.ICalGenericListIntFormatter import com.elementary.tasks.reminder.build.formatter.ical.ICalListDayValueFormatter -import com.elementary.tasks.reminder.create.fragments.recur.adapter.ParamToTextAdapter +import com.elementary.tasks.reminder.build.adapter.ParamToTextAdapter import com.github.naz013.domain.reminder.BiType import com.github.naz013.common.ContextProvider diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/formatter/ical/ICalDayValueFormatter.kt b/app/src/main/java/com/elementary/tasks/reminder/build/formatter/ical/ICalDayValueFormatter.kt index 82676d072..24b914620 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/formatter/ical/ICalDayValueFormatter.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/formatter/ical/ICalDayValueFormatter.kt @@ -2,7 +2,7 @@ package com.elementary.tasks.reminder.build.formatter.ical import com.github.naz013.icalendar.DayValue import com.elementary.tasks.reminder.build.formatter.Formatter -import com.elementary.tasks.reminder.create.fragments.recur.adapter.ParamToTextAdapter +import com.elementary.tasks.reminder.build.adapter.ParamToTextAdapter class ICalDayValueFormatter( private val paramToTextAdapter: ParamToTextAdapter diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/formatter/ical/ICalFreqFormatter.kt b/app/src/main/java/com/elementary/tasks/reminder/build/formatter/ical/ICalFreqFormatter.kt index 7835cf270..05a03d91c 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/formatter/ical/ICalFreqFormatter.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/formatter/ical/ICalFreqFormatter.kt @@ -2,7 +2,7 @@ package com.elementary.tasks.reminder.build.formatter.ical import com.github.naz013.icalendar.FreqType import com.elementary.tasks.reminder.build.formatter.Formatter -import com.elementary.tasks.reminder.create.fragments.recur.adapter.ParamToTextAdapter +import com.elementary.tasks.reminder.build.adapter.ParamToTextAdapter class ICalFreqFormatter( private val paramToTextAdapter: ParamToTextAdapter diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/formatter/ical/ICalListDayValueFormatter.kt b/app/src/main/java/com/elementary/tasks/reminder/build/formatter/ical/ICalListDayValueFormatter.kt index 689fd5cdd..77f55bcfe 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/formatter/ical/ICalListDayValueFormatter.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/formatter/ical/ICalListDayValueFormatter.kt @@ -4,7 +4,7 @@ import android.content.Context import com.elementary.tasks.R import com.github.naz013.icalendar.DayValue import com.elementary.tasks.reminder.build.formatter.Formatter -import com.elementary.tasks.reminder.create.fragments.recur.adapter.ParamToTextAdapter +import com.elementary.tasks.reminder.build.adapter.ParamToTextAdapter class ICalListDayValueFormatter( private val context: Context, diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preset/PresetAdapter.kt b/app/src/main/java/com/elementary/tasks/reminder/build/preset/PresetAdapter.kt similarity index 94% rename from app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preset/PresetAdapter.kt rename to app/src/main/java/com/elementary/tasks/reminder/build/preset/PresetAdapter.kt index 2d91dba55..b03742b21 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preset/PresetAdapter.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/preset/PresetAdapter.kt @@ -1,14 +1,13 @@ -package com.elementary.tasks.reminder.create.fragments.recur.preset +package com.elementary.tasks.reminder.build.preset import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.elementary.tasks.core.data.ui.preset.UiPresetList -import com.github.naz013.ui.common.view.visibleInvisible import com.elementary.tasks.databinding.ListItemRecurPresetBinding +import com.github.naz013.ui.common.view.visibleInvisible -@Deprecated("Use new builder screen") class PresetAdapter( private val canDelete: Boolean = true, private val onItemClickListener: (UiPresetList) -> Unit, diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preset/PresetDiffCallback.kt b/app/src/main/java/com/elementary/tasks/reminder/build/preset/PresetDiffCallback.kt similarity index 81% rename from app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preset/PresetDiffCallback.kt rename to app/src/main/java/com/elementary/tasks/reminder/build/preset/PresetDiffCallback.kt index 2782895fe..282332236 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preset/PresetDiffCallback.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/preset/PresetDiffCallback.kt @@ -1,10 +1,9 @@ -package com.elementary.tasks.reminder.create.fragments.recur.preset +package com.elementary.tasks.reminder.build.preset import androidx.recyclerview.widget.DiffUtil import com.elementary.tasks.core.data.ui.preset.UiPresetList import java.util.Objects -@Deprecated("Use new builder screen") class PresetDiffCallback : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: UiPresetList, newItem: UiPresetList): Boolean { diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/reminder/EventData.kt b/app/src/main/java/com/elementary/tasks/reminder/build/reminder/EventData.kt new file mode 100644 index 000000000..84aa8467f --- /dev/null +++ b/app/src/main/java/com/elementary/tasks/reminder/build/reminder/EventData.kt @@ -0,0 +1,8 @@ +package com.elementary.tasks.reminder.build.reminder + +import org.threeten.bp.LocalDateTime + +data class EventData( + val startDateTime: LocalDateTime, + val recurObject: String +) diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/reminder/ICalDateTimeCalculator.kt b/app/src/main/java/com/elementary/tasks/reminder/build/reminder/ICalDateTimeCalculator.kt index ca7ae5d07..e567330b0 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/reminder/ICalDateTimeCalculator.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/reminder/ICalDateTimeCalculator.kt @@ -1,25 +1,24 @@ package com.elementary.tasks.reminder.build.reminder +import com.elementary.tasks.reminder.build.BuilderItem +import com.elementary.tasks.reminder.build.ICalBuilderItem +import com.elementary.tasks.reminder.build.ICalStartDateBuilderItem +import com.elementary.tasks.reminder.build.ICalStartTimeBuilderItem +import com.elementary.tasks.reminder.build.ICalUntilDateBuilderItem +import com.elementary.tasks.reminder.build.ICalUntilTimeBuilderItem +import com.elementary.tasks.reminder.build.bi.BiGroup +import com.elementary.tasks.reminder.build.bi.ProcessedBuilderItems import com.github.naz013.common.datetime.DateTimeManager +import com.github.naz013.domain.reminder.BiType import com.github.naz013.icalendar.DateTimeStartTag -import com.github.naz013.icalendar.RecurParam import com.github.naz013.icalendar.ICalendarApi +import com.github.naz013.icalendar.RecurParam import com.github.naz013.icalendar.RecurrenceRuleTag import com.github.naz013.icalendar.RuleMap import com.github.naz013.icalendar.Tag import com.github.naz013.icalendar.TagType import com.github.naz013.icalendar.UntilRecurParam import com.github.naz013.icalendar.UtcDateTime -import com.elementary.tasks.reminder.build.BuilderItem -import com.elementary.tasks.reminder.build.ICalBuilderItem -import com.elementary.tasks.reminder.build.ICalStartDateBuilderItem -import com.elementary.tasks.reminder.build.ICalStartTimeBuilderItem -import com.elementary.tasks.reminder.build.ICalUntilDateBuilderItem -import com.elementary.tasks.reminder.build.ICalUntilTimeBuilderItem -import com.elementary.tasks.reminder.build.bi.BiGroup -import com.github.naz013.domain.reminder.BiType -import com.elementary.tasks.reminder.build.bi.ProcessedBuilderItems -import com.elementary.tasks.reminder.create.fragments.recur.EventData import com.github.naz013.logging.Logger import org.threeten.bp.LocalDateTime diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/reminder/compose/ICalDateTimeInjector.kt b/app/src/main/java/com/elementary/tasks/reminder/build/reminder/compose/ICalDateTimeInjector.kt index 50b96da25..fe881b919 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/reminder/compose/ICalDateTimeInjector.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/reminder/compose/ICalDateTimeInjector.kt @@ -1,9 +1,9 @@ package com.elementary.tasks.reminder.build.reminder.compose -import com.github.naz013.domain.Reminder -import com.github.naz013.common.datetime.DateTimeManager import com.elementary.tasks.reminder.build.bi.ProcessedBuilderItems import com.elementary.tasks.reminder.build.reminder.ICalDateTimeCalculator +import com.github.naz013.common.datetime.DateTimeManager +import com.github.naz013.domain.Reminder import com.github.naz013.logging.Logger import org.threeten.bp.LocalDateTime diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/selectordialog/SelectorDialog.kt b/app/src/main/java/com/elementary/tasks/reminder/build/selectordialog/SelectorDialog.kt index 88764d291..20d455fa4 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/selectordialog/SelectorDialog.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/selectordialog/SelectorDialog.kt @@ -11,7 +11,7 @@ import com.elementary.tasks.core.utils.ui.onTabSelected import com.elementary.tasks.core.utils.ui.onTextChanged import com.elementary.tasks.databinding.BottomSheetBuilderSelectorBinding import com.elementary.tasks.reminder.build.selectordialog.params.SelectorAdapter -import com.elementary.tasks.reminder.create.fragments.recur.preset.PresetAdapter +import com.elementary.tasks.reminder.build.preset.PresetAdapter import com.github.naz013.feature.common.livedata.nonNullObserve import com.github.naz013.logging.Logger import com.github.naz013.ui.common.view.gone diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ValueControllerFactory.kt b/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ValueControllerFactory.kt index 20594fe5a..e50ba4829 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ValueControllerFactory.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ValueControllerFactory.kt @@ -88,7 +88,7 @@ import com.elementary.tasks.reminder.build.valuedialog.controller.ical.ICalTimeC import com.elementary.tasks.reminder.build.valuedialog.controller.ical.ICalWeekStartController import com.elementary.tasks.reminder.build.valuedialog.controller.shopitems.SubTasksController import com.elementary.tasks.reminder.build.valuedialog.controller.shopitems.SubTasksViewModel -import com.elementary.tasks.reminder.create.fragments.recur.adapter.ParamToTextAdapter +import com.elementary.tasks.reminder.build.adapter.ParamToTextAdapter import com.github.naz013.domain.Place import com.github.naz013.feature.common.android.SystemServiceProvider import org.threeten.bp.LocalDate diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalDateController.kt b/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalDateController.kt index ba95059b4..176254113 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalDateController.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalDateController.kt @@ -2,13 +2,12 @@ package com.elementary.tasks.reminder.build.valuedialog.controller.ical import android.view.LayoutInflater import android.view.ViewGroup -import androidx.core.content.ContextCompat.startActivity import com.elementary.tasks.R import com.github.naz013.ui.common.context.startActivity import com.elementary.tasks.databinding.BuilderItemDateBinding import com.elementary.tasks.reminder.build.BuilderItem import com.elementary.tasks.reminder.build.valuedialog.controller.core.AbstractBindingValueController -import com.elementary.tasks.reminder.create.fragments.recur.RecurHelpActivity +import com.elementary.tasks.reminder.recur.RecurHelpActivity import org.threeten.bp.LocalDate class ICalDateController( diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalDayValueListController.kt b/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalDayValueListController.kt index 3e0cf622c..568e50d6f 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalDayValueListController.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalDayValueListController.kt @@ -6,8 +6,8 @@ import com.github.naz013.icalendar.Day import com.github.naz013.icalendar.DayValue import com.elementary.tasks.reminder.build.BuilderItem import com.elementary.tasks.reminder.build.valuedialog.controller.core.AbstractSelectableArrayController -import com.elementary.tasks.reminder.create.fragments.recur.RecurHelpActivity -import com.elementary.tasks.reminder.create.fragments.recur.adapter.ParamToTextAdapter +import com.elementary.tasks.reminder.recur.RecurHelpActivity +import com.elementary.tasks.reminder.build.adapter.ParamToTextAdapter class ICalDayValueListController( builderItem: BuilderItem>, diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalFreqController.kt b/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalFreqController.kt index e0440f1f6..56c34127b 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalFreqController.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalFreqController.kt @@ -5,8 +5,8 @@ import com.github.naz013.ui.common.context.startActivity import com.github.naz013.icalendar.FreqType import com.elementary.tasks.reminder.build.BuilderItem import com.elementary.tasks.reminder.build.valuedialog.controller.core.AbstractTypeController -import com.elementary.tasks.reminder.create.fragments.recur.RecurHelpActivity -import com.elementary.tasks.reminder.create.fragments.recur.adapter.ParamToTextAdapter +import com.elementary.tasks.reminder.recur.RecurHelpActivity +import com.elementary.tasks.reminder.build.adapter.ParamToTextAdapter class ICalFreqController( builderItem: BuilderItem, diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalIntController.kt b/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalIntController.kt index 5a56bddcf..047ca05c5 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalIntController.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalIntController.kt @@ -8,7 +8,7 @@ import com.elementary.tasks.core.views.common.ValueSliderView import com.elementary.tasks.databinding.BuilderItemRepeatLimitBinding import com.elementary.tasks.reminder.build.ICalIntBuilderItem import com.elementary.tasks.reminder.build.valuedialog.controller.core.AbstractBindingValueController -import com.elementary.tasks.reminder.create.fragments.recur.RecurHelpActivity +import com.elementary.tasks.reminder.recur.RecurHelpActivity class ICalIntController( builderItem: ICalIntBuilderItem diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalIntListController.kt b/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalIntListController.kt index 66dda3a54..5c1ac0bfe 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalIntListController.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalIntListController.kt @@ -4,7 +4,7 @@ import com.elementary.tasks.R import com.github.naz013.ui.common.context.startActivity import com.elementary.tasks.reminder.build.BuilderItem import com.elementary.tasks.reminder.build.valuedialog.controller.core.AbstractSelectableArrayController -import com.elementary.tasks.reminder.create.fragments.recur.RecurHelpActivity +import com.elementary.tasks.reminder.recur.RecurHelpActivity class ICalIntListController( builderItem: BuilderItem>, diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalTimeController.kt b/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalTimeController.kt index 4f3b4721b..09bf6e4c1 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalTimeController.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalTimeController.kt @@ -7,7 +7,7 @@ import com.github.naz013.ui.common.context.startActivity import com.elementary.tasks.databinding.BuilderItemTimeBinding import com.elementary.tasks.reminder.build.BuilderItem import com.elementary.tasks.reminder.build.valuedialog.controller.core.AbstractBindingValueController -import com.elementary.tasks.reminder.create.fragments.recur.RecurHelpActivity +import com.elementary.tasks.reminder.recur.RecurHelpActivity import org.threeten.bp.LocalTime class ICalTimeController( diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalWeekStartController.kt b/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalWeekStartController.kt index b7d48acee..4a2e53f48 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalWeekStartController.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/valuedialog/controller/ical/ICalWeekStartController.kt @@ -6,8 +6,8 @@ import com.github.naz013.icalendar.Day import com.github.naz013.icalendar.DayValue import com.elementary.tasks.reminder.build.BuilderItem import com.elementary.tasks.reminder.build.valuedialog.controller.core.AbstractTypeController -import com.elementary.tasks.reminder.create.fragments.recur.RecurHelpActivity -import com.elementary.tasks.reminder.create.fragments.recur.adapter.ParamToTextAdapter +import com.elementary.tasks.reminder.recur.RecurHelpActivity +import com.elementary.tasks.reminder.build.adapter.ParamToTextAdapter class ICalWeekStartController( builderItem: BuilderItem, diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/ConfigureActivity.kt b/app/src/main/java/com/elementary/tasks/reminder/create/ConfigureActivity.kt deleted file mode 100644 index aa05a6bb3..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/ConfigureActivity.kt +++ /dev/null @@ -1,86 +0,0 @@ -package com.elementary.tasks.reminder.create - -import android.os.Bundle -import androidx.activity.enableEdgeToEdge -import com.elementary.tasks.core.data.platform.ReminderCreatorConfig -import com.elementary.tasks.core.utils.BuildParams -import com.elementary.tasks.core.utils.params.Prefs -import com.elementary.tasks.core.views.PrefsView -import com.elementary.tasks.databinding.ActivityConfigureReminderCreatorBinding -import com.github.naz013.cloudapi.googletasks.GoogleTasksAuthManager -import com.github.naz013.logging.Logger -import com.github.naz013.ui.common.activity.BindingActivity -import com.github.naz013.ui.common.view.applyBottomInsets -import com.github.naz013.ui.common.view.applyTopInsets -import com.github.naz013.ui.common.view.visibleGone -import org.koin.android.ext.android.inject - -@Deprecated("Replaced by new Builder") -class ConfigureActivity : BindingActivity() { - - private val prefs by inject() - private val googleTasksAuthManager by inject() - private val config: ReminderCreatorConfig by lazy { prefs.reminderCreatorParams } - - override fun inflateBinding() = ActivityConfigureReminderCreatorBinding.inflate(layoutInflater) - - override fun onCreate(savedInstanceState: Bundle?) { - enableEdgeToEdge() - super.onCreate(savedInstanceState) - binding.appBar.applyTopInsets() - binding.scrollView.applyBottomInsets() - binding.toolbar.setNavigationOnClickListener { finish() } - - initParam(binding.beforeParam, config.isBeforePickerEnabled()) { - config.setBeforePickerEnabled(it) - } - - initParam(binding.repeatParam, config.isRepeatPickerEnabled()) { - config.setRepeatPickerEnabled(it) - } - - initParam(binding.repeatLimitParam, config.isRepeatLimitPickerEnabled()) { - config.setRepeatLimitPickerEnabled(it) - } - - initParam(binding.priorityParam, config.isPriorityPickerEnabled()) { - config.setPriorityPickerEnabled(it) - } - - initParam(binding.attachmentParam, config.isAttachmentPickerEnabled()) { - config.setAttachmentPickerEnabled(it) - } - - initParam(binding.calendarParam, config.isCalendarPickerEnabled()) { - config.setCalendarPickerEnabled(it) - } - - binding.tasksParam.visibleGone(googleTasksAuthManager.isAuthorized()) - initParam(binding.tasksParam, config.isGoogleTasksPickerEnabled()) { - config.setGoogleTasksPickerEnabled(it) - } - - initParam(binding.extraParam, config.isTuneExtraPickerEnabled()) { - config.setTuneExtraPickerEnabled(it) - } - - binding.ledParam.visibleGone(BuildParams.isPro) - initParam(binding.ledParam, config.isLedPickerEnabled()) { - config.setLedPickerEnabled(it) - } - } - - private fun initParam(prefsView: PrefsView, enabled: Boolean, onClick: (Boolean) -> Unit) { - prefsView.isChecked = enabled - prefsView.setOnClickListener { - prefsView.isChecked = !prefsView.isChecked - onClick(prefsView.isChecked) - save() - } - } - - private fun save() { - Logger.d("save: $config") - prefs.reminderCreatorParams = config - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/CreateReminderActivity.kt b/app/src/main/java/com/elementary/tasks/reminder/create/CreateReminderActivity.kt deleted file mode 100644 index 3ea7f3e88..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/CreateReminderActivity.kt +++ /dev/null @@ -1,622 +0,0 @@ -package com.elementary.tasks.reminder.create - -import android.annotation.SuppressLint -import android.app.Activity -import android.content.ContentResolver -import android.content.Intent -import android.os.Build -import android.os.Bundle -import android.view.Menu -import android.view.MenuItem -import android.view.View -import android.view.ViewGroup -import android.widget.AdapterView -import android.widget.ArrayAdapter -import android.widget.BaseAdapter -import androidx.core.view.get -import androidx.fragment.app.FragmentTransaction -import androidx.lifecycle.Observer -import com.elementary.tasks.R -import com.elementary.tasks.core.data.Commands -import com.elementary.tasks.core.deeplink.DeepLinkDataParser -import com.elementary.tasks.core.deeplink.ReminderDatetimeTypeDeepLinkData -import com.elementary.tasks.core.os.PermissionFlowDelegateImpl -import com.elementary.tasks.core.os.datapicker.UriPicker -import com.elementary.tasks.core.utils.io.MemoryUtil -import com.elementary.tasks.core.utils.params.Prefs -import com.elementary.tasks.databinding.ActivityCreateReminderBinding -import com.elementary.tasks.databinding.ListItemNavigationBinding -import com.elementary.tasks.reminder.create.fragments.ApplicationFragment -import com.elementary.tasks.reminder.create.fragments.DateFragment -import com.elementary.tasks.reminder.create.fragments.EmailFragment -import com.elementary.tasks.reminder.create.fragments.LocationFragment -import com.elementary.tasks.reminder.create.fragments.MonthFragment -import com.elementary.tasks.reminder.create.fragments.ReminderInterface -import com.elementary.tasks.reminder.create.fragments.ShopFragment -import com.elementary.tasks.reminder.create.fragments.TimerFragment -import com.elementary.tasks.reminder.create.fragments.TypeFragment -import com.elementary.tasks.reminder.create.fragments.WeekFragment -import com.elementary.tasks.reminder.create.fragments.YearFragment -import com.elementary.tasks.reminder.create.fragments.recur.RecurFragment -import com.github.naz013.appwidgets.AppWidgetUpdater -import com.github.naz013.cloudapi.FileConfig -import com.github.naz013.common.Module -import com.github.naz013.common.Permissions -import com.github.naz013.common.datetime.DateTimeManager -import com.github.naz013.common.intent.IntentKeys -import com.github.naz013.domain.Reminder -import com.github.naz013.domain.ReminderGroup -import com.github.naz013.logging.Logger -import com.github.naz013.navigation.intent.IntentDataReader -import com.github.naz013.ui.common.Dialogues -import com.github.naz013.ui.common.activity.BindingActivity -import com.github.naz013.ui.common.activity.toast -import com.github.naz013.ui.common.context.startActivity -import com.github.naz013.ui.common.view.visibleGone -import com.google.android.material.snackbar.Snackbar -import org.koin.android.ext.android.inject -import org.koin.androidx.viewmodel.ext.android.viewModel -import org.koin.core.parameter.parametersOf -import java.util.UUID - -@Deprecated("Replaced by new Builder") -class CreateReminderActivity : BindingActivity(), ReminderInterface { - - private val prefs by inject() - private val dateTimeManager by inject() - private val dialogues by inject() - private val appWidgetUpdater by inject() - private val intentDataReader by inject() - - private val viewModel by viewModel { parametersOf(getId()) } - private val stateViewModel by viewModel() - - private val permissionFlowDelegate = PermissionFlowDelegateImpl(this) - private val uriPicker = UriPicker(this) - - private var fragment: TypeFragment<*>? = null - private var isEditing: Boolean = false - private var isTablet = false - private var hasLocation = false - private var selectorList = emptyList() - - override val state: ReminderStateViewModel - get() = stateViewModel - override val defGroup: ReminderGroup? - get() = stateViewModel.group - override var canExportToTasks: Boolean = false - override var canExportToCalendar: Boolean = false - - private val reminderObserver: Observer = Observer { reminder -> - if (reminder != null) { - editReminder(reminder) - } - } - - override fun inflateBinding() = ActivityCreateReminderBinding.inflate(layoutInflater) - - override fun requireLogin() = true - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setSupportActionBar(binding.toolbar) - supportActionBar?.setDisplayShowTitleEnabled(false) - supportActionBar?.setDisplayHomeAsUpEnabled(true) - supportActionBar?.setHomeButtonEnabled(true) - supportActionBar?.setDisplayShowHomeEnabled(true) - - hasLocation = Module.hasLocation(this) - isTablet = resources.getBoolean(R.bool.is_tablet) - canExportToCalendar = prefs.isCalendarEnabled || prefs.isStockCalendarEnabled - canExportToTasks = stateViewModel.isLoggedToGoogleTasks() - - initNavigation() - - if (savedInstanceState == null) { - stateViewModel.reminder.priority = prefs.defaultPriority - stateViewModel.radius = prefs.radius - stateViewModel.markerStyle = prefs.markerStyle - } - - loadReminder() - } - - private fun openScreen(uiSelectorType: UiSelectorType) { - when (uiSelectorType) { - UiSelectorType.DATE -> replaceFragment(DateFragment()) - UiSelectorType.TIMER -> replaceFragment(TimerFragment()) - UiSelectorType.WEEK -> replaceFragment(WeekFragment()) - UiSelectorType.EMAIL -> replaceFragment(EmailFragment()) - UiSelectorType.APP -> replaceFragment(ApplicationFragment()) - UiSelectorType.MONTH -> replaceFragment(MonthFragment()) - UiSelectorType.SHOP -> replaceFragment(ShopFragment()) - UiSelectorType.YEAR -> replaceFragment(YearFragment()) - UiSelectorType.GPS -> replaceFragment(LocationFragment()) - UiSelectorType.RECUR -> replaceFragment(RecurFragment()) - } - } - - private fun initViewModel() { - lifecycle.addObserver(viewModel) - viewModel.reminder.observe(this, reminderObserver) - viewModel.result.observe(this) { commands -> - if (commands != null) { - when (commands) { - Commands.DELETED, Commands.SAVED -> { - setResult(Activity.RESULT_OK) - finish() - } - - else -> { - } - } - } - } - viewModel.allGroups.observe(this) { - if (it != null && it.isNotEmpty()) { - stateViewModel.group = it[0] - showGroup(it[0]) - } - } - } - - private fun getId(): String = intentString(IntentKeys.INTENT_ID) - - private fun loadReminder() { - val id = getId() - initViewModel() - when { - intent?.action == Intent.ACTION_SEND -> { - if ("text/plain" == intent.type) { - handleSendText(intent) - } - } - - id != "" -> { - isEditing = true - } - - intent.data != null -> { - readFromIntent() - } - - intent.getBooleanExtra(IntentKeys.INTENT_ITEM, false) -> { - intentDataReader.get(IntentKeys.INTENT_ITEM, Reminder::class.java)?.run { - Logger.logEvent("Reminder loaded from intent") - editReminder(this, false, fromFile = true) - } - } - - intent.getBooleanExtra(IntentKeys.INTENT_DEEP_LINK, false) -> { - runCatching { - val parser = DeepLinkDataParser() - when (val deepLinkData = parser.readDeepLinkData(intent)) { - is ReminderDatetimeTypeDeepLinkData -> { - stateViewModel.reminder.type = deepLinkData.type - stateViewModel.reminder.eventTime = dateTimeManager.getGmtFromDateTime( - dateTime = deepLinkData.dateTime - ) - editReminder(stateViewModel.reminder, false) - } - - else -> { - } - } - } - } - - else -> { - var lastPos = prefs.lastUsedReminder - if (lastPos >= binding.navSpinner.adapter.count) lastPos = 0 - binding.navSpinner.setSelection(lastPos) - } - } - } - - private fun readFromIntent() { - permissionFlowDelegate.permissionFlow.askPermission(Permissions.READ_EXTERNAL) { - intent.data?.let { - try { - var fromFile = false - val reminder = if (ContentResolver.SCHEME_CONTENT != it.scheme) { - val any = MemoryUtil.readFromUri(this, it, FileConfig.FILE_NAME_REMINDER) - if (any != null && any is Reminder) { - fromFile = true - any - } else { - Reminder() - } - } else { - Reminder() - } - editReminder(reminder, false, fromFile) - } catch (e: Throwable) { - Logger.d("loadReminder: ${e.message}") - } - } - } - } - - private fun editReminder(reminder: Reminder, stop: Boolean = true, fromFile: Boolean = false) { - Logger.d("editReminder: $stop, $reminder") - stateViewModel.reminder = reminder - stateViewModel.isFromFile = fromFile - if (fromFile) { - viewModel.findSame(reminder.uuId) - } - if (stop) { - viewModel.pauseReminder(reminder) - stateViewModel.original = reminder - stateViewModel.isPaused = true - } else { - val group = defGroup - if (reminder.groupUuId.isBlank() && group != null) { - stateViewModel.reminder.groupUuId = group.groupUuId - stateViewModel.reminder.groupColor = group.groupColor - stateViewModel.reminder.groupTitle = group.groupTitle - } - } - val current = binding.navSpinner.selectedItemPosition.let { selectorList.getOrNull(it) }?.type - var toSelect: UiSelectorType = UiSelectorType.DATE - when (reminder.type) { - Reminder.BY_DATE, Reminder.BY_DATE_CALL, Reminder.BY_DATE_SMS -> { - toSelect = UiSelectorType.DATE - } - - Reminder.BY_TIME, Reminder.BY_TIME_CALL, Reminder.BY_TIME_SMS -> { - toSelect = UiSelectorType.TIMER - } - - Reminder.BY_WEEK, Reminder.BY_WEEK_CALL, Reminder.BY_WEEK_SMS -> { - toSelect = UiSelectorType.WEEK - } - - Reminder.BY_DATE_EMAIL -> { - toSelect = UiSelectorType.EMAIL - } - - Reminder.BY_DATE_APP, Reminder.BY_DATE_LINK -> { - toSelect = UiSelectorType.APP - } - - Reminder.BY_MONTH, Reminder.BY_MONTH_CALL, Reminder.BY_MONTH_SMS -> { - toSelect = UiSelectorType.MONTH - } - - Reminder.BY_DATE_SHOP -> { - toSelect = UiSelectorType.SHOP - } - - Reminder.BY_DAY_OF_YEAR, Reminder.BY_DAY_OF_YEAR_CALL, Reminder.BY_DAY_OF_YEAR_SMS -> { - toSelect = UiSelectorType.YEAR - } - - Reminder.BY_RECUR, Reminder.BY_RECUR_CALL, Reminder.BY_RECUR_SMS -> { - toSelect = if (com.elementary.tasks.core.utils.BuildParams.isPro) { - UiSelectorType.RECUR - } else { - UiSelectorType.DATE - } - } - - else -> { - toSelect = if (hasLocation) { - when (reminder.type) { - Reminder.BY_LOCATION, Reminder.BY_LOCATION_CALL, Reminder.BY_LOCATION_SMS, - Reminder.BY_OUT_SMS, Reminder.BY_OUT_CALL, Reminder.BY_OUT, Reminder.BY_PLACES, - Reminder.BY_PLACES_SMS, Reminder.BY_PLACES_CALL -> { - UiSelectorType.GPS - } - - else -> { - UiSelectorType.GPS - } - } - } else { - UiSelectorType.DATE - } - } - } - if (current == toSelect) { - openScreen(toSelect) - } else { - val index = selectorList.indexOfFirst { it.type == toSelect } - if (index != -1) { - binding.navSpinner.setSelection(index) - } - } - } - - private fun initNavigation() { - val list = mutableListOf() - list.add(UiSelectorReminder(getString(R.string.by_date), UiSelectorType.DATE)) - list.add(UiSelectorReminder(getString(R.string.timer), UiSelectorType.TIMER)) - list.add(UiSelectorReminder(getString(R.string.alarm), UiSelectorType.WEEK)) - list.add(UiSelectorReminder(getString(R.string.e_mail), UiSelectorType.EMAIL)) - if (Module.is12) { - list.add(UiSelectorReminder(getString(R.string.open_link), UiSelectorType.APP)) - } else { - list.add(UiSelectorReminder(getString(R.string.launch_application), UiSelectorType.APP)) - } - list.add(UiSelectorReminder(getString(R.string.day_of_month), UiSelectorType.MONTH)) - list.add(UiSelectorReminder(getString(R.string.yearly), UiSelectorType.YEAR)) - list.add(UiSelectorReminder(getString(R.string.shopping_list), UiSelectorType.SHOP)) - if (hasLocation) { - list.add(UiSelectorReminder(getString(R.string.location), UiSelectorType.GPS)) - } - if (com.elementary.tasks.core.utils.BuildParams.isPro) { - list.add(UiSelectorReminder(getString(R.string.recur_custom), UiSelectorType.RECUR)) - } - - selectorList = list - val adapter = TitleNavigationAdapter(list) - - binding.navSpinner.adapter = adapter - binding.navSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { - prefs.lastUsedReminder = position - openScreen(list[position].type) - } - - override fun onNothingSelected(parent: AdapterView<*>) { - } - } - } - - private fun changeGroup() { - val groups = viewModel.getGroups() - val names = groups.map { it.groupTitle } - val builder = dialogues.getMaterialDialog(this) - builder.setTitle(R.string.choose_group) - builder.setSingleChoiceItems( - ArrayAdapter( - this, - android.R.layout.simple_list_item_single_choice, - names - ), - names.indexOf(stateViewModel.reminder.groupTitle) - ) { dialog, which -> - dialog.dismiss() - showGroup(groups[which]) - } - builder.create().show() - } - - private fun showGroup(item: ReminderGroup?) { - if (item == null) return - val frag = fragment ?: return - frag.onGroupUpdate(item) - } - - private fun replaceFragment(fragment: TypeFragment<*>) { - runCatching { - supportFragmentManager.beginTransaction() - .replace(R.id.main_container, fragment, null) - .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) - .commitAllowingStateLoss() - } - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - R.id.action_add -> { - askNotificationPermissionIfNeeded() - return true - } - - R.id.action_delete -> { - deleteReminder() - return true - } - - R.id.action_configure -> { - startActivity(ConfigureActivity::class.java) - return true - } - - android.R.id.home -> { - closeScreen() - return true - } - } - return super.onOptionsItemSelected(item) - } - - override fun selectMelody() { - } - - override fun attachFile() { - permissionFlowDelegate.permissionFlow.askPermission(Permissions.READ_EXTERNAL) { - selectAnyFile() - } - } - - private fun closeScreen() { - if (isEditing) { - if (!stateViewModel.reminder.isActive) { - viewModel.resumeReminder(stateViewModel.reminder) - } - setResult(Activity.RESULT_OK) - finish() - } else { - setResult(Activity.RESULT_OK) - finish() - } - } - - private fun deleteReminder() { - if (stateViewModel.reminder.isRemoved) { - dialogues.askConfirmation(this, getString(R.string.delete)) { - if (it) viewModel.deleteReminder(stateViewModel.reminder, true) - } - } else { - dialogues.askConfirmation(this, getString(R.string.move_to_trash)) { - if (it) viewModel.moveToTrash(stateViewModel.reminder) - } - } - } - - private fun askNotificationPermissionIfNeeded() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - permissionFlowDelegate.permissionFlow.askPermission(Permissions.POST_NOTIFICATION) { - askCopySaving() - } - } else { - askCopySaving() - } - } - - private fun askCopySaving() { - if (stateViewModel.isFromFile && viewModel.hasSameInDb) { - dialogues.getMaterialDialog(this) - .setMessage(R.string.same_reminder_message) - .setPositiveButton(R.string.keep) { dialogInterface, _ -> - dialogInterface.dismiss() - save(true) - } - .setNegativeButton(R.string.replace) { dialogInterface, _ -> - dialogInterface.dismiss() - save() - } - .setNeutralButton(R.string.cancel) { dialogInterface, _ -> - dialogInterface.dismiss() - } - .create() - .show() - } else { - save() - } - } - - private fun save(newId: Boolean = false) { - fragment?.let { - it.prepare()?.let { item -> - Logger.d("save: $item") - viewModel.reminder.removeObserver(reminderObserver) - stateViewModel.isSaving = true - if (newId) { - item.uuId = UUID.randomUUID().toString() - } - viewModel.saveAndStartReminder(item, isEditing) - } - } - } - - override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.activity_create_reminder, menu) - menu[1].isVisible = isEditing && !stateViewModel.isFromFile - return true - } - - private fun handleSendText(intent: Intent) { - intent.getStringExtra(Intent.EXTRA_TEXT)?.let { - stateViewModel.reminder.summary = it - editReminder(stateViewModel.reminder, false) - } - } - - private fun selectAnyFile() { - val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) - intent.addCategory(Intent.CATEGORY_OPENABLE) - intent.type = "*/*" - try { - uriPicker.launchIntent(intent) { uri -> - uri?.also { fragment?.onAttachmentSelect(it) } - } - } catch (e: Exception) { - toast(R.string.app_not_found) - } - } - - override fun selectGroup() { - changeGroup() - } - - override fun showSnackbar(title: String, actionName: String, listener: View.OnClickListener) { - Snackbar.make(binding.coordinator, title, Snackbar.LENGTH_SHORT).setAction(actionName, listener) - .show() - } - - override fun showSnackbar(title: String) { - Snackbar.make(binding.coordinator, title, Snackbar.LENGTH_SHORT).show() - } - - override fun setFullScreenMode(fullScreenEnabled: Boolean) { - if (!isTablet) { - binding.appBar.visibleGone(!fullScreenEnabled) - } - } - - override fun updateScroll(y: Int) { - if (!isTablet) binding.appBar.isSelected = y > 0 - } - - override fun isTablet(): Boolean { - return isTablet - } - - override fun setFragment(typeFragment: TypeFragment<*>?) { - this.fragment = typeFragment - } - - override fun onDestroy() { - super.onDestroy() - if (stateViewModel.isPaused && !stateViewModel.isSaving) { - stateViewModel.original?.let { viewModel.resumeReminder(it) } - } - appWidgetUpdater.updateAllWidgets() - appWidgetUpdater.updateCalendarWidget() - } - - override fun handleBackPress(): Boolean { - if (fragment != null && fragment?.onBackPressed() == true) { - closeScreen() - } - return true - } - - private data class UiSelectorReminder(val title: String, val type: UiSelectorType) - - private enum class UiSelectorType { - DATE, - TIMER, - WEEK, - EMAIL, - APP, - MONTH, - YEAR, - SHOP, - GPS, - RECUR - } - - private inner class TitleNavigationAdapter( - private val items: List - ) : BaseAdapter() { - - override fun getCount(): Int { - return items.size - } - - override fun getItem(index: Int): Any { - return items[index] - } - - override fun getItemId(position: Int): Long { - return position.toLong() - } - - @SuppressLint("ViewHolder") - override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { - val cView = ListItemNavigationBinding.inflate(layoutInflater) - cView.txtTitle.text = items[position].title - return cView.root - } - - override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View { - val cView = ListItemNavigationBinding.inflate(layoutInflater) - cView.txtTitle.text = items[position].title - return cView.root - } - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/EditReminderViewModel.kt b/app/src/main/java/com/elementary/tasks/reminder/create/EditReminderViewModel.kt deleted file mode 100644 index 77e58ee15..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/EditReminderViewModel.kt +++ /dev/null @@ -1,175 +0,0 @@ -package com.elementary.tasks.reminder.create - -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.LiveData -import androidx.lifecycle.viewModelScope -import com.elementary.tasks.core.analytics.ReminderAnalyticsTracker -import com.elementary.tasks.core.arch.BaseProgressViewModel -import com.elementary.tasks.core.controller.EventControlFactory -import com.elementary.tasks.core.data.Commands -import com.elementary.tasks.core.data.observeTable -import com.elementary.tasks.core.data.ui.reminder.UiReminderType -import com.github.naz013.common.intent.IntentKeys -import com.elementary.tasks.core.utils.GoogleCalendarUtils -import com.elementary.tasks.core.utils.work.WorkerLauncher -import com.elementary.tasks.reminder.work.ReminderDeleteBackupWorker -import com.elementary.tasks.reminder.work.ReminderSingleBackupWorker -import com.github.naz013.analytics.AnalyticsEventSender -import com.github.naz013.analytics.Feature -import com.github.naz013.analytics.FeatureUsedEvent -import com.github.naz013.domain.GoogleTask -import com.github.naz013.domain.GoogleTaskList -import com.github.naz013.domain.Reminder -import com.github.naz013.domain.ReminderGroup -import com.github.naz013.feature.common.coroutine.DispatcherProvider -import com.github.naz013.feature.common.livedata.toLiveData -import com.github.naz013.feature.common.viewmodel.mutableLiveDataOf -import com.github.naz013.logging.Logger -import com.github.naz013.repository.PlaceRepository -import com.github.naz013.repository.ReminderGroupRepository -import com.github.naz013.repository.ReminderRepository -import com.github.naz013.repository.observer.TableChangeListenerFactory -import com.github.naz013.repository.table.Table -import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking - -@Deprecated("Replaced by new Builder") -class EditReminderViewModel( - id: String, - private val googleCalendarUtils: GoogleCalendarUtils, - private val eventControlFactory: EventControlFactory, - dispatcherProvider: DispatcherProvider, - private val workerLauncher: WorkerLauncher, - private val reminderGroupRepository: ReminderGroupRepository, - private val reminderRepository: ReminderRepository, - private val placeRepository: PlaceRepository, - private val analyticsEventSender: AnalyticsEventSender, - private val reminderAnalyticsTracker: ReminderAnalyticsTracker, - private val tableChangeListenerFactory: TableChangeListenerFactory -) : BaseProgressViewModel(dispatcherProvider) { - - private val _googleTask = mutableLiveDataOf>() - val googleTask = _googleTask.toLiveData() - - val reminder = viewModelScope.observeTable( - table = Table.Reminder, - tableChangeListenerFactory = tableChangeListenerFactory, - queryProducer = { reminderRepository.getById(id) } - ) - var hasSameInDb: Boolean = false - - private var _allGroups = viewModelScope.observeTable( - table = Table.ReminderGroup, - tableChangeListenerFactory = tableChangeListenerFactory, - queryProducer = { reminderGroupRepository.getAll() } - ) - var allGroups: LiveData> = _allGroups - - fun getGroups(): List { - return _allGroups.value ?: emptyList() - } - - override fun onCreate(owner: LifecycleOwner) { - super.onCreate(owner) - reminderAnalyticsTracker.startTracking() - } - - fun saveAndStartReminder(reminder: Reminder, isEdit: Boolean = true) { - postInProgress(true) - viewModelScope.launch(dispatcherProvider.default()) { - runBlocking { - Logger.d("saveAndStartReminder: save START") - if (reminder.groupUuId == "") { - val group = reminderGroupRepository.defaultGroup() - if (group != null) { - reminder.groupColor = group.groupColor - reminder.groupTitle = group.groupTitle - reminder.groupUuId = group.groupUuId - } - } - reminderRepository.save(reminder) - if (!isEdit) { - if (Reminder.isGpsType(reminder.type)) { - val places = reminder.places - if (places.isNotEmpty()) { - placeRepository.save(places[0]) - } - } - } - eventControlFactory.getController(reminder).enable() - Logger.d("saveAndStartReminder: save DONE") - analyticsEventSender.send(FeatureUsedEvent(Feature.CREATE_REMINDER)) - reminderAnalyticsTracker.sendEvent(UiReminderType(reminder.type).getEventType()) - Logger.logEvent("Reminder saved, type = ${reminder.type}") - } - backupReminder(reminder.uuId) - postInProgress(false) - postCommand(Commands.SAVED) - } - } - - fun pauseReminder(reminder: Reminder) { - postInProgress(true) - viewModelScope.launch(dispatcherProvider.default()) { - eventControlFactory.getController(reminder).pause() - postInProgress(false) - } - } - - fun resumeReminder(reminder: Reminder) { - postInProgress(true) - viewModelScope.launch(dispatcherProvider.default()) { - eventControlFactory.getController(reminder).resume() - postInProgress(false) - } - } - - fun findSame(id: String) { - viewModelScope.launch(dispatcherProvider.default()) { - val reminder = reminderRepository.getById(id) - hasSameInDb = reminder != null - } - } - - fun moveToTrash(reminder: Reminder) { - withResultSuspend { - reminder.isRemoved = true - eventControlFactory.getController(reminder).disable() - reminderRepository.save(reminder) - backupReminder(reminder.uuId) - Commands.DELETED - } - } - - fun deleteReminder(reminder: Reminder, showMessage: Boolean) { - if (showMessage) { - withResultSuspend { - eventControlFactory.getController(reminder).disable() - reminderRepository.delete(reminder.uuId) - googleCalendarUtils.deleteEvents(reminder.uuId) - workerLauncher.startWork( - ReminderDeleteBackupWorker::class.java, - IntentKeys.INTENT_ID, - reminder.uuId - ) - Commands.DELETED - } - } else { - withProgressSuspend { - eventControlFactory.getController(reminder).disable() - reminderRepository.delete(reminder.uuId) - googleCalendarUtils.deleteEvents(reminder.uuId) - workerLauncher.startWork( - ReminderDeleteBackupWorker::class.java, - IntentKeys.INTENT_ID, - reminder.uuId - ) - } - } - } - - private fun backupReminder(uuId: String) { - Logger.d("backupReminder: start backup") - workerLauncher.startWork(ReminderSingleBackupWorker::class.java, IntentKeys.INTENT_ID, uuId) - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/ReminderStateViewModel.kt b/app/src/main/java/com/elementary/tasks/reminder/create/ReminderStateViewModel.kt deleted file mode 100644 index bbe9a84d4..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/ReminderStateViewModel.kt +++ /dev/null @@ -1,76 +0,0 @@ -package com.elementary.tasks.reminder.create - -import androidx.lifecycle.LifecycleObserver -import androidx.lifecycle.ViewModel -import com.elementary.tasks.core.utils.FeatureManager -import com.github.naz013.cloudapi.googletasks.GoogleTasksAuthManager -import com.github.naz013.domain.Reminder -import com.github.naz013.domain.ReminderGroup -import com.github.naz013.domain.reminder.ShopItem -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDateTime -import org.threeten.bp.LocalTime - -@Deprecated("Replaced by new Builder") -class ReminderStateViewModel( - private val googleTasksAuthManager: GoogleTasksAuthManager, - private val featureManager: FeatureManager -) : ViewModel(), LifecycleObserver { - - var shopItems: List = listOf() - var weekdays: List = listOf() - var reminder: Reminder = Reminder() - var group: ReminderGroup? = null - - var isShopItemsEdited: Boolean = false - var isLink: Boolean = false - var isMessage: Boolean = false - var isDelayAdded: Boolean = false - var isEmailOrSubjectChanged: Boolean = false - var isLeave: Boolean = false - var isLastDay: Boolean = false - var isWeekdaysSaved: Boolean = false - var isAppSaved: Boolean = false - - var app: String = "" - var link: String = "" - var email: String = "" - var subject: String = "" - - var date: LocalDate = LocalDate.now() - var time: LocalTime = LocalTime.now() - - var day: Int = 0 - var month: Int = 0 - var year: Int = 0 - - var hour: Int = 0 - var minute: Int = 0 - - var radius: Int = 0 - var markerStyle: Int = 0 - - var timer: Long = 0 - var isPaused: Boolean = false - var original: Reminder? = null - var isSaving: Boolean = false - var isFromFile: Boolean = false - - init { - setDateTime() - } - - fun isLoggedToGoogleTasks(): Boolean { - return featureManager.isFeatureEnabled(FeatureManager.Feature.GOOGLE_TASKS) && - googleTasksAuthManager.isAuthorized() - } - - private fun setDateTime() { - val dateTime = LocalDateTime.now() - day = dateTime.dayOfMonth - month = dateTime.monthValue - 1 - year = dateTime.year - hour = dateTime.hour - minute = dateTime.minute - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/ApplicationFragment.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/ApplicationFragment.kt deleted file mode 100644 index 321da0173..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/ApplicationFragment.kt +++ /dev/null @@ -1,185 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments - -import android.os.Bundle -import android.text.TextUtils -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.elementary.tasks.R -import com.elementary.tasks.core.os.datapicker.ApplicationPicker -import com.elementary.tasks.core.utils.onChanged -import com.elementary.tasks.core.utils.params.ReminderExplanationVisibility -import com.elementary.tasks.core.views.ClosableLegacyBuilderRemovalWarningView -import com.elementary.tasks.databinding.FragmentReminderApplicationBinding -import com.github.naz013.common.Module -import com.github.naz013.common.PackageManagerWrapper -import com.github.naz013.domain.Reminder -import com.github.naz013.logging.Logger -import com.github.naz013.ui.common.view.gone -import com.github.naz013.ui.common.view.visibleGone -import org.koin.android.ext.android.inject - -class ApplicationFragment : RepeatableTypeFragment() { - - private val packageManagerWrapper by inject() - private val applicationPicker = ApplicationPicker(this) { - iFace.state.app = it - iFace.state.isAppSaved = true - binding.applicationName.text = appName - } - - private val type: Int - get() = if (isApplication()) { - Reminder.BY_DATE_APP - } else { - Reminder.BY_DATE_LINK - } - private val appName: String - get() = packageManagerWrapper.getApplicationName(iFace.state.app) - - override fun getExplanationVisibilityType(): ReminderExplanationVisibility.Type { - return ReminderExplanationVisibility.Type.LINK - } - - override fun getExplanationView(): View { - return binding.explanationView - } - - override fun setCloseListenerToExplanationView(listener: View.OnClickListener) { - binding.explanationView.setOnClickListener(listener) - } - - override fun prepare(): Reminder? { - val type = type - var number: String - val reminder = iFace.state.reminder - if (Reminder.isSame(type, Reminder.BY_DATE_APP)) { - number = iFace.state.app - if (TextUtils.isEmpty(number)) { - iFace.showSnackbar(getString(R.string.you_dont_select_application)) - return null - } - } else { - number = binding.urlField.text.toString().trim() - if (TextUtils.isEmpty(number) || number.matches(".*https?://".toRegex())) { - iFace.showSnackbar(getString(R.string.you_dont_insert_link)) - return null - } - if (!number.startsWith("http://") && !number.startsWith("https://")) { - number = "http://$number" - } - } - val startTime = binding.dateView.selectedDateTime - if (!validBefore(startTime, reminder)) { - iFace.showSnackbar(getString(R.string.invalid_remind_before_parameter)) - return null - } - Logger.d("EVENT_TIME ${dateTimeManager.logDateTime(startTime)}") - if (!dateTimeManager.isCurrent(startTime)) { - iFace.showSnackbar(getString(R.string.reminder_is_outdated)) - return null - } - val gmtTime = dateTimeManager.getGmtFromDateTime(startTime) - reminder.target = number - reminder.type = type - reminder.eventTime = gmtTime - reminder.startTime = gmtTime - reminder.after = 0L - reminder.dayOfMonth = 0 - reminder.delay = 0 - reminder.eventCount = 0 - reminder.recurDataObject = null - return reminder - } - - override fun inflate( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentReminderApplicationBinding.inflate(inflater, container, false) - - override fun getDynamicViews(): List { - return listOfNotNull( - binding.ledView, - binding.exportToCalendar, - binding.exportToTasks, - binding.tuneExtraView, - binding.attachmentView, - binding.groupView, - binding.taskSummary, - binding.beforeView, - binding.dateView, - binding.priorityView, - binding.repeatLimitView, - binding.repeatView - ) - } - - override fun getLegacyMessageView(): ClosableLegacyBuilderRemovalWarningView { - return binding.legacyBuilderWarningView - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - binding.tuneExtraView.hasAutoExtra = true - binding.tuneExtraView.hint = getString(R.string.enable_launching_application_automatically) - - binding.pickApplication.setOnClickListener { applicationPicker.pickApplication() } - binding.urlLayout.gone() - binding.urlField.setText(iFace.state.link) - binding.urlField.onChanged { - iFace.state.link = it - iFace.state.isAppSaved = true - } - - binding.actionTypeOptionsGroup.addOnButtonCheckedListener { _, checkedId, isChecked -> - iFace.state.isLink = isChecked && checkedId == R.id.browserCheck - binding.applicationLayout.visibleGone(!iFace.state.isLink) - binding.urlLayout.visibleGone(iFace.state.isLink) - } - - if (Module.is12) { - checkBrowser() - binding.actionTypeOptionsGroup.gone() - } - editReminder() - } - - private fun isApplication(): Boolean { - return binding.actionTypeOptionsGroup.checkedButtonId == R.id.applicationCheck - } - - private fun checkApp() { - binding.actionTypeOptionsGroup.check(R.id.applicationCheck) - } - - private fun checkBrowser() { - binding.actionTypeOptionsGroup.check(R.id.browserCheck) - } - - private fun editReminder() { - val reminder = iFace.state.reminder - if (reminder.target != "") { - if (!iFace.state.isLink && Reminder.isSame(reminder.type, Reminder.BY_DATE_APP)) { - checkApp() - iFace.state.app = reminder.target - iFace.state.isLink = false - binding.applicationName.text = appName - } else { - checkBrowser() - iFace.state.link = reminder.target - iFace.state.isLink = true - binding.urlField.setText(reminder.target) - } - } - if (iFace.state.isAppSaved) { - if (!iFace.state.isLink) { - checkApp() - binding.applicationName.text = appName - } else { - checkBrowser() - binding.urlField.setText(iFace.state.link) - } - } - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/DateFragment.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/DateFragment.kt deleted file mode 100644 index 53712798a..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/DateFragment.kt +++ /dev/null @@ -1,124 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments - -import android.os.Bundle -import android.text.TextUtils -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.elementary.tasks.R -import com.elementary.tasks.core.utils.params.ReminderExplanationVisibility -import com.elementary.tasks.core.views.ActionView -import com.elementary.tasks.core.views.ClosableLegacyBuilderRemovalWarningView -import com.elementary.tasks.databinding.FragmentReminderDateBinding -import com.github.naz013.domain.Reminder -import com.github.naz013.logging.Logger - -class DateFragment : RepeatableTypeFragment() { - - override fun getExplanationVisibilityType(): ReminderExplanationVisibility.Type { - return ReminderExplanationVisibility.Type.BY_DATE - } - - override fun getExplanationView(): View { - return binding.explanationView - } - - override fun setCloseListenerToExplanationView(listener: View.OnClickListener) { - binding.explanationView.setOnClickListener(listener) - } - - override fun prepare(): Reminder? { - val reminder = iFace.state.reminder - var type = Reminder.BY_DATE - val isAction = binding.actionView.hasAction() - if (TextUtils.isEmpty(reminder.summary) && !isAction) { - binding.taskLayout.error = string(R.string.task_summary_is_empty) - binding.taskLayout.isErrorEnabled = true - return null - } - var number = "" - if (isAction) { - number = binding.actionView.number - if (TextUtils.isEmpty(number)) { - iFace.showSnackbar(string(R.string.you_dont_insert_number)) - return null - } - type = if (binding.actionView.actionState == ActionView.ActionState.CALL) { - Reminder.BY_DATE_CALL - } else { - Reminder.BY_DATE_SMS - } - } - Logger.d("prepare: $type") - - val startTime = binding.dateView.selectedDateTime - Logger.d("EVENT_TIME ${dateTimeManager.logDateTime(startTime)}") - if (!dateTimeManager.isCurrent(startTime)) { - iFace.showSnackbar(string(R.string.reminder_is_outdated)) - return null - } - - if (!validBefore(startTime, reminder)) { - iFace.showSnackbar(string(R.string.invalid_remind_before_parameter)) - return null - } - - val gmtTime = dateTimeManager.getGmtFromDateTime(startTime) - reminder.target = number - reminder.type = type - reminder.eventTime = gmtTime - reminder.startTime = gmtTime - reminder.dayOfMonth = 0 - reminder.after = 0L - reminder.delay = 0 - reminder.eventCount = 0 - reminder.recurDataObject = null - return reminder - } - - override fun inflate( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentReminderDateBinding.inflate(inflater, container, false) - - override fun getDynamicViews(): List { - return listOfNotNull( - binding.ledView, - binding.exportToCalendar, - binding.exportToTasks, - binding.tuneExtraView, - binding.attachmentView, - binding.groupView, - binding.taskSummary, - binding.beforeView, - binding.dateView, - binding.priorityView, - binding.repeatLimitView, - binding.repeatView, - binding.actionView - ) - } - - override fun getLegacyMessageView(): ClosableLegacyBuilderRemovalWarningView { - return binding.legacyBuilderWarningView - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - binding.tuneExtraView.hasAutoExtra = false - } - - override fun updateActions() { - if (binding.actionView.hasAction()) { - if (binding.actionView.actionState == ActionView.ActionState.SMS) { - binding.tuneExtraView.hasAutoExtra = false - } else { - binding.tuneExtraView.hasAutoExtra = true - binding.tuneExtraView.hint = string(R.string.enable_making_phone_calls_automatically) - } - } else { - binding.tuneExtraView.hasAutoExtra = false - } - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/EmailFragment.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/EmailFragment.kt deleted file mode 100644 index bbd9d39a7..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/EmailFragment.kt +++ /dev/null @@ -1,121 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments - -import android.os.Bundle -import android.text.TextUtils -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.elementary.tasks.R -import com.elementary.tasks.core.utils.onChanged -import com.elementary.tasks.core.utils.params.ReminderExplanationVisibility -import com.elementary.tasks.core.views.ClosableLegacyBuilderRemovalWarningView -import com.elementary.tasks.databinding.FragmentReminderEmailBinding -import com.github.naz013.domain.Reminder -import com.github.naz013.logging.Logger - -class EmailFragment : RepeatableTypeFragment() { - - override fun getExplanationVisibilityType(): ReminderExplanationVisibility.Type { - return ReminderExplanationVisibility.Type.EMAIL - } - - override fun getExplanationView(): View { - return binding.explanationView - } - - override fun setCloseListenerToExplanationView(listener: View.OnClickListener) { - binding.explanationView.setOnClickListener(listener) - } - - override fun prepare(): Reminder? { - val reminder = iFace.state.reminder - val email = binding.mail.text.toString().trim() - if (TextUtils.isEmpty(email) || !email.matches(".*@.*..*".toRegex())) { - iFace.showSnackbar(getString(R.string.email_is_incorrect)) - return null - } - val subjectString = binding.subject.text.toString().trim() - if (TextUtils.isEmpty(subjectString)) { - iFace.showSnackbar(getString(R.string.you_dont_insert_any_message)) - return null - } - val startTime = binding.dateView.selectedDateTime - Logger.d("EVENT_TIME ${dateTimeManager.logDateTime(startTime)}") - - if (!dateTimeManager.isCurrent(startTime)) { - iFace.showSnackbar(getString(R.string.reminder_is_outdated)) - return null - } - - if (!validBefore(startTime, reminder)) { - iFace.showSnackbar(getString(R.string.invalid_remind_before_parameter)) - return null - } - val gmtTime = dateTimeManager.getGmtFromDateTime(startTime) - reminder.subject = subjectString - reminder.target = email - reminder.type = Reminder.BY_DATE_EMAIL - reminder.eventTime = gmtTime - reminder.startTime = gmtTime - reminder.after = 0L - reminder.dayOfMonth = 0 - reminder.delay = 0 - reminder.eventCount = 0 - reminder.recurDataObject = null - return reminder - } - - override fun inflate( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentReminderEmailBinding.inflate(inflater, container, false) - - override fun getDynamicViews(): List { - return listOfNotNull( - binding.ledView, - binding.exportToCalendar, - binding.exportToTasks, - binding.tuneExtraView, - binding.attachmentView, - binding.groupView, - binding.taskSummary, - binding.beforeView, - binding.dateView, - binding.priorityView, - binding.repeatLimitView, - binding.repeatView - ) - } - - override fun getLegacyMessageView(): ClosableLegacyBuilderRemovalWarningView { - return binding.legacyBuilderWarningView - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - binding.tuneExtraView.hint = getString(R.string.message) - binding.tuneExtraView.hasAutoExtra = true - - binding.mail.onChanged { - iFace.state.isEmailOrSubjectChanged = true - iFace.state.email = it - } - binding.subject.onChanged { - iFace.state.isEmailOrSubjectChanged = true - iFace.state.subject = it - } - - editReminder() - } - - private fun editReminder() { - if (iFace.state.isEmailOrSubjectChanged) { - binding.mail.setText(iFace.state.email) - binding.subject.setText(iFace.state.subject) - } else { - binding.mail.setText(iFace.state.reminder.target) - binding.subject.setText(iFace.state.reminder.subject) - } - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/LocationFragment.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/LocationFragment.kt deleted file mode 100644 index a632537e8..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/LocationFragment.kt +++ /dev/null @@ -1,405 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments - -import android.os.Bundle -import android.text.TextUtils -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.elementary.tasks.R -import com.elementary.tasks.core.utils.params.ReminderExplanationVisibility -import com.elementary.tasks.core.views.ActionView -import com.elementary.tasks.core.views.ClosableLegacyBuilderRemovalWarningView -import com.elementary.tasks.databinding.FragmentReminderLocationBinding -import com.elementary.tasks.simplemap.SimpleMapFragment -import com.github.naz013.common.Module -import com.github.naz013.common.Permissions -import com.github.naz013.domain.Place -import com.github.naz013.domain.Reminder -import com.github.naz013.logging.Logger -import com.github.naz013.ui.common.view.fadeInAnimation -import com.github.naz013.ui.common.view.fadeOutAnimation -import com.github.naz013.ui.common.view.gone -import com.github.naz013.ui.common.view.isVisible -import com.github.naz013.ui.common.view.visible -import com.github.naz013.ui.common.view.visibleGone -import com.google.android.gms.maps.model.LatLng - -class LocationFragment : RadiusTypeFragment() { - - private var simpleMapFragment: SimpleMapFragment? = null - private var lastPos: LatLng? = null - private var mapState = MapState.WINDOWED - - private fun showPlaceOnMap() { - val reminder = iFace.state.reminder - if (!Reminder.isGpsType(reminder.type)) return - val text = reminder.summary - if (reminder.places.isNotEmpty()) { - val place = reminder.places[0] - val latitude = place.latitude - val longitude = place.longitude - iFace.state.radius = place.radius - lastPos = LatLng(latitude, longitude) - simpleMapFragment?.run { - changeRadius(place.radius) - addMarker( - latLng = LatLng(latitude, longitude), - title = text, - clear = true, - animate = true - ) - toggleMap() - } - } - } - - override fun getExplanationVisibilityType(): ReminderExplanationVisibility.Type { - return ReminderExplanationVisibility.Type.BY_LOCATION - } - - override fun getExplanationView(): View { - return binding.explanationView - } - - override fun setCloseListenerToExplanationView(listener: View.OnClickListener) { - binding.explanationView.setOnClickListener(listener) - } - - override fun prepare(): Reminder? { - if (!Permissions.checkForeground(requireActivity())) { - permissionFlow.askPermission(Permissions.FOREGROUND_SERVICE) {} - return null - } - if (Module.is15 && !Permissions.checkPermission( - requireContext(), - Permissions.FOREGROUND_SERVICE_LOCATION - ) - ) { - permissionFlow.askPermission(Permissions.FOREGROUND_SERVICE_LOCATION) {} - return null - } - if (!Permissions.isBgLocationAllowed(requireActivity())) { - showBgLocationPopup() - return null - } - val reminder = super.prepare() ?: return null - - var type = if (!isLeaving()) { - Reminder.BY_LOCATION - } else { - Reminder.BY_OUT - } - - val pos = lastPos - if (pos == null) { - iFace.showSnackbar(getString(R.string.you_dont_select_place)) - return null - } - if (TextUtils.isEmpty(reminder.summary)) { - binding.taskLayout.error = getString(R.string.task_summary_is_empty) - binding.taskLayout.isErrorEnabled = true - if (mapState == MapState.FULLSCREEN) { - showWindowedState() - } - return null - } - var number = "" - if (binding.actionView.hasAction()) { - number = binding.actionView.number - if (TextUtils.isEmpty(number)) { - iFace.showSnackbar(getString(R.string.you_dont_insert_number)) - return null - } - type = if (binding.actionView.actionState == ActionView.ActionState.CALL) { - if (!isLeaving()) { - Reminder.BY_LOCATION_CALL - } else { - Reminder.BY_OUT_CALL - } - } else { - if (!isLeaving()) { - Reminder.BY_LOCATION_SMS - } else { - Reminder.BY_OUT_SMS - } - } - } - - reminder.places = listOf( - Place( - radius = iFace.state.radius, - marker = iFace.state.markerStyle, - latitude = pos.latitude, - longitude = pos.longitude, - name = reminder.summary, - dateTime = dateTimeManager.getNowGmtDateTime() - ) - ) - reminder.target = number - reminder.type = type - reminder.exportToCalendar = false - reminder.exportToTasks = false - reminder.hasReminder = binding.enableDelayCheck.isChecked - reminder.after = 0L - reminder.delay = 0 - reminder.eventCount = 0 - reminder.repeatInterval = 0 - reminder.recurDataObject = null - - if (binding.enableDelayCheck.isChecked) { - val startTime = binding.dateView.selectedDateTime - reminder.startTime = dateTimeManager.getGmtFromDateTime(startTime) - reminder.eventTime = dateTimeManager.getGmtFromDateTime(startTime) - Logger.d("EVENT_TIME %s", dateTimeManager.logDateTime(startTime)) - } else { - reminder.eventTime = "" - reminder.startTime = "" - } - return reminder - } - - private fun showBgLocationPopup() { - dialogues.getMaterialDialog(requireContext()) - .setMessage(R.string.bg_location_message) - .setPositiveButton(R.string.allow) { dialog, _ -> - dialog.dismiss() - permissionFlow.askPermission(Permissions.BACKGROUND_LOCATION) {} - } - .setNegativeButton(R.string.do_not_allow) { dialog, _ -> - dialog.dismiss() - } - .create() - .show() - } - - override fun inflate( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentReminderLocationBinding.inflate(inflater, container, false) - - override fun getDynamicViews(): List { - return listOfNotNull( - binding.ledView, - binding.tuneExtraView, - binding.attachmentView, - binding.groupView, - binding.taskSummary, - binding.dateView, - binding.priorityView, - binding.actionView - ) - } - - override fun getLegacyMessageView(): ClosableLegacyBuilderRemovalWarningView { - return binding.legacyBuilderWarningView - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - if (!isTablet()) { - binding.mapContainer.gone() - binding.mapButton.visible() - binding.searchBlock.visible() - } else { - binding.mapContainer.visible() - binding.mapButton.gone() - binding.searchBlock.gone() - } - - val simpleMapFragment = SimpleMapFragment.newInstance( - SimpleMapFragment.MapParams( - isRadius = true, - isStyles = true, - isPlaces = true, - rememberMarkerStyle = false, - rememberMarkerRadius = false, - rememberMapStyle = true, - customButtons = listOf( - SimpleMapFragment.MapCustomButton( - icon = R.drawable.ic_fluent_chevron_left, - id = MAP_EXIT_BUTTON - ), - SimpleMapFragment.MapCustomButton( - icon = R.drawable.ic_builder_map_full_screen, - id = MAP_FULLSCREEN_BUTTON - ) - ), - radiusParams = SimpleMapFragment.RadiusParams( - radius = iFace.state.radius - ), - markerStyle = iFace.state.markerStyle - ) - ) - - simpleMapFragment.mapCallback = object : SimpleMapFragment.MapCallback { - override fun onMapReady() { - showPlaceOnMap() - } - - override fun onLocationSelected(markerState: SimpleMapFragment.MarkerState) { - lastPos = markerState.latLng - iFace.state.radius = markerState.radius - binding.radiusView.radiusInM = markerState.radius - } - } - simpleMapFragment.radiusChangeListener = object : SimpleMapFragment.RadiusChangeListener { - override fun onRadiusChanged(radius: Int) { - iFace.state.radius = radius - binding.radiusView.radiusInM = radius - } - } - simpleMapFragment.customButtonCallback = object : SimpleMapFragment.CustomButtonCallback { - override fun onButtonClicked(buttonId: Int) { - if (buttonId == MAP_FULLSCREEN_BUTTON) { - if (mapState == MapState.WINDOWED) { - showFullScreenState() - } else { - showWindowedState() - } - } else { - toggleMap() - } - } - } - - fragmentManager?.beginTransaction() - ?.replace(binding.mapFrame.id, simpleMapFragment) - ?.addToBackStack(null) - ?.commit() - - this.simpleMapFragment = simpleMapFragment - - binding.tuneExtraView.hasAutoExtra = false - - binding.delayLayout.gone() - binding.enableDelayCheck.setOnCheckedChangeListener { _, isChecked -> - iFace.state.isDelayAdded = isChecked - binding.delayLayout.visibleGone(isChecked) - } - binding.enableDelayCheck.isChecked = iFace.state.isDelayAdded - - binding.triggerOptionGroup.addOnButtonCheckedListener { _, checkedId, isChecked -> - iFace.state.isLeave = isChecked && checkedId == R.id.leaveCheck - } - - binding.clearButton.setOnClickListener { binding.addressField.setText("") } - binding.mapButton.setOnClickListener { toggleMap() } - binding.addressField.setOnItemClickListener { _, _, position, _ -> - val sel = binding.addressField.getAddress(position) ?: return@setOnItemClickListener - val lat = sel.latitude - val lon = sel.longitude - val pos = LatLng(lat, lon) - var title: String? = binding.taskSummary.text.toString().trim() - if (title != null && title.matches("".toRegex())) title = pos.toString() - simpleMapFragment.addMarker( - latLng = pos, - title = title, - clear = true, - animate = true - ) - } - - binding.radiusView.onRadiusChangeListener = { - iFace.state.radius = it - simpleMapFragment.changeRadius(it) - } - binding.radiusView.radiusInM = iFace.state.radius - binding.radiusView.useMetric = prefs.useMetric - - editReminder() - } - - private fun isLeaving(): Boolean { - return binding.triggerOptionGroup.checkedButtonId == R.id.leaveCheck - } - - private fun checkLeaving() { - binding.triggerOptionGroup.check(R.id.leaveCheck) - } - - private fun checkArriving() { - binding.triggerOptionGroup.check(R.id.enterCheck) - } - - override fun updateActions() { - if (binding.actionView.hasAction()) { - if (binding.actionView.actionState == ActionView.ActionState.SMS) { - binding.tuneExtraView.hasAutoExtra = false - } else { - binding.tuneExtraView.hasAutoExtra = true - binding.tuneExtraView.hint = getString(R.string.enable_making_phone_calls_automatically) - } - } else { - binding.tuneExtraView.hasAutoExtra = false - } - } - - private fun toggleMap() { - if (!isTablet()) { - if (binding.mapContainer.isVisible()) { - binding.mapContainer.fadeOutAnimation() - binding.scrollView.fadeInAnimation() - } else { - binding.scrollView.fadeOutAnimation() - binding.mapContainer.fadeInAnimation() - } - } - } - - private fun showWindowedState() { - if (!isTablet()) { - val map = simpleMapFragment ?: return - mapState = MapState.WINDOWED - iFace.setFullScreenMode(false) - map.changeCustomButton( - SimpleMapFragment.MapCustomButton( - icon = R.drawable.ic_builder_map_full_screen, - id = MAP_FULLSCREEN_BUTTON - ) - ) - } - } - - private fun showFullScreenState() { - if (!isTablet()) { - val map = simpleMapFragment ?: return - mapState = MapState.FULLSCREEN - iFace.setFullScreenMode(true) - map.changeCustomButton( - SimpleMapFragment.MapCustomButton( - icon = R.drawable.ic_fluent_chevron_left, - id = MAP_FULLSCREEN_BUTTON - ) - ) - } - } - - override fun onBackPressed(): Boolean { - return simpleMapFragment == null || simpleMapFragment?.onBackPressed() == true - } - - private fun editReminder() { - val reminder = iFace.state.reminder - Logger.d("editReminder: $reminder") - if (reminder.eventTime != "" && reminder.hasReminder) { - binding.dateView.setDateTime(reminder.eventTime) - binding.enableDelayCheck.isChecked = true - } - iFace.state.isLeave = Reminder.isBase(reminder.type, Reminder.BY_OUT) - if (Reminder.isBase(reminder.type, Reminder.BY_OUT)) { - checkLeaving() - } else { - checkArriving() - } - } - - private enum class MapState { - WINDOWED, FULLSCREEN - } - - companion object { - private const val MAP_EXIT_BUTTON = 0 - private const val MAP_FULLSCREEN_BUTTON = 1 - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/MonthFragment.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/MonthFragment.kt deleted file mode 100644 index 1b744053f..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/MonthFragment.kt +++ /dev/null @@ -1,241 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments - -import android.os.Bundle -import android.text.TextUtils -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.elementary.tasks.R -import com.elementary.tasks.core.utils.params.ReminderExplanationVisibility -import com.elementary.tasks.core.views.ActionView -import com.elementary.tasks.core.views.ClosableLegacyBuilderRemovalWarningView -import com.elementary.tasks.databinding.FragmentReminderMonthBinding -import com.github.naz013.common.datetime.minusMillis -import com.github.naz013.domain.Reminder -import com.github.naz013.logging.Logger -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDateTime -import org.threeten.bp.LocalTime - -class MonthFragment : RepeatableTypeFragment() { - - private val time: LocalTime - get() = LocalTime.of(iFace.state.hour, iFace.state.minute) - - override fun getExplanationVisibilityType(): ReminderExplanationVisibility.Type { - return ReminderExplanationVisibility.Type.BY_MONTH - } - - override fun getExplanationView(): View { - return binding.explanationView - } - - override fun setCloseListenerToExplanationView(listener: View.OnClickListener) { - binding.explanationView.setOnClickListener(listener) - } - - override fun prepare(): Reminder? { - val reminder = iFace.state.reminder - var type = Reminder.BY_MONTH - val isAction = binding.actionView.hasAction() - if (TextUtils.isEmpty(reminder.summary) && !isAction) { - binding.taskLayout.error = getString(R.string.task_summary_is_empty) - binding.taskLayout.isErrorEnabled = true - return null - } - var number = "" - if (isAction) { - number = binding.actionView.number - if (TextUtils.isEmpty(number)) { - iFace.showSnackbar(getString(R.string.you_dont_insert_number)) - return null - } - type = if (binding.actionView.actionState == ActionView.ActionState.CALL) { - Reminder.BY_MONTH_CALL - } else { - Reminder.BY_MONTH_SMS - } - } - reminder.weekdays = listOf() - reminder.target = number - reminder.type = type - reminder.dayOfMonth = iFace.state.day - reminder.eventTime = dateTimeManager.getGmtFromDateTime(LocalDateTime.of(LocalDate.now(), time)) - if (reminder.repeatInterval <= 0) { - reminder.repeatInterval = 1 - } - val startTime = modelDateTimeFormatter.getNewNextMonthDayTime(reminder) - if (reminder.remindBefore > 0 && - !dateTimeManager.isCurrent(startTime.minusMillis(reminder.remindBefore)) - ) { - iFace.showSnackbar(getString(R.string.invalid_remind_before_parameter)) - return null - } - Logger.d("EVENT_TIME ${dateTimeManager.logDateTime(startTime)}") - if (!dateTimeManager.isCurrent(startTime)) { - iFace.showSnackbar(getString(R.string.reminder_is_outdated)) - return null - } - reminder.startTime = dateTimeManager.getGmtFromDateTime(startTime) - reminder.eventTime = dateTimeManager.getGmtFromDateTime(startTime) - reminder.after = 0L - reminder.delay = 0 - reminder.eventCount = 0 - reminder.recurDataObject = null - return reminder - } - - override fun inflate( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentReminderMonthBinding.inflate(inflater, container, false) - - override fun getDynamicViews(): List { - return listOfNotNull( - binding.ledView, - binding.exportToCalendar, - binding.exportToTasks, - binding.tuneExtraView, - binding.attachmentView, - binding.groupView, - binding.taskSummary, - binding.beforeView, - binding.priorityView, - binding.repeatLimitView, - binding.repeatView, - binding.actionView - ) - } - - override fun getLegacyMessageView(): ClosableLegacyBuilderRemovalWarningView { - return binding.legacyBuilderWarningView - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - binding.monthDayField.setOnClickListener { - dateTimePickerProvider.showDatePicker( - fragmentManager = childFragmentManager, - date = getDate(), - title = getString(R.string.select_date) - ) { - onDateSelected(it) - } - } - binding.timeField.setOnClickListener { - dateTimePickerProvider.showTimePicker( - fragmentManager = childFragmentManager, - time = time, - title = getString(R.string.select_time) - ) { onTimeSelected(it) } - } - binding.timeField.text = dateTimeManager.getTime(time) - binding.repeatView.defaultValue = 1 - - binding.tuneExtraView.hasAutoExtra = false - - binding.dayOfMonthOptionGroup.addOnButtonCheckedListener { _, checkedId, isChecked -> - if (isChecked) { - iFace.state.isLastDay = checkedId == R.id.lastCheck - changeUi(iFace.state.isLastDay) - } - } - - if (!iFace.state.isLastDay) { - binding.dayOfMonthOptionGroup.check(R.id.dayCheck) - } - changeUi(iFace.state.isLastDay) - - showSelectedDay() - editReminder() - calculateNextDate() - } - - private fun getDate(): LocalDate { - return LocalDate.of(iFace.state.year, iFace.state.month + 1, iFace.state.day) - } - - private fun onDateSelected(date: LocalDate) { - iFace.state.day = date.dayOfMonth - iFace.state.month = date.monthValue - 1 - iFace.state.year = date.year - showSelectedDay() - calculateNextDate() - } - - private fun onTimeSelected(time: LocalTime) { - iFace.state.hour = time.hour - iFace.state.minute = time.minute - binding.timeField.text = dateTimeManager.getTime(time) - calculateNextDate() - } - - private fun calculateNextDate() { - val reminder = Reminder() - reminder.type = Reminder.BY_MONTH - reminder.dayOfMonth = iFace.state.day - reminder.eventTime = dateTimeManager.getGmtFromDateTime(LocalDateTime.of(LocalDate.now(), time)) - if (reminder.repeatInterval <= 0) { - reminder.repeatInterval = 1 - } - Logger.d("calculateNextDate: $reminder") - val startTime = modelDateTimeFormatter.getNewNextMonthDayTime(reminder) - binding.calculatedNextTime.text = dateTimeManager.getFullDateTime(startTime) - } - - override fun updateActions() { - if (binding.actionView.hasAction()) { - if (binding.actionView.actionState == ActionView.ActionState.SMS) { - binding.tuneExtraView.hasAutoExtra = false - } else { - binding.tuneExtraView.hasAutoExtra = true - binding.tuneExtraView.hint = getString(R.string.enable_making_phone_calls_automatically) - } - } else { - binding.tuneExtraView.hasAutoExtra = false - } - } - - private fun showSelectedDay() { - if (iFace.state.day <= 0) { - iFace.state.day = LocalDate.now().dayOfMonth - } - Logger.d("showSelectedDay: ${iFace.state.day}") - binding.monthDayField.text = getZeroedInt(iFace.state.day) - } - - private fun changeUi(b: Boolean) { - if (b) { - binding.dayView.visibility = View.GONE - iFace.state.day = 0 - } else { - binding.dayView.visibility = View.VISIBLE - showSelectedDay() - } - calculateNextDate() - } - - private fun updateTime(time: LocalTime?): LocalTime { - val localTime = time ?: LocalTime.now() - iFace.state.hour = localTime.hour - iFace.state.minute = localTime.minute - return localTime - } - - private fun editReminder() { - val reminder = iFace.state.reminder - updateTime(dateTimeManager.fromGmtToLocal(reminder.eventTime)?.toLocalTime()).also { - Logger.d("editReminder: time=$it") - binding.timeField.text = dateTimeManager.getTime(it) - } - if (iFace.state.isLastDay || reminder.dayOfMonth == 0) { - binding.dayOfMonthOptionGroup.check(R.id.lastCheck) - } else { - iFace.state.day = reminder.dayOfMonth - binding.dayOfMonthOptionGroup.check(R.id.dayCheck) - showSelectedDay() - } - calculateNextDate() - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/RadiusTypeFragment.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/RadiusTypeFragment.kt deleted file mode 100644 index 2e26bab94..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/RadiusTypeFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments - -import androidx.viewbinding.ViewBinding -import com.github.naz013.domain.Reminder -import com.elementary.tasks.core.utils.SuperUtil - -abstract class RadiusTypeFragment : TypeFragment() { - - override fun prepare(): Reminder? { - if (!SuperUtil.checkLocationEnable(requireContext())) { - SuperUtil.showLocationAlert(requireContext(), iFace) - return null - } - return iFace.state.reminder - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/ReminderInterface.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/ReminderInterface.kt deleted file mode 100644 index f4ba31cfb..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/ReminderInterface.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments - -import android.view.View -import com.github.naz013.domain.ReminderGroup -import com.elementary.tasks.reminder.create.ReminderStateViewModel - -@Deprecated("Replaced by new Builder") -interface ReminderInterface { - val defGroup: ReminderGroup? - var canExportToTasks: Boolean - var canExportToCalendar: Boolean - val state: ReminderStateViewModel - fun isTablet(): Boolean - fun selectMelody() - fun attachFile() - fun selectGroup() - fun showSnackbar(title: String) - fun showSnackbar(title: String, actionName: String, listener: View.OnClickListener) - fun setFullScreenMode(fullScreenEnabled: Boolean) - fun updateScroll(y: Int) - fun setFragment(typeFragment: TypeFragment<*>?) -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/RepeatableTypeFragment.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/RepeatableTypeFragment.kt deleted file mode 100644 index 4efbb63c7..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/RepeatableTypeFragment.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments - -import androidx.viewbinding.ViewBinding -import com.github.naz013.domain.Reminder -import org.threeten.bp.LocalDateTime - -abstract class RepeatableTypeFragment : TypeFragment() { - - protected fun validBefore(dateTime: LocalDateTime, reminder: Reminder): Boolean { - val millis = dateTimeManager.toMillis(dateTime) - reminder.remindBefore - 100 - return millis >= System.currentTimeMillis() - } - - protected fun getZeroedInt(v: Int): String { - return if (v <= 9) { - "0$v" - } else { - v.toString() - } - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/ShopFragment.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/ShopFragment.kt deleted file mode 100644 index f4644f4ed..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/ShopFragment.kt +++ /dev/null @@ -1,167 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments - -import android.os.Bundle -import android.text.TextUtils -import android.view.KeyEvent -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.inputmethod.EditorInfo -import android.widget.Toast -import androidx.recyclerview.widget.LinearLayoutManager -import com.elementary.tasks.R -import com.elementary.tasks.core.utils.params.ReminderExplanationVisibility -import com.elementary.tasks.core.views.ClosableLegacyBuilderRemovalWarningView -import com.elementary.tasks.databinding.FragmentReminderShopBinding -import com.elementary.tasks.reminder.lists.adapter.ShopListRecyclerAdapter -import com.github.naz013.domain.Reminder -import com.github.naz013.domain.reminder.ShopItem -import com.github.naz013.logging.Logger -import com.github.naz013.ui.common.view.gone -import com.github.naz013.ui.common.view.visibleGone - -class ShopFragment : RepeatableTypeFragment() { - - private val mAdapter = ShopListRecyclerAdapter() - private val mActionListener = object : ShopListRecyclerAdapter.ActionListener { - override fun onItemCheck(position: Int, isChecked: Boolean) { - val item = mAdapter.getItem(position) - item.isChecked = !item.isChecked - mAdapter.updateData() - iFace.state.shopItems = mAdapter.data - } - - override fun onItemDelete(position: Int) { - mAdapter.delete(position) - iFace.state.shopItems = mAdapter.data - } - } - - override fun getExplanationVisibilityType(): ReminderExplanationVisibility.Type { - return ReminderExplanationVisibility.Type.SHOPPING - } - - override fun getExplanationView(): View { - return binding.explanationView - } - - override fun setCloseListenerToExplanationView(listener: View.OnClickListener) { - binding.explanationView.setOnClickListener(listener) - } - - override fun prepare(): Reminder? { - if (mAdapter.itemCount == 0) { - iFace.showSnackbar(getString(R.string.shopping_list_is_empty)) - return null - } - val reminder = iFace.state.reminder - reminder.shoppings = mAdapter.data - reminder.target = "" - reminder.type = Reminder.BY_DATE_SHOP - reminder.repeatInterval = 0 - reminder.exportToCalendar = false - reminder.exportToTasks = false - reminder.hasReminder = binding.attackDelay.isChecked - reminder.after = 0L - reminder.dayOfMonth = 0 - reminder.delay = 0 - reminder.eventCount = 0 - reminder.recurDataObject = null - - if (binding.attackDelay.isChecked) { - val startTime = binding.dateView.selectedDateTime - val time = dateTimeManager.getGmtFromDateTime(startTime) - Logger.d("EVENT_TIME ${dateTimeManager.logDateTime(startTime)}") - if (!dateTimeManager.isCurrent(time)) { - Toast.makeText(context, R.string.reminder_is_outdated, Toast.LENGTH_SHORT).show() - return null - } - reminder.startTime = time - reminder.eventTime = time - } else { - reminder.eventTime = "" - reminder.startTime = "" - } - return reminder - } - - override fun inflate( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentReminderShopBinding.inflate(inflater, container, false) - - override fun getDynamicViews(): List { - return listOfNotNull( - binding.ledView, - binding.tuneExtraView, - binding.attachmentView, - binding.groupView, - binding.taskSummary, - binding.dateView, - binding.priorityView - ) - } - - override fun getLegacyMessageView(): ClosableLegacyBuilderRemovalWarningView { - return binding.legacyBuilderWarningView - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - binding.tuneExtraView.hasAutoExtra = false - - binding.todoList.layoutManager = LinearLayoutManager(context) - mAdapter.listener = mActionListener - binding.todoList.adapter = mAdapter - binding.shopEdit.setOnEditorActionListener { _, actionId, event -> - if ( - event != null && event.keyCode == KeyEvent.KEYCODE_ENTER || - actionId == EditorInfo.IME_ACTION_NEXT - ) { - addNewItem() - return@setOnEditorActionListener true - } - false - } - binding.addButton.setOnClickListener { addNewItem() } - - binding.attackDelay.setOnCheckedChangeListener { _, isChecked -> - iFace.state.isDelayAdded = isChecked - binding.dateView.visibleGone(isChecked) - } - binding.dateView.gone() - binding.attackDelay.isChecked = iFace.state.isDelayAdded - - editReminder() - } - - private fun addNewItem() { - val task = binding.shopEdit.text.toString().trim() - if (task == "") { - binding.shopLayout.error = getString(R.string.must_be_not_empty) - binding.shopLayout.isErrorEnabled = true - return - } - mAdapter.addItem( - ShopItem( - task.replace("\n".toRegex(), " "), - createTime = dateTimeManager.getNowGmtDateTime() - ) - ) - binding.shopEdit.setText("") - iFace.state.shopItems = mAdapter.data - } - - private fun editReminder() { - val reminder = iFace.state.reminder - if (!iFace.state.isShopItemsEdited) { - mAdapter.data = reminder.shoppings - iFace.state.isShopItemsEdited = true - iFace.state.shopItems = reminder.shoppings - binding.attackDelay.isChecked = reminder.hasReminder && !TextUtils.isEmpty(reminder.eventTime) - } else { - mAdapter.data = iFace.state.shopItems - } - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/TimerFragment.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/TimerFragment.kt deleted file mode 100644 index a1c421abd..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/TimerFragment.kt +++ /dev/null @@ -1,224 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments - -import android.os.Bundle -import android.text.TextUtils -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.ListAdapter -import com.elementary.tasks.R -import com.elementary.tasks.core.binding.HolderBinding -import com.elementary.tasks.core.data.ui.UiUsedTimeList -import com.elementary.tasks.core.utils.bindProperty -import com.elementary.tasks.core.utils.params.ReminderExplanationVisibility -import com.elementary.tasks.core.views.ActionView -import com.elementary.tasks.core.views.ClosableLegacyBuilderRemovalWarningView -import com.elementary.tasks.core.views.TimerPickerView -import com.elementary.tasks.databinding.FragmentReminderTimerBinding -import com.elementary.tasks.databinding.ListItemUsedTimeBinding -import com.elementary.tasks.reminder.create.fragments.timer.UiUsedTimeListDiffCallback -import com.elementary.tasks.reminder.create.fragments.timer.UsedTimeViewModel -import com.github.naz013.common.datetime.minusMillis -import com.github.naz013.domain.Reminder -import com.github.naz013.feature.common.livedata.nonNullObserve -import com.github.naz013.logging.Logger -import com.github.naz013.ui.common.view.gone -import com.github.naz013.ui.common.view.inflater -import com.github.naz013.ui.common.view.visible -import org.koin.androidx.viewmodel.ext.android.viewModel - -class TimerFragment : RepeatableTypeFragment() { - - private val timesAdapter = TimesAdapter() - private val viewModel by viewModel() - - override fun getExplanationVisibilityType(): ReminderExplanationVisibility.Type { - return ReminderExplanationVisibility.Type.BY_TIMER - } - - override fun getExplanationView(): View { - return binding.explanationView - } - - override fun setCloseListenerToExplanationView(listener: View.OnClickListener) { - binding.explanationView.setOnClickListener(listener) - } - - override fun prepare(): Reminder? { - val reminder = iFace.state.reminder - val after = binding.timerPickerView.timerValue - if (after == 0L) { - iFace.showSnackbar(getString(R.string.you_dont_insert_timer_time)) - return null - } - var type = Reminder.BY_TIME - val isAction = binding.actionView.hasAction() - if (TextUtils.isEmpty(reminder.summary) && !isAction) { - binding.taskLayout.error = getString(R.string.task_summary_is_empty) - binding.taskLayout.isErrorEnabled = true - return null - } - var number = "" - if (isAction) { - number = binding.actionView.number - if (TextUtils.isEmpty(number)) { - iFace.showSnackbar(getString(R.string.you_dont_insert_number)) - return null - } - type = if (binding.actionView.actionState == ActionView.ActionState.CALL) { - Reminder.BY_TIME_CALL - } else { - Reminder.BY_TIME_SMS - } - } - - reminder.target = number - reminder.type = type - reminder.after = after - reminder.delay = 0 - reminder.eventCount = 0 - reminder.recurDataObject = null - - val startTime = modelDateTimeFormatter.generateNextTimer(reminder, true) - Logger.d("EVENT_TIME ${dateTimeManager.logDateTime(startTime)}") - - if (!validBefore(startTime, reminder)) { - iFace.showSnackbar(getString(R.string.invalid_remind_before_parameter)) - return null - } - - if (!dateTimeManager.isCurrent(startTime.minusMillis(reminder.remindBefore))) { - iFace.showSnackbar(getString(R.string.reminder_is_outdated)) - return null - } - - reminder.startTime = dateTimeManager.getGmtFromDateTime(startTime) - reminder.eventTime = dateTimeManager.getGmtFromDateTime(startTime) - - viewModel.saveTime(after) - return reminder - } - - override fun inflate( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentReminderTimerBinding.inflate(inflater, container, false) - - override fun getDynamicViews(): List { - return listOfNotNull( - binding.ledView, - binding.exportToCalendar, - binding.exportToTasks, - binding.tuneExtraView, - binding.attachmentView, - binding.groupView, - binding.taskSummary, - binding.beforeView, - binding.priorityView, - binding.repeatLimitView, - binding.repeatView, - binding.actionView - ) - } - - override fun getLegacyMessageView(): ClosableLegacyBuilderRemovalWarningView { - return binding.legacyBuilderWarningView - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - initMostUsedList() - binding.tuneExtraView.hasAutoExtra = false - - binding.timerPickerView.setListener(object : TimerPickerView.TimerListener { - override fun onTimerChange(time: Long) { - iFace.state.reminder.after = time - } - }) - - binding.exclusionView.bindProperty( - iFace.state.reminder.hours, - iFace.state.reminder.from, - iFace.state.reminder.to - ) { hours, from, to -> - iFace.state.reminder.hours = hours - iFace.state.reminder.from = from - iFace.state.reminder.to = to - } - - editReminder() - initViewModel() - } - - private fun initViewModel() { - viewModel.usedTimeList.nonNullObserve(viewLifecycleOwner) { - timesAdapter.submitList(it) - if (it.isEmpty()) { - binding.mostUserTimes.gone() - } else { - binding.mostUserTimes.visible() - } - } - } - - private fun initMostUsedList() { - binding.mostUserTimes.layoutManager = LinearLayoutManager( - context, - LinearLayoutManager.HORIZONTAL, - false - ) - timesAdapter.listener = { - binding.timerPickerView.timerValue = it.timeMills - } - binding.mostUserTimes.adapter = timesAdapter - } - - override fun updateActions() { - if (binding.actionView.hasAction()) { - if (binding.actionView.actionState == ActionView.ActionState.SMS) { - binding.tuneExtraView.hasAutoExtra = false - } else { - binding.tuneExtraView.hasAutoExtra = true - binding.tuneExtraView.hint = getString(R.string.enable_making_phone_calls_automatically) - } - } else { - binding.tuneExtraView.hasAutoExtra = false - } - } - - private fun editReminder() { - binding.timerPickerView.timerValue = iFace.state.reminder.after - } - - inner class TimesAdapter : ListAdapter( - UiUsedTimeListDiffCallback() - ) { - - var listener: ((UiUsedTimeList) -> Unit)? = null - - override fun onBindViewHolder(holder: TimeHolder, position: Int) { - holder.bind(getItem(position)) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = TimeHolder(parent) - - inner class TimeHolder( - viewGroup: ViewGroup - ) : HolderBinding( - ListItemUsedTimeBinding.inflate(viewGroup.inflater(), viewGroup, false) - ) { - - init { - binding.chipItem.setOnClickListener { - listener?.invoke(getItem(bindingAdapterPosition)) - } - } - - fun bind(usedTime: UiUsedTimeList) { - binding.chipItem.text = usedTime.timeString - } - } - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/TypeFragment.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/TypeFragment.kt deleted file mode 100644 index 5e474d3bf..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/TypeFragment.kt +++ /dev/null @@ -1,384 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments - -import android.content.Context -import android.net.Uri -import android.os.Bundle -import android.text.InputFilter -import android.text.InputType -import android.text.TextUtils -import android.view.View -import androidx.viewbinding.ViewBinding -import com.elementary.tasks.core.arch.BindingFragment -import com.elementary.tasks.core.os.datapicker.ContactPicker -import com.elementary.tasks.core.utils.BuildParams -import com.elementary.tasks.core.utils.Configs -import com.elementary.tasks.core.utils.GoogleCalendarUtils -import com.elementary.tasks.core.utils.bindProperty -import com.elementary.tasks.core.utils.copyExtra -import com.elementary.tasks.core.utils.params.Prefs -import com.elementary.tasks.core.utils.params.ReminderExplanationVisibility -import com.elementary.tasks.core.utils.ui.DateTimePickerProvider -import com.elementary.tasks.core.views.ActionView -import com.elementary.tasks.core.views.AttachmentView -import com.elementary.tasks.core.views.BeforePickerView -import com.elementary.tasks.core.views.ClosableLegacyBuilderRemovalWarningView -import com.elementary.tasks.core.views.DateTimeView -import com.elementary.tasks.core.views.ExportToCalendarView -import com.elementary.tasks.core.views.ExportToGoogleTasksView -import com.elementary.tasks.core.views.GroupView -import com.elementary.tasks.core.views.LedPickerView -import com.elementary.tasks.core.views.PriorityPickerView -import com.elementary.tasks.core.views.RepeatLimitView -import com.elementary.tasks.core.views.RepeatView -import com.elementary.tasks.core.views.TuneExtraView -import com.elementary.tasks.reminder.ReminderBuilderLauncher -import com.github.naz013.common.Permissions -import com.github.naz013.common.datetime.DateTimeManager -import com.github.naz013.common.uri.UriUtil -import com.github.naz013.domain.Reminder -import com.github.naz013.domain.ReminderGroup -import com.github.naz013.logging.Logger -import com.github.naz013.ui.common.datetime.ModelDateTimeFormatter -import com.github.naz013.ui.common.theme.ThemeProvider -import com.github.naz013.ui.common.view.ViewUtils -import com.github.naz013.ui.common.view.gone -import com.github.naz013.ui.common.view.visible -import com.github.naz013.ui.common.view.visibleGone -import com.google.android.material.textfield.TextInputEditText -import org.koin.android.ext.android.inject -import org.threeten.bp.LocalDateTime - -@Deprecated("Replaced by new Builder") -abstract class TypeFragment : BindingFragment() { - - private val reminderBuilderLauncher by inject() - protected val dateTimeManager by inject() - protected val dateTimePickerProvider by inject() - protected val modelDateTimeFormatter by inject() - private val contactPicker = ContactPicker(this) { actionView?.number = it.phone } - - lateinit var iFace: ReminderInterface - private set - - protected val prefs by inject() - protected val themeUtil by inject() - protected val googleCalendarUtils by inject() - protected val explanationVisibility by inject() - - private val calendars: List by lazy { - googleCalendarUtils.getCalendarsList() - } - - private var attachmentView: AttachmentView? = null - private var groupView: GroupView? = null - private var actionView: ActionView? = null - - abstract fun prepare(): Reminder? - - override fun onAttach(context: Context) { - super.onAttach(context) - iFace = context as ReminderInterface - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - getDynamicViews().forEach { initViews(it) } - getExplanationView().visibleGone( - explanationVisibility.shouldShowExplanation(getExplanationVisibilityType()) - ) - getLegacyMessageView().run { - visibleGone(prefs.showLegacyBuilderRemovalWarning) - onTryClicked = { - reminderBuilderLauncher.toggleBuilder(requireActivity()) - } - onCloseClicked = { - prefs.showLegacyBuilderRemovalWarning = false - gone() - } - } - setCloseListenerToExplanationView(getExplanationVisibilityHideClickListener()) - } - - protected abstract fun getLegacyMessageView(): ClosableLegacyBuilderRemovalWarningView - - protected abstract fun getDynamicViews(): List - - protected abstract fun getExplanationView(): View - - protected abstract fun getExplanationVisibilityType(): ReminderExplanationVisibility.Type - - protected abstract fun setCloseListenerToExplanationView(listener: View.OnClickListener) - - private fun getExplanationVisibilityHideClickListener(): View.OnClickListener { - return View.OnClickListener { - explanationVisibility.explanationShowed(getExplanationVisibilityType()) - getExplanationView().visibleGone( - explanationVisibility.shouldShowExplanation(getExplanationVisibilityType()) - ) - } - } - - private fun initViews(view: View) { - when (view) { - is ActionView -> { - this.actionView = view - if (prefs.isTelephonyAllowed) { - view.visible() - view.setPermissionHandle(permissionFlow) - view.setContactClickListener { - permissionFlow.askPermission(Permissions.READ_CONTACTS) { contactPicker.pickContact() } - } - view.bindProperty(iFace.state.reminder.target) { number -> - iFace.state.reminder.target = number - updateActions() - } - if (iFace.state.reminder.target != "") { - if (Reminder.isKind(iFace.state.reminder.type, Reminder.Kind.CALL)) { - view.actionState = ActionView.ActionState.CALL - } else if (Reminder.isKind(iFace.state.reminder.type, Reminder.Kind.SMS)) { - view.actionState = ActionView.ActionState.SMS - } else { - view.actionState = ActionView.ActionState.NO_ACTION - } - } - } else { - view.gone() - } - } - - is AttachmentView -> { - this.attachmentView = view - view.onFileSelectListener = { iFace.attachFile() } - ViewUtils.registerDragAndDrop( - requireActivity(), - view, - true, - ThemeProvider.getPrimaryColor(view.context), - { clipData -> - if (clipData.itemCount > 0) { - view.setUri(clipData.getItemAt(0).uri) - } - }, - *ATTACHMENT_TYPES - ) - view.bindProperty(iFace.state.reminder.attachmentFile) { path -> - iFace.state.reminder.attachmentFile = path - } - view.visibleGone(prefs.reminderCreatorParams.isAttachmentPickerEnabled()) - } - - is BeforePickerView -> { - view.visibleGone(prefs.reminderCreatorParams.isBeforePickerEnabled()) - view.bindProperty(iFace.state.reminder.remindBefore) { millis -> - iFace.state.reminder.remindBefore = millis - } - } - - is DateTimeView -> { - view.setDateTime(iFace.state.reminder.eventTime) - view.addOnDateChangeListener( - object : DateTimeView.OnDateChangeListener { - override fun onChanged(dateTime: LocalDateTime) { - iFace.state.reminder.eventTime = dateTimeManager.getGmtFromDateTime(dateTime) - } - } - ) - } - - is ExportToCalendarView -> { - view.visibleGone( - iFace.canExportToCalendar && prefs.reminderCreatorParams.isCalendarPickerEnabled() - ) - view.bindProperty( - iFace.state.reminder.exportToCalendar, - iFace.state.reminder.calendarId - ) { isChecked, calendarId -> - iFace.state.reminder.exportToCalendar = isChecked - iFace.state.reminder.calendarId = calendarId - } - } - - is ExportToGoogleTasksView -> { - view.visibleGone( - iFace.canExportToTasks && - prefs.reminderCreatorParams.isGoogleTasksPickerEnabled() - ) - view.bindProperty( - iFace.state.reminder.exportToTasks, - iFace.state.reminder.taskListId - ) { isChecked, listId -> - iFace.state.reminder.exportToTasks = isChecked - iFace.state.reminder.taskListId = listId - } - } - - is GroupView -> { - this.groupView = view - view.onGroupSelectListener = { iFace.selectGroup() } - showGroup(view, iFace.state.reminder) - } - - is LedPickerView -> { - if (BuildParams.isPro) { - view.visibleGone(prefs.reminderCreatorParams.isLedPickerEnabled()) - view.bindProperty(iFace.state.reminder.color) { color -> - iFace.state.reminder.color = color - } - } else { - view.gone() - } - } - - is PriorityPickerView -> { - view.visibleGone(prefs.reminderCreatorParams.isPriorityPickerEnabled()) - view.bindProperty(iFace.state.reminder.priority) { priority -> - iFace.state.reminder.priority = priority - } - } - - is RepeatLimitView -> { - view.visibleGone(prefs.reminderCreatorParams.isRepeatLimitPickerEnabled()) - view.bindProperty(iFace.state.reminder.repeatLimit) { limit -> - iFace.state.reminder.repeatLimit = limit - } - } - - is RepeatView -> { - view.visibleGone(prefs.reminderCreatorParams.isRepeatPickerEnabled()) - view.bindProperty(iFace.state.reminder.repeatInterval) { millis -> - iFace.state.reminder.repeatInterval = millis - } - } - - is TextInputEditText -> { - view.filters = arrayOf(InputFilter.LengthFilter(Configs.MAX_REMINDER_SUMMARY_LENGTH)) - view.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or - InputType.TYPE_TEXT_FLAG_AUTO_CORRECT - view.bindProperty(iFace.state.reminder.summary) { summary -> - iFace.state.reminder.summary = summary.trim() - } - } - - is TuneExtraView -> { - view.visibleGone(prefs.reminderCreatorParams.isTuneExtraPickerEnabled()) - view.dialogues = dialogues - view.bindProperty(iFace.state.reminder) { reminder -> - iFace.state.reminder.copyExtra(reminder) - } - } - } - } - - private fun updateVisibility(view: View) { - when (view) { - is AttachmentView -> { - view.visibleGone(prefs.reminderCreatorParams.isAttachmentPickerEnabled()) - } - - is BeforePickerView -> { - view.visibleGone(prefs.reminderCreatorParams.isBeforePickerEnabled()) - } - - is ExportToCalendarView -> { - view.visibleGone( - iFace.canExportToCalendar && - prefs.reminderCreatorParams.isCalendarPickerEnabled() - ) - } - - is ExportToGoogleTasksView -> { - view.visibleGone( - iFace.canExportToTasks && - prefs.reminderCreatorParams.isGoogleTasksPickerEnabled() - ) - } - - is LedPickerView -> { - if (BuildParams.isPro) { - view.visibleGone(prefs.reminderCreatorParams.isLedPickerEnabled()) - } else { - view.gone() - } - } - - is PriorityPickerView -> { - view.visibleGone(prefs.reminderCreatorParams.isPriorityPickerEnabled()) - } - - is RepeatLimitView -> { - view.visibleGone(prefs.reminderCreatorParams.isRepeatLimitPickerEnabled()) - } - - is RepeatView -> { - view.visibleGone(prefs.reminderCreatorParams.isRepeatPickerEnabled()) - } - - is TuneExtraView -> { - view.visibleGone(prefs.reminderCreatorParams.isTuneExtraPickerEnabled()) - } - } - } - - protected open fun updateActions() { - } - - open fun onBackPressed(): Boolean { - return true - } - - open fun onVoiceAction(text: String) { - } - - protected fun isTablet() = iFace.isTablet() - - private fun showGroup(groupView: GroupView?, reminder: Reminder) { - if (TextUtils.isEmpty(reminder.groupTitle) || reminder.groupTitle == "null") { - groupView?.reminderGroup = iFace.defGroup - } else { - groupView?.reminderGroup = ReminderGroup( - groupDateTime = dateTimeManager.getNowGmtDateTime(), - groupUuId = reminder.groupUuId, - groupColor = reminder.groupColor, - groupTitle = reminder.groupTitle ?: "", - isDefaultGroup = true - ) - } - } - - override fun onResume() { - super.onResume() - getDynamicViews().forEach { updateVisibility(it) } - Logger.d("onResume: ${iFace.state.reminder.groupTitle}, ${iFace.defGroup}") - if ( - iFace.state.reminder.groupUuId.isBlank() || - TextUtils.isEmpty(iFace.state.reminder.groupTitle) - ) { - iFace.defGroup?.let { - onGroupUpdate(it) - } - } - iFace.setFragment(this) - } - - fun onGroupUpdate(reminderGroup: ReminderGroup) { - runCatching { - iFace.state.reminder.groupUuId = reminderGroup.groupUuId - iFace.state.reminder.groupColor = reminderGroup.groupColor - iFace.state.reminder.groupTitle = reminderGroup.groupTitle - } - if (isResumed) { - groupView?.reminderGroup = reminderGroup - } - } - - fun onMelodySelect(path: String) { - } - - fun onAttachmentSelect(uri: Uri) { - attachmentView?.setUri(uri) - } - - companion object { - val ATTACHMENT_TYPES = arrayOf(UriUtil.URI_MIME, UriUtil.ANY_MIME) - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/WeekFragment.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/WeekFragment.kt deleted file mode 100644 index 2e92251d1..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/WeekFragment.kt +++ /dev/null @@ -1,223 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments - -import android.os.Bundle -import android.text.TextUtils -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.CompoundButton -import com.elementary.tasks.R -import com.elementary.tasks.core.utils.datetime.IntervalUtil -import com.elementary.tasks.core.utils.params.ReminderExplanationVisibility -import com.elementary.tasks.core.views.ActionView -import com.elementary.tasks.core.views.ClosableLegacyBuilderRemovalWarningView -import com.elementary.tasks.databinding.FragmentReminderWeekdaysBinding -import com.github.naz013.domain.Reminder -import com.github.naz013.logging.Logger -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDateTime -import org.threeten.bp.LocalTime - -class WeekFragment : RepeatableTypeFragment() { - - private val time: LocalTime - get() = LocalTime.of(iFace.state.hour, iFace.state.minute) - - val days: List - get() = IntervalUtil.getWeekRepeat( - binding.mondayCheck.isChecked, - binding.tuesdayCheck.isChecked, - binding.wednesdayCheck.isChecked, - binding.thursdayCheck.isChecked, - binding.fridayCheck.isChecked, - binding.saturdayCheck.isChecked, - binding.sundayCheck.isChecked - ) - - private val mCheckListener: CompoundButton.OnCheckedChangeListener = - CompoundButton.OnCheckedChangeListener { _, _ -> - iFace.state.weekdays = days - iFace.state.isWeekdaysSaved = true - calculateNextDate() - } - - override fun getExplanationVisibilityType(): ReminderExplanationVisibility.Type { - return ReminderExplanationVisibility.Type.BY_WEEKDAY - } - - override fun getExplanationView(): View { - return binding.explanationView - } - - override fun setCloseListenerToExplanationView(listener: View.OnClickListener) { - binding.explanationView.setOnClickListener(listener) - } - - override fun prepare(): Reminder? { - val reminder = iFace.state.reminder - var type = Reminder.BY_WEEK - val isAction = binding.actionView.hasAction() - if (TextUtils.isEmpty(reminder.summary) && !isAction) { - binding.taskLayout.error = getString(R.string.task_summary_is_empty) - binding.taskLayout.isErrorEnabled = true - return null - } - var number = "" - if (isAction) { - number = binding.actionView.number - if (TextUtils.isEmpty(number)) { - iFace.showSnackbar(getString(R.string.you_dont_insert_number)) - return null - } - type = if (binding.actionView.actionState == ActionView.ActionState.CALL) { - Reminder.BY_WEEK_CALL - } else { - Reminder.BY_WEEK_SMS - } - } - val weekdays = iFace.state.weekdays - if (!IntervalUtil.isWeekday(weekdays)) { - iFace.showSnackbar(getString(R.string.you_dont_select_any_day)) - return null - } - - reminder.weekdays = weekdays - reminder.target = number - reminder.type = type - reminder.after = 0L - reminder.delay = 0 - reminder.eventCount = 0 - reminder.repeatInterval = 0 - reminder.recurDataObject = null - - reminder.eventTime = dateTimeManager.getGmtFromDateTime(LocalDateTime.of(LocalDate.now(), time)) - val startTime = modelDateTimeFormatter.getNextWeekdayTime(reminder) - if (!dateTimeManager.isCurrent(startTime)) { - iFace.showSnackbar(getString(R.string.reminder_is_outdated)) - return null - } - reminder.startTime = dateTimeManager.getGmtFromDateTime(startTime) - reminder.eventTime = dateTimeManager.getGmtFromDateTime(startTime) - Logger.d("EVENT_TIME ${dateTimeManager.logDateTime(startTime)}") - return reminder - } - - override fun inflate( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentReminderWeekdaysBinding.inflate(inflater, container, false) - - override fun getDynamicViews(): List { - return listOfNotNull( - binding.ledView, - binding.exportToCalendar, - binding.exportToTasks, - binding.tuneExtraView, - binding.attachmentView, - binding.groupView, - binding.taskSummary, - binding.beforeView, - binding.priorityView, - binding.repeatLimitView, - binding.actionView - ) - } - - override fun getLegacyMessageView(): ClosableLegacyBuilderRemovalWarningView { - return binding.legacyBuilderWarningView - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - binding.sundayCheck.setOnCheckedChangeListener(mCheckListener) - binding.saturdayCheck.setOnCheckedChangeListener(mCheckListener) - binding.fridayCheck.setOnCheckedChangeListener(mCheckListener) - binding.thursdayCheck.setOnCheckedChangeListener(mCheckListener) - binding.wednesdayCheck.setOnCheckedChangeListener(mCheckListener) - binding.tuesdayCheck.setOnCheckedChangeListener(mCheckListener) - binding.mondayCheck.setOnCheckedChangeListener(mCheckListener) - - binding.timeField.setOnClickListener { - dateTimePickerProvider.showTimePicker( - fragmentManager = childFragmentManager, - time = time, - title = getString(R.string.select_time) - ) { - onTimeSelected(it) - } - } - binding.timeField.text = dateTimeManager.getTime(time) - - binding.tuneExtraView.hasAutoExtra = false - calculateNextDate() - editReminder() - } - - private fun onTimeSelected(localTime: LocalTime) { - iFace.state.hour = localTime.hour - iFace.state.minute = localTime.minute - binding.timeField.text = dateTimeManager.getTime(localTime) - calculateNextDate() - } - - private fun calculateNextDate() { - val weekdays = days - if (!IntervalUtil.isWeekday(weekdays)) { - binding.calculatedNextTime.text = "" - return - } - val reminder = Reminder() - reminder.weekdays = weekdays - reminder.type = Reminder.BY_WEEK - reminder.repeatInterval = 0 - reminder.eventTime = dateTimeManager.getGmtFromDateTime(LocalDateTime.of(LocalDate.now(), time)) - val startTime = modelDateTimeFormatter.getNextWeekdayTime(reminder) - binding.calculatedNextTime.text = dateTimeManager.getFullDateTime(startTime) - } - - override fun updateActions() { - if (!isAdded) return - if (binding.actionView.hasAction()) { - if (binding.actionView.actionState == ActionView.ActionState.SMS) { - binding.tuneExtraView.hasAutoExtra = false - } else { - binding.tuneExtraView.hasAutoExtra = true - binding.tuneExtraView.hint = getString(R.string.enable_making_phone_calls_automatically) - } - } else { - binding.tuneExtraView.hasAutoExtra = false - } - } - - private fun updateTime(time: LocalTime?): LocalTime { - val localTime = time ?: LocalTime.now() - iFace.state.hour = localTime.hour - iFace.state.minute = localTime.minute - return localTime - } - - private fun setCheckForDays(weekdays: List) { - binding.sundayCheck.isChecked = weekdays[0] == 1 - binding.mondayCheck.isChecked = weekdays[1] == 1 - binding.tuesdayCheck.isChecked = weekdays[2] == 1 - binding.wednesdayCheck.isChecked = weekdays[3] == 1 - binding.thursdayCheck.isChecked = weekdays[4] == 1 - binding.fridayCheck.isChecked = weekdays[5] == 1 - binding.saturdayCheck.isChecked = weekdays[6] == 1 - } - - private fun editReminder() { - val reminder = iFace.state.reminder - binding.timeField.text = dateTimeManager.getTime( - updateTime(dateTimeManager.fromGmtToLocal(reminder.eventTime)?.toLocalTime()) - ) - if (reminder.weekdays.isNotEmpty()) { - setCheckForDays(reminder.weekdays) - } - if (iFace.state.isWeekdaysSaved) { - setCheckForDays(iFace.state.weekdays) - } - calculateNextDate() - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/YearFragment.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/YearFragment.kt deleted file mode 100644 index bcd141f11..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/YearFragment.kt +++ /dev/null @@ -1,161 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments - -import android.os.Bundle -import android.text.TextUtils -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.elementary.tasks.R -import com.elementary.tasks.core.utils.params.ReminderExplanationVisibility -import com.elementary.tasks.core.views.ActionView -import com.elementary.tasks.core.views.ClosableLegacyBuilderRemovalWarningView -import com.elementary.tasks.core.views.DateTimeView -import com.elementary.tasks.databinding.FragmentReminderYearBinding -import com.github.naz013.common.datetime.minusMillis -import com.github.naz013.domain.Reminder -import com.github.naz013.logging.Logger -import org.threeten.bp.LocalDate -import org.threeten.bp.LocalDateTime -import org.threeten.bp.LocalTime - -class YearFragment : RepeatableTypeFragment() { - - override fun getExplanationVisibilityType(): ReminderExplanationVisibility.Type { - return ReminderExplanationVisibility.Type.BY_YEAR - } - - override fun getExplanationView(): View { - return binding.explanationView - } - - override fun setCloseListenerToExplanationView(listener: View.OnClickListener) { - binding.explanationView.setOnClickListener(listener) - } - - override fun prepare(): Reminder? { - val reminder = iFace.state.reminder - var type = Reminder.BY_DAY_OF_YEAR - val isAction = binding.actionView.hasAction() - if (TextUtils.isEmpty(reminder.summary) && !isAction) { - binding.taskLayout.error = getString(R.string.task_summary_is_empty) - binding.taskLayout.isErrorEnabled = true - return null - } - var number = "" - if (isAction) { - number = binding.actionView.number - if (TextUtils.isEmpty(number)) { - iFace.showSnackbar(getString(R.string.you_dont_insert_number)) - return null - } - type = if (binding.actionView.actionState == ActionView.ActionState.CALL) { - Reminder.BY_DAY_OF_YEAR_CALL - } else { - Reminder.BY_DAY_OF_YEAR_SMS - } - } - reminder.weekdays = listOf() - reminder.target = number - reminder.type = type - reminder.dayOfMonth = iFace.state.day - reminder.monthOfYear = iFace.state.month - reminder.after = 0L - reminder.delay = 0 - reminder.eventCount = 0 - reminder.repeatInterval = 0 - reminder.recurDataObject = null - - reminder.eventTime = dateTimeManager.getGmtFromDateTime(getDateTime()) - val startTime = modelDateTimeFormatter.getNextYearDayTime(reminder) - - if (reminder.remindBefore > 0 && - !dateTimeManager.isCurrent(startTime.minusMillis(reminder.remindBefore)) - ) { - iFace.showSnackbar(getString(R.string.invalid_remind_before_parameter)) - return null - } - - reminder.startTime = dateTimeManager.getGmtFromDateTime(startTime) - reminder.eventTime = dateTimeManager.getGmtFromDateTime(startTime) - Logger.d("EVENT_TIME ${dateTimeManager.logDateTime(startTime)}") - if (!dateTimeManager.isCurrent(reminder.eventTime)) { - iFace.showSnackbar(getString(R.string.reminder_is_outdated)) - return null - } - return reminder - } - - private fun getDateTime(): LocalDateTime { - return LocalDateTime.of(LocalDate.now(), iFace.state.time.withSecond(0)) - } - - override fun inflate( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentReminderYearBinding.inflate(inflater, container, false) - - override fun getDynamicViews(): List { - return listOfNotNull( - binding.ledView, - binding.exportToCalendar, - binding.exportToTasks, - binding.tuneExtraView, - binding.attachmentView, - binding.groupView, - binding.taskSummary, - binding.beforeView, - binding.dateView, - binding.priorityView, - binding.repeatLimitView, - binding.actionView - ) - } - - override fun getLegacyMessageView(): ClosableLegacyBuilderRemovalWarningView { - return binding.legacyBuilderWarningView - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - binding.tuneExtraView.hasAutoExtra = false - - binding.dateView.setDateFormat(dateTimeManager.simpleDateFormatter()) - binding.dateView.setOnSelectListener(object : DateTimeView.OnSelectListener { - override fun onDateSelect(date: LocalDate) { - iFace.state.date = date - } - - override fun onTimeSelect(time: LocalTime) { - iFace.state.time = time - } - }) - - binding.dateView.selectedDateTime = LocalDateTime.of(iFace.state.date, iFace.state.time) - editReminder() - } - - override fun updateActions() { - if (binding.actionView.hasAction()) { - if (binding.actionView.actionState == ActionView.ActionState.SMS) { - binding.tuneExtraView.hasAutoExtra = false - } else { - binding.tuneExtraView.hasAutoExtra = true - binding.tuneExtraView.hint = getString(R.string.enable_making_phone_calls_automatically) - } - } else { - binding.tuneExtraView.hasAutoExtra = false - } - } - - private fun updateDateTime(reminder: Reminder) { - val dateTime = dateTimeManager.fromGmtToLocal(reminder.eventTime) ?: LocalDateTime.now() - binding.dateView.selectedDateTime = dateTime - iFace.state.date = dateTime.toLocalDate() - iFace.state.time = dateTime.toLocalTime() - } - - private fun editReminder() { - updateDateTime(iFace.state.reminder) - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/BuilderParam.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/BuilderParam.kt deleted file mode 100644 index 8c4ca5cf6..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/BuilderParam.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments.recur - -import com.github.naz013.icalendar.DayValue -import com.github.naz013.icalendar.FreqType -import com.github.naz013.icalendar.RecurParamType - -data class BuilderParam( - val recurParamType: RecurParamType, - val value: T -) { - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as BuilderParam<*> - - return recurParamType == other.recurParamType - } - - override fun hashCode(): Int { - return recurParamType.hashCode() - } -} - -data class UiBuilderParam(val text: String, val param: BuilderParam) - -data class UiFreqParam(val text: String, val freqType: FreqType) - -data class UiDayParam(val text: String, val dayValue: DayValue) diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/BuilderParamLogic.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/BuilderParamLogic.kt deleted file mode 100644 index b882bd2af..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/BuilderParamLogic.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments.recur - -class BuilderParamLogic { - - private var allParams: Set> = emptySet() - private val usedParams: MutableSet> = HashSet() - - fun setAllParams(allParams: List>) { - this.allParams = allParams.toHashSet() - } - - fun addOrUpdateParam(builderParam: BuilderParam<*>) { - if (allParams.isEmpty()) return - val index = usedParams.indexOf(builderParam) - if (index != -1) { - usedParams.remove(builderParam) - } - usedParams.add(builderParam) - } - - fun addOrUpdateParams(params: List>) { - if (allParams.isEmpty()) return - params.forEach { builderParam -> - val index = usedParams.indexOf(builderParam) - if (index != -1) { - usedParams.remove(builderParam) - } - usedParams.add(builderParam) - } - } - - fun removeParam(builderParam: BuilderParam<*>) { - if (allParams.isEmpty()) return - usedParams.remove(builderParam) - } - - fun getAvailable(): List> { - return allParams.toList() - usedParams - } - - fun getUsed(): List> { - return usedParams.toList() - } - - fun clearUsed() { - usedParams.clear() - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/ByDayValidator.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/ByDayValidator.kt deleted file mode 100644 index daccc5a0c..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/ByDayValidator.kt +++ /dev/null @@ -1,96 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments.recur - -import com.github.naz013.icalendar.Day -import com.github.naz013.icalendar.DayValue -import com.github.naz013.logging.Logger - -class ByDayValidator { - - private var stateListener: ((isValid: Boolean) -> Unit)? = null - private var lastValue: String = "" - private var isValid: Boolean = true - - fun getValues(): List { - return if (lastValue.isEmpty()) { - emptyList() - } else { - lastValue.split(",").map { DayValue(it) }.also { - Logger.d("getValues: $it") - } - } - } - - fun setListener(stateListener: (isValid: Boolean) -> Unit) { - this.stateListener = stateListener - } - - fun onTextChanged(text: String) { - if (text == lastValue) { - Logger.d("onTextChanged: same") - return - } - isValid = false - lastValue = text - if (text.matches(".*\\s.*".toRegex())) { - Logger.d("onTextChanged: has whitespace") - stateListener?.invoke(isValid) - return - } - - val values = text.split(",") - - val allContainDays = values.all { containsDay(it) } - if (!allContainDays) { - Logger.d("onTextChanged: not all contain day") - stateListener?.invoke(isValid) - return - } - - val allCorrectPrefix = values.all { hasCorrectPrefix(it) } - if (!allCorrectPrefix) { - Logger.d("onTextChanged: not all have correct prefix") - stateListener?.invoke(isValid) - return - } - - Logger.d("onTextChanged: is correct") - - isValid = true - stateListener?.invoke(true) - } - - private fun hasCorrectPrefix(value: String): Boolean { - return days().firstOrNull { value.contains(it) }?.let { day -> - val withoutDay = value.replace(day, "") - if (withoutDay.isEmpty()) { - Logger.d("hasCorrectPrefix: day = $day, no prefix") - true - } else { - if (hasSuffix(value, day)) { - false - } else { - val integer = runCatching { withoutDay.toInt() }.getOrNull() - Logger.d("hasCorrectPrefix: day = $day, prefix integer = $integer") - integer != null - } - } - } ?: false - } - - private fun hasSuffix(value: String, dayValue: String): Boolean { - val index = value.indexOf(dayValue) - return if (index != -1) { - index + dayValue.length < value.length - } else { - false - } - } - - private fun containsDay(value: String): Boolean { - return days().any { value.contains(it) } - } - - private fun days(): List { - return Day.entries.map { it.value } - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/RecurBuilderViewModel.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/RecurBuilderViewModel.kt deleted file mode 100644 index 292329069..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/RecurBuilderViewModel.kt +++ /dev/null @@ -1,557 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments.recur - -import androidx.lifecycle.viewModelScope -import com.elementary.tasks.R -import com.elementary.tasks.core.arch.BaseProgressViewModel -import com.github.naz013.feature.common.livedata.toSingleEvent -import com.github.naz013.domain.Reminder -import com.github.naz013.feature.common.coroutine.DispatcherProvider -import com.github.naz013.common.TextProvider -import com.github.naz013.common.datetime.DateTimeManager -import com.github.naz013.icalendar.ByDayRecurParam -import com.github.naz013.icalendar.ByHourRecurParam -import com.github.naz013.icalendar.ByMinuteRecurParam -import com.github.naz013.icalendar.ByMonthDayRecurParam -import com.github.naz013.icalendar.ByMonthRecurParam -import com.github.naz013.icalendar.BySetPosRecurParam -import com.github.naz013.icalendar.ByWeekNumberRecurParam -import com.github.naz013.icalendar.ByYearDayRecurParam -import com.github.naz013.icalendar.CountRecurParam -import com.github.naz013.icalendar.DateTimeStartTag -import com.github.naz013.icalendar.Day -import com.github.naz013.icalendar.DayValue -import com.github.naz013.icalendar.FreqRecurParam -import com.github.naz013.icalendar.FreqType -import com.github.naz013.icalendar.IntervalRecurParam -import com.github.naz013.icalendar.RecurParam -import com.github.naz013.icalendar.RecurParamType -import com.github.naz013.icalendar.ICalendarApi -import com.github.naz013.icalendar.RecurrenceRuleTag -import com.github.naz013.icalendar.RuleMap -import com.github.naz013.icalendar.Tag -import com.github.naz013.icalendar.TagType -import com.github.naz013.icalendar.UntilRecurParam -import com.github.naz013.icalendar.UtcDateTime -import com.github.naz013.icalendar.WeekStartRecurParam -import com.github.naz013.feature.common.viewmodel.mutableLiveDataOf -import com.elementary.tasks.core.utils.params.Prefs -import com.github.naz013.feature.common.livedata.toLiveData -import com.elementary.tasks.reminder.create.fragments.recur.adapter.ParamToTextAdapter -import com.elementary.tasks.reminder.create.fragments.recur.intdialog.Number -import com.elementary.tasks.reminder.create.fragments.recur.preview.PreviewData -import com.elementary.tasks.reminder.create.fragments.recur.preview.PreviewItem -import com.elementary.tasks.reminder.create.fragments.recur.preview.Style -import com.github.naz013.analytics.AnalyticsEventSender -import com.github.naz013.analytics.PresetAction -import com.github.naz013.analytics.PresetUsed -import com.github.naz013.domain.PresetType -import com.github.naz013.domain.RecurPreset -import com.github.naz013.logging.Logger -import com.github.naz013.repository.RecurPresetRepository -import kotlinx.coroutines.launch -import org.threeten.bp.LocalDateTime -import java.util.Timer -import java.util.TimerTask - -class RecurBuilderViewModel( - dispatcherProvider: DispatcherProvider, - private val paramToTextAdapter: ParamToTextAdapter, - private val ICalendarApi: ICalendarApi, - private val dateTimeManager: DateTimeManager, - private val recurPresetRepository: RecurPresetRepository, - private val prefs: Prefs, - private val textProvider: TextProvider, - private val analyticsEventSender: AnalyticsEventSender -) : BaseProgressViewModel(dispatcherProvider) { - - private val builderParamLogic = BuilderParamLogic() - private val refreshTimer = RefreshTimer { reCalculate() } - - private val _availableParams = mutableLiveDataOf>>() - val availableParams = _availableParams.toLiveData() - - private val _usedParams = mutableLiveDataOf>>() - val usedParams = _usedParams.toLiveData() - - private val _supportedFreq = mutableLiveDataOf>() - val supportedFreq = _supportedFreq.toLiveData() - - private val _supportedDays = mutableLiveDataOf>() - val supportedDays = _supportedDays.toLiveData() - - private val _previewData = mutableLiveDataOf() - val previewData = _previewData.toLiveData() - - private val _dateTime = mutableLiveDataOf() - val dateTime = _dateTime.toLiveData() - - private val _previewError = mutableLiveDataOf() - val previewError = _previewError.toSingleEvent() - - private var startDateTime = LocalDateTime.now() - - init { - viewModelScope.launch(dispatcherProvider.default()) { - builderParamLogic.setAllParams(RecurParamType.entries.map { it.toBuilderParam() }) - - _availableParams.postValue(createAvailableDataList(builderParamLogic.getAvailable())) - _supportedFreq.postValue(getSupportedFreq()) - _supportedDays.postValue(getSupportedDays()) - - val used = createUsedDataList(builderParamLogic.getUsed()) - calculateEvents(used) - _usedParams.postValue(used) - _dateTime.postValue(startDateTime) - } - } - - fun showAdvancedDayDialog(): Boolean { - return prefs.showAdvancedDayDialog - } - - fun setShowAdvancedDayDialog(boolean: Boolean) { - prefs.showAdvancedDayDialog = boolean - } - - fun onPresetSelected(presetId: String) { - Logger.d("onPresetSelected: $presetId") - viewModelScope.launch(dispatcherProvider.default()) { - val preset = recurPresetRepository.getById(presetId) ?: return@launch - - val params = runCatching { ICalendarApi.parseObject(preset.recurObject) }.getOrNull() - ?.getTagOrNull(TagType.RRULE) - ?.params - ?.map { it.toBuilderParam() } - ?: emptyList() - - if (params.isNotEmpty()) { - builderParamLogic.clearUsed() - builderParamLogic.addOrUpdateParams(params) - - val used = createUsedDataList(builderParamLogic.getUsed()) - calculateEvents(used) - - _usedParams.postValue(used) - _availableParams.postValue(createAvailableDataList(builderParamLogic.getAvailable())) - - analyticsEventSender.send(PresetUsed(PresetAction.USE)) - } - } - } - - fun addPreset(recurObject: String, name: String) { - viewModelScope.launch(dispatcherProvider.default()) { - val preset = RecurPreset( - recurObject = recurObject, - name = name, - type = PresetType.RECUR, - createdAt = dateTimeManager.getCurrentDateTime(), - useCount = 1, - description = null - ) - recurPresetRepository.save(preset) - analyticsEventSender.send(PresetUsed(PresetAction.CREATE)) - } - } - - fun generateNumbers( - minValue: Int, - maxValue: Int, - excludedValues: IntArray, - selectedValues: List - ): List { - val list = mutableListOf() - for (i in minValue..maxValue) { - val number = Number(i) - if (selectedValues.contains(i)) { - number.isSelected = true - } - list.add(number) - } - excludedValues.forEach { - list.remove(Number(it)) - } - return list - } - - fun getEventData(): EventData? { - val usedParams = _usedParams.value?.map { it.param } ?: return null - - Logger.d("calculateEvents: params = $usedParams") - - val ruleMap = createRuleMap(usedParams) - - Logger.d("calculateEvents: map = $ruleMap") - - val recurObject = runCatching { - ICalendarApi.createObject(ruleMap) - }.getOrNull() ?: return null - - val dates = runCatching { ICalendarApi.generate(ruleMap) }.getOrNull() ?: emptyList() - val position = findPosition(dates) - - return dates[position].dateTime?.let { - EventData( - startDateTime = it, - recurObject = recurObject - ) - } - } - - fun onEdit(reminder: Reminder) { - viewModelScope.launch(dispatcherProvider.default()) { - Logger.d("onEdit: recurDataObject = ${reminder.recurDataObject}") - - val rules = runCatching { - ICalendarApi.parseObject(reminder.recurDataObject) - }.getOrNull() - - rules?.map?.values?.forEach { tag -> - when (tag) { - is RecurrenceRuleTag -> { - tag.params.map { it.toBuilderParam() }.also { - Logger.d("onEdit: builder params = $it") - builderParamLogic.addOrUpdateParams(it) - } - } - - is DateTimeStartTag -> { - tag.value.dateTime?.also { - startDateTime = it - } - } - - else -> {} - } - } - - val used = createUsedDataList(builderParamLogic.getUsed()) - calculateEvents(used) - - _usedParams.postValue(used) - _availableParams.postValue(createAvailableDataList(builderParamLogic.getAvailable())) - _dateTime.postValue(startDateTime) - } - } - - fun onDateTimeChanged(dateTime: LocalDateTime) { - this.startDateTime = dateTime - - viewModelScope.launch(dispatcherProvider.default()) { - calculateEvents(_usedParams.value ?: emptyList()) - } - } - - fun selectOrUpdateParam(builderParam: BuilderParam<*>) { - viewModelScope.launch(dispatcherProvider.default()) { - builderParamLogic.addOrUpdateParam(builderParam) - - val used = createUsedDataList(builderParamLogic.getUsed()) - calculateEvents(used) - - _usedParams.postValue(used) - _availableParams.postValue(createAvailableDataList(builderParamLogic.getAvailable())) - } - } - - fun unSelectParam(builderParam: BuilderParam<*>) { - viewModelScope.launch(dispatcherProvider.default()) { - builderParamLogic.removeParam(builderParam) - - val used = createUsedDataList(builderParamLogic.getUsed()) - calculateEvents(used) - - _usedParams.postValue(used) - _availableParams.postValue(createAvailableDataList(builderParamLogic.getAvailable())) - } - } - - private fun reCalculate() { - viewModelScope.launch(dispatcherProvider.default()) { - val used = createUsedDataList(builderParamLogic.getUsed()) - calculateEvents(used) - } - } - - private fun calculateEvents(used: List>) { - _previewError.postValue(null) - - val (dates, scrollPosition) = generateDates(used) - - if (dates.isEmpty()) { - refreshTimer.stop() - - val hasUntilRule = used.firstOrNull { - it.param.recurParamType == RecurParamType.UNTIL - } != null - - if (hasUntilRule) { - _previewError.postValue(textProvider.getText(R.string.recur_change_until_param_error)) - } - } else { - refreshTimer.start() - } - - _previewData.postValue(PreviewData(scrollPosition, dates)) - } - - private fun generateDates(used: List>): Pair, Int> { - val usedParams = used.map { it.param } - Logger.d("calculateEvents: params = $usedParams") - - if (!hasLimit(usedParams)) { - Logger.d("calculateEvents: no limit, show error") - _previewError.postValue(textProvider.getText(R.string.recur_no_limit_error)) - return Pair(emptyList(), 0) - } - - val ruleMap = createRuleMap(usedParams) - return generateFromMap(ruleMap) - } - - private fun hasLimit(params: List>): Boolean { - return params.firstOrNull { it.recurParamType == RecurParamType.COUNT } != null || - params.firstOrNull { it.recurParamType == RecurParamType.UNTIL } != null - } - - private fun generateFromMap(ruleMap: RuleMap): Pair, Int> { - Logger.d("calculateEvents: map = $ruleMap") - - val generated = runCatching { ICalendarApi.generate(ruleMap) }.getOrNull() ?: emptyList() - - return convertForUi(generated) - } - - private fun findPosition(generated: List): Int { - if (generated.isEmpty()) return -1 - - val nowDateTime = dateTimeManager.getCurrentDateTime().withNano(0) - - var nowSelected = false - var position = -1 - - generated.forEachIndexed { index, utcDateTime -> - val dateTime = utcDateTime.dateTime - if (dateTime != null) { - if (!nowSelected) { - if (dateTime.isEqual(nowDateTime) || dateTime.isAfter(nowDateTime)) { - position = index - nowSelected = true - } - } - } - } - - return position - } - - private fun convertForUi(generated: List): Pair, Int> { - val nowDateTime = dateTimeManager.getCurrentDateTime().withNano(0) - - var nowSelected = false - - val dates = generated.mapNotNull { it.dateTime }.map { - val isNext = if (!nowSelected) { - if (it.isEqual(nowDateTime) || it.isAfter(nowDateTime)) { - nowSelected = true - true - } else { - false - } - } else { - false - } - val style = if (isNext) { - Style.BOLD - } else { - if (it.isBefore(nowDateTime)) { - Style.DISABLED - } else { - Style.NORMAL - } - } - PreviewItem( - text = dateTimeManager.getFullDateTime(it), - style = style - ) - } - - val scrollPosition = dates.indexOfFirst { it.style == Style.BOLD } - - Logger.d("calculateEvents: scrollPosition = $scrollPosition, dates = ${dates.size}") - return Pair(dates, scrollPosition) - } - - private fun createRuleMap(params: List>): RuleMap { - val map = mutableMapOf().apply { - put(TagType.DTSTART, DateTimeStartTag(UtcDateTime(startDateTime))) - } - - createRruleTag(params)?.also { - map[it.tagType] = it - } - - return RuleMap(map) - } - - @Suppress("UNCHECKED_CAST") - private fun createRruleTag(params: List>): RecurrenceRuleTag? { - if (params.isEmpty()) return null - - val recurParams = mutableListOf() - - params.forEach { builderParam -> - val value = builderParam.value - if (value != null) { - when (builderParam.recurParamType) { - RecurParamType.FREQ -> { - recurParams.add(FreqRecurParam(value as FreqType)) - } - - RecurParamType.INTERVAL -> { - recurParams.add(IntervalRecurParam(value as Int)) - } - - RecurParamType.COUNT -> { - recurParams.add(CountRecurParam(value as Int)) - } - - RecurParamType.UNTIL -> { - recurParams.add(UntilRecurParam(value as UtcDateTime)) - } - - RecurParamType.BYMONTH -> { - recurParams.add(ByMonthRecurParam(value as List)) - } - - RecurParamType.WEEKSTART -> { - recurParams.add(WeekStartRecurParam(value as DayValue)) - } - - RecurParamType.BYDAY -> { - recurParams.add(ByDayRecurParam(value as List)) - } - - RecurParamType.BYMONTHDAY -> { - recurParams.add(ByMonthDayRecurParam(value as List)) - } - - RecurParamType.BYHOUR -> { - recurParams.add(ByHourRecurParam(value as List)) - } - - RecurParamType.BYMINUTE -> { - recurParams.add(ByMinuteRecurParam(value as List)) - } - - RecurParamType.BYYEARDAY -> { - recurParams.add(ByYearDayRecurParam(value as List)) - } - - RecurParamType.BYWEEKNO -> { - recurParams.add(ByWeekNumberRecurParam(value as List)) - } - - RecurParamType.BYSETPOS -> { - recurParams.add(BySetPosRecurParam(value as List)) - } - } - } - } - - return RecurrenceRuleTag(recurParams) - } - - private fun createAvailableDataList(list: List>): List> { - return list.map { UiBuilderParam(paramToTextAdapter.createText(it), it) } - .sortedBy { it.text } - } - - private fun createUsedDataList(list: List>): List> { - return list.map { UiBuilderParam(paramToTextAdapter.createTextWithValues(it), it) } - } - - private fun getSupportedFreq(): List { - return FreqType.entries.map { - UiFreqParam( - text = paramToTextAdapter.getFreqText(it), - freqType = it - ) - }.sortedBy { it.text } - } - - private fun getSupportedDays(): List { - return Day.entries.map { DayValue(it) }.map { - UiDayParam( - text = paramToTextAdapter.getDayFullText(it), - dayValue = it - ) - } - } - - inner class RefreshTimer( - private val onRefreshListener: () -> Unit - ) { - private var timer: Timer? = null - - fun start() { - runCatching { timer?.cancel() } - - timer = Timer() - timer?.scheduleAtFixedRate( - /* task = */ object : TimerTask() { - override fun run() { - onRefreshListener.invoke() - } - }, - /* delay = */ 15 * 1000L, - /* period = */ 15 * 1000L - ) - } - - fun stop() { - runCatching { timer?.cancel() } - } - } -} - -private fun RecurParam.toBuilderParam(): BuilderParam<*> { - return when (this) { - is CountRecurParam -> BuilderParam(this.recurParamType, this.value) - is IntervalRecurParam -> BuilderParam(this.recurParamType, this.value) - is FreqRecurParam -> BuilderParam(this.recurParamType, this.value) - is UntilRecurParam -> BuilderParam(this.recurParamType, this.value) - is ByDayRecurParam -> BuilderParam(this.recurParamType, this.value) - is ByMonthRecurParam -> BuilderParam(this.recurParamType, this.value) - is ByMonthDayRecurParam -> BuilderParam(this.recurParamType, this.value) - is ByHourRecurParam -> BuilderParam(this.recurParamType, this.value) - is ByMinuteRecurParam -> BuilderParam(this.recurParamType, this.value) - is ByYearDayRecurParam -> BuilderParam(this.recurParamType, this.value) - is ByWeekNumberRecurParam -> BuilderParam(this.recurParamType, this.value) - is BySetPosRecurParam -> BuilderParam(this.recurParamType, this.value) - is WeekStartRecurParam -> BuilderParam(this.recurParamType, this.value) - } -} - -private fun RecurParamType.toBuilderParam(): BuilderParam<*> { - return when (this) { - RecurParamType.COUNT -> BuilderParam(this, 1) - RecurParamType.INTERVAL -> BuilderParam(this, 1) - RecurParamType.FREQ -> BuilderParam(this, FreqType.DAILY) - RecurParamType.UNTIL -> BuilderParam(this, UtcDateTime(LocalDateTime.now())) - RecurParamType.BYDAY -> BuilderParam(this, emptyList()) - RecurParamType.BYMONTH -> BuilderParam(this, emptyList()) - RecurParamType.BYMONTHDAY -> BuilderParam(this, emptyList()) - RecurParamType.BYHOUR -> BuilderParam(this, emptyList()) - RecurParamType.BYMINUTE -> BuilderParam(this, emptyList()) - RecurParamType.BYYEARDAY -> BuilderParam(this, emptyList()) - RecurParamType.BYWEEKNO -> BuilderParam(this, emptyList()) - RecurParamType.BYSETPOS -> BuilderParam(this, emptyList()) - RecurParamType.WEEKSTART -> BuilderParam(this, DayValue(Day.MO)) - } -} - -data class EventData( - val startDateTime: LocalDateTime, - val recurObject: String -) diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/RecurFragment.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/RecurFragment.kt deleted file mode 100644 index 6399a31d8..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/RecurFragment.kt +++ /dev/null @@ -1,685 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments.recur - -import android.os.Bundle -import android.text.TextUtils -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Button -import androidx.appcompat.app.AlertDialog -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.LinearLayoutManager -import com.elementary.tasks.R -import com.elementary.tasks.core.utils.params.ReminderExplanationVisibility -import com.elementary.tasks.core.utils.ui.onTextChanged -import com.elementary.tasks.core.utils.ui.trimmedText -import com.elementary.tasks.core.views.ActionView -import com.elementary.tasks.core.views.ClosableLegacyBuilderRemovalWarningView -import com.elementary.tasks.core.views.DateTimeView -import com.elementary.tasks.core.views.common.ValueSliderView -import com.elementary.tasks.databinding.DialogRecurDayAdvancedBinding -import com.elementary.tasks.databinding.DialogRecurDayBinding -import com.elementary.tasks.databinding.DialogRecurIntListBinding -import com.elementary.tasks.databinding.DialogRecurSingleIntBinding -import com.elementary.tasks.databinding.FragmentReminderRecurBinding -import com.elementary.tasks.reminder.create.fragments.RepeatableTypeFragment -import com.elementary.tasks.reminder.create.fragments.recur.adapter.ParamBuilderAdapter -import com.elementary.tasks.reminder.create.fragments.recur.intdialog.IntListAdapter -import com.elementary.tasks.reminder.create.fragments.recur.preset.PresetPicker -import com.elementary.tasks.reminder.create.fragments.recur.preview.PreviewDataAdapter -import com.github.naz013.analytics.AnalyticsEventSender -import com.github.naz013.analytics.Feature -import com.github.naz013.analytics.FeatureUsedEvent -import com.github.naz013.domain.Reminder -import com.github.naz013.feature.common.livedata.nonNullObserve -import com.github.naz013.icalendar.Day -import com.github.naz013.icalendar.DayValue -import com.github.naz013.icalendar.FreqType -import com.github.naz013.icalendar.RecurParamType -import com.github.naz013.icalendar.UtcDateTime -import com.github.naz013.logging.Logger -import com.github.naz013.ui.common.fragment.startActivity -import com.github.naz013.ui.common.view.gone -import com.github.naz013.ui.common.view.isVisible -import com.github.naz013.ui.common.view.visible -import com.github.naz013.ui.common.view.visibleGone -import com.google.android.material.tabs.TabLayout -import org.koin.android.ext.android.inject -import org.koin.androidx.viewmodel.ext.android.viewModel -import org.threeten.bp.LocalDateTime - -class RecurFragment : RepeatableTypeFragment() { - - private val viewModel by viewModel() - private val analyticsEventSender by inject() - - private lateinit var presetPicker: PresetPicker - - private val previewAdapter = PreviewDataAdapter() - private val builderAdapter = ParamBuilderAdapter( - onItemClickListener = object : ParamBuilderAdapter.OnItemClickListener { - override fun onItemClicked(position: Int, param: UiBuilderParam<*>) { - showParamEditorDialog(param) - } - }, - onItemRemoveListener = object : ParamBuilderAdapter.OnItemRemoveListener { - override fun onItemRemoved(position: Int, param: UiBuilderParam<*>) { - viewModel.unSelectParam(param.param) - } - } - ) - - override fun getExplanationVisibilityType(): ReminderExplanationVisibility.Type { - return ReminderExplanationVisibility.Type.BY_RECUR - } - - override fun getExplanationView(): View { - return binding.explanationView - } - - override fun setCloseListenerToExplanationView(listener: View.OnClickListener) { - binding.explanationView.setOnClickListener(listener) - } - - override fun prepare(): Reminder? { - val reminder = iFace.state.reminder - var type = Reminder.BY_RECUR - val isAction = binding.actionView.hasAction() - if (TextUtils.isEmpty(reminder.summary) && !isAction) { - binding.taskLayout.error = getString(R.string.task_summary_is_empty) - binding.taskLayout.isErrorEnabled = true - return null - } - var number = "" - if (isAction) { - number = binding.actionView.number - if (TextUtils.isEmpty(number)) { - iFace.showSnackbar(getString(R.string.you_dont_insert_number)) - binding.tabs.selectTab(binding.tabs.getTabAt(2), true) - return null - } - type = if (binding.actionView.actionState == ActionView.ActionState.CALL) { - Reminder.BY_RECUR_CALL - } else { - Reminder.BY_RECUR_SMS - } - } - - reminder.weekdays = listOf() - reminder.target = number - reminder.type = type - reminder.after = 0L - reminder.delay = 0 - reminder.eventCount = 0 - reminder.repeatInterval = 0 - - val eventData = viewModel.getEventData() - if (eventData == null) { - iFace.showSnackbar( - getString(R.string.recur_wrong_parameters_message) - ) - binding.tabs.selectTab(binding.tabs.getTabAt(0), true) - return null - } - - val startTime = eventData.startDateTime - Logger.d("EVENT_TIME ${dateTimeManager.logDateTime(startTime)}") - - reminder.recurDataObject = eventData.recurObject - reminder.eventTime = dateTimeManager.getGmtFromDateTime(startTime) - reminder.startTime = dateTimeManager.getGmtFromDateTime(startTime) - - if (binding.savePresetCheck.isChecked) { - viewModel.addPreset( - recurObject = eventData.recurObject, - name = binding.presetNameInput.trimmedText() - ) - } - - analyticsEventSender.send(FeatureUsedEvent(Feature.RECUR_EVENT_CREATED)) - - return reminder - } - - override fun inflate( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentReminderRecurBinding.inflate(inflater, container, false) - - override fun getDynamicViews(): List { - return listOfNotNull( - binding.ledView, - binding.exportToCalendar, - binding.exportToTasks, - binding.tuneExtraView, - binding.attachmentView, - binding.groupView, - binding.taskSummary, - binding.beforeView, - binding.priorityView, - binding.actionView, - binding.dateView - ) - } - - override fun getLegacyMessageView(): ClosableLegacyBuilderRemovalWarningView { - return binding.legacyBuilderWarningView - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - presetPicker = PresetPicker(this) { - viewModel.onPresetSelected(it) - } - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - binding.tuneExtraView.hasAutoExtra = false - - binding.dateView.addOnDateChangeListener( - object : DateTimeView.OnDateChangeListener { - override fun onChanged(dateTime: LocalDateTime) { - viewModel.onDateTimeChanged(dateTime) - } - } - ) - viewModel.onDateTimeChanged(binding.dateView.selectedDateTime) - - binding.tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { - override fun onTabSelected(tab: TabLayout.Tab?) { - hideTabViews() - when (tab?.position) { - 0 -> { - binding.buildContentView.visible() - } - - 1 -> { - binding.previewContentView.visible() - } - - 2 -> { - binding.customizeContentView.visible() - } - } - } - - override fun onTabReselected(tab: TabLayout.Tab?) {} - override fun onTabUnselected(tab: TabLayout.Tab?) {} - - private fun hideTabViews() { - if (binding.buildContentView.isVisible()) { - binding.buildContentView.gone() - } - if (binding.previewContentView.isVisible()) { - binding.previewContentView.gone() - } - if (binding.customizeContentView.isVisible()) { - binding.customizeContentView.gone() - } - } - }) - - binding.ruleList.layoutManager = LinearLayoutManager(context) - binding.ruleList.adapter = builderAdapter - - binding.addParamButton.setOnClickListener { showParamSelectorDialog() } - binding.presetsButton.setOnClickListener { presetPicker.pickPreset() } - binding.helpButton.setOnClickListener { - startActivity(RecurHelpActivity::class.java) - } - binding.savePresetCheck.setOnCheckedChangeListener { buttonView, isChecked -> - binding.presetNameLayout.visibleGone(isChecked) - } - - binding.previewList.layoutManager = LinearLayoutManager(context) - binding.previewList.adapter = previewAdapter - binding.previewErrorTooltip.setOnClickListener { - binding.previewErrorTooltip.gone() - } - - viewModel.usedParams.observe(viewLifecycleOwner) { - builderAdapter.submitList(it) - } - viewModel.previewData.observe(viewLifecycleOwner) { - previewAdapter.submitList(it.items) - if (it.scrollTo >= 0) { - binding.previewList.smoothScrollToPosition(it.scrollTo) - } - } - viewModel.dateTime.nonNullObserve(viewLifecycleOwner) { - binding.dateView.selectedDateTime = it - } - viewModel.availableParams.observe(viewLifecycleOwner) { } - viewModel.supportedFreq.observe(viewLifecycleOwner) { } - viewModel.supportedDays.observe(viewLifecycleOwner) { } - viewModel.previewError.observe(viewLifecycleOwner) { error -> - binding.previewErrorTooltip.visibleGone(error != null) - error?.also { binding.previewErrorTooltip.setText(it) } - } - - editReminder() - } - - private fun showParamSelectorDialog() { - val availableParams = viewModel.availableParams.value ?: emptyList() - - val items = availableParams.map { it.text }.toTypedArray() - - dialogues.getNullableDialog(context) - ?.setTitle(getString(R.string.recur_add_parameter)) - ?.setItems(items) { dialog, which -> - dialog.dismiss() - showParamEditorDialog(availableParams[which]) - } - ?.create() - ?.show() - } - - @Suppress("UNCHECKED_CAST") - private fun showParamEditorDialog(param: UiBuilderParam<*>) { - when (param.param.recurParamType) { - RecurParamType.COUNT -> showSingleIntPickerDialog( - builderParam = param as UiBuilderParam, - title = getString(R.string.recur_count), - minValue = 0, - maxValue = 500 - ) - - RecurParamType.INTERVAL -> showSingleIntPickerDialog( - builderParam = param as UiBuilderParam, - title = getString(R.string.recur_interval), - minValue = 0, - maxValue = 366 - ) - - RecurParamType.UNTIL -> showDatePickerDialog(param as UiBuilderParam) - RecurParamType.FREQ -> showFreqPickerDialog(param as UiBuilderParam) - RecurParamType.BYDAY -> showDaysPickerDialog(param as UiBuilderParam>) - RecurParamType.WEEKSTART -> showDayPickerDialog(param as UiBuilderParam) - RecurParamType.BYMONTH -> showIntListPickerDialog( - builderParam = param as UiBuilderParam>, - title = getString(R.string.recur_month_s), - minValue = 1, - maxValue = 12 - ) - - RecurParamType.BYMINUTE -> showIntListPickerDialog( - builderParam = param as UiBuilderParam>, - title = getString(R.string.recur_minute_s), - minValue = 0, - maxValue = 59 - ) - - RecurParamType.BYHOUR -> showIntListPickerDialog( - builderParam = param as UiBuilderParam>, - title = getString(R.string.recur_hour_s), - minValue = 0, - maxValue = 23 - ) - - RecurParamType.BYMONTHDAY -> showIntListPickerDialog( - builderParam = param as UiBuilderParam>, - title = getString(R.string.recur_day_s_of_month), - minValue = -31, - maxValue = 31, - excludedValues = intArrayOf(0) - ) - - RecurParamType.BYWEEKNO -> showIntListPickerDialog( - builderParam = param as UiBuilderParam>, - title = getString(R.string.recur_week_number_s), - minValue = -53, - maxValue = 53, - excludedValues = intArrayOf(0) - ) - - RecurParamType.BYYEARDAY -> showIntListPickerDialog( - builderParam = param as UiBuilderParam>, - title = getString(R.string.recur_day_s_of_year), - minValue = -366, - maxValue = 366, - excludedValues = intArrayOf(0) - ) - - RecurParamType.BYSETPOS -> showIntListPickerDialog( - builderParam = param as UiBuilderParam>, - title = getString(R.string.recur_set_pos), - minValue = -366, - maxValue = 366, - excludedValues = intArrayOf(0) - ) - } - } - - private fun showIntListPickerDialog( - builderParam: UiBuilderParam>, - title: String, - minValue: Int, - maxValue: Int, - vararg excludedValues: Int - ) { - val numbers = viewModel.generateNumbers( - minValue = minValue, - maxValue = maxValue, - excludedValues = excludedValues, - selectedValues = builderParam.param.value - ) - - val adapter = IntListAdapter(numbers) - val view = DialogRecurIntListBinding.inflate(layoutInflater) - view.intList.layoutManager = GridLayoutManager(requireContext(), 6) - view.intList.adapter = adapter - - view.clearSelectionButton.setOnClickListener { adapter.clearSelection() } - view.selectAllButton.setOnClickListener { adapter.selectAll() } - - dialogues.getMaterialDialog(requireContext()) - .setView(view.root) - .setTitle(title) - .setPositiveButton(getString(R.string.recur_save)) { dialog, _ -> - dialog.dismiss() - val ints = adapter.getSelected().map { it.value } - viewModel.selectOrUpdateParam(builderParam.param.copy(value = ints)) - } - .setNegativeButton(getString(R.string.cancel)) { dialog, _ -> - dialog.dismiss() - } - .create() - .show() - } - - private fun showDaysPickerDialog(builderParam: UiBuilderParam>) { - if (viewModel.showAdvancedDayDialog() || builderParam.param.value.any { it.hasPrefix }) { - showAdvancedDaysPickerDialog(builderParam) - } else { - showSimplifiedDaysPickerDialog(builderParam) - } - } - - private fun showSimplifiedDaysPickerDialog(builderParam: UiBuilderParam>) { - val view = DialogRecurDayBinding.inflate(layoutInflater) - - builderParam.param.value.map { it.value }.forEach { - when { - it.contains(Day.MO.value) -> { - view.mondayCheck.isChecked = true - } - - it.contains(Day.TU.value) -> { - view.tuesdayCheck.isChecked = true - } - - it.contains(Day.WE.value) -> { - view.wednesdayCheck.isChecked = true - } - - it.contains(Day.TH.value) -> { - view.thursdayCheck.isChecked = true - } - - it.contains(Day.FR.value) -> { - view.fridayCheck.isChecked = true - } - - it.contains(Day.SA.value) -> { - view.saturdayCheck.isChecked = true - } - - it.contains(Day.SU.value) -> { - view.sundayCheck.isChecked = true - } - } - } - - dialogues.getMaterialDialog(requireContext()) - .setView(view.root) - .setTitle(getString(R.string.recur_day_s)) - .setPositiveButton(getString(R.string.recur_save)) { dialog, _ -> - dialog.dismiss() - viewModel.selectOrUpdateParam( - builderParam.param.copy( - value = dayValues(view) - ) - ) - } - .setNegativeButton(getString(R.string.cancel)) { dialog, _ -> - dialog.dismiss() - } - .setNeutralButton(getString(R.string.recur_advanced)) { dialog, _ -> - dialog.dismiss() - viewModel.setShowAdvancedDayDialog(true) - val copyParam = builderParam.copy( - param = builderParam.param.copy( - value = dayValues(view) - ) - ) - showAdvancedDaysPickerDialog(copyParam) - } - .create() - .show() - } - - private fun dayValues(view: DialogRecurDayBinding): MutableList { - val days = mutableListOf() - - if (view.mondayCheck.isChecked) { - days.add(DayValue(Day.MO)) - } - if (view.tuesdayCheck.isChecked) { - days.add(DayValue(Day.TU)) - } - if (view.wednesdayCheck.isChecked) { - days.add(DayValue(Day.WE)) - } - if (view.thursdayCheck.isChecked) { - days.add(DayValue(Day.TH)) - } - if (view.fridayCheck.isChecked) { - days.add(DayValue(Day.FR)) - } - if (view.saturdayCheck.isChecked) { - days.add(DayValue(Day.SA)) - } - if (view.sundayCheck.isChecked) { - days.add(DayValue(Day.SU)) - } - return days - } - - private fun showAdvancedDaysPickerDialog(builderParam: UiBuilderParam>) { - val view = DialogRecurDayAdvancedBinding.inflate(layoutInflater) - - val initValue = builderParam.param.value.joinToString(",") { it.buildString() } - view.daysInput.setText(initValue) - - val validator = ByDayValidator() - - val dialog = dialogues.getMaterialDialog(requireContext()) - .setView(view.root) - .setTitle(getString(R.string.recur_day_s)) - .setPositiveButton(getString(R.string.recur_save)) { dialog, _ -> - dialog.dismiss() - viewModel.selectOrUpdateParam( - builderParam.param.copy( - value = validator.getValues() - ) - ) - } - .setNegativeButton(getString(R.string.cancel)) { dialog, _ -> - dialog.dismiss() - } - .setNeutralButton(getString(R.string.recur_simplified)) { dialog, _ -> - dialog.dismiss() - viewModel.setShowAdvancedDayDialog(false) - val copyParam = builderParam.copy( - param = builderParam.param.copy( - value = validator.getValues() - ) - ) - showSimplifiedDaysPickerDialog(copyParam) - } - .create() - dialog.show() - - val buttonPositive: Button? = dialog.getButton(AlertDialog.BUTTON_POSITIVE) - val buttonNeutral: Button? = dialog.getButton(AlertDialog.BUTTON_NEUTRAL) - - validator.setListener { - if (!it) { - view.daysLayout.error = getString(R.string.recur_by_day_wrong_format) - } else { - view.daysLayout.error = null - } - view.daysLayout.isErrorEnabled = !it - - buttonPositive?.isEnabled = it - buttonNeutral?.isEnabled = it - } - validator.onTextChanged(initValue) - - view.daysInput.onTextChanged { validator.onTextChanged(it?.uppercase() ?: "") } - } - - private fun showDayPickerDialog(builderParam: UiBuilderParam) { - val availableParams = viewModel.supportedDays.value ?: emptyList() - - val items = availableParams.map { it.text }.toTypedArray() - - var index = availableParams.indexOfFirst { it.dayValue == builderParam.param.value } - if (index == -1) { - index = 0 - } - - dialogues.getMaterialDialog(requireContext()) - .setTitle(getString(R.string.recur_week_start)) - .setSingleChoiceItems(items, index) { _, which -> - index = which - } - .setPositiveButton(getString(R.string.recur_save)) { dialog, _ -> - dialog.dismiss() - val newParam = builderParam.param.copy( - value = availableParams[index].dayValue - ) - viewModel.selectOrUpdateParam(newParam) - } - .setNegativeButton(getString(R.string.cancel)) { dialog, _ -> - dialog.dismiss() - } - .create() - .show() - } - - private fun showFreqPickerDialog(builderParam: UiBuilderParam) { - val availableParams = viewModel.supportedFreq.value ?: emptyList() - - val items = availableParams.map { it.text }.toTypedArray() - - var index = availableParams.indexOfFirst { it.freqType == builderParam.param.value } - if (index == -1) { - index = 0 - } - - dialogues.getMaterialDialog(requireContext()) - .setTitle(getString(R.string.recur_frequency)) - .setSingleChoiceItems(items, index) { _, which -> - index = which - } - .setPositiveButton(getString(R.string.recur_save)) { dialog, _ -> - dialog.dismiss() - val newParam = builderParam.param.copy( - value = availableParams[index].freqType - ) - viewModel.selectOrUpdateParam(newParam) - } - .setNegativeButton(getString(R.string.cancel)) { dialog, _ -> - dialog.dismiss() - } - .create() - .show() - } - - private fun showDatePickerDialog(builderParam: UiBuilderParam) { - builderParam.param.value.dateTime?.also { localDateTime -> - dateTimePickerProvider.showDatePicker(requireContext(), localDateTime.toLocalDate()) { - val newDateTime = LocalDateTime.of(it, localDateTime.toLocalTime()) - showTimePickerDialog( - builderParam.copy( - param = builderParam.param.copy( - value = UtcDateTime(newDateTime) - ) - ) - ) - } - } - } - - private fun showTimePickerDialog(builderParam: UiBuilderParam) { - builderParam.param.value.dateTime?.also { localDateTime -> - dateTimePickerProvider.showTimePicker( - fragmentManager = childFragmentManager, - time = localDateTime.toLocalTime(), - title = builderParam.text - ) { - val newDateTime = LocalDateTime.of(localDateTime.toLocalDate(), it) - viewModel.selectOrUpdateParam( - builderParam.param.copy( - value = UtcDateTime(newDateTime) - ) - ) - } - } - } - - private fun showSingleIntPickerDialog( - builderParam: UiBuilderParam, - title: String, - minValue: Int, - maxValue: Int - ) { - val view = DialogRecurSingleIntBinding.inflate(layoutInflater) - view.intValuePicker.valueFormatter = object : ValueSliderView.ValueFormatter { - override fun apply(value: Float): String { - return value.toInt().toString() - } - } - view.intValuePicker.setRange(minValue.toFloat(), maxValue.toFloat(), 1f) - view.intValuePicker.value = builderParam.param.value.toFloat() - - dialogues.getMaterialDialog(requireContext()) - .setView(view.root) - .setTitle(title) - .setPositiveButton(getString(R.string.recur_save)) { dialog, _ -> - dialog.dismiss() - val newParam = builderParam.param.copy( - value = view.intValuePicker.value.toInt() - ) - viewModel.selectOrUpdateParam(newParam) - } - .setNegativeButton(getString(R.string.cancel)) { dialog, _ -> - dialog.dismiss() - } - .create() - .show() - } - - override fun updateActions() { - if (!isAdded) return - if (binding.actionView.hasAction()) { - if (binding.actionView.actionState == ActionView.ActionState.SMS) { - binding.tuneExtraView.hasAutoExtra = false - } else { - binding.tuneExtraView.hasAutoExtra = true - binding.tuneExtraView.hint = getString(R.string.enable_making_phone_calls_automatically) - } - } else { - binding.tuneExtraView.hasAutoExtra = false - } - } - - private fun editReminder() { - val reminder = iFace.state.reminder - viewModel.onEdit(reminder) - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/adapter/BuilderParamDiffCallback.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/adapter/BuilderParamDiffCallback.kt deleted file mode 100644 index a79889f07..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/adapter/BuilderParamDiffCallback.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments.recur.adapter - -import androidx.recyclerview.widget.DiffUtil -import com.elementary.tasks.reminder.create.fragments.recur.UiBuilderParam -import java.util.Objects - -class BuilderParamDiffCallback : DiffUtil.ItemCallback>() { - - override fun areItemsTheSame(oldItem: UiBuilderParam<*>, newItem: UiBuilderParam<*>): Boolean { - return oldItem.param.recurParamType == newItem.param.recurParamType - } - - override fun areContentsTheSame(oldItem: UiBuilderParam<*>, newItem: UiBuilderParam<*>): Boolean { - return Objects.equals(oldItem.param.value, newItem.param.value) - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/adapter/ParamBuilderAdapter.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/adapter/ParamBuilderAdapter.kt deleted file mode 100644 index 2517aaf3a..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/adapter/ParamBuilderAdapter.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments.recur.adapter - -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.recyclerview.widget.ListAdapter -import androidx.recyclerview.widget.RecyclerView -import com.elementary.tasks.databinding.ListItemRecurBuilderBinding -import com.elementary.tasks.reminder.create.fragments.recur.UiBuilderParam - -class ParamBuilderAdapter( - private val onItemClickListener: OnItemClickListener, - private val onItemRemoveListener: OnItemRemoveListener -) : ListAdapter, ParamBuilderAdapter.ViewHolder>(BuilderParamDiffCallback()) { - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bind(getItem(position)) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder( - parent = parent, - clickListener = { onItemClickListener.onItemClicked(it, getItem(it)) }, - removeListener = { onItemRemoveListener.onItemRemoved(it, getItem(it)) } - ) - } - - class ViewHolder( - parent: ViewGroup, - clickListener: (Int) -> Unit, - removeListener: (Int) -> Unit, - private val binding: ListItemRecurBuilderBinding = ListItemRecurBuilderBinding.inflate( - /* inflater = */ LayoutInflater.from(parent.context), - /* parent = */ parent, - /* attachToParent = */ false - ) - ) : RecyclerView.ViewHolder(binding.root) { - - init { - binding.clickView.setOnClickListener { clickListener(bindingAdapterPosition) } - binding.removeButton.setOnClickListener { removeListener(bindingAdapterPosition) } - } - - fun bind(param: UiBuilderParam<*>) { - binding.nameView.text = param.text - } - } - - interface OnItemClickListener { - fun onItemClicked(position: Int, param: UiBuilderParam<*>) - } - - interface OnItemRemoveListener { - fun onItemRemoved(position: Int, param: UiBuilderParam<*>) - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/intdialog/IntListAdapter.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/intdialog/IntListAdapter.kt deleted file mode 100644 index df1ab3926..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/intdialog/IntListAdapter.kt +++ /dev/null @@ -1,87 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments.recur.intdialog - -import android.annotation.SuppressLint -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView -import com.elementary.tasks.R -import com.elementary.tasks.databinding.ListItemRecurIntDialogBinding -import com.elementary.tasks.reminder.create.fragments.recur.UiBuilderParam - -class IntListAdapter( - private val items: List -) : RecyclerView.Adapter() { - - fun getSelected(): List { - return items.filter { it.isSelected } - } - - @SuppressLint("NotifyDataSetChanged") - fun clearSelection() { - items.forEach { - it.isSelected = false - } - notifyDataSetChanged() - } - - @SuppressLint("NotifyDataSetChanged") - fun selectAll() { - items.forEach { - it.isSelected = true - } - notifyDataSetChanged() - } - - override fun getItemCount(): Int { - return items.size - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bind(items[position]) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder( - parent = parent, - clickListener = { onItemClicked(it) } - ) - } - - private fun onItemClicked(position: Int) { - val item = items[position] - item.isSelected = !item.isSelected - notifyItemChanged(position) - } - - class ViewHolder( - parent: ViewGroup, - clickListener: (Int) -> Unit, - private val binding: ListItemRecurIntDialogBinding = ListItemRecurIntDialogBinding.inflate( - /* inflater = */ LayoutInflater.from(parent.context), - /* parent = */ parent, - /* attachToParent = */ false - ) - ) : RecyclerView.ViewHolder(binding.root) { - - init { - binding.textView.setOnClickListener { clickListener(bindingAdapterPosition) } - } - - fun bind(number: Number) { - binding.textView.text = number.value.toString() - if (number.isSelected) { - binding.textView.setBackgroundResource(R.drawable.drawable_tertiary) - } else { - binding.textView.background = null - } - } - } - - interface OnItemClickListener { - fun onItemClicked(position: Int, param: UiBuilderParam<*>) - } - - interface OnItemRemoveListener { - fun onItemRemoved(position: Int, param: UiBuilderParam<*>) - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/intdialog/Number.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/intdialog/Number.kt deleted file mode 100644 index 4b2d824e6..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/intdialog/Number.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments.recur.intdialog - -data class Number( - val value: Int -) { - var isSelected = false -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preset/PresetSelectionActivity.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preset/PresetSelectionActivity.kt deleted file mode 100644 index f10561991..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preset/PresetSelectionActivity.kt +++ /dev/null @@ -1,107 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments.recur.preset - -import android.app.Activity -import android.content.Intent -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.result.ActivityResult -import androidx.activity.result.contract.ActivityResultContracts -import androidx.fragment.app.Fragment -import androidx.recyclerview.widget.LinearLayoutManager -import com.elementary.tasks.R -import com.github.naz013.ui.common.activity.BindingActivity -import com.elementary.tasks.core.data.ui.preset.UiPresetList -import com.github.naz013.ui.common.context.buildIntent -import com.github.naz013.common.intent.ActivityLauncherCreator -import com.github.naz013.common.intent.FragmentLauncherCreator -import com.github.naz013.common.intent.IntentPicker -import com.github.naz013.common.intent.LauncherCreator -import com.github.naz013.common.intent.IntentKeys -import com.github.naz013.feature.common.livedata.nonNullObserve -import com.github.naz013.ui.common.view.visibleGone -import com.elementary.tasks.databinding.ActivityRecurPresetListBinding -import org.koin.androidx.viewmodel.ext.android.viewModel - -@Deprecated("Use new builder screen") -class PresetSelectionActivity : BindingActivity() { - - private val viewModel by viewModel() - private val presetAdapter = PresetAdapter( - onItemClickListener = { onPresetSelected(it) }, - onItemDeleteListener = { viewModel.deletePreset(it.id) } - ) - - override fun inflateBinding() = ActivityRecurPresetListBinding.inflate(layoutInflater) - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - initActionBar() - - binding.presetListView.layoutManager = LinearLayoutManager(this) - binding.presetListView.adapter = presetAdapter - - lifecycle.addObserver(viewModel) - viewModel.presets.nonNullObserve(this) { - presetAdapter.submitList(it) - updateListView(it.isEmpty()) - } - } - - private fun updateListView(isEmpty: Boolean) { - binding.emptyView.visibleGone(isEmpty) - binding.presetListView.visibleGone(!isEmpty) - } - - private fun onPresetSelected(item: UiPresetList) { - setResult( - RESULT_OK, - Intent().apply { - putExtra(IntentKeys.INTENT_ID, item.id) - } - ) - finish() - } - - private fun initActionBar() { - binding.toolbar.setNavigationOnClickListener { - setResult(RESULT_CANCELED) - finish() - } - binding.toolbar.title = getString(R.string.recur_presets) - } -} - -@Deprecated("Use new builder screen") -class PresetPicker private constructor( - launcherCreator: LauncherCreator, - private val resultCallback: (String) -> Unit -) : IntentPicker( - ActivityResultContracts.StartActivityForResult(), - launcherCreator -) { - - constructor( - activity: ComponentActivity, - resultCallback: (String) -> Unit - ) : this(ActivityLauncherCreator(activity), resultCallback) - - constructor( - fragment: Fragment, - resultCallback: (String) -> Unit - ) : this(FragmentLauncherCreator(fragment), resultCallback) - - fun pickPreset() { - launch(getIntent()) - } - - override fun dispatchResult(result: ActivityResult) { - if (result.resultCode == Activity.RESULT_OK) { - val appPackage = result.data?.getStringExtra(IntentKeys.INTENT_ID) ?: "" - resultCallback.invoke(appPackage) - } - } - - private fun getIntent(): Intent { - return getActivity().buildIntent(PresetSelectionActivity::class.java) - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preset/PresetViewModel.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preset/PresetViewModel.kt deleted file mode 100644 index 0eb8153ac..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preset/PresetViewModel.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments.recur.preset - -import androidx.lifecycle.viewModelScope -import com.elementary.tasks.core.arch.BaseProgressViewModel -import com.elementary.tasks.core.data.adapter.preset.UiPresetListAdapter -import com.elementary.tasks.core.data.ui.preset.UiPresetList -import com.github.naz013.feature.common.coroutine.DispatcherProvider -import com.github.naz013.feature.common.livedata.toLiveData -import com.github.naz013.feature.common.viewmodel.mutableLiveDataOf -import com.github.naz013.repository.RecurPresetRepository -import kotlinx.coroutines.launch - -@Deprecated("Use new builder screen") -class PresetViewModel( - dispatcherProvider: DispatcherProvider, - private val uiPresetListAdapter: UiPresetListAdapter, - private val recurPresetRepository: RecurPresetRepository -) : BaseProgressViewModel(dispatcherProvider) { - - private val _presets = mutableLiveDataOf>() - val presets = _presets.toLiveData() - - init { - viewModelScope.launch(dispatcherProvider.default()) { - loadPresets() - } - } - - fun deletePreset(id: String) { - viewModelScope.launch(dispatcherProvider.default()) { - recurPresetRepository.delete(id) - loadPresets() - } - } - - private suspend fun loadPresets() { - val presets = recurPresetRepository.getAll().map { uiPresetListAdapter.create(it) } - _presets.postValue(presets) - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preview/PreviewData.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preview/PreviewData.kt deleted file mode 100644 index 0333ded7d..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preview/PreviewData.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments.recur.preview - -data class PreviewData( - val scrollTo: Int, - val items: List -) - -data class PreviewItem( - val text: String, - val style: Style -) - -enum class Style { - DISABLED, - BOLD, - NORMAL -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preview/PreviewDataAdapter.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preview/PreviewDataAdapter.kt deleted file mode 100644 index fc74b9b0d..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preview/PreviewDataAdapter.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments.recur.preview - -import android.graphics.Typeface -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.recyclerview.widget.ListAdapter -import androidx.recyclerview.widget.RecyclerView -import com.elementary.tasks.databinding.ListItemRecurPreviewBinding - -class PreviewDataAdapter : ListAdapter( - PreviewItemDiffCallback() -) { - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bind(getItem(position)) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder(parent = parent) - } - - class ViewHolder( - parent: ViewGroup, - private val binding: ListItemRecurPreviewBinding = ListItemRecurPreviewBinding.inflate( - /* inflater = */ LayoutInflater.from(parent.context), - /* parent = */ parent, - /* attachToParent = */ false - ) - ) : RecyclerView.ViewHolder(binding.root) { - - fun bind(item: PreviewItem) { - binding.textView.text = item.text - when (item.style) { - Style.DISABLED -> { - binding.textView.setTypeface(binding.textView.typeface, Typeface.NORMAL) - binding.textView.isEnabled = false - } - Style.BOLD -> { - binding.textView.setTypeface(binding.textView.typeface, Typeface.BOLD) - binding.textView.isEnabled = true - } - Style.NORMAL -> { - binding.textView.setTypeface(binding.textView.typeface, Typeface.NORMAL) - binding.textView.isEnabled = true - } - } - } - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preview/PreviewItemDiffCallback.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preview/PreviewItemDiffCallback.kt deleted file mode 100644 index 28ebfbf2c..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/preview/PreviewItemDiffCallback.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments.recur.preview - -import androidx.recyclerview.widget.DiffUtil -import java.util.Objects - -class PreviewItemDiffCallback : DiffUtil.ItemCallback() { - - override fun areItemsTheSame(oldItem: PreviewItem, newItem: PreviewItem): Boolean { - return oldItem == newItem - } - - override fun areContentsTheSame(oldItem: PreviewItem, newItem: PreviewItem): Boolean { - return Objects.equals(oldItem, newItem) - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/timer/UiUsedTimeListDiffCallback.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/timer/UiUsedTimeListDiffCallback.kt deleted file mode 100644 index c36dc66df..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/timer/UiUsedTimeListDiffCallback.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments.timer - -import androidx.recyclerview.widget.DiffUtil -import com.elementary.tasks.core.data.ui.UiUsedTimeList - -class UiUsedTimeListDiffCallback : DiffUtil.ItemCallback() { - - override fun areContentsTheSame(oldItem: UiUsedTimeList, newItem: UiUsedTimeList): Boolean { - return oldItem == newItem - } - - override fun areItemsTheSame(oldItem: UiUsedTimeList, newItem: UiUsedTimeList): Boolean { - return oldItem.timeString == newItem.timeString - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/timer/UsedTimeViewModel.kt b/app/src/main/java/com/elementary/tasks/reminder/create/fragments/timer/UsedTimeViewModel.kt deleted file mode 100644 index df572f14c..000000000 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/timer/UsedTimeViewModel.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.elementary.tasks.reminder.create.fragments.timer - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.map -import androidx.lifecycle.viewModelScope -import com.elementary.tasks.core.data.adapter.UiUsedTimeListAdapter -import com.elementary.tasks.core.data.observeTable -import com.github.naz013.common.datetime.DateTimeManager -import com.github.naz013.domain.UsedTime -import com.github.naz013.feature.common.coroutine.DispatcherProvider -import com.github.naz013.repository.UsedTimeRepository -import com.github.naz013.repository.observer.TableChangeListenerFactory -import com.github.naz013.repository.table.Table -import kotlinx.coroutines.launch - -class UsedTimeViewModel( - private val dispatcherProvider: DispatcherProvider, - private val usedTimeRepository: UsedTimeRepository, - private val uiUsedTimeListAdapter: UiUsedTimeListAdapter, - tableChangeListenerFactory: TableChangeListenerFactory -) : ViewModel() { - - val usedTimeList = viewModelScope.observeTable( - table = Table.UsedTime, - tableChangeListenerFactory = tableChangeListenerFactory, - queryProducer = { usedTimeRepository.getFirst(limit = 5) } - ).map { list -> - list.map { uiUsedTimeListAdapter.convert(it) } - } - - fun saveTime(after: Long) { - viewModelScope.launch(dispatcherProvider.default()) { - var old = usedTimeRepository.getByTimeMills(after) - old = old?.copy( - useCount = old.useCount + 1 - ) ?: UsedTime(0, DateTimeManager.generateViewAfterString(after), after, 1) - usedTimeRepository.save(old) - } - } -} diff --git a/app/src/main/java/com/elementary/tasks/reminder/dialog/ReminderDialog29Activity.kt b/app/src/main/java/com/elementary/tasks/reminder/dialog/ReminderDialog29Activity.kt index e7764942d..e2863490a 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/dialog/ReminderDialog29Activity.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/dialog/ReminderDialog29Activity.kt @@ -26,25 +26,26 @@ import com.elementary.tasks.core.utils.BuildParams import com.elementary.tasks.core.utils.Notifier import com.elementary.tasks.core.utils.SuperUtil import com.elementary.tasks.core.utils.TelephonyUtil -import com.github.naz013.common.datetime.DateTimeManager import com.elementary.tasks.core.utils.io.BitmapUtils import com.elementary.tasks.core.utils.launchDefault import com.elementary.tasks.core.utils.params.Prefs -import com.github.naz013.ui.common.Dialogues import com.elementary.tasks.core.utils.withUIContext import com.elementary.tasks.databinding.ActivityDialogReminderBinding -import com.elementary.tasks.reminder.ReminderBuilderLauncher +import com.elementary.tasks.reminder.build.BuildReminderActivity import com.elementary.tasks.reminder.lists.adapter.ShopListRecyclerAdapter import com.github.naz013.common.Permissions import com.github.naz013.common.contacts.ContactsReader +import com.github.naz013.common.datetime.DateTimeManager import com.github.naz013.common.intent.IntentKeys import com.github.naz013.domain.Reminder import com.github.naz013.feature.common.livedata.nonNullObserve import com.github.naz013.logging.Logger +import com.github.naz013.ui.common.Dialogues import com.github.naz013.ui.common.activity.BindingActivity import com.github.naz013.ui.common.context.buildIntent import com.github.naz013.ui.common.context.colorOf import com.github.naz013.ui.common.context.startActivity +import com.github.naz013.ui.common.login.LoginApi import com.github.naz013.ui.common.theme.ThemeProvider import com.github.naz013.ui.common.view.gone import com.github.naz013.ui.common.view.transparent @@ -62,7 +63,6 @@ class ReminderDialog29Activity : BindingActivity( private val jobScheduler by inject() private val dateTimeManager by inject() private val contactsReader by inject() - private val reminderBuilderLauncher by inject() private val prefs by inject() private val dialogues by inject() private val notifier by inject() @@ -505,7 +505,7 @@ class ReminderDialog29Activity : BindingActivity( private fun editReminder() { discardNotification(id) doActions({ it.disable() }, { - reminderBuilderLauncher.openLogged(this) { + LoginApi.openLogged(this, BuildReminderActivity::class.java) { putExtra(IntentKeys.INTENT_ID, it.uuId) } finish() diff --git a/app/src/main/java/com/elementary/tasks/reminder/lists/ReminderActionResolver.kt b/app/src/main/java/com/elementary/tasks/reminder/lists/ReminderActionResolver.kt index 02909bc57..24009a9a7 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/lists/ReminderActionResolver.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/lists/ReminderActionResolver.kt @@ -4,18 +4,18 @@ import android.content.Context import android.view.View import com.elementary.tasks.R import com.elementary.tasks.core.os.PermissionFlow +import com.elementary.tasks.reminder.build.BuildReminderActivity +import com.elementary.tasks.reminder.lists.data.UiReminderListActions +import com.elementary.tasks.reminder.preview.ReminderPreviewActivity import com.github.naz013.common.Permissions -import com.github.naz013.ui.common.context.startActivity import com.github.naz013.common.intent.IntentKeys import com.github.naz013.ui.common.Dialogues -import com.elementary.tasks.reminder.ReminderBuilderLauncher -import com.elementary.tasks.reminder.lists.data.UiReminderListActions -import com.elementary.tasks.reminder.preview.ReminderPreviewActivity +import com.github.naz013.ui.common.context.startActivity +import com.github.naz013.ui.common.login.LoginApi class ReminderActionResolver( private val context: Context, private val dialogues: Dialogues, - private val reminderBuilderLauncher: ReminderBuilderLauncher, private val permissionFlow: PermissionFlow, private val deleteAction: (id: String) -> Unit, private val toggleAction: (id: String) -> Unit, @@ -122,7 +122,7 @@ class ReminderActionResolver( } private fun editReminder(id: String) { - reminderBuilderLauncher.openLogged(context) { + LoginApi.openLogged(context, BuildReminderActivity::class.java) { putExtra(IntentKeys.INTENT_ID, id) } } diff --git a/app/src/main/java/com/elementary/tasks/reminder/lists/active/RemindersFragment.kt b/app/src/main/java/com/elementary/tasks/reminder/lists/active/RemindersFragment.kt index 388446f00..d23100444 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/lists/active/RemindersFragment.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/lists/active/RemindersFragment.kt @@ -12,7 +12,7 @@ import com.elementary.tasks.core.views.recyclerview.SpaceBetweenItemDecoration import com.elementary.tasks.databinding.FragmentRemindersBinding import com.elementary.tasks.home.eventsview.BaseSubEventsFragment import com.elementary.tasks.home.eventsview.HomeEventsFragmentDirections -import com.elementary.tasks.reminder.ReminderBuilderLauncher +import com.elementary.tasks.reminder.build.BuildReminderActivity import com.elementary.tasks.reminder.lists.ReminderActionResolver import com.elementary.tasks.reminder.lists.RemindersAdapter import com.elementary.tasks.reminder.lists.data.UiReminderEventsList @@ -23,6 +23,7 @@ import com.github.naz013.feature.common.livedata.nonNullObserve import com.github.naz013.logging.Logger import com.github.naz013.ui.common.fragment.dp2px import com.github.naz013.ui.common.fragment.toast +import com.github.naz013.ui.common.login.LoginApi import com.github.naz013.ui.common.view.ViewUtils import com.github.naz013.ui.common.view.applyBottomInsets import com.github.naz013.ui.common.view.visibleGone @@ -32,14 +33,12 @@ import org.koin.androidx.viewmodel.ext.android.viewModel class RemindersFragment : BaseSubEventsFragment() { private val systemServiceProvider by inject() - private val reminderBuilderLauncher by inject() private val viewModel by viewModel() private val reminderResolver by lazy { ReminderActionResolver( context = requireContext(), dialogues = dialogues, - reminderBuilderLauncher = reminderBuilderLauncher, permissionFlow = permissionFlow, toggleAction = { viewModel.toggleReminder(it) }, deleteAction = { viewModel.moveToTrash(it) }, @@ -100,7 +99,7 @@ class RemindersFragment : BaseSubEventsFragment() { } binding.fab.setOnClickListener { - reminderBuilderLauncher.openLogged(requireContext()) { } + LoginApi.openLogged(requireContext(), BuildReminderActivity::class.java) } analyticsEventSender.send(ScreenUsedEvent(Screen.REMINDERS_LIST)) diff --git a/app/src/main/java/com/elementary/tasks/reminder/lists/removed/ArchiveFragment.kt b/app/src/main/java/com/elementary/tasks/reminder/lists/removed/ArchiveFragment.kt index 17739d8d1..6d979b899 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/lists/removed/ArchiveFragment.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/lists/removed/ArchiveFragment.kt @@ -12,7 +12,6 @@ import com.elementary.tasks.core.utils.ui.SearchMenuHandler import com.elementary.tasks.core.views.recyclerview.SpaceBetweenItemDecoration import com.elementary.tasks.databinding.FragmentTrashBinding import com.elementary.tasks.navigation.toolbarfragment.BaseToolbarFragment -import com.elementary.tasks.reminder.ReminderBuilderLauncher import com.elementary.tasks.reminder.lists.ReminderActionResolver import com.elementary.tasks.reminder.lists.RemindersAdapter import com.elementary.tasks.reminder.lists.data.UiReminderEventsList @@ -28,13 +27,11 @@ class ArchiveFragment : BaseToolbarFragment() { private val viewModel by viewModel() private val systemServiceProvider by inject() - private val reminderBuilderLauncher by inject() private val reminderResolver by lazy { ReminderActionResolver( context = requireContext(), dialogues = dialogues, - reminderBuilderLauncher = reminderBuilderLauncher, permissionFlow = permissionFlow, toggleAction = { }, deleteAction = { viewModel.deleteReminder(it) }, diff --git a/app/src/main/java/com/elementary/tasks/reminder/lists/todo/TodoRemindersFragment.kt b/app/src/main/java/com/elementary/tasks/reminder/lists/todo/TodoRemindersFragment.kt index 86cfa6db8..1c5df9851 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/lists/todo/TodoRemindersFragment.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/lists/todo/TodoRemindersFragment.kt @@ -12,7 +12,7 @@ import com.elementary.tasks.core.utils.ui.SearchMenuHandler import com.elementary.tasks.core.views.recyclerview.SpaceBetweenItemDecoration import com.elementary.tasks.databinding.FragmentRemindersBinding import com.elementary.tasks.home.eventsview.BaseSubEventsFragment -import com.elementary.tasks.reminder.ReminderBuilderLauncher +import com.elementary.tasks.reminder.build.BuildReminderActivity import com.elementary.tasks.reminder.lists.ReminderActionResolver import com.elementary.tasks.reminder.lists.RemindersAdapter import com.elementary.tasks.reminder.lists.data.UiReminderEventsList @@ -23,6 +23,7 @@ import com.github.naz013.feature.common.livedata.nonNullObserve import com.github.naz013.logging.Logger import com.github.naz013.ui.common.fragment.dp2px import com.github.naz013.ui.common.fragment.toast +import com.github.naz013.ui.common.login.LoginApi import com.github.naz013.ui.common.view.ViewUtils import com.github.naz013.ui.common.view.applyBottomInsets import com.github.naz013.ui.common.view.visibleGone @@ -33,7 +34,6 @@ class TodoRemindersFragment : BaseSubEventsFragment() private val systemServiceProvider by inject() private val viewModel by viewModel() - private val reminderBuilderLauncher by inject() private var mPosition: Int = 0 @@ -41,7 +41,6 @@ class TodoRemindersFragment : BaseSubEventsFragment() ReminderActionResolver( context = requireContext(), dialogues = dialogues, - reminderBuilderLauncher = reminderBuilderLauncher, permissionFlow = permissionFlow, toggleAction = { viewModel.toggleReminder(it) }, deleteAction = { viewModel.moveToTrash(it) }, @@ -84,7 +83,11 @@ class TodoRemindersFragment : BaseSubEventsFragment() } binding.fab.setOnClickListener { - reminderBuilderLauncher.openDeepLink(requireContext(), ReminderTodoTypeDeepLinkData) + LoginApi.openLogged( + requireContext(), + BuildReminderActivity::class.java, + ReminderTodoTypeDeepLinkData + ) } analyticsEventSender.send(ScreenUsedEvent(Screen.REMINDERS_LIST)) diff --git a/app/src/main/java/com/elementary/tasks/reminder/preview/ReminderPreviewActivity.kt b/app/src/main/java/com/elementary/tasks/reminder/preview/ReminderPreviewActivity.kt index 172b1ba6c..eca0aeb02 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/preview/ReminderPreviewActivity.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/preview/ReminderPreviewActivity.kt @@ -17,7 +17,7 @@ import com.elementary.tasks.databinding.ActivityReminderPreviewBinding import com.elementary.tasks.notes.preview.ImagePreviewActivity import com.elementary.tasks.notes.preview.ImagesSingleton import com.elementary.tasks.notes.preview.NotePreviewActivity -import com.elementary.tasks.reminder.ReminderBuilderLauncher +import com.elementary.tasks.reminder.build.BuildReminderActivity import com.elementary.tasks.reminder.preview.adapter.ReminderPreviewDataAdapter import com.github.naz013.common.datetime.DateTimeManager import com.github.naz013.common.intent.IntentKeys @@ -28,6 +28,7 @@ import com.github.naz013.ui.common.activity.BindingActivity import com.github.naz013.ui.common.activity.toast import com.github.naz013.ui.common.context.buildIntent import com.github.naz013.ui.common.context.startActivity +import com.github.naz013.ui.common.login.LoginApi import com.github.naz013.ui.common.view.applyBottomInsets import com.github.naz013.ui.common.view.applyTopInsets import org.koin.android.ext.android.inject @@ -40,7 +41,6 @@ class ReminderPreviewActivity : BindingActivity( private val viewModel by viewModel { parametersOf(getId()) } private val dateTimeManager by inject() private val imagesSingleton by inject() - private val reminderBuilderLauncher by inject() private val dialogues by inject() private val prefs by inject() @@ -132,7 +132,7 @@ class ReminderPreviewActivity : BindingActivity( } private fun editReminder() { - reminderBuilderLauncher.openLogged(this) { + LoginApi.openLogged(this, BuildReminderActivity::class.java) { putExtra(IntentKeys.INTENT_ID, getId()) } } diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/RecurHelpActivity.kt b/app/src/main/java/com/elementary/tasks/reminder/recur/RecurHelpActivity.kt similarity index 94% rename from app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/RecurHelpActivity.kt rename to app/src/main/java/com/elementary/tasks/reminder/recur/RecurHelpActivity.kt index 2488e6aea..261ec642c 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/create/fragments/recur/RecurHelpActivity.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/recur/RecurHelpActivity.kt @@ -1,4 +1,4 @@ -package com.elementary.tasks.reminder.create.fragments.recur +package com.elementary.tasks.reminder.recur import android.annotation.SuppressLint import android.os.Bundle diff --git a/app/src/main/java/com/elementary/tasks/settings/reminders/ManagePresetsFragment.kt b/app/src/main/java/com/elementary/tasks/settings/reminders/ManagePresetsFragment.kt index 7c6e28d51..3b38791ae 100644 --- a/app/src/main/java/com/elementary/tasks/settings/reminders/ManagePresetsFragment.kt +++ b/app/src/main/java/com/elementary/tasks/settings/reminders/ManagePresetsFragment.kt @@ -11,7 +11,7 @@ import com.github.naz013.ui.common.view.visibleGone import com.elementary.tasks.databinding.FragmentManagePresetsBinding import com.elementary.tasks.navigation.fragments.BaseSettingsFragment import com.elementary.tasks.reminder.build.preset.ManagePresetsViewModel -import com.elementary.tasks.reminder.create.fragments.recur.preset.PresetAdapter +import com.elementary.tasks.reminder.build.preset.PresetAdapter import org.koin.androidx.viewmodel.ext.android.viewModel class ManagePresetsFragment : BaseSettingsFragment() { diff --git a/app/src/main/java/com/elementary/tasks/settings/reminders/RemindersSettingsFragment.kt b/app/src/main/java/com/elementary/tasks/settings/reminders/RemindersSettingsFragment.kt index 2e16b2570..5bc4b8dc0 100644 --- a/app/src/main/java/com/elementary/tasks/settings/reminders/RemindersSettingsFragment.kt +++ b/app/src/main/java/com/elementary/tasks/settings/reminders/RemindersSettingsFragment.kt @@ -5,12 +5,10 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.elementary.tasks.R -import com.elementary.tasks.core.utils.BuildParams -import com.github.naz013.common.datetime.DateTimeManager import com.elementary.tasks.core.utils.ui.DateTimePickerProvider import com.elementary.tasks.databinding.FragmentSettingsRemindersBinding import com.elementary.tasks.navigation.fragments.BaseSettingsFragment -import com.github.naz013.ui.common.view.visibleGone +import com.github.naz013.common.datetime.DateTimeManager import org.koin.android.ext.android.inject import org.threeten.bp.LocalTime @@ -35,7 +33,6 @@ class RemindersSettingsFragment : BaseSettingsFragment - mItemSelect = which - } - builder.setPositiveButton(getString(R.string.ok)) { dialog, _ -> - prefs.useLegacyBuilder = mItemSelect == 1 - showBuilderType() - dialog.dismiss() - } - builder.setNegativeButton(R.string.cancel) { dialog, _ -> - dialog.dismiss() - } - builder.create().show() - } - } - - private fun builderTypeList(): Array { - return arrayOf( - getString(R.string.default_string), - getString(R.string.legacy) - ) - } - - private fun showBuilderType() { - val type = if (prefs.useLegacyBuilder) { - getString(R.string.legacy) - } else { - getString(R.string.default_string) - } - binding.defaultBuilderPrefs.setDetailText(type) - } - private fun initIgnorePrefs() { binding.doNotDisturbIgnorePrefs.setOnClickListener { showIgnoreDialog() } binding.doNotDisturbIgnorePrefs.setDependentView(binding.doNotDisturbPrefs) diff --git a/app/src/main/java/com/elementary/tasks/splash/SplashScreenActivity.kt b/app/src/main/java/com/elementary/tasks/splash/SplashScreenActivity.kt index 4439ce139..86ab4287c 100644 --- a/app/src/main/java/com/elementary/tasks/splash/SplashScreenActivity.kt +++ b/app/src/main/java/com/elementary/tasks/splash/SplashScreenActivity.kt @@ -11,7 +11,7 @@ import com.elementary.tasks.R import com.elementary.tasks.core.os.ContextSwitcher import com.elementary.tasks.home.BottomNavActivity import com.elementary.tasks.notes.create.CreateNoteActivity -import com.elementary.tasks.reminder.ReminderBuilderLauncher +import com.elementary.tasks.reminder.build.BuildReminderActivity import com.github.naz013.ui.common.activity.LightThemedActivity import com.github.naz013.ui.common.activity.finishWith import com.github.naz013.ui.common.login.LoginApi @@ -23,7 +23,6 @@ class SplashScreenActivity : LightThemedActivity() { private val viewModel by viewModel() private val contextSwitcher by inject() - private val reminderBuilderLauncher by inject() override fun onCreate(savedInstanceState: Bundle?) { // Handle the splash screen transition. @@ -57,7 +56,7 @@ class SplashScreenActivity : LightThemedActivity() { .setIntents( arrayOf( Intent(Intent.ACTION_MAIN).setClass(this, BottomNavActivity::class.java), - Intent(Intent.ACTION_VIEW).setClass(this, reminderBuilderLauncher.getActivityClass()) + Intent(Intent.ACTION_VIEW).setClass(this,BuildReminderActivity::class.java) ) ) .build() diff --git a/app/src/main/res/layout-sw600dp-land/fragment_reminder_application.xml b/app/src/main/res/layout-sw600dp-land/fragment_reminder_application.xml deleted file mode 100644 index 73966146a..000000000 --- a/app/src/main/res/layout-sw600dp-land/fragment_reminder_application.xml +++ /dev/null @@ -1,260 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp-land/fragment_reminder_date.xml b/app/src/main/res/layout-sw600dp-land/fragment_reminder_date.xml deleted file mode 100644 index b549ef466..000000000 --- a/app/src/main/res/layout-sw600dp-land/fragment_reminder_date.xml +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp-land/fragment_reminder_email.xml b/app/src/main/res/layout-sw600dp-land/fragment_reminder_email.xml deleted file mode 100644 index 7ae2d717d..000000000 --- a/app/src/main/res/layout-sw600dp-land/fragment_reminder_email.xml +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp-land/fragment_reminder_location.xml b/app/src/main/res/layout-sw600dp-land/fragment_reminder_location.xml deleted file mode 100644 index 0a86847ad..000000000 --- a/app/src/main/res/layout-sw600dp-land/fragment_reminder_location.xml +++ /dev/null @@ -1,260 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp-land/fragment_reminder_month.xml b/app/src/main/res/layout-sw600dp-land/fragment_reminder_month.xml deleted file mode 100644 index fe794b2b7..000000000 --- a/app/src/main/res/layout-sw600dp-land/fragment_reminder_month.xml +++ /dev/null @@ -1,309 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp-land/fragment_reminder_shop.xml b/app/src/main/res/layout-sw600dp-land/fragment_reminder_shop.xml deleted file mode 100644 index 22ed206d8..000000000 --- a/app/src/main/res/layout-sw600dp-land/fragment_reminder_shop.xml +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp-land/fragment_reminder_timer.xml b/app/src/main/res/layout-sw600dp-land/fragment_reminder_timer.xml deleted file mode 100644 index 75d20861f..000000000 --- a/app/src/main/res/layout-sw600dp-land/fragment_reminder_timer.xml +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp-land/fragment_reminder_weekdays.xml b/app/src/main/res/layout-sw600dp-land/fragment_reminder_weekdays.xml deleted file mode 100644 index a27e478ae..000000000 --- a/app/src/main/res/layout-sw600dp-land/fragment_reminder_weekdays.xml +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp-land/fragment_reminder_year.xml b/app/src/main/res/layout-sw600dp-land/fragment_reminder_year.xml deleted file mode 100644 index aaeab4c77..000000000 --- a/app/src/main/res/layout-sw600dp-land/fragment_reminder_year.xml +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp/fragment_reminder_application.xml b/app/src/main/res/layout-sw600dp/fragment_reminder_application.xml deleted file mode 100644 index 9d81a8f71..000000000 --- a/app/src/main/res/layout-sw600dp/fragment_reminder_application.xml +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp/fragment_reminder_date.xml b/app/src/main/res/layout-sw600dp/fragment_reminder_date.xml deleted file mode 100644 index e5c5f48af..000000000 --- a/app/src/main/res/layout-sw600dp/fragment_reminder_date.xml +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp/fragment_reminder_email.xml b/app/src/main/res/layout-sw600dp/fragment_reminder_email.xml deleted file mode 100644 index ba769e415..000000000 --- a/app/src/main/res/layout-sw600dp/fragment_reminder_email.xml +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp/fragment_reminder_location.xml b/app/src/main/res/layout-sw600dp/fragment_reminder_location.xml deleted file mode 100644 index eb2e33e0d..000000000 --- a/app/src/main/res/layout-sw600dp/fragment_reminder_location.xml +++ /dev/null @@ -1,258 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp/fragment_reminder_month.xml b/app/src/main/res/layout-sw600dp/fragment_reminder_month.xml deleted file mode 100644 index 2e1279a4e..000000000 --- a/app/src/main/res/layout-sw600dp/fragment_reminder_month.xml +++ /dev/null @@ -1,284 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp/fragment_reminder_shop.xml b/app/src/main/res/layout-sw600dp/fragment_reminder_shop.xml deleted file mode 100644 index 6ad69f827..000000000 --- a/app/src/main/res/layout-sw600dp/fragment_reminder_shop.xml +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp/fragment_reminder_timer.xml b/app/src/main/res/layout-sw600dp/fragment_reminder_timer.xml deleted file mode 100644 index 585780d1b..000000000 --- a/app/src/main/res/layout-sw600dp/fragment_reminder_timer.xml +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp/fragment_reminder_weekdays.xml b/app/src/main/res/layout-sw600dp/fragment_reminder_weekdays.xml deleted file mode 100644 index 76db5186d..000000000 --- a/app/src/main/res/layout-sw600dp/fragment_reminder_weekdays.xml +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw600dp/fragment_reminder_year.xml b/app/src/main/res/layout-sw600dp/fragment_reminder_year.xml deleted file mode 100644 index e6fd6cc17..000000000 --- a/app/src/main/res/layout-sw600dp/fragment_reminder_year.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/a_components.xml b/app/src/main/res/layout/a_components.xml index dc8fb3abd..3736e83cb 100644 --- a/app/src/main/res/layout/a_components.xml +++ b/app/src/main/res/layout/a_components.xml @@ -39,12 +39,6 @@ android:animateLayoutChanges="true" android:orientation="vertical"> - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_recur_preset_list.xml b/app/src/main/res/layout/activity_recur_preset_list.xml deleted file mode 100644 index f3830559e..000000000 --- a/app/src/main/res/layout/activity_recur_preset_list.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_bottom_color_slider.xml b/app/src/main/res/layout/dialog_bottom_color_slider.xml deleted file mode 100644 index 7b1b7b5f5..000000000 --- a/app/src/main/res/layout/dialog_bottom_color_slider.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_bottom_seek_and_title.xml b/app/src/main/res/layout/dialog_bottom_seek_and_title.xml deleted file mode 100644 index 447ba22d0..000000000 --- a/app/src/main/res/layout/dialog_bottom_seek_and_title.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_exclusion_picker.xml b/app/src/main/res/layout/dialog_exclusion_picker.xml deleted file mode 100644 index acb34b056..000000000 --- a/app/src/main/res/layout/dialog_exclusion_picker.xml +++ /dev/null @@ -1,377 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_recur_day.xml b/app/src/main/res/layout/dialog_recur_day.xml deleted file mode 100644 index 176f8b5f9..000000000 --- a/app/src/main/res/layout/dialog_recur_day.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_recur_day_advanced.xml b/app/src/main/res/layout/dialog_recur_day_advanced.xml deleted file mode 100644 index 3defbe994..000000000 --- a/app/src/main/res/layout/dialog_recur_day_advanced.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_recur_int_list.xml b/app/src/main/res/layout/dialog_recur_int_list.xml deleted file mode 100644 index 93f74e308..000000000 --- a/app/src/main/res/layout/dialog_recur_int_list.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_recur_single_int.xml b/app/src/main/res/layout/dialog_recur_single_int.xml deleted file mode 100644 index 321ab307f..000000000 --- a/app/src/main/res/layout/dialog_recur_single_int.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/dialog_select_extra.xml b/app/src/main/res/layout/dialog_select_extra.xml deleted file mode 100644 index 7542921a3..000000000 --- a/app/src/main/res/layout/dialog_select_extra.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_reminder_application.xml b/app/src/main/res/layout/fragment_reminder_application.xml deleted file mode 100644 index 7715f5462..000000000 --- a/app/src/main/res/layout/fragment_reminder_application.xml +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_reminder_date.xml b/app/src/main/res/layout/fragment_reminder_date.xml deleted file mode 100644 index c43d5b51b..000000000 --- a/app/src/main/res/layout/fragment_reminder_date.xml +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_reminder_email.xml b/app/src/main/res/layout/fragment_reminder_email.xml deleted file mode 100644 index 5a052d880..000000000 --- a/app/src/main/res/layout/fragment_reminder_email.xml +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_reminder_location.xml b/app/src/main/res/layout/fragment_reminder_location.xml deleted file mode 100644 index 2e3acb57d..000000000 --- a/app/src/main/res/layout/fragment_reminder_location.xml +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -