Move title edit to collapsing toolbar layout

pull/996/head
Alex Baker 5 years ago
parent 1d01c5d7b4
commit ac39ccb966

@ -69,7 +69,6 @@ import org.tasks.ui.TaskListViewModel;
public class MainActivity extends InjectingAppCompatActivity public class MainActivity extends InjectingAppCompatActivity
implements TaskListFragment.TaskListFragmentCallbackHandler, implements TaskListFragment.TaskListFragmentCallbackHandler,
PriorityControlSet.OnPriorityChanged,
RemoteListFragment.OnListChanged, RemoteListFragment.OnListChanged,
TimerControlSet.TimerControlSetCallback, TimerControlSet.TimerControlSetCallback,
DeadlineControlSet.DueDateChangeListener, DeadlineControlSet.DueDateChangeListener,
@ -450,11 +449,6 @@ public class MainActivity extends InjectingAppCompatActivity
getSupportFragmentManager().findFragmentByTag(TaskEditFragment.TAG_TASKEDIT_FRAGMENT); getSupportFragmentManager().findFragmentByTag(TaskEditFragment.TAG_TASKEDIT_FRAGMENT);
} }
@Override
public void onPriorityChange(int priority) {
getTaskEditFragment().onPriorityChange(priority);
}
@Override @Override
public Task stopTimer() { public Task stopTimer() {
return getTaskEditFragment().stopTimer(); return getTaskEditFragment().stopTimer();

@ -9,23 +9,34 @@ package com.todoroo.astrid.activity;
import static com.google.common.base.Predicates.not; import static com.google.common.base.Predicates.not;
import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.filter;
import static com.todoroo.andlib.utility.AndroidUtilities.assertNotMainThread; import static com.todoroo.andlib.utility.AndroidUtilities.assertNotMainThread;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastQ;
import static com.todoroo.andlib.utility.DateUtilities.now;
import static org.tasks.date.DateTimeUtils.newDateTime; import static org.tasks.date.DateTimeUtils.newDateTime;
import static org.tasks.files.FileHelper.copyToUri; import static org.tasks.files.FileHelper.copyToUri;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.graphics.Paint;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.text.format.DateUtils; import android.text.format.DateUtils;
import android.text.method.ScrollingMovementMethod;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction; import androidx.fragment.app.FragmentTransaction;
import com.google.android.material.appbar.AppBarLayout;
import com.google.common.base.Strings;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
@ -35,7 +46,6 @@ import com.todoroo.astrid.notes.CommentsController;
import com.todoroo.astrid.repeats.RepeatControlSet; import com.todoroo.astrid.repeats.RepeatControlSet;
import com.todoroo.astrid.service.TaskDeleter; import com.todoroo.astrid.service.TaskDeleter;
import com.todoroo.astrid.timers.TimerPlugin; import com.todoroo.astrid.timers.TimerPlugin;
import com.todoroo.astrid.ui.EditTitleControlSet;
import io.reactivex.Completable; import io.reactivex.Completable;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
@ -47,6 +57,7 @@ import org.tasks.data.UserActivity;
import org.tasks.data.UserActivityDao; import org.tasks.data.UserActivityDao;
import org.tasks.databinding.FragmentTaskEditBinding; import org.tasks.databinding.FragmentTaskEditBinding;
import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.DialogBuilder;
import org.tasks.dialogs.Linkify;
import org.tasks.fragments.TaskEditControlSetFragmentManager; import org.tasks.fragments.TaskEditControlSetFragmentManager;
import org.tasks.injection.ForActivity; import org.tasks.injection.ForActivity;
import org.tasks.injection.FragmentComponent; import org.tasks.injection.FragmentComponent;
@ -63,6 +74,7 @@ public final class TaskEditFragment extends InjectingFragment
static final String TAG_TASKEDIT_FRAGMENT = "taskedit_fragment"; static final String TAG_TASKEDIT_FRAGMENT = "taskedit_fragment";
private static final String EXTRA_TASK = "extra_task"; private static final String EXTRA_TASK = "extra_task";
private static final String EXTRA_THEME = "extra_theme"; private static final String EXTRA_THEME = "extra_theme";
private static final String EXTRA_COMPLETED = "extra_completed";
@Inject TaskDao taskDao; @Inject TaskDao taskDao;
@Inject UserActivityDao userActivityDao; @Inject UserActivityDao userActivityDao;
@ -75,10 +87,14 @@ public final class TaskEditFragment extends InjectingFragment
@Inject Preferences preferences; @Inject Preferences preferences;
@Inject Tracker tracker; @Inject Tracker tracker;
@Inject TimerPlugin timerPlugin; @Inject TimerPlugin timerPlugin;
@Inject Linkify linkify;
Task model = null; Task model = null;
ThemeColor themeColor; private ThemeColor themeColor;
private TaskEditFragmentCallbackHandler callback; private TaskEditFragmentCallbackHandler callback;
private boolean showKeyboard;
private FragmentTaskEditBinding binding;
private boolean completed;
static TaskEditFragment newTaskEditFragment(Task task, ThemeColor themeColor) { static TaskEditFragment newTaskEditFragment(Task task, ThemeColor themeColor) {
TaskEditFragment taskEditFragment = new TaskEditFragment(); TaskEditFragment taskEditFragment = new TaskEditFragment();
@ -96,6 +112,13 @@ public final class TaskEditFragment extends InjectingFragment
callback = (TaskEditFragmentCallbackHandler) activity; callback = (TaskEditFragmentCallbackHandler) activity;
} }
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(EXTRA_COMPLETED, completed);
}
@Override @Override
protected void inject(FragmentComponent component) { protected void inject(FragmentComponent component) {
component.inject(this); component.inject(this);
@ -104,14 +127,14 @@ public final class TaskEditFragment extends InjectingFragment
@Override @Override
public View onCreateView( public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
FragmentTaskEditBinding binding = FragmentTaskEditBinding.inflate(inflater); binding = FragmentTaskEditBinding.inflate(inflater);
View view = binding.getRoot(); View view = binding.getRoot();
Bundle arguments = getArguments(); Bundle arguments = getArguments();
model = arguments.getParcelable(EXTRA_TASK); model = arguments.getParcelable(EXTRA_TASK);
themeColor = arguments.getParcelable(EXTRA_THEME); themeColor = arguments.getParcelable(EXTRA_THEME);
Toolbar toolbar = binding.toolbar.toolbar; Toolbar toolbar = binding.toolbar;
final boolean backButtonSavesTask = preferences.backButtonSavesTask(); final boolean backButtonSavesTask = preferences.backButtonSavesTask();
toolbar.setNavigationIcon( toolbar.setNavigationIcon(
ContextCompat.getDrawable( ContextCompat.getDrawable(
@ -130,8 +153,70 @@ public final class TaskEditFragment extends InjectingFragment
if (!model.isNew()) { if (!model.isNew()) {
toolbar.inflateMenu(R.menu.menu_task_edit_fragment); toolbar.inflateMenu(R.menu.menu_task_edit_fragment);
} }
if (savedInstanceState == null) {
showKeyboard = model.isNew() && Strings.isNullOrEmpty(model.getTitle());
completed = model.isCompleted();
} else {
completed = savedInstanceState.getBoolean(EXTRA_COMPLETED);
}
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) binding.appbarlayout.getLayoutParams();
params.setBehavior(new AppBarLayout.Behavior());
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
@Override
public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
return false;
}
});
toolbar.setOnMenuItemClickListener(this); toolbar.setOnMenuItemClickListener(this);
themeColor.apply(toolbar); themeColor.apply(binding.collapsingtoolbarlayout, toolbar);
EditText title = binding.title;
title.setTextKeepState(model.getTitle());
title.setHorizontallyScrolling(false);
title.setMovementMethod(new ScrollingMovementMethod());
title.setLines(1);
title.setTextColor(themeColor.getColorOnPrimary());
title.setHintTextColor(themeColor.getHintOnPrimary());
title.setMaxLines(5);
if (completed) {
title.setPaintFlags(title.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
binding.fab.setImageResource(R.drawable.ic_undo_24px);
}
binding.fab.setOnClickListener(v -> {
if (completed) {
completed = false;
title.setPaintFlags(title.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
binding.fab.setImageResource(R.drawable.ic_check_black_24dp);
} else {
completed = true;
save();
}
});
if (atLeastQ()) {
title.setVerticalScrollbarThumbDrawable(new ColorDrawable(themeColor.getHintOnPrimary()));
}
binding.appbarlayout.addOnOffsetChangedListener(
(appBarLayout, verticalOffset) -> {
if (verticalOffset == 0) {
binding.fab.setVisibility(View.VISIBLE);
title.setVisibility(View.VISIBLE);
binding.collapsingtoolbarlayout.setTitleEnabled(false);
} else if (Math.abs(verticalOffset) >= appBarLayout.getTotalScrollRange()) {
binding.fab.setVisibility(View.INVISIBLE);
} else {
binding.fab.setVisibility(View.VISIBLE);
title.setVisibility(View.INVISIBLE);
binding.collapsingtoolbarlayout.setTitle(title.getText());
binding.collapsingtoolbarlayout.setTitleEnabled(true);
}
});
if (preferences.getBoolean(R.string.p_linkify_task_edit, false)) {
linkify.linkify(title);
}
if (!model.isNew()) { if (!model.isNew()) {
notificationManager.cancel(model.getId()); notificationManager.cancel(model.getId());
@ -155,13 +240,25 @@ public final class TaskEditFragment extends InjectingFragment
} }
fragmentTransaction.commit(); fragmentTransaction.commit();
for (int i = taskEditControlFragments.size() - 2; i > 1; i--) { for (int i = taskEditControlFragments.size() - 1; i > 0; i--) {
binding.controlSets.addView(inflater.inflate(R.layout.task_edit_row_divider, binding.controlSets, false), i); binding.controlSets.addView(inflater.inflate(R.layout.task_edit_row_divider, binding.controlSets, false), i);
} }
return view; return view;
} }
@Override
public void onResume() {
super.onResume();
if (showKeyboard) {
binding.title.requestFocus();
InputMethodManager imm =
(InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(binding.title, InputMethodManager.SHOW_IMPLICIT);
}
}
@Override @Override
public boolean onMenuItemClick(MenuItem item) { public boolean onMenuItemClick(MenuItem item) {
AndroidUtilities.hideKeyboard(getActivity()); AndroidUtilities.hideKeyboard(getActivity());
@ -206,6 +303,11 @@ public final class TaskEditFragment extends InjectingFragment
if (hasChanges(fragments)) { if (hasChanges(fragments)) {
boolean isNewTask = model.isNew(); boolean isNewTask = model.isNew();
TaskListFragment taskListFragment = ((MainActivity) getActivity()).getTaskListFragment(); TaskListFragment taskListFragment = ((MainActivity) getActivity()).getTaskListFragment();
String title = getTitle();
model.setTitle(Strings.isNullOrEmpty(title) ? getString(R.string.no_title) : title);
if (completed != model.isCompleted()) {
model.setCompletionDate(completed ? now() : 0);
}
for (TaskEditControlFragment fragment : for (TaskEditControlFragment fragment :
filter(fragments, not(TaskEditControlFragment::requiresId))) { filter(fragments, not(TaskEditControlFragment::requiresId))) {
fragment.apply(model); fragment.apply(model);
@ -245,10 +347,6 @@ public final class TaskEditFragment extends InjectingFragment
* ====================================================================== * ======================================================================
*/ */
private EditTitleControlSet getEditTitleControlSet() {
return getFragment(EditTitleControlSet.TAG);
}
private RepeatControlSet getRepeatControlSet() { private RepeatControlSet getRepeatControlSet() {
return getFragment(RepeatControlSet.TAG); return getFragment(RepeatControlSet.TAG);
} }
@ -262,7 +360,18 @@ public final class TaskEditFragment extends InjectingFragment
return (T) getChildFragmentManager().findFragmentByTag(getString(tag)); return (T) getChildFragmentManager().findFragmentByTag(getString(tag));
} }
private String getTitle() {
return binding.title.getText().toString().trim();
}
private boolean hasChanges(List<TaskEditControlFragment> fragments) { private boolean hasChanges(List<TaskEditControlFragment> fragments) {
String newTitle = getTitle();
if (!newTitle.equals(model.getTitle())
|| (!model.isNew() && completed != model.isCompleted())
|| (model.isNew() && !Strings.isNullOrEmpty(newTitle))) {
return true;
}
try { try {
for (TaskEditControlFragment fragment : fragments) { for (TaskEditControlFragment fragment : fragments) {
if (fragment.hasChanges(model)) { if (fragment.hasChanges(model)) {
@ -315,20 +424,12 @@ public final class TaskEditFragment extends InjectingFragment
.show(); .show();
} }
void onPriorityChange(int priority) {
getEditTitleControlSet().setPriority(priority);
}
/* /*
* ====================================================================== * ======================================================================
* ========================================== UI component helper classes * ========================================== UI component helper classes
* ====================================================================== * ======================================================================
*/ */
public void onRepeatChanged(boolean repeat) {
getEditTitleControlSet().repeatChanged(repeat);
}
void onDueDateChanged(long dueDate) { void onDueDateChanged(long dueDate) {
RepeatControlSet repeatControlSet = getRepeatControlSet(); RepeatControlSet repeatControlSet = getRepeatControlSet();
if (repeatControlSet != null) { if (repeatControlSet != null) {
@ -351,7 +452,7 @@ public final class TaskEditFragment extends InjectingFragment
} }
userActivity.setMessage(message); userActivity.setMessage(message);
userActivity.setTargetId(model.getUuid()); userActivity.setTargetId(model.getUuid());
userActivity.setCreated(DateUtilities.now()); userActivity.setCreated(now());
userActivityDao.createNew(userActivity); userActivityDao.createNew(userActivity);
commentsController.reloadView(); commentsController.reloadView();
} }

@ -33,7 +33,6 @@ import butterknife.OnItemSelected;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.ical.values.RRule; import com.google.ical.values.RRule;
import com.google.ical.values.WeekdayNum; import com.google.ical.values.WeekdayNum;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import java.text.ParseException; import java.text.ParseException;
import java.util.ArrayList; import java.util.ArrayList;
@ -253,9 +252,5 @@ public class RepeatControlSet extends TaskEditControlFragment {
displayView.setText(repeatRuleToString.toString(rrule)); displayView.setText(repeatRuleToString.toString(rrule));
repeatTypeContainer.setVisibility(View.VISIBLE); repeatTypeContainer.setVisibility(View.VISIBLE);
} }
TaskEditFragment targetFragment = (TaskEditFragment) getParentFragment();
if (targetFragment != null) {
targetFragment.onRepeatChanged(rrule != null);
}
} }
} }

@ -1,192 +0,0 @@
/*
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.ui;
import static com.todoroo.andlib.utility.DateUtilities.now;
import android.content.Context;
import android.graphics.Paint;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import androidx.annotation.Nullable;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.OnTextChanged;
import com.google.common.base.Strings;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.TaskCompleter;
import javax.inject.Inject;
import org.tasks.R;
import org.tasks.dialogs.Linkify;
import org.tasks.injection.ForApplication;
import org.tasks.injection.FragmentComponent;
import org.tasks.preferences.Preferences;
import org.tasks.ui.CheckBoxProvider;
import org.tasks.ui.TaskEditControlFragment;
/**
* Control set for mapping a Property to an EditText
*
* @author Tim Su <tim@todoroo.com>
*/
public class EditTitleControlSet extends TaskEditControlFragment {
public static final int TAG = R.string.TEA_ctrl_title_pref;
private static final String EXTRA_COMPLETE = "extra_complete";
private static final String EXTRA_TITLE = "extra_title";
private static final String EXTRA_REPEATING = "extra_repeating";
private static final String EXTRA_PRIORITY = "extra_priority";
@Inject @ForApplication Context context;
@Inject TaskCompleter taskCompleter;
@Inject Linkify linkify;
@Inject CheckBoxProvider checkBoxProvider;
@Inject Preferences preferences;
@BindView(R.id.title)
EditText editText;
@BindView(R.id.completeBox)
CheckableImageView completeBox;
private boolean showKeyboard;
private boolean isComplete;
private boolean isRepeating;
private int importanceValue;
private String title;
@Override
protected void inject(FragmentComponent component) {
component.inject(this);
}
@Nullable
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(getLayout(), null);
ButterKnife.bind(this, view);
if (savedInstanceState == null) {
isComplete = task.isCompleted();
title = task.getTitle();
isRepeating = !TextUtils.isEmpty(task.getRecurrence());
importanceValue = task.getPriority();
showKeyboard = task.isNew() && Strings.isNullOrEmpty(title);
} else {
isComplete = savedInstanceState.getBoolean(EXTRA_COMPLETE);
title = savedInstanceState.getString(EXTRA_TITLE);
isRepeating = savedInstanceState.getBoolean(EXTRA_REPEATING);
importanceValue = savedInstanceState.getInt(EXTRA_PRIORITY);
}
completeBox.setChecked(isComplete);
editText.setTextKeepState(title);
editText.setHorizontallyScrolling(false);
editText.setLines(1);
editText.setMaxLines(Integer.MAX_VALUE);
if (preferences.getBoolean(R.string.p_linkify_task_edit, false)) {
linkify.linkify(editText);
}
updateCompleteBox();
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(EXTRA_COMPLETE, isComplete);
outState.putString(EXTRA_TITLE, title);
outState.putBoolean(EXTRA_REPEATING, isRepeating);
outState.putInt(EXTRA_PRIORITY, importanceValue);
}
@OnClick(R.id.completeBox)
void toggleComplete(View view) {
updateCompleteBox();
}
@Override
public void onResume() {
super.onResume();
if (showKeyboard) {
editText.requestFocus();
InputMethodManager imm =
(InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
}
@OnTextChanged(R.id.title)
void onTextChanged(CharSequence text) {
this.title = text.toString().trim();
}
public void setPriority(int priority) {
importanceValue = priority;
updateCompleteBox();
}
public void repeatChanged(boolean repeat) {
isRepeating = repeat;
updateCompleteBox();
}
private void updateCompleteBox() {
isComplete = completeBox.isChecked();
completeBox.setImageDrawable(
checkBoxProvider.getCheckBox(isComplete, isRepeating, importanceValue));
if (isComplete) {
editText.setPaintFlags(editText.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
} else {
editText.setPaintFlags(editText.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
}
}
@Override
protected int getLayout() {
return R.layout.control_set_title;
}
@Override
public int getIcon() {
return -1;
}
@Override
public int controlId() {
return TAG;
}
@Override
public boolean hasChanges(Task original) {
return !title.equals(original.getTitle())
|| isComplete != original.isCompleted()
|| (original.isNew() && !Strings.isNullOrEmpty(title));
}
@Override
public void apply(Task task) {
task.setTitle(Strings.isNullOrEmpty(title) ? getString(R.string.no_title) : title);
if (task.isNew()) {
task.setCompletionDate(isComplete ? now() : 0);
} else if (isComplete != task.isCompleted()) {
taskCompleter.setComplete(task, isComplete);
}
}
}

@ -10,7 +10,6 @@ import com.todoroo.astrid.files.FilesControlSet;
import com.todoroo.astrid.repeats.RepeatControlSet; import com.todoroo.astrid.repeats.RepeatControlSet;
import com.todoroo.astrid.tags.TagsControlSet; import com.todoroo.astrid.tags.TagsControlSet;
import com.todoroo.astrid.timers.TimerControlSet; import com.todoroo.astrid.timers.TimerControlSet;
import com.todoroo.astrid.ui.EditTitleControlSet;
import com.todoroo.astrid.ui.HideUntilControlSet; import com.todoroo.astrid.ui.HideUntilControlSet;
import com.todoroo.astrid.ui.ReminderControlSet; import com.todoroo.astrid.ui.ReminderControlSet;
import java.util.ArrayList; import java.util.ArrayList;
@ -36,7 +35,6 @@ public class TaskEditControlSetFragmentManager {
public static final int[] TASK_EDIT_CONTROL_FRAGMENT_ROWS = public static final int[] TASK_EDIT_CONTROL_FRAGMENT_ROWS =
new int[] { new int[] {
R.id.row_title,
R.id.comment_bar, R.id.comment_bar,
R.id.row_1, R.id.row_1,
R.id.row_2, R.id.row_2,
@ -55,7 +53,6 @@ public class TaskEditControlSetFragmentManager {
private static final int[] TASK_EDIT_CONTROL_SET_FRAGMENTS = private static final int[] TASK_EDIT_CONTROL_SET_FRAGMENTS =
new int[] { new int[] {
EditTitleControlSet.TAG,
DeadlineControlSet.TAG, DeadlineControlSet.TAG,
TimerControlSet.TAG, TimerControlSet.TAG,
DescriptionControlSet.TAG, DescriptionControlSet.TAG,
@ -87,8 +84,7 @@ public class TaskEditControlSetFragmentManager {
@Inject @Inject
public TaskEditControlSetFragmentManager(@ForActivity Context context, Preferences preferences) { public TaskEditControlSetFragmentManager(@ForActivity Context context, Preferences preferences) {
displayOrder = BeastModePreferences.constructOrderedControlList(preferences, context); displayOrder = BeastModePreferences.constructOrderedControlList(preferences, context);
displayOrder.add(0, context.getString(EditTitleControlSet.TAG)); displayOrder.add(0, context.getString(CommentBarFragment.TAG));
displayOrder.add(1, context.getString(CommentBarFragment.TAG));
String hideAlwaysTrigger = context.getString(R.string.TEA_ctrl_hide_section_pref); String hideAlwaysTrigger = context.getString(R.string.TEA_ctrl_hide_section_pref);
for (numRows = 0; numRows < displayOrder.size(); numRows++) { for (numRows = 0; numRows < displayOrder.size(); numRows++) {
if (displayOrder.get(numRows).equals(hideAlwaysTrigger)) { if (displayOrder.get(numRows).equals(hideAlwaysTrigger)) {
@ -138,8 +134,6 @@ public class TaskEditControlSetFragmentManager {
private TaskEditControlFragment createFragment(int fragmentId) { private TaskEditControlFragment createFragment(int fragmentId) {
switch (fragmentId) { switch (fragmentId) {
case EditTitleControlSet.TAG:
return new EditTitleControlSet();
case DeadlineControlSet.TAG: case DeadlineControlSet.TAG:
return new DeadlineControlSet(); return new DeadlineControlSet();
case PriorityControlSet.TAG: case PriorityControlSet.TAG:

@ -7,7 +7,6 @@ import com.todoroo.astrid.files.FilesControlSet;
import com.todoroo.astrid.repeats.RepeatControlSet; import com.todoroo.astrid.repeats.RepeatControlSet;
import com.todoroo.astrid.tags.TagsControlSet; import com.todoroo.astrid.tags.TagsControlSet;
import com.todoroo.astrid.timers.TimerControlSet; import com.todoroo.astrid.timers.TimerControlSet;
import com.todoroo.astrid.ui.EditTitleControlSet;
import com.todoroo.astrid.ui.HideUntilControlSet; import com.todoroo.astrid.ui.HideUntilControlSet;
import com.todoroo.astrid.ui.ReminderControlSet; import com.todoroo.astrid.ui.ReminderControlSet;
import dagger.Subcomponent; import dagger.Subcomponent;
@ -51,8 +50,6 @@ public interface FragmentComponent {
void inject(CommentBarFragment commentBarFragment); void inject(CommentBarFragment commentBarFragment);
void inject(EditTitleControlSet editTitleControlSet);
void inject(FilesControlSet filesControlSet); void inject(FilesControlSet filesControlSet);
void inject(TagsControlSet tagsControlSet); void inject(TagsControlSet tagsControlSet);

@ -166,7 +166,9 @@ object CustomIcons {
1126 to R.drawable.ic_outline_palette_24px, 1126 to R.drawable.ic_outline_palette_24px,
1127 to R.drawable.ic_outline_sd_storage_24px, 1127 to R.drawable.ic_outline_sd_storage_24px,
1128 to R.drawable.ic_baseline_lens_24px, 1128 to R.drawable.ic_baseline_lens_24px,
1129 to R.drawable.ic_map_24px 1129 to R.drawable.ic_map_24px,
1130 to R.drawable.ic_check_black_24dp,
1131 to R.drawable.ic_undo_24px
) )
@kotlin.jvm.JvmStatic @kotlin.jvm.JvmStatic

@ -166,6 +166,7 @@ public class ThemeColor implements Pickable {
private final int original; private final int original;
private final int colorOnPrimary; private final int colorOnPrimary;
private final int hintOnPrimary;
private final int colorPrimary; private final int colorPrimary;
private final int colorPrimaryVariant; private final int colorPrimaryVariant;
private final boolean isDark; private final boolean isDark;
@ -186,7 +187,13 @@ public class ThemeColor implements Pickable {
double contrast = ColorUtils.calculateContrast(WHITE, colorPrimary); double contrast = ColorUtils.calculateContrast(WHITE, colorPrimary);
isDark = contrast < 3; isDark = contrast < 3;
colorOnPrimary = isDark ? context.getResources().getColor(R.color.black_87) : WHITE; if (isDark) {
colorOnPrimary = context.getResources().getColor(R.color.black_87);
hintOnPrimary = context.getResources().getColor(R.color.black_60);
} else {
colorOnPrimary = WHITE;
hintOnPrimary = context.getResources().getColor(R.color.white_87);
}
} }
private ThemeColor(Parcel source) { private ThemeColor(Parcel source) {
@ -195,6 +202,7 @@ public class ThemeColor implements Pickable {
colorPrimaryVariant = source.readInt(); colorPrimaryVariant = source.readInt();
isDark = ParcelCompat.readBoolean(source); isDark = ParcelCompat.readBoolean(source);
original = source.readInt(); original = source.readInt();
hintOnPrimary = source.readInt();
} }
public static ThemeColor getLauncherColor(Context context, int index) { public static ThemeColor getLauncherColor(Context context, int index) {
@ -255,6 +263,15 @@ public class ThemeColor implements Pickable {
layout.setStatusBarScrimColor(colorPrimaryVariant); layout.setStatusBarScrimColor(colorPrimaryVariant);
} }
public void apply(CollapsingToolbarLayout layout, Toolbar toolbar) {
setStatusBarColor(layout);
layout.setBackgroundColor(colorPrimary);
layout.setCollapsedTitleTextColor(colorOnPrimary);
layout.setExpandedTitleColor(colorOnPrimary);
toolbar.setNavigationIcon(colorDrawable(toolbar.getNavigationIcon(), colorOnPrimary));
colorMenu(toolbar.getMenu(), colorOnPrimary);
}
public void applyToStatusBarIcons(Activity activity) { public void applyToStatusBarIcons(Activity activity) {
if (atLeastMarshmallow()) { if (atLeastMarshmallow()) {
View decorView = activity.getWindow().getDecorView(); View decorView = activity.getWindow().getDecorView();
@ -330,6 +347,10 @@ public class ThemeColor implements Pickable {
return colorOnPrimary; return colorOnPrimary;
} }
public int getHintOnPrimary() {
return hintOnPrimary;
}
public void apply(Toolbar toolbar) { public void apply(Toolbar toolbar) {
toolbar.setBackgroundColor(getPrimaryColor()); toolbar.setBackgroundColor(getPrimaryColor());
toolbar.setNavigationIcon(colorDrawable(toolbar.getNavigationIcon(), colorOnPrimary)); toolbar.setNavigationIcon(colorDrawable(toolbar.getNavigationIcon(), colorOnPrimary));
@ -349,6 +370,7 @@ public class ThemeColor implements Pickable {
dest.writeInt(colorPrimaryVariant); dest.writeInt(colorPrimaryVariant);
ParcelCompat.writeBoolean(dest, isDark); ParcelCompat.writeBoolean(dest, isDark);
dest.writeInt(original); dest.writeInt(original);
dest.writeInt(hintOnPrimary);
} }
public void colorMenu(Menu menu) { public void colorMenu(Menu menu) {

@ -1,6 +1,5 @@
package org.tasks.ui; package org.tasks.ui;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.os.Bundle; import android.os.Bundle;
@ -41,16 +40,8 @@ public class PriorityControlSet extends TaskEditControlFragment {
@BindView(R.id.priority_none) @BindView(R.id.priority_none)
AppCompatRadioButton priorityNone; AppCompatRadioButton priorityNone;
private OnPriorityChanged callback;
private @Priority int priority; private @Priority int priority;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
callback = (OnPriorityChanged) activity;
}
@Override @Override
protected void inject(FragmentComponent component) { protected void inject(FragmentComponent component) {
component.inject(this); component.inject(this);
@ -59,7 +50,6 @@ public class PriorityControlSet extends TaskEditControlFragment {
@OnClick({R.id.priority_high, R.id.priority_medium, R.id.priority_low, R.id.priority_none}) @OnClick({R.id.priority_high, R.id.priority_medium, R.id.priority_low, R.id.priority_none})
void onPriorityChanged(CompoundButton button) { void onPriorityChanged(CompoundButton button) {
priority = getPriority(); priority = getPriority();
callback.onPriorityChange(priority);
} }
@Nullable @Nullable
@ -143,9 +133,4 @@ public class PriorityControlSet extends TaskEditControlFragment {
} }
return Priority.NONE; return Priority.NONE;
} }
public interface OnPriorityChanged {
void onPriorityChange(int priority);
}
} }

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M12.5,8c-2.65,0 -5.05,0.99 -6.9,2.6L2,7v9h9l-3.62,-3.62c1.39,-1.16 3.16,-1.88 5.12,-1.88 3.54,0 6.55,2.31 7.6,5.5l2.37,-0.78C21.08,11.03 17.15,8 12.5,8z"/>
</vector>

@ -1,59 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><!--
** Copyright (c) 2012 Todoroo Inc
**
** See the file "LICENSE" for the full license governing this code.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
android:orientation="horizontal"
android:paddingStart="0dp"
android:paddingLeft="0dp"
android:paddingTop="@dimen/task_edit_drawable_padding_top_bottom"
android:paddingEnd="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_first"
android:paddingBottom="@dimen/task_edit_drawable_padding_top_bottom">
<com.todoroo.astrid.ui.CheckableImageView
android:id="@+id/completeBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_gravity="top"
android:paddingStart="@dimen/keyline_first"
android:paddingEnd="@dimen/keyline_second"
android:paddingLeft="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_second"
android:scaleType="center"/>
<EditText
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/completeBox"
android:layout_toRightOf="@id/completeBox"
android:background="@null"
android:freezesText="true"
android:gravity="start"
android:hint="@string/TEA_title_hint"
android:imeOptions="flagNoExtractUi"
android:inputType="textCapSentences|textAutoCorrect"
android:nextFocusLeft="@id/title"
android:nextFocusUp="@id/title"
android:scrollbars="vertical"
android:textAlignment="viewStart"/>
</RelativeLayout>
<View style="@style/horizontal_divider"/>
</LinearLayout>

@ -3,113 +3,176 @@
** **
** See the file "LICENSE" for the full license governing this code. ** See the file "LICENSE" for the full license governing this code.
--> -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_width="match_parent"
android:layout_height="fill_parent" android:layout_height="match_parent"
android:orientation="vertical"> xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<include
android:id="@+id/toolbar" <com.google.android.material.appbar.AppBarLayout
layout="@layout/toolbar" /> android:id="@+id/appbarlayout"
android:layout_width="match_parent"
<androidx.core.widget.NestedScrollView android:layout_height="wrap_content">
android:scrollbarStyle="outsideOverlay"
android:layout_width="fill_parent" <com.google.android.material.appbar.CollapsingToolbarLayout
android:layout_height="0dp" android:id="@+id/collapsingtoolbarlayout"
android:layout_weight="100" android:layout_width="match_parent"
android:elevation="0dp" android:layout_height="wrap_content"
android:overScrollMode="never"> app:collapsedTitleTextAppearance="?attr/textAppearanceHeadline6"
app:expandedTitleGravity="top"
app:expandedTitleMarginTop="?attr/actionBarSize"
app:expandedTitleMarginStart="@dimen/keyline_first"
app:expandedTitleTextAppearance="?attr/textAppearanceHeadline5"
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">
<EditText
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="?attr/actionBarSize"
android:paddingLeft="@dimen/keyline_first"
android:paddingStart="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_first"
android:paddingEnd="@dimen/keyline_first"
android:paddingBottom="@dimen/keyline_second"
android:layout_gravity="top"
android:background="@null"
android:gravity="start"
android:freezesText="true"
android:textAppearance="?attr/textAppearanceHeadline5"
android:hint="@string/TEA_title_hint"
android:imeOptions="flagNoExtractUi"
android:inputType="textCapSentences|textAutoCorrect"
android:scrollbars="vertical"
android:textAlignment="viewStart" />
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:elevation="@dimen/elevation_toolbar"
app:layout_collapseMode="pin"
android:theme="?attr/overlay_theme"
app:popupTheme="@style/popup_overlay"
app:titleTextColor="?attr/colorOnPrimary"
app:toolbarStyle="@style/Widget.MaterialComponents.Toolbar"
tools:ignore="UnusedAttribute" />
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
<LinearLayout <LinearLayout
android:id="@+id/control_sets"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="fill_parent"
android:gravity="center_horizontal" android:orientation="vertical"
android:orientation="vertical"> app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
<FrameLayout <androidx.core.widget.NestedScrollView
android:id="@+id/row_title" android:scrollbarStyle="outsideOverlay"
android:layout_width="match_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content"/> android:layout_height="0dp"
android:layout_weight="100"
<FrameLayout android:elevation="0dp"
android:id="@+id/row_1" android:overScrollMode="never">
android:layout_width="match_parent"
android:layout_height="wrap_content"/> <LinearLayout
android:id="@+id/control_sets"
<FrameLayout android:layout_width="fill_parent"
android:id="@+id/row_2" android:layout_height="wrap_content"
android:layout_width="match_parent" android:gravity="center_horizontal"
android:layout_height="wrap_content"/> android:orientation="vertical">
<FrameLayout <FrameLayout
android:id="@+id/row_3" android:id="@+id/row_1"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content" />
<FrameLayout <FrameLayout
android:id="@+id/row_4" android:id="@+id/row_2"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content" />
<FrameLayout <FrameLayout
android:id="@+id/row_5" android:id="@+id/row_3"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content" />
<FrameLayout <FrameLayout
android:id="@+id/row_6" android:id="@+id/row_4"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content" />
<FrameLayout <FrameLayout
android:id="@+id/row_7" android:id="@+id/row_5"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content" />
<FrameLayout <FrameLayout
android:id="@+id/row_8" android:id="@+id/row_6"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content" />
<FrameLayout <FrameLayout
android:id="@+id/row_9" android:id="@+id/row_7"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content" />
<FrameLayout <FrameLayout
android:id="@+id/row_10" android:id="@+id/row_8"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content" />
<FrameLayout <FrameLayout
android:id="@+id/row_11" android:id="@+id/row_9"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content" />
<FrameLayout <FrameLayout
android:id="@+id/row_12" android:id="@+id/row_10"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content" />
<FrameLayout <FrameLayout
android:id="@+id/row_13" android:id="@+id/row_11"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content" />
<LinearLayout <FrameLayout
android:id="@+id/comments" android:id="@+id/row_12"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content" />
android:orientation="vertical"/>
<FrameLayout
android:id="@+id/row_13"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:id="@+id/comments"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<FrameLayout
android:id="@+id/comment_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="@dimen/elevation_toolbar" />
</LinearLayout> </LinearLayout>
</androidx.core.widget.NestedScrollView>
<FrameLayout
android:id="@+id/comment_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="@dimen/elevation_toolbar"/>
</LinearLayout> <com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/keyline_first"
android:src="@drawable/ic_check_black_24dp"
android:tint="?attr/colorOnSecondary"
android:background="?attr/colorSecondary"
app:layout_anchor="@id/appbarlayout"
app:layout_anchorGravity="bottom|right|end" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

@ -182,7 +182,6 @@
<item>@string/TEA_control_hidden_section</item> <item>@string/TEA_control_hidden_section</item>
</string-array> </string-array>
<string name="TEA_ctrl_title_pref">TEA_ctrl_title_pref</string> <!-- Deprecated -->
<string name="TEA_ctrl_when_pref">TEA_ctrl_when_pref</string> <string name="TEA_ctrl_when_pref">TEA_ctrl_when_pref</string>
<string name="TEA_ctrl_repeat_pref">TEA_ctrl_repeat_pref</string> <string name="TEA_ctrl_repeat_pref">TEA_ctrl_repeat_pref</string>
<string name="TEA_ctrl_importance_pref">TEA_ctrl_importance_pref</string> <string name="TEA_ctrl_importance_pref">TEA_ctrl_importance_pref</string>

Loading…
Cancel
Save