diff --git a/app/src/main/java/com/todoroo/astrid/adapter/AstridTaskAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/AstridTaskAdapter.java index b5c50e708..857e0c55a 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/AstridTaskAdapter.java +++ b/app/src/main/java/com/todoroo/astrid/adapter/AstridTaskAdapter.java @@ -1,8 +1,16 @@ package com.todoroo.astrid.adapter; +import android.text.TextUtils; +import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.subtasks.SubtasksFilterUpdater; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.tasks.data.TaskListMetadata; import timber.log.Timber; @@ -11,12 +19,16 @@ public final class AstridTaskAdapter extends TaskAdapter { private final TaskListMetadata list; private final Filter filter; private final SubtasksFilterUpdater updater; + private final TaskDao taskDao; + private final Map> chainedCompletions = + Collections.synchronizedMap(new HashMap<>()); public AstridTaskAdapter( - TaskListMetadata list, Filter filter, SubtasksFilterUpdater updater) { + TaskListMetadata list, Filter filter, SubtasksFilterUpdater updater, TaskDao taskDao) { this.list = list; this.filter = filter; this.updater = updater; + this.taskDao = taskDao; } @Override @@ -79,4 +91,49 @@ public final class AstridTaskAdapter extends TaskAdapter { public void onTaskDeleted(Task task) { updater.onDeleteTask(list, filter, task.getUuid()); } + + @Override + public void onCompletedTask(Task item, boolean completedState) { + final String itemId = item.getUuid(); + + final long completionDate = completedState ? DateUtilities.now() : 0; + + if (!completedState) { + ArrayList chained = chainedCompletions.get(itemId); + if (chained != null) { + for (String taskId : chained) { + taskDao.setCompletionDate(taskId, completionDate); + } + } + return; + } + + final ArrayList chained = new ArrayList<>(); + updater.applyToDescendants( + itemId, + node -> { + String uuid = node.uuid; + taskDao.setCompletionDate(uuid, completionDate); + chained.add(node.uuid); + }); + + if (chained.size() > 0) { + // move recurring items to item parent + List tasks = taskDao.getRecurringTasks(chained); + + boolean madeChanges = false; + for (Task t : tasks) { + if (!TextUtils.isEmpty(t.getRecurrence())) { + updater.moveToParentOf(t.getUuid(), itemId); + madeChanges = true; + } + } + + if (madeChanges) { + updater.writeSerialization(list, updater.serializeTree()); + } + + chainedCompletions.put(itemId, chained); + } + } } diff --git a/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.java index cb56cf78b..229ded281 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.java +++ b/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.java @@ -1,11 +1,18 @@ package com.todoroo.astrid.adapter; +import android.text.TextUtils; import com.todoroo.andlib.data.Property; +import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.gtasks.GtasksTaskListUpdater; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import org.tasks.data.GoogleTask; +import org.tasks.data.GoogleTaskDao; import org.tasks.data.GoogleTaskList; import timber.log.Timber; @@ -13,10 +20,20 @@ public final class GoogleTaskAdapter extends TaskAdapter { private final GoogleTaskList list; private final GtasksTaskListUpdater updater; + private final TaskDao taskDao; + private final GoogleTaskDao googleTaskDao; + private final Map> chainedCompletions = + Collections.synchronizedMap(new HashMap<>()); - public GoogleTaskAdapter(GoogleTaskList list, GtasksTaskListUpdater updater) { + public GoogleTaskAdapter( + GoogleTaskList list, + GtasksTaskListUpdater updater, + TaskDao taskDao, + GoogleTaskDao googleTaskDao) { this.list = list; this.updater = updater; + this.taskDao = taskDao; + this.googleTaskDao = googleTaskDao; } @Override @@ -81,4 +98,45 @@ public final class GoogleTaskAdapter extends TaskAdapter { public void onTaskDeleted(Task task) { updater.onDeleteTask(list, task.getId()); } + + @Override + public void onCompletedTask(Task item, boolean completedState) { + final long itemId = item.getId(); + + final long completionDate = completedState ? DateUtilities.now() : 0; + + if (!completedState) { + ArrayList chained = chainedCompletions.get(itemId); + if (chained != null) { + for (Long taskId : chained) { + Task task = taskDao.fetch(taskId); + task.setCompletionDate(completionDate); + taskDao.save(task); + } + } + return; + } + + final ArrayList chained = new ArrayList<>(); + final int parentIndent = item.getIndent(); + updater.applyToChildren( + list, + itemId, + node -> { + Task childTask = taskDao.fetch(node.taskId); + if (!TextUtils.isEmpty(childTask.getRecurrence())) { + GoogleTask googleTask = updater.getTaskMetadata(node.taskId); + googleTask.setIndent(parentIndent); + googleTaskDao.update(googleTask); + } + childTask.setCompletionDate(completionDate); + taskDao.save(childTask); + + chained.add(node.taskId); + }); + + if (chained.size() > 0) { + chainedCompletions.put(itemId, chained); + } + } } diff --git a/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.java index 700b78a61..0366ae922 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.java +++ b/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.java @@ -51,7 +51,6 @@ public class TaskAdapter { Property.class); private final Set selected = new HashSet<>(); private AsyncPagedListDiffer helper; - private OnCompletedTaskListener onCompletedTaskListener = null; public int getCount() { return helper.getItemCount(); @@ -119,30 +118,13 @@ public class TaskAdapter { return getTask(position).getUuid(); } - public void onCompletedTask(Task task, boolean newState) { - if (onCompletedTaskListener != null) { - onCompletedTaskListener.onCompletedTask(task, newState); - } - } - - public void setOnCompletedTaskListener(final OnCompletedTaskListener newListener) { - this.onCompletedTaskListener = newListener; - } - public Property[] getTaskProperties() { return PROPERTIES; } - public void onTaskCreated(String uuid) { + public void onCompletedTask(Task task, boolean newState) {} - } + public void onTaskCreated(String uuid) {} - public void onTaskDeleted(Task task) { - - } - - public interface OnCompletedTaskListener { - - void onCompletedTask(Task item, boolean newState); - } + public void onTaskDeleted(Task task) {} } diff --git a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksSubtaskListFragment.java b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksSubtaskListFragment.java index a7cc71f50..f15a4568f 100644 --- a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksSubtaskListFragment.java +++ b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksSubtaskListFragment.java @@ -6,20 +6,22 @@ package com.todoroo.astrid.gtasks; -import android.app.Activity; -import android.os.Bundle; import com.todoroo.astrid.activity.TaskListFragment; +import com.todoroo.astrid.adapter.GoogleTaskAdapter; import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.api.GtasksFilter; -import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.dao.TaskDao; import javax.inject.Inject; +import org.tasks.data.GoogleTaskDao; import org.tasks.data.GoogleTaskList; import org.tasks.injection.FragmentComponent; import org.tasks.tasklist.GtasksListFragment; public class GtasksSubtaskListFragment extends GtasksListFragment { - @Inject OrderedMetadataListFragmentHelper helper; + @Inject TaskDao taskDao; + @Inject GtasksTaskListUpdater updater; + @Inject GoogleTaskDao googleTaskDao; public static TaskListFragment newGtasksSubtaskListFragment( GtasksFilter filter, GoogleTaskList list) { @@ -29,25 +31,10 @@ public class GtasksSubtaskListFragment extends GtasksListFragment { return fragment; } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - helper.setList(list); - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - - helper.setTaskListFragment(this); - } - @Override protected TaskAdapter createTaskAdapter() { - helper.setList(list); - helper.beforeSetUpTaskList(filter); - return helper.createTaskAdapter(); + updater.initialize(filter); + return new GoogleTaskAdapter(list, updater, taskDao, googleTaskDao); } @Override diff --git a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdater.java b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdater.java index b241ccc2b..587760216 100644 --- a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdater.java +++ b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdater.java @@ -50,7 +50,7 @@ public class GtasksTaskListUpdater { // --- overrides - GoogleTask getTaskMetadata(long taskId) { + public GoogleTask getTaskMetadata(long taskId) { return googleTaskDao.getByTaskId(taskId); } @@ -338,7 +338,7 @@ public class GtasksTaskListUpdater { } /** Apply an operation only to the children of the task */ - void applyToChildren(GoogleTaskList list, long targetTaskId, OrderedListNodeVisitor visitor) { + public void applyToChildren(GoogleTaskList list, long targetTaskId, OrderedListNodeVisitor visitor) { Node root = buildTreeModel(list); Node target = findNode(root, targetTaskId); @@ -385,12 +385,12 @@ public class GtasksTaskListUpdater { void processTask(long taskId, GoogleTask googleTask); } - interface OrderedListNodeVisitor { + public interface OrderedListNodeVisitor { void visitNode(Node node); } - static class Node { + public static class Node { public final long taskId; final ArrayList children = new ArrayList<>(); diff --git a/app/src/main/java/com/todoroo/astrid/gtasks/OrderedMetadataListFragmentHelper.java b/app/src/main/java/com/todoroo/astrid/gtasks/OrderedMetadataListFragmentHelper.java deleted file mode 100644 index 6ede3fce1..000000000 --- a/app/src/main/java/com/todoroo/astrid/gtasks/OrderedMetadataListFragmentHelper.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2012 Todoroo Inc - * - * See the file "LICENSE" for the full license governing this code. - */ - -package com.todoroo.astrid.gtasks; - -import android.text.TextUtils; -import com.todoroo.andlib.utility.DateUtilities; -import com.todoroo.astrid.activity.TaskListFragment; -import com.todoroo.astrid.adapter.GoogleTaskAdapter; -import com.todoroo.astrid.adapter.TaskAdapter; -import com.todoroo.astrid.api.Filter; -import com.todoroo.astrid.dao.TaskDao; -import com.todoroo.astrid.data.Task; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import javax.inject.Inject; -import org.tasks.data.GoogleTask; -import org.tasks.data.GoogleTaskDao; -import org.tasks.data.GoogleTaskList; - -class OrderedMetadataListFragmentHelper { - - private final GtasksTaskListUpdater updater; - private final GoogleTaskDao googleTaskDao; - - private final TaskDao taskDao; - private final Map> chainedCompletions = - Collections.synchronizedMap(new HashMap<>()); - private TaskListFragment fragment; - private GoogleTaskList list; - - @Inject - OrderedMetadataListFragmentHelper( - TaskDao taskDao, GtasksTaskListUpdater updater, GoogleTaskDao googleTaskDao) { - this.taskDao = taskDao; - this.updater = updater; - this.googleTaskDao = googleTaskDao; - } - - void setTaskListFragment(TaskListFragment fragment) { - this.fragment = fragment; - } - - void beforeSetUpTaskList(Filter filter) { - updater.initialize(filter); - } - - TaskAdapter createTaskAdapter() { - GoogleTaskAdapter taskAdapter = new GoogleTaskAdapter(list, updater); - - taskAdapter.setOnCompletedTaskListener(this::setCompletedForItemAndSubtasks); - - return taskAdapter; - } - - private void setCompletedForItemAndSubtasks(final Task item, final boolean completedState) { - final long itemId = item.getId(); - - final long completionDate = completedState ? DateUtilities.now() : 0; - - if (!completedState) { - ArrayList chained = chainedCompletions.get(itemId); - if (chained != null) { - for (Long taskId : chained) { - Task task = taskDao.fetch(taskId); - task.setCompletionDate(completionDate); - taskDao.save(task); - } - fragment.loadTaskListContent(); - } - return; - } - - final ArrayList chained = new ArrayList<>(); - final int parentIndent = item.getIndent(); - updater.applyToChildren( - list, - itemId, - node -> { - Task childTask = taskDao.fetch(node.taskId); - if (!TextUtils.isEmpty(childTask.getRecurrence())) { - GoogleTask googleTask = updater.getTaskMetadata(node.taskId); - googleTask.setIndent(parentIndent); - googleTaskDao.update(googleTask); - } - childTask.setCompletionDate(completionDate); - taskDao.save(childTask); - - chained.add(node.taskId); - }); - - if (chained.size() > 0) { - chainedCompletions.put(itemId, chained); - fragment.loadTaskListContent(); - } - } - - public void setList(GoogleTaskList list) { - this.list = list; - } -} diff --git a/app/src/main/java/com/todoroo/astrid/subtasks/AstridOrderedListFragmentHelper.java b/app/src/main/java/com/todoroo/astrid/subtasks/AstridOrderedListFragmentHelper.java deleted file mode 100644 index 2bd6a6933..000000000 --- a/app/src/main/java/com/todoroo/astrid/subtasks/AstridOrderedListFragmentHelper.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.todoroo.astrid.subtasks; - -import android.text.TextUtils; -import com.todoroo.andlib.utility.DateUtilities; -import com.todoroo.astrid.activity.TaskListFragment; -import com.todoroo.astrid.adapter.AstridTaskAdapter; -import com.todoroo.astrid.adapter.TaskAdapter; -import com.todoroo.astrid.api.Filter; -import com.todoroo.astrid.dao.TaskDao; -import com.todoroo.astrid.data.Task; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import javax.inject.Inject; -import org.tasks.data.TaskListMetadata; - -class AstridOrderedListFragmentHelper { - - private final SubtasksFilterUpdater updater; - private final TaskDao taskDao; - private final Map> chainedCompletions = - Collections.synchronizedMap(new HashMap<>()); - private TaskListFragment fragment; - private TaskListMetadata list; - - @Inject - AstridOrderedListFragmentHelper(SubtasksFilterUpdater updater, TaskDao taskDao) { - this.updater = updater; - this.taskDao = taskDao; - } - - void setTaskListFragment(TaskListFragment fragment) { - this.fragment = fragment; - } - - void beforeSetUpTaskList(Filter filter) { - updater.initialize(list, filter); - } - - TaskAdapter createTaskAdapter() { - AstridTaskAdapter taskAdapter = new AstridTaskAdapter(list, fragment.getFilter(), updater); - - taskAdapter.setOnCompletedTaskListener(this::setCompletedForItemAndSubtasks); - - return taskAdapter; - } - - private void setCompletedForItemAndSubtasks(final Task item, final boolean completedState) { - final String itemId = item.getUuid(); - - final long completionDate = completedState ? DateUtilities.now() : 0; - - if (!completedState) { - ArrayList chained = chainedCompletions.get(itemId); - if (chained != null) { - for (String taskId : chained) { - taskDao.setCompletionDate(taskId, completionDate); - } - fragment.loadTaskListContent(); - } - return; - } - - final ArrayList chained = new ArrayList<>(); - updater.applyToDescendants( - itemId, - node -> { - String uuid = node.uuid; - taskDao.setCompletionDate(uuid, completionDate); - chained.add(node.uuid); - }); - - if (chained.size() > 0) { - // move recurring items to item parent - List tasks = taskDao.getRecurringTasks(chained); - - boolean madeChanges = false; - for (Task t : tasks) { - if (!TextUtils.isEmpty(t.getRecurrence())) { - updater.moveToParentOf(t.getUuid(), itemId); - madeChanges = true; - } - } - - if (madeChanges) { - updater.writeSerialization(list, updater.serializeTree()); - } - - chainedCompletions.put(itemId, chained); - fragment.loadTaskListContent(); - } - } - - public void setList(TaskListMetadata list) { - this.list = list; - } -} diff --git a/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksFilterUpdater.java b/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksFilterUpdater.java index 2a8f333dd..32e742120 100644 --- a/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksFilterUpdater.java +++ b/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksFilterUpdater.java @@ -116,7 +116,7 @@ public class SubtasksFilterUpdater { return order; } - void writeSerialization(TaskListMetadata list, String serialized) { + public void writeSerialization(TaskListMetadata list, String serialized) { if (list != null) { list.setTaskIds(serialized); taskListMetadataDao.update(list); @@ -236,7 +236,7 @@ public class SubtasksFilterUpdater { } } - void applyToDescendants(String taskId, OrderedListNodeVisitor visitor) { + public void applyToDescendants(String taskId, OrderedListNodeVisitor visitor) { Node n = idToNode.get(taskId); if (n == null) { return; @@ -342,7 +342,7 @@ public class SubtasksFilterUpdater { moveHelper(list, filter, target, before); } - void moveToParentOf(String moveThis, String toParentOfThis) { + public void moveToParentOf(String moveThis, String toParentOfThis) { Node target = idToNode.get(toParentOfThis); if (target == null) { return; @@ -450,11 +450,11 @@ public class SubtasksFilterUpdater { applyToFilter(filter); } - String serializeTree() { + public String serializeTree() { return serializeTree(treeRoot); } - interface OrderedListNodeVisitor { + public interface OrderedListNodeVisitor { void visitNode(Node node); } @@ -464,7 +464,7 @@ public class SubtasksFilterUpdater { void afterAddNode(Node node); } - static class Node { + public static class Node { final ArrayList children = new ArrayList<>(); public String uuid; diff --git a/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksListFragment.java b/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksListFragment.java index e751e4f48..c31273590 100644 --- a/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksListFragment.java +++ b/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksListFragment.java @@ -10,6 +10,7 @@ import android.app.Activity; import android.content.Context; import android.text.TextUtils; import com.todoroo.astrid.activity.TaskListFragment; +import com.todoroo.astrid.adapter.AstridTaskAdapter; import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.core.BuiltInFilterExposer; @@ -32,8 +33,8 @@ public class SubtasksListFragment extends TaskListFragment { @Inject Preferences preferences; @Inject @ForApplication Context context; @Inject TaskListMetadataDao taskListMetadataDao; + @Inject SubtasksFilterUpdater updater; @Inject TaskDao taskDao; - @Inject AstridOrderedListFragmentHelper helper; public static TaskListFragment newSubtasksListFragment(Filter filter) { SubtasksListFragment fragment = new SubtasksListFragment(); @@ -42,10 +43,10 @@ public class SubtasksListFragment extends TaskListFragment { } @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - - helper.setTaskListFragment(this); + protected TaskAdapter createTaskAdapter() { + TaskListMetadata list = initializeTaskListMetadata(); + updater.initialize(list, filter); + return new AstridTaskAdapter(list, filter, updater, taskDao); } private TaskListMetadata initializeTaskListMetadata() { @@ -76,13 +77,6 @@ public class SubtasksListFragment extends TaskListFragment { return taskListMetadata; } - @Override - protected TaskAdapter createTaskAdapter() { - helper.setList(initializeTaskListMetadata()); - helper.beforeSetUpTaskList(filter); - return helper.createTaskAdapter(); - } - @Override public void inject(FragmentComponent component) { component.inject(this); diff --git a/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksTagListFragment.java b/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksTagListFragment.java index 64edbc071..7fd70bf81 100644 --- a/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksTagListFragment.java +++ b/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksTagListFragment.java @@ -6,10 +6,11 @@ package com.todoroo.astrid.subtasks; -import android.app.Activity; import com.todoroo.astrid.activity.TaskListFragment; +import com.todoroo.astrid.adapter.AstridTaskAdapter; import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.api.TagFilter; +import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.data.Task; import javax.inject.Inject; import org.tasks.data.TagData; @@ -21,7 +22,8 @@ import org.tasks.tasklist.TagListFragment; public class SubtasksTagListFragment extends TagListFragment { @Inject TaskListMetadataDao taskListMetadataDao; - @Inject AstridOrderedListFragmentHelper helper; + @Inject SubtasksFilterUpdater updater; + @Inject TaskDao taskDao; public static TaskListFragment newSubtasksTagListFragment(TagFilter filter, TagData tagData) { SubtasksTagListFragment fragment = new SubtasksTagListFragment(); @@ -31,14 +33,13 @@ public class SubtasksTagListFragment extends TagListFragment { } @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - - helper.setTaskListFragment(this); + protected TaskAdapter createTaskAdapter() { + TaskListMetadata list = initializeTaskListMetadata(); + updater.initialize(list, filter); + return new AstridTaskAdapter(list, filter, updater, taskDao); } - @Override - protected TaskAdapter createTaskAdapter() { + private TaskListMetadata initializeTaskListMetadata() { String tdId = tagData.getRemoteId(); TaskListMetadata taskListMetadata = taskListMetadataDao.fetchByTagOrFilter(tagData.getRemoteId()); @@ -47,9 +48,7 @@ public class SubtasksTagListFragment extends TagListFragment { taskListMetadata.setTagUuid(tdId); taskListMetadataDao.createNew(taskListMetadata); } - helper.setList(taskListMetadata); - helper.beforeSetUpTaskList(filter); - return helper.createTaskAdapter(); + return taskListMetadata; } @Override diff --git a/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java b/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java index 84d0b1b90..2d3068329 100644 --- a/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java +++ b/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java @@ -99,6 +99,7 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter @Override public void onCompletedTask(Task task, boolean newState) { adapter.onCompletedTask(task, newState); + taskList.loadTaskListContent(); } @Override