Implement Add existing habits to existing groups

pull/2020/head
Dharanish 1 year ago
parent 811b818590
commit e85f5822b6

@ -42,6 +42,14 @@
android:value=".activities.habits.list.ListHabitsActivity" />
</activity>
<activity
android:name=".activities.habits.list.HabitGroupPickerDialog"
android:exported="true">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activities.habits.list.ListHabitsActivity" />
</activity>
<activity
android:name=".activities.habits.edit.EditHabitGroupActivity"
android:exported="true">

@ -0,0 +1,91 @@
/*
* Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.activities.habits.list
import android.app.Activity
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.ListView
import android.widget.TextView
import org.isoron.uhabits.HabitsApplication
import org.isoron.uhabits.R
import org.isoron.uhabits.activities.AndroidThemeSwitcher
import org.isoron.uhabits.core.commands.AddToGroupCommand
import org.isoron.uhabits.core.models.Habit
import org.isoron.uhabits.core.models.HabitGroupList
import org.isoron.uhabits.core.models.HabitList
import org.isoron.uhabits.inject.HabitsApplicationComponent
class HabitGroupPickerDialog : Activity() {
private lateinit var habitGroupList: HabitGroupList
private lateinit var habitList: HabitList
private lateinit var selected: List<Habit>
private lateinit var component: HabitsApplicationComponent
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
component = (applicationContext as HabitsApplication).component
AndroidThemeSwitcher(this, component.preferences).apply()
habitList = component.habitList
habitGroupList = component.habitGroupList
val selectedIds = intent.getLongArrayExtra("selected")!!
selected = selectedIds.map { id ->
habitList.getById(id) ?: habitGroupList.getHabitByID(id)!!
}
val groupIds = ArrayList<Long>()
val groupNames = ArrayList<String>()
for (hgr in habitGroupList) {
if (hgr.isArchived) continue
groupIds.add(hgr.id!!)
groupNames.add(hgr.name)
}
if (groupNames.isEmpty()) {
setContentView(R.layout.widget_empty_activity)
findViewById<TextView>(R.id.message).setText(R.string.no_habit_groups)
return
}
setContentView(R.layout.widget_configure_activity)
val listView = findViewById<ListView>(R.id.listView)
with(listView) {
adapter = ArrayAdapter(
context,
android.R.layout.simple_list_item_1,
groupNames
)
setOnItemClickListener { parent, view, position, id ->
performTransfer(groupIds[position])
}
}
}
private fun performTransfer(toGroupId: Long) {
val hgr = habitGroupList.getById(toGroupId)!!
selected = selected.filter { it.groupId != hgr.id }
component.commandRunner.run(
AddToGroupCommand(habitList, hgr, selected)
)
finish()
}
}

@ -185,6 +185,11 @@ class ListHabitsScreen
activity.startActivity(intent)
}
override fun showHabitGroupPickerDialog(selected: List<Habit>) {
val intent = intentFactory.startHabitGroupPickerActivity(activity, selected)
activity.startActivity(intent)
}
override fun showFAQScreen() {
val intent = intentFactory.viewFAQ(activity)
activity.startActivity(intent)

@ -76,6 +76,7 @@ class ListHabitsSelectionMenu @Inject constructor(
val itemArchive = menu.findItem(R.id.action_archive_habit)
val itemUnarchive = menu.findItem(R.id.action_unarchive_habit)
val itemRemoveFromGroup = menu.findItem(R.id.action_remove_from_group)
val itemAddToGroup = menu.findItem(R.id.action_add_to_group)
val itemNotify = menu.findItem(R.id.action_notify)
itemColor.isVisible = true
@ -83,6 +84,7 @@ class ListHabitsSelectionMenu @Inject constructor(
itemArchive.isVisible = behavior.canArchive()
itemUnarchive.isVisible = behavior.canUnarchive()
itemRemoveFromGroup.isVisible = behavior.areSubHabits()
itemAddToGroup.isVisible = behavior.areHabits()
itemNotify.isVisible = prefs.isDeveloper
activeActionMode?.title = (listAdapter.selectedHabits.size + listAdapter.selectedHabitGroups.size).toString()
return true
@ -113,6 +115,11 @@ class ListHabitsSelectionMenu @Inject constructor(
return true
}
R.id.action_add_to_group -> {
behavior.onAddToGroup()
return true
}
R.id.action_delete -> {
behavior.onDeleteHabits()
return true

@ -26,6 +26,7 @@ import org.isoron.uhabits.R
import org.isoron.uhabits.activities.about.AboutActivity
import org.isoron.uhabits.activities.habits.edit.EditHabitActivity
import org.isoron.uhabits.activities.habits.edit.EditHabitGroupActivity
import org.isoron.uhabits.activities.habits.list.HabitGroupPickerDialog
import org.isoron.uhabits.activities.habits.show.ShowHabitActivity
import org.isoron.uhabits.activities.habits.show.ShowHabitGroupActivity
import org.isoron.uhabits.activities.intro.IntroActivity
@ -124,4 +125,11 @@ class IntentFactory
intent.putExtra("habitGroupId", habitGroup.id)
return intent
}
fun startHabitGroupPickerActivity(context: Context, selected: List<Habit>): Intent {
val intent = Intent(context, HabitGroupPickerDialog::class.java)
val ids = selected.map { it.id!! }.toLongArray()
intent.putExtra("selected", ids)
return intent
}
}

@ -41,6 +41,11 @@
android:title="@string/unarchive"
app:showAsAction="never"/>
<item
android:id="@+id/action_add_to_group"
android:title="@string/add_to_group"
app:showAsAction="never"/>
<item
android:id="@+id/action_remove_from_group"
android:title="@string/remove_from_group"

@ -30,6 +30,7 @@
<string name="archive">Archive</string>
<string name="unarchive">Unarchive</string>
<string name="remove_from_group">Remove from group</string>
<string name="add_to_group">Add to group</string>
<string name="add_habit">Add habit</string>
<string name="color_picker_default_title">Change color</string>
<string name="toast_habit_created">Habit created</string>
@ -239,4 +240,5 @@
<string name="pref_midnight_delay_title">Extend day a few hours past midnight</string>
<string name="pref_midnight_delay_description">Wait until 3:00 AM to show a new day. Useful if you typically go to sleep after midnight. Requires app restart.</string>
<string name="no_sub_habits">Group contains no habits.</string>
<string name="no_habit_groups">No habit groups</string>
</resources>

@ -0,0 +1,40 @@
/*
* Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.core.commands
import org.isoron.uhabits.core.models.Habit
import org.isoron.uhabits.core.models.HabitGroup
import org.isoron.uhabits.core.models.HabitList
data class AddToGroupCommand(
val habitList: HabitList,
val hgr: HabitGroup,
val selected: List<Habit>
) : Command {
override fun run() {
for (h in selected) {
val oldGroup = h.group
(oldGroup?.habitList ?: habitList).remove(h)
h.groupId = hgr.id
h.groupUUID = hgr.uuid
h.group = hgr
hgr.habitList.add(h)
}
}
}

@ -65,6 +65,10 @@ class ListHabitsSelectionMenuBehavior @Inject constructor(
return (adapter.getSelectedHabits().all { it.isSubHabit() })
}
fun areHabits(): Boolean {
return adapter.getSelectedHabitGroups().isEmpty()
}
fun onArchiveHabits() {
commandRunner.run(ArchiveHabitsCommand(habitList, adapter.getSelectedHabits()))
commandRunner.run(ArchiveHabitGroupsCommand(habitGroupList, adapter.getSelectedHabitGroups()))
@ -142,6 +146,12 @@ class ListHabitsSelectionMenuBehavior @Inject constructor(
adapter.clearSelection()
}
fun onAddToGroup() {
adapter.performRemove(adapter.getSelectedHabits())
screen.showHabitGroupPickerDialog(adapter.getSelectedHabits())
adapter.clearSelection()
}
interface Adapter {
fun clearSelection()
fun getSelectedHabits(): List<Habit>
@ -164,5 +174,6 @@ class ListHabitsSelectionMenuBehavior @Inject constructor(
fun showEditHabitsScreen(selected: List<Habit>)
fun showEditHabitGroupScreen(selected: List<HabitGroup>)
fun showHabitGroupPickerDialog(selected: List<Habit>)
}
}

Loading…
Cancel
Save