mirror of https://github.com/tasks/tasks
Convert TaskViewHolder to Kotlin
parent
5a4b5d0ffb
commit
798bcc5c1c
@ -1,361 +0,0 @@
|
|||||||
package org.tasks.tasklist;
|
|
||||||
|
|
||||||
import static com.todoroo.andlib.utility.DateUtilities.getRelativeDateTime;
|
|
||||||
import static com.todoroo.andlib.utility.DateUtilities.getTimeString;
|
|
||||||
import static org.tasks.date.DateTimeUtils.newDateTime;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.graphics.Paint;
|
|
||||||
import android.util.DisplayMetrics;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.view.ViewGroup.MarginLayoutParams;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import butterknife.BindView;
|
|
||||||
import butterknife.ButterKnife;
|
|
||||||
import butterknife.OnClick;
|
|
||||||
import butterknife.OnLongClick;
|
|
||||||
import com.google.android.material.chip.Chip;
|
|
||||||
import com.google.android.material.chip.ChipGroup;
|
|
||||||
import com.todoroo.astrid.api.Filter;
|
|
||||||
import com.todoroo.astrid.core.SortHelper;
|
|
||||||
import com.todoroo.astrid.service.TaskCompleter;
|
|
||||||
import com.todoroo.astrid.ui.CheckableImageView;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Locale;
|
|
||||||
import org.tasks.R;
|
|
||||||
import org.tasks.data.TaskContainer;
|
|
||||||
import org.tasks.dialogs.Linkify;
|
|
||||||
import org.tasks.preferences.Preferences;
|
|
||||||
import org.tasks.ui.CheckBoxProvider;
|
|
||||||
import org.tasks.ui.ChipProvider;
|
|
||||||
import java.time.format.FormatStyle;
|
|
||||||
|
|
||||||
public class TaskViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
|
|
||||||
private final Activity context;
|
|
||||||
private final Preferences preferences;
|
|
||||||
private final int textColorSecondary;
|
|
||||||
private final TaskCompleter taskCompleter;
|
|
||||||
private final ViewHolderCallbacks callback;
|
|
||||||
private final DisplayMetrics metrics;
|
|
||||||
private final int background;
|
|
||||||
private final int selectedColor;
|
|
||||||
private final int rowPadding;
|
|
||||||
private final Linkify linkify;
|
|
||||||
private final Locale locale;
|
|
||||||
private final CheckBoxProvider checkBoxProvider;
|
|
||||||
private final int textColorOverdue;
|
|
||||||
private final ChipProvider chipProvider;
|
|
||||||
|
|
||||||
@BindView(R.id.row)
|
|
||||||
public ViewGroup row;
|
|
||||||
|
|
||||||
@BindView(R.id.due_date)
|
|
||||||
public TextView dueDate;
|
|
||||||
|
|
||||||
public TaskContainer task;
|
|
||||||
|
|
||||||
@BindView(R.id.rowBody)
|
|
||||||
ViewGroup rowBody;
|
|
||||||
|
|
||||||
@BindView(R.id.title)
|
|
||||||
TextView nameView;
|
|
||||||
|
|
||||||
@BindView(R.id.description)
|
|
||||||
TextView description;
|
|
||||||
|
|
||||||
@BindView(R.id.completeBox)
|
|
||||||
CheckableImageView completeBox;
|
|
||||||
|
|
||||||
@BindView(R.id.chip_group)
|
|
||||||
ChipGroup chipGroup;
|
|
||||||
|
|
||||||
@BindView(R.id.hidden_icon)
|
|
||||||
View hiddenIcon;
|
|
||||||
|
|
||||||
private int indent;
|
|
||||||
private boolean selected;
|
|
||||||
private boolean moving;
|
|
||||||
private int minIndent;
|
|
||||||
private int maxIndent;
|
|
||||||
|
|
||||||
TaskViewHolder(
|
|
||||||
Activity context,
|
|
||||||
ViewGroup view,
|
|
||||||
Preferences preferences,
|
|
||||||
int fontSize,
|
|
||||||
ChipProvider chipProvider,
|
|
||||||
CheckBoxProvider checkBoxProvider,
|
|
||||||
int textColorOverdue,
|
|
||||||
int textColorSecondary,
|
|
||||||
TaskCompleter taskCompleter,
|
|
||||||
ViewHolderCallbacks callback,
|
|
||||||
DisplayMetrics metrics,
|
|
||||||
int background,
|
|
||||||
int selectedColor,
|
|
||||||
int rowPadding,
|
|
||||||
Linkify linkify,
|
|
||||||
Locale locale) {
|
|
||||||
super(view);
|
|
||||||
this.context = context;
|
|
||||||
this.preferences = preferences;
|
|
||||||
this.chipProvider = chipProvider;
|
|
||||||
this.checkBoxProvider = checkBoxProvider;
|
|
||||||
this.textColorOverdue = textColorOverdue;
|
|
||||||
this.textColorSecondary = textColorSecondary;
|
|
||||||
this.taskCompleter = taskCompleter;
|
|
||||||
this.callback = callback;
|
|
||||||
this.metrics = metrics;
|
|
||||||
this.background = background;
|
|
||||||
this.selectedColor = selectedColor;
|
|
||||||
this.rowPadding = rowPadding;
|
|
||||||
this.linkify = linkify;
|
|
||||||
this.locale = locale;
|
|
||||||
ButterKnife.bind(this, view);
|
|
||||||
|
|
||||||
if (preferences.getBoolean(R.string.p_fullTaskTitle, false)) {
|
|
||||||
nameView.setMaxLines(Integer.MAX_VALUE);
|
|
||||||
nameView.setSingleLine(false);
|
|
||||||
nameView.setEllipsize(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (preferences.getBoolean(R.string.p_show_full_description, false)) {
|
|
||||||
description.setMaxLines(Integer.MAX_VALUE);
|
|
||||||
description.setSingleLine(false);
|
|
||||||
description.setEllipsize(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
setTopPadding(rowPadding, nameView, completeBox, dueDate, hiddenIcon);
|
|
||||||
setBottomPadding(rowPadding, completeBox, dueDate);
|
|
||||||
|
|
||||||
nameView.setTextSize(fontSize);
|
|
||||||
description.setTextSize(fontSize);
|
|
||||||
int fontSizeDetails = Math.max(10, fontSize - 2);
|
|
||||||
dueDate.setTextSize(fontSizeDetails);
|
|
||||||
|
|
||||||
view.setTag(this);
|
|
||||||
for (int i = 0; i < view.getChildCount(); i++) {
|
|
||||||
view.getChildAt(i).setTag(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setTopPadding(int padding, View... views) {
|
|
||||||
for (View v : views) {
|
|
||||||
v.setPaddingRelative(v.getPaddingStart(), padding, v.getPaddingEnd(), v.getPaddingBottom());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setBottomPadding(int padding, View... views) {
|
|
||||||
for (View v : views) {
|
|
||||||
v.setPaddingRelative(v.getPaddingStart(), v.getPaddingTop(), v.getPaddingEnd(), padding);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean isMoving() {
|
|
||||||
return moving;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setMoving(boolean moving) {
|
|
||||||
this.moving = moving;
|
|
||||||
updateBackground();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateBackground() {
|
|
||||||
if (selected || moving) {
|
|
||||||
rowBody.setBackgroundColor(selectedColor);
|
|
||||||
} else {
|
|
||||||
rowBody.setBackgroundResource(background);
|
|
||||||
rowBody.getBackground().jumpToCurrentState();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSelected(boolean selected) {
|
|
||||||
this.selected = selected;
|
|
||||||
updateBackground();
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
|
||||||
public void setIndent(int indent) {
|
|
||||||
this.indent = indent;
|
|
||||||
int indentSize = getIndentSize(indent);
|
|
||||||
MarginLayoutParams layoutParams = (MarginLayoutParams) row.getLayoutParams();
|
|
||||||
layoutParams.setMarginStart(indentSize);
|
|
||||||
row.setLayoutParams(layoutParams);
|
|
||||||
}
|
|
||||||
|
|
||||||
float getShiftSize() {
|
|
||||||
return 20 * metrics.density;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getIndentSize(int indent) {
|
|
||||||
return Math.round(indent * getShiftSize());
|
|
||||||
}
|
|
||||||
|
|
||||||
void bindView(TaskContainer task, Filter filter, int sortMode) {
|
|
||||||
this.task = task;
|
|
||||||
this.indent = task.indent;
|
|
||||||
|
|
||||||
nameView.setText(task.getTitle());
|
|
||||||
hiddenIcon.setVisibility(task.isHidden() ? View.VISIBLE : View.GONE);
|
|
||||||
setupTitleAndCheckbox();
|
|
||||||
setupDueDate(sortMode);
|
|
||||||
setupChips(filter);
|
|
||||||
if (preferences.getBoolean(R.string.p_show_description, true)) {
|
|
||||||
description.setText(task.getNotes());
|
|
||||||
description.setVisibility(task.hasNotes() ? View.VISIBLE : View.GONE);
|
|
||||||
}
|
|
||||||
if (preferences.getBoolean(R.string.p_linkify_task_list, false)) {
|
|
||||||
linkify.linkify(nameView, this::onRowBodyClick);
|
|
||||||
linkify.linkify(description, this::onRowBodyClick);
|
|
||||||
nameView.setOnLongClickListener(view -> onRowBodyLongClick());
|
|
||||||
description.setOnLongClickListener(view -> onRowBodyLongClick());
|
|
||||||
}
|
|
||||||
if (chipGroup.getVisibility() == View.VISIBLE) {
|
|
||||||
setBottomPadding(rowPadding, chipGroup);
|
|
||||||
setBottomPadding(0, description, nameView);
|
|
||||||
} else if (description.getVisibility() == View.VISIBLE) {
|
|
||||||
setBottomPadding(rowPadding, description);
|
|
||||||
setBottomPadding(0, nameView);
|
|
||||||
} else {
|
|
||||||
setBottomPadding(rowPadding, nameView);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setupTitleAndCheckbox() {
|
|
||||||
if (task.isCompleted()) {
|
|
||||||
nameView.setTextColor(context.getColor(R.color.text_tertiary));
|
|
||||||
nameView.setPaintFlags(nameView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
|
|
||||||
} else {
|
|
||||||
nameView.setTextColor(
|
|
||||||
context.getColor(task.isHidden() ? R.color.text_tertiary : R.color.text_primary));
|
|
||||||
nameView.setPaintFlags(nameView.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
|
|
||||||
}
|
|
||||||
|
|
||||||
completeBox.setChecked(task.isCompleted());
|
|
||||||
completeBox.setImageDrawable(checkBoxProvider.getCheckBox(task.getTask()));
|
|
||||||
completeBox.invalidate();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setupDueDate(int sortMode) {
|
|
||||||
if (task.hasDueDate()) {
|
|
||||||
if (task.isOverdue()) {
|
|
||||||
dueDate.setTextColor(textColorOverdue);
|
|
||||||
} else {
|
|
||||||
dueDate.setTextColor(textColorSecondary);
|
|
||||||
}
|
|
||||||
String dateValue;
|
|
||||||
if (sortMode == SortHelper.SORT_DUE
|
|
||||||
&& task.sortGroup != null
|
|
||||||
&& !preferences.getBoolean(R.string.p_disable_subtasks, false)) {
|
|
||||||
dateValue =
|
|
||||||
task.hasDueTime() ? getTimeString(context, newDateTime(task.getDueDate())) : null;
|
|
||||||
} else {
|
|
||||||
dateValue = getRelativeDateTime(context, task.getDueDate(), locale, FormatStyle.MEDIUM);
|
|
||||||
}
|
|
||||||
dueDate.setText(dateValue);
|
|
||||||
dueDate.setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
|
||||||
dueDate.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setupChips(Filter filter) {
|
|
||||||
List<Chip> chips = chipProvider.getChips(filter, indent > 0, task);
|
|
||||||
if (chips.isEmpty()) {
|
|
||||||
chipGroup.setVisibility(View.GONE);
|
|
||||||
} else {
|
|
||||||
chipGroup.removeAllViews();
|
|
||||||
for (Chip chip : chips) {
|
|
||||||
chip.setOnClickListener(this::onChipClick);
|
|
||||||
chipGroup.addView(chip);
|
|
||||||
}
|
|
||||||
chipGroup.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void onChipClick(View v) {
|
|
||||||
Object tag = v.getTag();
|
|
||||||
if (tag instanceof Filter) {
|
|
||||||
callback.onClick((Filter) tag);
|
|
||||||
} else if (tag instanceof TaskContainer) {
|
|
||||||
TaskContainer task = (TaskContainer) tag;
|
|
||||||
callback.toggleSubtasks(task, !task.isCollapsed());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@OnClick(R.id.rowBody)
|
|
||||||
void onRowBodyClick() {
|
|
||||||
callback.onClick(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@OnLongClick(R.id.rowBody)
|
|
||||||
boolean onRowBodyLongClick() {
|
|
||||||
return callback.onLongPress(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@OnClick(R.id.completeBox)
|
|
||||||
void onCompleteBoxClick() {
|
|
||||||
if (task == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean newState = completeBox.isChecked();
|
|
||||||
|
|
||||||
if (newState != task.isCompleted()) {
|
|
||||||
taskCompleter.setComplete(task.getTask(), newState);
|
|
||||||
callback.onCompletedTask(task, newState);
|
|
||||||
}
|
|
||||||
|
|
||||||
// set check box to actual action item state
|
|
||||||
setupTitleAndCheckbox();
|
|
||||||
}
|
|
||||||
|
|
||||||
@OnClick(R.id.due_date)
|
|
||||||
void changeDueDate() {
|
|
||||||
callback.onChangeDueDate(task);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getIndent() {
|
|
||||||
return indent;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setMinIndent(int minIndent) {
|
|
||||||
this.minIndent = minIndent;
|
|
||||||
if (task.getTargetIndent() < minIndent) {
|
|
||||||
task.setTargetIndent(minIndent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setMaxIndent(int maxIndent) {
|
|
||||||
this.maxIndent = maxIndent;
|
|
||||||
if (task.getTargetIndent() > maxIndent) {
|
|
||||||
task.setTargetIndent(maxIndent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int getMinIndent() {
|
|
||||||
return minIndent;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getMaxIndent() {
|
|
||||||
return maxIndent;
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface ViewHolderCallbacks {
|
|
||||||
|
|
||||||
void onCompletedTask(TaskContainer task, boolean newState);
|
|
||||||
|
|
||||||
void onClick(TaskViewHolder taskViewHolder);
|
|
||||||
|
|
||||||
void onClick(Filter filter);
|
|
||||||
|
|
||||||
void toggleSubtasks(TaskContainer task, boolean collapsed);
|
|
||||||
|
|
||||||
boolean onLongPress(TaskViewHolder taskViewHolder);
|
|
||||||
|
|
||||||
void onChangeDueDate(TaskContainer task);
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,288 @@
|
|||||||
|
package org.tasks.tasklist
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.graphics.Paint
|
||||||
|
import android.util.DisplayMetrics
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.view.ViewGroup.MarginLayoutParams
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import butterknife.BindView
|
||||||
|
import butterknife.ButterKnife
|
||||||
|
import butterknife.OnClick
|
||||||
|
import butterknife.OnLongClick
|
||||||
|
import com.google.android.material.chip.ChipGroup
|
||||||
|
import com.todoroo.andlib.utility.DateUtilities
|
||||||
|
import com.todoroo.astrid.api.Filter
|
||||||
|
import com.todoroo.astrid.core.SortHelper
|
||||||
|
import com.todoroo.astrid.service.TaskCompleter
|
||||||
|
import com.todoroo.astrid.ui.CheckableImageView
|
||||||
|
import org.tasks.R
|
||||||
|
import org.tasks.data.TaskContainer
|
||||||
|
import org.tasks.date.DateTimeUtils.newDateTime
|
||||||
|
import org.tasks.dialogs.Linkify
|
||||||
|
import org.tasks.preferences.Preferences
|
||||||
|
import org.tasks.ui.CheckBoxProvider
|
||||||
|
import org.tasks.ui.ChipProvider
|
||||||
|
import java.time.format.FormatStyle
|
||||||
|
import java.util.*
|
||||||
|
import kotlin.math.max
|
||||||
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
|
class TaskViewHolder internal constructor(
|
||||||
|
private val context: Activity,
|
||||||
|
view: ViewGroup,
|
||||||
|
private val preferences: Preferences,
|
||||||
|
fontSize: Int,
|
||||||
|
private val chipProvider: ChipProvider,
|
||||||
|
private val checkBoxProvider: CheckBoxProvider,
|
||||||
|
private val textColorOverdue: Int,
|
||||||
|
private val textColorSecondary: Int,
|
||||||
|
private val taskCompleter: TaskCompleter,
|
||||||
|
private val callback: ViewHolderCallbacks,
|
||||||
|
private val metrics: DisplayMetrics,
|
||||||
|
private val background: Int,
|
||||||
|
private val selectedColor: Int,
|
||||||
|
private val rowPadding: Int,
|
||||||
|
private val linkify: Linkify,
|
||||||
|
private val locale: Locale) : RecyclerView.ViewHolder(view) {
|
||||||
|
|
||||||
|
@BindView(R.id.row)
|
||||||
|
lateinit var row: ViewGroup
|
||||||
|
|
||||||
|
@BindView(R.id.due_date)
|
||||||
|
lateinit var dueDate: TextView
|
||||||
|
|
||||||
|
@BindView(R.id.rowBody)
|
||||||
|
lateinit var rowBody: ViewGroup
|
||||||
|
|
||||||
|
@BindView(R.id.title)
|
||||||
|
lateinit var nameView: TextView
|
||||||
|
|
||||||
|
@BindView(R.id.description)
|
||||||
|
lateinit var description: TextView
|
||||||
|
|
||||||
|
@BindView(R.id.completeBox)
|
||||||
|
lateinit var completeBox: CheckableImageView
|
||||||
|
|
||||||
|
@BindView(R.id.chip_group)
|
||||||
|
lateinit var chipGroup: ChipGroup
|
||||||
|
|
||||||
|
@BindView(R.id.hidden_icon)
|
||||||
|
lateinit var hiddenIcon: View
|
||||||
|
|
||||||
|
lateinit var task: TaskContainer
|
||||||
|
|
||||||
|
var indent = 0
|
||||||
|
set(value) {
|
||||||
|
field = value
|
||||||
|
val indentSize = getIndentSize(value)
|
||||||
|
val layoutParams = row.layoutParams as MarginLayoutParams
|
||||||
|
layoutParams.marginStart = indentSize
|
||||||
|
row.layoutParams = layoutParams
|
||||||
|
}
|
||||||
|
|
||||||
|
var selected = false
|
||||||
|
set(value) {
|
||||||
|
field = value
|
||||||
|
updateBackground()
|
||||||
|
}
|
||||||
|
|
||||||
|
var moving = false
|
||||||
|
set(value) {
|
||||||
|
field = value
|
||||||
|
updateBackground()
|
||||||
|
}
|
||||||
|
|
||||||
|
var minIndent = 0
|
||||||
|
set(value) {
|
||||||
|
field = value
|
||||||
|
if (task.targetIndent < value) {
|
||||||
|
task.targetIndent = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var maxIndent = 0
|
||||||
|
set(value) {
|
||||||
|
field = value
|
||||||
|
if (task.targetIndent > value) {
|
||||||
|
task.targetIndent = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setTopPadding(padding: Int, vararg views: View) {
|
||||||
|
for (v in views) {
|
||||||
|
v.setPaddingRelative(v.paddingStart, padding, v.paddingEnd, v.paddingBottom)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setBottomPadding(padding: Int, vararg views: View) {
|
||||||
|
for (v in views) {
|
||||||
|
v.setPaddingRelative(v.paddingStart, v.paddingTop, v.paddingEnd, padding)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateBackground() {
|
||||||
|
if (selected || moving) {
|
||||||
|
rowBody.setBackgroundColor(selectedColor)
|
||||||
|
} else {
|
||||||
|
rowBody.setBackgroundResource(background)
|
||||||
|
rowBody.background.jumpToCurrentState()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val shiftSize: Float
|
||||||
|
get() = 20 * metrics.density
|
||||||
|
|
||||||
|
private fun getIndentSize(indent: Int) = (indent * shiftSize).roundToInt()
|
||||||
|
|
||||||
|
fun bindView(task: TaskContainer, filter: Filter, sortMode: Int) {
|
||||||
|
this.task = task
|
||||||
|
indent = task.indent
|
||||||
|
nameView.text = task.title
|
||||||
|
hiddenIcon.visibility = if (task.isHidden) View.VISIBLE else View.GONE
|
||||||
|
setupTitleAndCheckbox()
|
||||||
|
setupDueDate(sortMode)
|
||||||
|
setupChips(filter)
|
||||||
|
if (preferences.getBoolean(R.string.p_show_description, true)) {
|
||||||
|
description.text = task.notes
|
||||||
|
description.visibility = if (task.hasNotes()) View.VISIBLE else View.GONE
|
||||||
|
}
|
||||||
|
if (preferences.getBoolean(R.string.p_linkify_task_list, false)) {
|
||||||
|
linkify.linkify(nameView) { onRowBodyClick() }
|
||||||
|
linkify.linkify(description) { onRowBodyClick() }
|
||||||
|
nameView.setOnLongClickListener { onRowBodyLongClick() }
|
||||||
|
description.setOnLongClickListener { onRowBodyLongClick() }
|
||||||
|
}
|
||||||
|
when {
|
||||||
|
chipGroup.visibility == View.VISIBLE -> {
|
||||||
|
setBottomPadding(rowPadding, chipGroup)
|
||||||
|
setBottomPadding(0, description, nameView)
|
||||||
|
}
|
||||||
|
description.visibility == View.VISIBLE -> {
|
||||||
|
setBottomPadding(rowPadding, description)
|
||||||
|
setBottomPadding(0, nameView)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
setBottomPadding(rowPadding, nameView)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setupTitleAndCheckbox() {
|
||||||
|
if (task.isCompleted) {
|
||||||
|
nameView.setTextColor(context.getColor(R.color.text_tertiary))
|
||||||
|
nameView.paintFlags = nameView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
|
||||||
|
} else {
|
||||||
|
nameView.setTextColor(
|
||||||
|
context.getColor(if (task.isHidden) R.color.text_tertiary else R.color.text_primary))
|
||||||
|
nameView.paintFlags = nameView.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
|
||||||
|
}
|
||||||
|
completeBox.isChecked = task.isCompleted
|
||||||
|
completeBox.setImageDrawable(checkBoxProvider.getCheckBox(task.getTask()))
|
||||||
|
completeBox.invalidate()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setupDueDate(sortMode: Int) {
|
||||||
|
if (task.hasDueDate()) {
|
||||||
|
if (task.isOverdue) {
|
||||||
|
dueDate.setTextColor(textColorOverdue)
|
||||||
|
} else {
|
||||||
|
dueDate.setTextColor(textColorSecondary)
|
||||||
|
}
|
||||||
|
val dateValue: String? = if (sortMode == SortHelper.SORT_DUE && task.sortGroup != null && !preferences.getBoolean(R.string.p_disable_subtasks, false)) {
|
||||||
|
if (task.hasDueTime()) DateUtilities.getTimeString(context, newDateTime(task.dueDate)) else null
|
||||||
|
} else {
|
||||||
|
DateUtilities.getRelativeDateTime(context, task.dueDate, locale, FormatStyle.MEDIUM)
|
||||||
|
}
|
||||||
|
dueDate.text = dateValue
|
||||||
|
dueDate.visibility = View.VISIBLE
|
||||||
|
} else {
|
||||||
|
dueDate.visibility = View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setupChips(filter: Filter) {
|
||||||
|
val chips = chipProvider.getChips(filter, indent > 0, task)
|
||||||
|
if (chips.isEmpty()) {
|
||||||
|
chipGroup.visibility = View.GONE
|
||||||
|
} else {
|
||||||
|
chipGroup.removeAllViews()
|
||||||
|
for (chip in chips) {
|
||||||
|
chip.setOnClickListener { v: View -> onChipClick(v) }
|
||||||
|
chipGroup.addView(chip)
|
||||||
|
}
|
||||||
|
chipGroup.visibility = View.VISIBLE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun onChipClick(v: View) {
|
||||||
|
val tag = v.tag
|
||||||
|
if (tag is Filter) {
|
||||||
|
callback.onClick(tag)
|
||||||
|
} else if (tag is TaskContainer) {
|
||||||
|
callback.toggleSubtasks(tag, !tag.isCollapsed)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnClick(R.id.rowBody)
|
||||||
|
fun onRowBodyClick() {
|
||||||
|
callback.onClick(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnLongClick(R.id.rowBody)
|
||||||
|
fun onRowBodyLongClick(): Boolean {
|
||||||
|
return callback.onLongPress(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnClick(R.id.completeBox)
|
||||||
|
fun onCompleteBoxClick() {
|
||||||
|
val newState = completeBox.isChecked
|
||||||
|
if (newState != task.isCompleted) {
|
||||||
|
taskCompleter.setComplete(task.getTask(), newState)
|
||||||
|
callback.onCompletedTask(task, newState)
|
||||||
|
}
|
||||||
|
|
||||||
|
// set check box to actual action item state
|
||||||
|
setupTitleAndCheckbox()
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnClick(R.id.due_date)
|
||||||
|
fun changeDueDate() {
|
||||||
|
callback.onChangeDueDate(task)
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ViewHolderCallbacks {
|
||||||
|
fun onCompletedTask(task: TaskContainer, newState: Boolean)
|
||||||
|
fun onClick(taskViewHolder: TaskViewHolder)
|
||||||
|
fun onClick(filter: Filter)
|
||||||
|
fun toggleSubtasks(task: TaskContainer, collapsed: Boolean)
|
||||||
|
fun onLongPress(taskViewHolder: TaskViewHolder): Boolean
|
||||||
|
fun onChangeDueDate(task: TaskContainer)
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
ButterKnife.bind(this, view)
|
||||||
|
if (preferences.getBoolean(R.string.p_fullTaskTitle, false)) {
|
||||||
|
nameView.maxLines = Int.MAX_VALUE
|
||||||
|
nameView.isSingleLine = false
|
||||||
|
nameView.ellipsize = null
|
||||||
|
}
|
||||||
|
if (preferences.getBoolean(R.string.p_show_full_description, false)) {
|
||||||
|
description.maxLines = Int.MAX_VALUE
|
||||||
|
description.isSingleLine = false
|
||||||
|
description.ellipsize = null
|
||||||
|
}
|
||||||
|
setTopPadding(rowPadding, nameView, completeBox, dueDate, hiddenIcon)
|
||||||
|
setBottomPadding(rowPadding, completeBox, dueDate)
|
||||||
|
nameView.textSize = fontSize.toFloat()
|
||||||
|
description.textSize = fontSize.toFloat()
|
||||||
|
val fontSizeDetails = max(10, fontSize - 2)
|
||||||
|
dueDate.textSize = fontSizeDetails.toFloat()
|
||||||
|
view.tag = this
|
||||||
|
for (i in 0 until view.childCount) {
|
||||||
|
view.getChildAt(i).tag = this
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue