/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* 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.support.annotation.*;
import android.view.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.commands.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.activities.habits.list.controllers.*;
import org.isoron.uhabits.activities.habits.list.model.*;
import java.util.*;
import javax.inject.*;
@ActivityScope
public class ListHabitsSelectionMenu extends BaseSelectionMenu
implements HabitCardListController.SelectionListener
{
@NonNull
private final ListHabitsScreen screen;
@NonNull
CommandRunner commandRunner;
@NonNull
private final HabitCardListAdapter listAdapter;
@Nullable
private HabitCardListController listController;
@NonNull
private final HabitList habitList;
@Inject
public ListHabitsSelectionMenu(@NonNull HabitList habitList,
@NonNull ListHabitsScreen screen,
@NonNull HabitCardListAdapter listAdapter,
@NonNull CommandRunner commandRunner)
{
this.habitList = habitList;
this.screen = screen;
this.listAdapter = listAdapter;
this.commandRunner = commandRunner;
}
@Override
public void onFinish()
{
if (listController != null) listController.onSelectionFinished();
super.onFinish();
}
@Override
public boolean onItemClicked(@NonNull MenuItem item)
{
List<Habit> selected = listAdapter.getSelected();
if (selected.isEmpty()) return false;
Habit firstHabit = selected.get(0);
switch (item.getItemId())
{
case R.id.action_edit_habit:
showEditScreen(firstHabit);
finish();
return true;
case R.id.action_archive_habit:
performArchive(selected);
finish();
return true;
case R.id.action_unarchive_habit:
performUnarchive(selected);
finish();
return true;
case R.id.action_delete:
performDelete(selected);
return true;
case R.id.action_color:
showColorPicker(selected, firstHabit);
return true;
default:
return false;
}
}
@Override
public boolean onPrepare(@NonNull Menu menu)
{
List<Habit> selected = listAdapter.getSelected();
boolean showEdit = (selected.size() == 1);
boolean showArchive = true;
boolean showUnarchive = true;
for (Habit h : selected)
{
if (h.isArchived()) showArchive = false;
else showUnarchive = false;
}
MenuItem itemEdit = menu.findItem(R.id.action_edit_habit);
MenuItem itemColor = menu.findItem(R.id.action_color);
MenuItem itemArchive = menu.findItem(R.id.action_archive_habit);
MenuItem itemUnarchive = menu.findItem(R.id.action_unarchive_habit);
itemColor.setVisible(true);
itemEdit.setVisible(showEdit);
itemArchive.setVisible(showArchive);
itemUnarchive.setVisible(showUnarchive);
setTitle(Integer.toString(selected.size()));
return true;
}
@Override
public void onSelectionChange()
{
invalidate();
}
@Override
public void onSelectionFinish()
{
finish();
}
@Override
public void onSelectionStart()
{
screen.startSelection();
}
public void setListController(HabitCardListController listController)
{
this.listController = listController;
}
@Override
protected int getResourceId()
{
return R.menu.list_habits_selection;
}
private void performArchive(@NonNull List<Habit> selected)
{
commandRunner.execute(new ArchiveHabitsCommand(habitList, selected),
null);
}
private void performDelete(@NonNull List<Habit> selected)
{
screen.showDeleteConfirmationScreen(() -> {
listAdapter.performRemove(selected);
commandRunner.execute(new DeleteHabitsCommand(habitList, selected),
null);
finish();
});
}
private void performUnarchive(@NonNull List<Habit> selected)
{
commandRunner.execute(new UnarchiveHabitsCommand(habitList, selected),
null);
}
private void showColorPicker(@NonNull List<Habit> selected,
@NonNull Habit firstHabit)
{
screen.showColorPicker(firstHabit, color -> {
commandRunner.execute(
new ChangeHabitColorCommand(habitList, selected, color), null);
finish();
});
}
private void showEditScreen(@NonNull Habit firstHabit)
{
screen.showEditHabitScreen(firstHabit);
}
}