diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 9ed0ffe17..686e6e178 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -174,26 +174,6 @@ - - - - - - - - - - - - - - - callApiMethod to ensure - * you really pass an Activity-instance. - * - * @param activity the activity-instance for which to set the finish-transition - * @param enterAnim the incoming-transition of the next activity - * @param exitAnim the outgoing-transition of this activity - */ - public static void callOverridePendingTransition(Activity activity, int enterAnim, int exitAnim) { - activity.overridePendingTransition(enterAnim, exitAnim); - } - /** * Capitalize the first character */ diff --git a/src/main/java/com/todoroo/astrid/actfm/FilterSettingsActivity.java b/src/main/java/com/todoroo/astrid/actfm/FilterSettingsActivity.java index 82328a976..6f7736af2 100644 --- a/src/main/java/com/todoroo/astrid/actfm/FilterSettingsActivity.java +++ b/src/main/java/com/todoroo/astrid/actfm/FilterSettingsActivity.java @@ -18,7 +18,6 @@ import android.view.MenuItem; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; -import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.CustomFilter; import com.todoroo.astrid.dao.StoreObjectDao; @@ -94,7 +93,6 @@ public class FilterSettingsActivity extends InjectingAppCompatActivity { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(filterName.getWindowToken(), 0); super.finish(); - AndroidUtilities.callOverridePendingTransition(this, R.anim.slide_right_in, R.anim.slide_right_out); } @Override diff --git a/src/main/java/com/todoroo/astrid/actfm/TagSettingsActivity.java b/src/main/java/com/todoroo/astrid/actfm/TagSettingsActivity.java index ef2b39d3a..9ada1eed4 100644 --- a/src/main/java/com/todoroo/astrid/actfm/TagSettingsActivity.java +++ b/src/main/java/com/todoroo/astrid/actfm/TagSettingsActivity.java @@ -23,7 +23,6 @@ import android.widget.EditText; import android.widget.TextView; import com.todoroo.andlib.sql.Criterion; -import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.TagDataDao; @@ -153,7 +152,6 @@ public class TagSettingsActivity extends InjectingAppCompatActivity { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(tagName.getWindowToken(), 0); super.finish(); - AndroidUtilities.callOverridePendingTransition(this, R.anim.slide_right_in, R.anim.slide_right_out); } @Override diff --git a/src/main/java/com/todoroo/astrid/activity/AstridActivity.java b/src/main/java/com/todoroo/astrid/activity/AstridActivity.java deleted file mode 100644 index 8872dab7c..000000000 --- a/src/main/java/com/todoroo/astrid/activity/AstridActivity.java +++ /dev/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.activity; - -import android.app.FragmentTransaction; -import android.content.Intent; -import android.os.Bundle; -import android.view.View; - -import com.todoroo.andlib.utility.AndroidUtilities; -import com.todoroo.astrid.api.Filter; -import com.todoroo.astrid.api.FilterWithCustomIntent; -import com.todoroo.astrid.data.TagData; -import com.todoroo.astrid.data.Task; -import com.todoroo.astrid.repeats.RepeatControlSet; -import com.todoroo.astrid.service.StartupService; -import com.todoroo.astrid.service.UpgradeActivity; -import com.todoroo.astrid.subtasks.SubtasksHelper; -import com.todoroo.astrid.timers.TimerControlSet; - -import org.tasks.R; -import org.tasks.injection.InjectingAppCompatActivity; -import org.tasks.ui.NavigationDrawerFragment; -import org.tasks.ui.PriorityControlSet; - -import javax.inject.Inject; - -import timber.log.Timber; - -/** - * This wrapper activity contains all the glue-code to handle the callbacks between the different - * fragments that could be visible on the screen in landscape-mode. - * So, it basically contains all the callback-code from the filterlist-fragment, the tasklist-fragments - * and the taskedit-fragment (and possibly others that should be handled). - * Using this AstridWrapperActivity helps to avoid duplicated code because its all gathered here for sub-wrapperactivities - * to use. - * - * @author Arne - * - */ -public abstract class AstridActivity extends InjectingAppCompatActivity implements - TaskListFragment.OnTaskListItemClickedListener, - PriorityControlSet.OnPriorityChanged, - TimerControlSet.TimerControlSetCallback, - RepeatControlSet.RepeatChangedListener { - - public static final int LAYOUT_SINGLE = 0; - public static final int LAYOUT_DOUBLE = 1; - - public static final int REQUEST_UPGRADE = 505; - - protected int fragmentLayout = LAYOUT_SINGLE; - - public TaskListFragment getTaskListFragment() { - return (TaskListFragment) getFragmentManager() - .findFragmentByTag(TaskListFragment.TAG_TASKLIST_FRAGMENT); - } - - public TaskEditFragment getTaskEditFragment() { - return (TaskEditFragment) getFragmentManager() - .findFragmentByTag(TaskEditFragment.TAG_TASKEDIT_FRAGMENT); - } - - @Inject StartupService startupService; - @Inject SubtasksHelper subtasksHelper; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - startupService.onStartupApplication(this); - } - - protected Bundle configureIntentAndExtrasWithFilter(Intent intent, Filter filter) { - if(filter instanceof FilterWithCustomIntent) { - int lastSelectedList = intent.getIntExtra(NavigationDrawerFragment.TOKEN_LAST_SELECTED, 0); - intent = ((FilterWithCustomIntent)filter).getCustomIntent(); - intent.putExtra(NavigationDrawerFragment.TOKEN_LAST_SELECTED, lastSelectedList); - } else { - intent.putExtra(TaskListFragment.TOKEN_FILTER, filter); - } - - setIntent(intent); - - Bundle extras = intent.getExtras(); - if (extras != null) { - extras = (Bundle) extras.clone(); - } - return extras; - } - - public void setupActivityFragment(TagData tagData) { - if (fragmentLayout == LAYOUT_SINGLE) { - return; - } - - if (fragmentLayout == LAYOUT_DOUBLE) { - findViewById(R.id.taskedit_fragment_container).setVisibility(View.VISIBLE); - } - } - - @Override - public void onTaskListItemClicked(long taskId) { - Intent intent = new Intent(this, TaskEditActivity.class); - intent.putExtra(TaskEditFragment.TOKEN_ID, taskId); - getIntent().putExtra(TaskEditFragment.TOKEN_ID, taskId); // Needs to be in activity intent so that TEA onResume doesn't create a blank activity - if (getIntent().hasExtra(TaskListFragment.TOKEN_FILTER)) { - intent.putExtra(TaskListFragment.TOKEN_FILTER, getIntent().getParcelableExtra(TaskListFragment.TOKEN_FILTER)); - } - - startEditActivity(intent); - } - - protected void startEditActivity(Intent intent) { - if (fragmentLayout == LAYOUT_SINGLE) { - startActivityForResult(intent, TaskListFragment.ACTIVITY_EDIT_TASK); - AndroidUtilities.callOverridePendingTransition(this, R.anim.slide_left_in, R.anim.slide_left_out); - } else { - TaskEditFragment editActivity = getTaskEditFragment(); - findViewById(R.id.taskedit_fragment_container).setVisibility(View.VISIBLE); - - if(editActivity == null) { - editActivity = new TaskEditFragment(); - FragmentTransaction transaction = getFragmentManager().beginTransaction(); - transaction.add(R.id.taskedit_fragment_container, editActivity, TaskEditFragment.TAG_TASKEDIT_FRAGMENT); - transaction.addToBackStack(null); - transaction.commit(); - runOnUiThread(new Runnable() { - @Override - public void run() { - // Force the transaction to occur so that we can be guaranteed of the fragment existing if we try to present it - getFragmentManager().executePendingTransactions(); - } - }); - } else { - editActivity.save(true); - editActivity.repopulateFromScratch(intent); - } - - TaskListFragment tlf = getTaskListFragment(); - if (tlf != null) { - tlf.loadTaskListContent(); - } - } - } - - @Override - public void onBackPressed() { - if (isFinishing()) { - return; - } - super.onBackPressed(); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == REQUEST_UPGRADE) { - if (resultCode == RESULT_OK) { - if (data != null && data.getBooleanExtra(UpgradeActivity.EXTRA_RESTART, false)) { - Timber.w("Upgrade requires restart"); - finish(); - startActivity(getIntent()); - } - } - } else { - super.onActivityResult(requestCode, resultCode, data); - } - } - - @Override - public void onPriorityChange(int priority) { - getTaskEditFragment().onPriorityChange(priority); - } - - @Override - public void repeatChanged(boolean repeat) { - getTaskEditFragment().onRepeatChanged(repeat); - } - - @Override - public Task stopTimer() { - return getTaskEditFragment().stopTimer(); - } - - @Override - public Task startTimer() { - return getTaskEditFragment().startTimer(); - } -} diff --git a/src/main/java/com/todoroo/astrid/activity/TaskEditActivity.java b/src/main/java/com/todoroo/astrid/activity/TaskEditActivity.java deleted file mode 100644 index 15cd4abd4..000000000 --- a/src/main/java/com/todoroo/astrid/activity/TaskEditActivity.java +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Copyright (c) 2012 Todoroo Inc - * - * See the file "LICENSE" for the full license governing this code. - */ -package com.todoroo.astrid.activity; - -import android.app.Fragment; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.support.v4.graphics.drawable.DrawableCompat; -import android.support.v7.app.ActionBar; -import android.support.v7.widget.Toolbar; -import android.view.KeyEvent; - -import com.todoroo.andlib.utility.AndroidUtilities; - -import org.tasks.ui.CalendarControlSet; -import org.tasks.ui.DescriptionControlSet; - -import org.tasks.R; -import org.tasks.preferences.ActivityPreferences; -import org.tasks.ui.PriorityControlSet; - -import javax.inject.Inject; - -import butterknife.Bind; -import butterknife.ButterKnife; - -public class TaskEditActivity extends AstridActivity { - - @Inject ActivityPreferences preferences; - - @Bind(R.id.toolbar) Toolbar toolbar; - - /** - * @see android.app.Activity#onCreate(Bundle) - */ - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - preferences.applyThemeAndStatusBarColor(); - - setContentView(R.layout.task_edit_wrapper_activity); - ButterKnife.bind(this); - - setSupportActionBar(toolbar); - ActionBar supportActionBar = getSupportActionBar(); - if (supportActionBar != null) { - supportActionBar.setDisplayHomeAsUpEnabled(true); - supportActionBar.setDisplayShowTitleEnabled(false); - Drawable drawable = DrawableCompat.wrap(getResources().getDrawable(R.drawable.ic_arrow_back_24dp)); - DrawableCompat.setTint(drawable, getResources().getColor(android.R.color.white)); - supportActionBar.setHomeAsUpIndicator(drawable); - } - } - - @Override - protected void onResume() { - super.onResume(); - - Fragment frag = getFragmentManager() - .findFragmentByTag(TaskListFragment.TAG_TASKLIST_FRAGMENT); - if (frag == null) { - fragmentLayout = LAYOUT_SINGLE; - } - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - TaskEditFragment frag = (TaskEditFragment) getFragmentManager() - .findFragmentByTag(TaskEditFragment.TAG_TASKEDIT_FRAGMENT); - if (frag != null && frag.isInLayout()) { - return frag.onKeyDown(keyCode); - } - return super.onKeyDown(keyCode, event); - } - - @Override - public void finish() { - super.finish(); - AndroidUtilities.callOverridePendingTransition(this, R.anim.slide_right_in, R.anim.slide_right_out); - } -} diff --git a/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java b/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java index 8bb9ec327..099d112aa 100755 --- a/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java +++ b/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java @@ -6,9 +6,6 @@ package com.todoroo.astrid.activity; import android.app.Activity; -import android.app.FragmentManager; -import android.app.FragmentTransaction; -import android.content.ContentValues; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -17,7 +14,6 @@ import android.os.Bundle; import android.os.Handler; import android.support.v4.view.ViewPager; import android.text.TextUtils; -import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -29,30 +25,22 @@ import android.view.ViewGroup.LayoutParams; import android.view.ViewParent; import android.widget.EditText; import android.widget.FrameLayout; -import android.widget.LinearLayout; import android.widget.ScrollView; import com.todoroo.andlib.utility.AndroidUtilities; -import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.actfm.ActFmCameraModule; -import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.UserActivityDao; -import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.TaskAttachment; import com.todoroo.astrid.files.AACRecordingActivity; import com.todoroo.astrid.files.FilesControlSet; import com.todoroo.astrid.notes.EditNoteActivity; -import com.todoroo.astrid.repeats.RepeatControlSet; import com.todoroo.astrid.service.TaskDeleter; import com.todoroo.astrid.service.TaskService; -import com.todoroo.astrid.tags.TagsControlSet; import com.todoroo.astrid.timers.TimerControlSet; import com.todoroo.astrid.timers.TimerPlugin; import com.todoroo.astrid.ui.EditTitleControlSet; -import com.todoroo.astrid.ui.HideUntilControlSet; -import com.todoroo.astrid.ui.ReminderControlSet; import com.todoroo.astrid.utility.Flags; import org.tasks.R; @@ -62,24 +50,13 @@ import org.tasks.injection.ForActivity; import org.tasks.injection.InjectingFragment; import org.tasks.notifications.NotificationManager; import org.tasks.preferences.ActivityPreferences; -import org.tasks.ui.CalendarControlSet; -import org.tasks.ui.DeadlineControlSet; -import org.tasks.ui.DescriptionControlSet; import org.tasks.ui.MenuColorizer; -import org.tasks.ui.PriorityControlSet; import org.tasks.ui.TaskEditControlFragment; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - import javax.inject.Inject; import butterknife.Bind; import butterknife.ButterKnife; -import timber.log.Timber; import static android.app.Activity.RESULT_OK; @@ -93,16 +70,22 @@ import static android.app.Activity.RESULT_OK; */ public final class TaskEditFragment extends InjectingFragment implements EditNoteActivity.UpdatesChangedListener { + public interface TaskEditFragmentCallbackHandler { + void taskEditFinished(); + } + + public static TaskEditFragment newTaskEditFragment(boolean isNewTask, Task task) { + TaskEditFragment taskEditFragment = new TaskEditFragment(); + taskEditFragment.isNewTask = isNewTask; + taskEditFragment.model = task; + taskEditFragment.applyModel = true; + return taskEditFragment; + } + public static final String TAG_TASKEDIT_FRAGMENT = "taskedit_fragment"; //$NON-NLS-1$ // --- bundle tokens - /** - * Task ID - */ - public static final String TOKEN_ID = "id"; //$NON-NLS-1$ - public static final String TOKEN_UUID = "uuid"; - /** * Content Values to set */ @@ -111,12 +94,8 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot /** * Task in progress (during orientation change) */ - private static final String TASK_IN_PROGRESS = "task_in_progress"; //$NON-NLS-1$ - - /** - * Task remote id (during orientation change) - */ - private static final String TASK_UUID = "task_uuid"; //$NON-NLS-1$ + private static final String EXTRA_TASK = "extra_task"; //$NON-NLS-1$ + private static final String EXTRA_APPLY_MODEL = "extra_apply_model"; /** * Token for saving a bitmap in the intent before it has been added with a comment @@ -128,12 +107,6 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot public static final int REQUEST_CODE_RECORD = 30; // TODO: move this to file control set public static final int REQUEST_CODE_CAMERA = 60; - // --- result codes - - public static final String OVERRIDE_FINISH_ANIM = "finishAnim"; //$NON-NLS-1$ - - public static final String TOKEN_TAGS_CHANGED = "tags_changed"; //$NON-NLS-1$ - // --- services public static final int TAB_VIEW_UPDATES = 0; @@ -150,16 +123,27 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot // --- UI components - private final Map controlSetFragments = new HashMap<>(); - private final List displayedFragments = new ArrayList<>(); private EditNoteActivity editNotes; @Bind(R.id.pager) ViewPager mPager; @Bind(R.id.updatesFooter) View commentsBar; - @Bind(R.id.basic_controls) LinearLayout basicControls; @Bind(R.id.edit_scroll) ScrollView scrollView; @Bind(R.id.commentField) EditText commentField; + public static final int[] rowIds = new int[] { + R.id.row_1, + R.id.row_2, + R.id.row_3, + R.id.row_4, + R.id.row_5, + R.id.row_6, + R.id.row_7, + R.id.row_8, + R.id.row_9, + R.id.row_10, + R.id.row_11, + }; + // --- other instance variables /** true if editing started with a new task */ @@ -167,15 +151,10 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot /** task model */ Task model = null; - - /** whether task should be saved when this activity exits */ - private boolean shouldSaveState = true; - - private boolean overrideFinishAnim; - - private String uuid = RemoteModel.NO_UUID; + private boolean applyModel = false; private boolean showEditComments; + private TaskEditFragmentCallbackHandler callback; /* * ====================================================================== @@ -188,22 +167,23 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot super.onCreate(savedInstanceState); // if we were editing a task already, restore it - if (savedInstanceState != null - && savedInstanceState.containsKey(TASK_IN_PROGRESS)) { - Task task = savedInstanceState.getParcelable(TASK_IN_PROGRESS); - if (task != null) { - model = task; - } - if (savedInstanceState.containsKey(TASK_UUID)) { - uuid = savedInstanceState.getString(TASK_UUID); - } - } + if (savedInstanceState != null) { + model = savedInstanceState.getParcelable(EXTRA_TASK); + applyModel = savedInstanceState.getBoolean(EXTRA_APPLY_MODEL); + } showEditComments = preferences.getBoolean(R.string.p_show_task_edit_comments, true); getActivity().setResult(RESULT_OK); } + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + + callback = (TaskEditFragmentCallbackHandler) activity; + } + /* * ====================================================================== * ==================================================== UI initialization @@ -213,51 +193,12 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.task_edit_activity, container, false); + View view = inflater.inflate(R.layout.task_edit_fragment, container, false); ButterKnife.bind(this, view); - loadItem(getActivity().getIntent()); - - registerFragment(R.string.TEA_ctrl_title_pref); - registerFragment(R.string.TEA_ctrl_when_pref); - registerFragment(R.string.TEA_ctrl_gcal); - registerFragment(R.string.TEA_ctrl_importance_pref); - registerFragment(R.string.TEA_ctrl_notes_pref); - registerFragment(R.string.TEA_ctrl_hide_until_pref); - registerFragment(R.string.TEA_ctrl_reminders_pref); - registerFragment(R.string.TEA_ctrl_files_pref); - registerFragment(R.string.TEA_ctrl_timer_pref); - registerFragment(R.string.TEA_ctrl_lists_pref); - registerFragment(R.string.TEA_ctrl_repeat_pref); - - ArrayList controlOrder = BeastModePreferences.constructOrderedControlList(preferences, getActivity()); - controlOrder.add(0, getString(R.string.TEA_ctrl_title_pref)); - - String hideAlwaysTrigger = getString(R.string.TEA_ctrl_hide_section_pref); - - FragmentManager fragmentManager = getFragmentManager(); - FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); - - for (String item : controlOrder) { - if (item.equals(hideAlwaysTrigger)) { - break; - } - Integer fragmentId = controlSetFragments.get(item); - if (fragmentId == null) { - Timber.e("Unknown task edit control %s", item); - continue; - } - displayedFragments.add(fragmentId); - if (fragmentManager.findFragmentByTag(item) == null) { - TaskEditControlFragment fragment = createFragment(controlSetFragments.get(item)); - if (fragment != null) { - fragment.initialize(isNewTask, model); - fragmentTransaction.add(basicControls.getId(), fragment, item); - } - } - } + notificationManager.cancel(model.getId()); - fragmentTransaction.commit(); + applyModel = false; if (!showEditComments) { commentsBar.setVisibility(View.GONE); @@ -266,38 +207,6 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot return view; } - private void registerFragment(int resId) { - controlSetFragments.put(getString(resId), resId); - } - - private TaskEditControlFragment createFragment(int fragmentId) { - switch (fragmentId) { - case R.string.TEA_ctrl_title_pref: - return new EditTitleControlSet(); - case R.string.TEA_ctrl_when_pref: - return new DeadlineControlSet(); - case R.string.TEA_ctrl_importance_pref: - return new PriorityControlSet(); - case R.string.TEA_ctrl_notes_pref: - return new DescriptionControlSet(); - case R.string.TEA_ctrl_gcal: - return new CalendarControlSet(); - case R.string.TEA_ctrl_hide_until_pref: - return new HideUntilControlSet(); - case R.string.TEA_ctrl_reminders_pref: - return new ReminderControlSet(); - case R.string.TEA_ctrl_files_pref: - return new FilesControlSet(); - case R.string.TEA_ctrl_timer_pref: - return new TimerControlSet(); - case R.string.TEA_ctrl_lists_pref: - return new TagsControlSet(); - case R.string.TEA_ctrl_repeat_pref: - return new RepeatControlSet(); - default: - throw new RuntimeException("Unsupported fragment"); - } - } @Override public void onActivityCreated(Bundle savedInstanceState) { @@ -306,25 +215,14 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot // We have a menu item to show in action bar. setHasOptionsMenu(true); - AstridActivity activity = (AstridActivity) getActivity(); - - overrideFinishAnim = false; - if (activity != null) { - if (activity.getIntent() != null) { - overrideFinishAnim = activity.getIntent().getBooleanExtra( - OVERRIDE_FINISH_ANIM, true); - } - } - // Load task data in background new TaskEditBackgroundLoader().start(); } private void instantiateEditNotes() { if (showEditComments) { - long idParam = getActivity().getIntent().getLongExtra(TOKEN_ID, -1L); editNotes = new EditNoteActivity(actFmCameraModule, metadataDao, userActivityDao, - taskService, this, getView(), idParam); + taskService, this, getView(), model.getId()); editNotes.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); @@ -333,8 +231,6 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot } private void loadMoreContainer() { - long idParam = getActivity().getIntent().getLongExtra(TOKEN_ID, -1L); - int tabStyle = TaskEditViewPager.TAB_SHOW_ACTIVITY; if (!showEditComments) { @@ -344,7 +240,7 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot if (editNotes == null) { instantiateEditNotes(); } else { - editNotes.loadViewForTaskID(idParam); + editNotes.loadViewForTaskID(model.getId()); } if (editNotes != null) { @@ -424,76 +320,12 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot * ====================================================================== */ - /** - * Loads action item from the given intent - */ - private void loadItem(Intent intent) { - if (model != null) { - // came from bundle - setIsNewTask(model.getTitle().length() == 0); - return; - } - - long idParam = intent.getLongExtra(TOKEN_ID, -1L); - if (idParam > -1L) { - model = taskService.fetchById(idParam, Task.PROPERTIES); - - if (model != null && model.containsNonNullValue(Task.UUID)) { - uuid = model.getUUID(); - } - } - - // not found by id or was never passed an id - if (model == null) { - String valuesAsString = intent.getStringExtra(TOKEN_VALUES); - ContentValues values = null; - try { - if (valuesAsString != null) { - valuesAsString = PermaSql.replacePlaceholders(valuesAsString); - values = AndroidUtilities.contentValuesFromSerializedString(valuesAsString); - } - } catch (Exception e) { - // oops, can't serialize - Timber.e(e, e.getMessage()); - } - model = taskService.createWithValues(values, null); - getActivity().getIntent().putExtra(TOKEN_ID, model.getId()); - } - - if (model.getTitle().length() == 0) { - - // set deletion date until task gets a title - model.setDeletionDate(DateUtilities.now()); - } - - setIsNewTask(model.getTitle().length() == 0); - - if (model == null) { - Timber.e(new NullPointerException("model"), "task-edit-no-task"); - getActivity().onBackPressed(); - return; - } - - notificationManager.cancel(model.getId()); - } - - private void setIsNewTask(boolean isNewTask) { - this.isNewTask = isNewTask; - } - - /** Convenience method to populate fields after setting model to null */ - public void repopulateFromScratch(Intent intent) { - model = null; - uuid = RemoteModel.NO_UUID; - loadMoreContainer(); - } - private String getTitle() { return getEditTitleControlSet().getTitle(); } /** Save task model from values in UI components */ - public void save(boolean onPause) { + public void save() { String title = getTitle(); if (title == null) { return; @@ -507,53 +339,42 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot return; } - if (!onPause) { - for (Integer fragmentId : displayedFragments) { - getFragment(fragmentId).apply(model); + for (int fragmentId : rowIds) { + TaskEditControlFragment fragment = (TaskEditControlFragment) getFragmentManager().findFragmentById(fragmentId); + if (fragment == null) { + break; } - taskService.save(model); - - boolean taskEditActivity = (getActivity() instanceof TaskEditActivity); - - boolean tagsChanged = Flags.check(Flags.TAGS_CHANGED); + fragment.apply(model); + } + taskService.save(model); - if (taskEditActivity) { - Intent data = new Intent(); - data.putExtra(TOKEN_TAGS_CHANGED, tagsChanged); - data.putExtra(TOKEN_ID, model.getId()); - data.putExtra(TOKEN_UUID, model.getUuid()); - getActivity().setResult(RESULT_OK, data); + boolean tagsChanged = Flags.check(Flags.TAGS_CHANGED); - } else { - // Notify task list fragment in multi-column case - // since the activity isn't actually finishing - TaskListActivity tla = (TaskListActivity) getActivity(); + // Notify task list fragment in multi-column case + // since the activity isn't actually finishing + TaskListActivity tla = (TaskListActivity) getActivity(); - if (tagsChanged) { - tla.tagsChanged(); - } - tla.refreshTaskList(); - if (isNewTask) { - tla.getTaskListFragment().onTaskCreated(model.getId(), model.getUuid()); - } - } - - removeExtrasFromIntent(getActivity().getIntent()); - shouldSaveState = false; - getActivity().onBackPressed(); + if (tagsChanged) { + tla.tagsChanged(); } + tla.refreshTaskList(); + if (isNewTask) { + tla.getTaskListFragment().onTaskCreated(model.getId(), model.getUuid()); + } + + removeExtrasFromIntent(getActivity().getIntent()); } private EditTitleControlSet getEditTitleControlSet() { - return getFragment(R.string.TEA_ctrl_title_pref); + return getFragment(EditTitleControlSet.TAG); } private FilesControlSet getFilesControlSet() { - return getFragment(R.string.TEA_ctrl_files_pref); + return getFragment(FilesControlSet.TAG); } private TimerControlSet getTimerControl() { - return getFragment(R.string.TEA_ctrl_timer_pref); + return getFragment(TimerControlSet.TAG ); } @SuppressWarnings("unchecked") @@ -561,39 +382,13 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot return (T) getFragmentManager().findFragmentByTag(getString(tag)); } - public boolean onKeyDown(int keyCode) { - if (keyCode == KeyEvent.KEYCODE_BACK) { - if(getTitle().length() == 0) { - discardButtonClick(); - } else { - saveButtonClick(); - } - return true; - } - return false; - } - - @Override - public void onDetach() { - super.onDetach(); - - // abandon editing and delete the newly created task if - // no title was entered - Activity activity = getActivity(); - if (overrideFinishAnim) { - AndroidUtilities.callOverridePendingTransition(activity, - R.anim.slide_right_in, R.anim.slide_right_out); - } - - if (activity instanceof TaskListActivity) { - if (getTitle().length() == 0 && isNewTask && model != null && model.isSaved()) { - taskDeleter.delete(model); - } - } else if (activity instanceof TaskEditActivity) { - if (getTitle().length() == 0 && isNewTask && model != null && model.isSaved()) { - taskDeleter.delete(model); - } + public void onBackPressed() { + if(getTitle().length() == 0) { + discardButtonClick(); + } else { + save(); } + callback.taskEditFinished(); } /** @@ -601,6 +396,7 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot */ public static void removeExtrasFromIntent(Intent intent) { if (intent != null) { + intent.removeExtra(TaskListActivity.TOKEN_SWITCH_TO_FILTER); intent.removeExtra(TaskListActivity.OPEN_TASK); intent.removeExtra(TOKEN_PICTURE_IN_PROGRESS); } @@ -612,13 +408,7 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot * ====================================================================== */ - protected void saveButtonClick() { - save(false); - } - protected void discardButtonClick() { - shouldSaveState = false; - // abandon editing in this case if (getTitle().trim().length() == 0 || TextUtils.isEmpty(model.getTitle())) { if (isNewTask) { @@ -632,7 +422,6 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot } removeExtrasFromIntent(getActivity().getIntent()); - getActivity().onBackPressed(); } protected void deleteButtonClick() { @@ -642,19 +431,7 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot public void onClick(DialogInterface dialog, int which) { TimerPlugin.stopTimer(notificationManager, taskService, getActivity(), model); taskDeleter.delete(model); - shouldSaveState = false; - - Activity a = getActivity(); - if (a instanceof TaskEditActivity) { - getActivity().setResult(RESULT_OK); - getActivity().onBackPressed(); - } else if (a instanceof TaskListActivity) { - discardButtonClick(); - TaskListFragment tlf = ((TaskListActivity) a).getTaskListFragment(); - if (tlf != null) { - tlf.refresh(); - } - } + callback.taskEditFinished(); } }) .setNegativeButton(android.R.string.cancel, null) @@ -672,10 +449,12 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot switch (item.getItemId()) { case R.id.menu_save: - saveButtonClick(); + save(); + callback.taskEditFinished(); return true; case R.id.menu_discard: discardButtonClick(); + callback.taskEditFinished(); return true; case R.id.menu_record_note: startRecordingAudio(); @@ -687,8 +466,9 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot if (getTitle().trim().length() == 0) { discardButtonClick(); } else { - saveButtonClick(); + save(); } + callback.taskEditFinished(); return true; } @@ -699,18 +479,11 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.clear(); inflater.inflate(R.menu.task_edit_fragment, menu); - MenuColorizer.colorMenu(getActivity(), menu, getResources().getColor(android.R.color.white)); - if (preferences.useTabletLayout()) { - menu.findItem(R.id.menu_save).setVisible(true); + for (int i = 0 ; i < menu.size() ; i++) { + MenuColorizer.colorMenuItem(menu.getItem(i), getResources().getColor(android.R.color.white)); } - } - - @Override - public void onPause() { - super.onPause(); - - if (shouldSaveState) { - save(true); + if (getResources().getBoolean(R.bool.two_pane_layout)) { + menu.findItem(R.id.menu_save).setVisible(true); } } @@ -738,9 +511,8 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - // stick our task into the outState - outState.putParcelable(TASK_IN_PROGRESS, model); - outState.putString(TASK_UUID, uuid); + outState.putParcelable(EXTRA_TASK, model); + outState.putBoolean(EXTRA_APPLY_MODEL, applyModel); } /* diff --git a/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java b/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java index faaefeb8d..b69076675 100644 --- a/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java +++ b/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java @@ -8,11 +8,11 @@ package com.todoroo.astrid.activity; import android.app.Activity; import android.app.FragmentManager; import android.app.FragmentTransaction; +import android.content.ContentValues; import android.content.Intent; import android.content.IntentFilter; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.support.design.widget.Snackbar; import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v4.view.MenuItemCompat; import android.support.v4.widget.DrawerLayout; @@ -23,64 +23,101 @@ import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.view.inputmethod.InputMethodManager; import com.todoroo.andlib.data.Callback; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.utility.AndroidUtilities; +import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.actfm.FilterSettingsActivity; import com.todoroo.astrid.actfm.TagSettingsActivity; import com.todoroo.astrid.actfm.TagViewFragment; -import com.todoroo.astrid.adapter.FilterAdapter; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.CustomFilter; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.FilterListItem; +import com.todoroo.astrid.api.FilterWithCustomIntent; +import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.core.BuiltInFilterExposer; import com.todoroo.astrid.dao.TagDataDao; import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.files.FilesControlSet; import com.todoroo.astrid.gtasks.GtasksListFragment; -import com.todoroo.astrid.gtasks.GtasksPreferenceService; +import com.todoroo.astrid.repeats.RepeatControlSet; +import com.todoroo.astrid.service.StartupService; +import com.todoroo.astrid.service.TaskCreator; +import com.todoroo.astrid.service.TaskService; +import com.todoroo.astrid.service.UpgradeActivity; import com.todoroo.astrid.subtasks.SubtasksHelper; import com.todoroo.astrid.subtasks.SubtasksListFragment; import com.todoroo.astrid.subtasks.SubtasksTagListFragment; import com.todoroo.astrid.tags.TagFilterExposer; -import com.todoroo.astrid.utility.Flags; +import com.todoroo.astrid.tags.TagsControlSet; +import com.todoroo.astrid.timers.TimerControlSet; +import com.todoroo.astrid.ui.EditTitleControlSet; +import com.todoroo.astrid.ui.HideUntilControlSet; +import com.todoroo.astrid.ui.ReminderControlSet; import com.todoroo.astrid.voice.VoiceInputAssistant; import com.todoroo.astrid.widget.TasksWidget; import org.tasks.R; import org.tasks.activities.SortActivity; -import org.tasks.analytics.Tracker; +import org.tasks.injection.InjectingAppCompatActivity; import org.tasks.preferences.ActivityPreferences; -import org.tasks.preferences.BasicPreferences; import org.tasks.receivers.RepeatConfirmationReceiver; +import org.tasks.ui.CalendarControlSet; +import org.tasks.ui.DeadlineControlSet; +import org.tasks.ui.DescriptionControlSet; import org.tasks.ui.MenuColorizer; import org.tasks.ui.NavigationDrawerFragment; +import org.tasks.ui.PriorityControlSet; +import org.tasks.ui.TaskEditControlFragment; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import javax.inject.Inject; +import butterknife.Bind; +import butterknife.ButterKnife; import timber.log.Timber; +import static com.todoroo.astrid.activity.TaskEditFragment.newTaskEditFragment; import static com.todoroo.astrid.voice.VoiceInputAssistant.voiceInputAvailable; import static org.tasks.ui.NavigationDrawerFragment.OnFilterItemClickedListener; -public class TaskListActivity extends AstridActivity implements OnFilterItemClickedListener { +public class TaskListActivity extends InjectingAppCompatActivity implements + OnFilterItemClickedListener, + TaskListFragment.OnTaskListItemClickedListener, + PriorityControlSet.OnPriorityChanged, + TimerControlSet.TimerControlSetCallback, + RepeatControlSet.RepeatChangedListener, + TaskEditFragment.TaskEditFragmentCallbackHandler { @Inject TagDataDao tagDataDao; @Inject ActivityPreferences preferences; - @Inject GtasksPreferenceService gtasksPreferenceService; @Inject VoiceInputAssistant voiceInputAssistant; - @Inject Tracker tracker; + @Inject StartupService startupService; + @Inject SubtasksHelper subtasksHelper; + @Inject TaskService taskService; + @Inject TaskCreator taskCreator; + + @Bind(R.id.toolbar) Toolbar toolbar; + public static final int REQUEST_UPGRADE = 505; private static final int REQUEST_EDIT_TAG = 11543; private static final int REQUEST_EDIT_FILTER = 11544; private static final int REQUEST_SORT = 11545; private final RepeatConfirmationReceiver repeatConfirmationReceiver = new RepeatConfirmationReceiver(this); + private final Map controlSetFragments = new HashMap<>(); private NavigationDrawerFragment navigationDrawer; + private ArrayList controlOrder; public static final String TOKEN_SWITCH_TO_FILTER = "newListCreated"; //$NON-NLS-1$ @@ -96,23 +133,24 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + startupService.onStartupApplication(this); preferences.applyTheme(); setContentView(R.layout.task_list_wrapper); + ButterKnife.bind(this); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); - ActionBar supportActionBar = getSupportActionBar(); - if (supportActionBar != null) { - supportActionBar.setDisplayHomeAsUpEnabled(true); - Drawable drawable = DrawableCompat.wrap(getResources().getDrawable(R.drawable.ic_menu_24dp)); - DrawableCompat.setTint(drawable, getResources().getColor(android.R.color.white)); - toolbar.setNavigationIcon(drawable); - } + updateToolbar(R.drawable.ic_menu_24dp, true); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - navigationDrawer.openDrawer(); + TaskEditFragment taskEditFragment = getTaskEditFragment(); + if (isDoublePaneLayout() || taskEditFragment == null) { + hideKeyboard(); + navigationDrawer.openDrawer(); + } else { + taskEditFragment.onBackPressed(); + } } }); @@ -120,13 +158,20 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); navigationDrawer.setUp(drawerLayout); - View editFragment = findViewById(R.id.taskedit_fragment_container); - - if(editFragment != null) { - fragmentLayout = LAYOUT_DOUBLE; - } else { - fragmentLayout = LAYOUT_SINGLE; - } + registerFragment(EditTitleControlSet.TAG); + registerFragment(DeadlineControlSet.TAG); + registerFragment(CalendarControlSet.TAG); + registerFragment(PriorityControlSet.TAG); + registerFragment(DescriptionControlSet.TAG); + registerFragment(HideUntilControlSet.TAG); + registerFragment(ReminderControlSet.TAG); + registerFragment(FilesControlSet.TAG); + registerFragment(TimerControlSet.TAG); + registerFragment(TagsControlSet.TAG); + registerFragment(RepeatControlSet.TAG); + + controlOrder = BeastModePreferences.constructOrderedControlList(preferences, this); + controlOrder.add(0, getString(EditTitleControlSet.TAG)); readIntent(); } @@ -141,7 +186,8 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic } private void readIntent() { - Bundle extras = getIntent().getExtras(); + Intent intent = getIntent(); + Bundle extras = intent.getExtras(); if (extras != null) { extras = (Bundle) extras.clone(); } @@ -150,15 +196,76 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic extras = new Bundle(); } - Filter savedFilter = getIntent().getParcelableExtra(TaskListFragment.TOKEN_FILTER); - if (savedFilter == null) { - savedFilter = getDefaultFilter(); - extras.putAll(configureIntentAndExtrasWithFilter(getIntent(), savedFilter)); + TaskListFragment taskListFragment; + if (intent.hasExtra(TaskListFragment.TOKEN_FILTER)) { + Filter filter = intent.getParcelableExtra(TaskListFragment.TOKEN_FILTER); + extras.putAll(configureIntentAndExtrasWithFilter(intent, filter)); + setListsTitle(filter.listingTitle); + taskListFragment = newTaskListFragment(filter, extras); + } else { + taskListFragment = getTaskListFragment(); + if (taskListFragment == null) { + Filter filter = getDefaultFilter(); + extras.putAll(configureIntentAndExtrasWithFilter(intent, filter)); + setListsTitle(filter.listingTitle); + taskListFragment = newTaskListFragment(filter, extras); + } } - extras.putParcelable(TaskListFragment.TOKEN_FILTER, savedFilter); - setupTasklistFragmentWithFilter(savedFilter, extras); - setListsTitle(savedFilter.listingTitle); + TaskEditFragment taskEditFragment = getTaskEditFragment(); + List taskEditControlFragments = new ArrayList<>(); + if (taskEditFragment != null) { + for (int rowId : TaskEditFragment.rowIds) { + TaskEditControlFragment fragment = (TaskEditControlFragment) getFragmentManager().findFragmentById(rowId); + if (fragment == null) { + break; + } + taskEditControlFragments.add(fragment); + } + } + + loadTaskListFragment(true, taskListFragment); + + if (taskEditFragment != null) { + loadTaskEditFragment(true, taskEditFragment, taskEditControlFragments); + } + } + + private void loadTaskListFragment(boolean onCreate, TaskListFragment taskListFragment) { + FragmentManager fragmentManager = getFragmentManager(); + if (onCreate) { + fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); + } else { + fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); + } + fragmentManager.beginTransaction() + .replace(isDoublePaneLayout() ? R.id.master_dual : R.id.single_pane, taskListFragment, TaskListFragment.TAG_TASKLIST_FRAGMENT) + .addToBackStack(TaskListFragment.TAG_TASKLIST_FRAGMENT) + .commit(); + } + + private void loadTaskEditFragment(boolean onCreate, TaskEditFragment taskEditFragment, List taskEditControlFragments) { + if (isSinglePaneLayout()) { + updateToolbar(R.drawable.ic_arrow_back_24dp, false); + } + FragmentManager fragmentManager = getFragmentManager(); + fragmentManager.beginTransaction() + .replace(isDoublePaneLayout() ? R.id.detail_dual : R.id.single_pane, taskEditFragment, TaskEditFragment.TAG_TASKEDIT_FRAGMENT) + .addToBackStack(TaskEditFragment.TAG_TASKEDIT_FRAGMENT) + .commit(); + + if (onCreate) { + fragmentManager.executePendingTransactions(); + } + + FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); + for (int i = 0 ; i < taskEditControlFragments.size() ; i++) { + TaskEditControlFragment taskEditControlFragment = taskEditControlFragments.get(i); + String tag = getString(taskEditControlFragment.controlId()); + fragmentTransaction.replace(TaskEditFragment.rowIds[i], taskEditControlFragment, tag); + } + fragmentTransaction.addToBackStack(null); + fragmentTransaction.commit(); } public NavigationDrawerFragment getNavigationDrawerFragment() { @@ -173,7 +280,6 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic registerReceiver( repeatConfirmationReceiver, new IntentFilter(AstridApiConstants.BROADCAST_EVENT_TASK_REPEATED)); - getTaskListFragment().setSyncOngoing(gtasksPreferenceService.isOngoing()); } @Override @@ -224,19 +330,19 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic query = query.trim(); String title = getString(R.string.FLA_search_filter, query); Filter savedFilter = new Filter(title, - new QueryTemplate().where - (Criterion.or(Task.NOTES. - like ( - "%" + //$NON-NLS-1$ - query + "%" - ), - Task.TITLE. - like ( - "%" + //$NON-NLS-1$ - query + "%" - ) - ) - ),null); + new QueryTemplate().where + (Criterion.or(Task.NOTES. + like( + "%" + //$NON-NLS-1$ + query + "%" + ), + Task.TITLE. + like( + "%" + //$NON-NLS-1$ + query + "%" + ) + ) + ), null); onFilterItemClicked(savedFilter); MenuItemCompat.collapseActionView(item); @@ -256,11 +362,11 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic } @Override - public boolean onFilterItemClicked(FilterListItem item) { + public void onFilterItemClicked(FilterListItem item) { TaskEditFragment.removeExtrasFromIntent(getIntent()); TaskEditFragment tef = getTaskEditFragment(); if (tef != null) { - onBackPressed(); + getTaskEditFragment().onBackPressed(); } if ((item instanceof Filter)) { @@ -273,73 +379,53 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic Filter filter = (Filter)item; Bundle extras = configureIntentAndExtrasWithFilter(intent, filter); - if (fragmentLayout == LAYOUT_DOUBLE && getTaskEditFragment() != null) { - onBackPressed(); // remove the task edit fragment when switching between lists - } - setupTasklistFragmentWithFilter(filter, extras); + TaskListFragment newFragment = newTaskListFragment(filter, extras); - // no animation for dualpane-layout - AndroidUtilities.callOverridePendingTransition(this, 0, 0); - return true; + loadTaskListFragment(false, newFragment); } - return false; } - public void setupTasklistFragmentWithFilter(Filter filter, Bundle extras) { + private TaskListFragment newTaskListFragment(Filter filter, Bundle extras) { Class customTaskList = null; if (subtasksHelper.shouldUseSubtasksFragmentForFilter(filter)) { customTaskList = SubtasksHelper.subtasksClassForFilter(filter); } - TaskListFragment newFragment = TaskListFragment.instantiateWithFilterAndExtras(filter, extras, customTaskList); + Class component = customTaskList; + if (filter instanceof FilterWithCustomIntent && component == null) { + try { + component = Class.forName(((FilterWithCustomIntent) filter).customTaskList.getClassName()); + } catch (Exception e) { + // Invalid + Timber.e(e, e.getMessage()); + } + } + if (component == null) { + component = TaskListFragment.class; + } + TaskListFragment newFragment; try { - FragmentManager manager = getFragmentManager(); - FragmentTransaction transaction = manager.beginTransaction(); - transaction.replace(R.id.tasklist_fragment_container, newFragment, TaskListFragment.TAG_TASKLIST_FRAGMENT); - transaction.commit(); - runOnUiThread(new Runnable() { - @Override - public void run() { - getFragmentManager().executePendingTransactions(); - } - }); - } catch (Exception e) { - // Don't worry about it + newFragment = (TaskListFragment) component.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { Timber.e(e, e.getMessage()); + newFragment = new TaskListFragment(); } - } - - @Override - public void setupActivityFragment(TagData tagData) { - super.setupActivityFragment(tagData); - - if (fragmentLayout == LAYOUT_DOUBLE) { - View container = findViewById(R.id.taskedit_fragment_container); - if (container != null) { - container.setVisibility(View.VISIBLE); - } - } + Bundle args = new Bundle(); + args.putBundle(TaskListFragment.TOKEN_EXTRAS, extras); + newFragment.setArguments(args); + return newFragment; } @Override protected void onPostResume() { super.onPostResume(); - if (!Flags.checkAndClear(Flags.TLA_DISMISSED_FROM_TASK_EDIT)) { - TaskEditFragment tea = getTaskEditFragment(); - if (tea != null) { - onBackPressed(); - } - } - if (getIntent().hasExtra(TOKEN_SWITCH_TO_FILTER)) { Filter newList = getIntent().getParcelableExtra(TOKEN_SWITCH_TO_FILTER); getIntent().removeExtra(TOKEN_SWITCH_TO_FILTER); onFilterItemClicked(newList); -// } else { -// navigationDrawer.restoreLastSelected(); } if (getIntent().hasExtra(OPEN_TASK)) { @@ -349,33 +435,90 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic } else { TaskListFragment tlf = getTaskListFragment(); if (tlf != null) { - tlf.quickAddBar.quickAddTask(); //$NON-NLS-1$ + Task task = tlf.quickAddBar.quickAddTask("");//$NON-NLS-1$ + onTaskListItemClicked(task.getId()); } } - if (fragmentLayout == LAYOUT_SINGLE) { - getIntent().removeExtra(OPEN_TASK); - } + getIntent().removeExtra(OPEN_TASK); } if (getIntent().getBooleanExtra(TOKEN_CREATE_NEW_LIST, false)) { - newListFromLaunch(); + Intent thisIntent = getIntent(); + Intent newTagIntent = new Intent(this, TagSettingsActivity.class); + newTagIntent.putExtra(TagSettingsActivity.TOKEN_AUTOPOPULATE_NAME, thisIntent.getStringExtra(TOKEN_CREATE_NEW_LIST_NAME)); + thisIntent.removeExtra(TOKEN_CREATE_NEW_LIST_NAME); + startActivityForResult(newTagIntent, NavigationDrawerFragment.REQUEST_NEW_LIST); } } - private void newListFromLaunch() { - Intent thisIntent = getIntent(); - Intent newTagIntent = new Intent(this, TagSettingsActivity.class); - newTagIntent.putExtra(TagSettingsActivity.TOKEN_AUTOPOPULATE_NAME, thisIntent.getStringExtra(TOKEN_CREATE_NEW_LIST_NAME)); - thisIntent.removeExtra(TOKEN_CREATE_NEW_LIST_NAME); - startActivityForResult(newTagIntent, NavigationDrawerFragment.REQUEST_NEW_LIST); - } - @Override public void onTaskListItemClicked(long taskId) { - if (fragmentLayout != LAYOUT_SINGLE) { - getIntent().putExtra(OPEN_TASK, taskId); + TaskEditFragment taskEditFragment = getTaskEditFragment(); + + if (taskEditFragment != null) { + taskEditFragment.onBackPressed(); + } + + Task task = loadItem(taskId); + if (task == null) { + Timber.e(new NullPointerException(), "Failed to load task id %s", taskId); + return; + } + boolean isNewTask = task.getTitle().length() == 0; + + String hideAlwaysTrigger = getString(R.string.TEA_ctrl_hide_section_pref); + + taskEditFragment = newTaskEditFragment(isNewTask, task); + List taskEditControlFragments = new ArrayList<>(); + for (int i = 0 ; i < controlOrder.size() ; i++) { + String item = controlOrder.get(i); + if (item.equals(hideAlwaysTrigger)) { + break; + } + Integer resId = controlSetFragments.get(item); + if (resId == null) { + Timber.e("Unknown task edit control %s", item); + continue; + } + + TaskEditControlFragment fragment = createFragment(resId); + fragment.initialize(isNewTask, task); + taskEditControlFragments.add(fragment); + } + loadTaskEditFragment(false, taskEditFragment, taskEditControlFragments); + } + + private void registerFragment(int resId) { + controlSetFragments.put(getString(resId), resId); + } + + private TaskEditControlFragment createFragment(int fragmentId) { + switch (fragmentId) { + case R.string.TEA_ctrl_title_pref: + return new EditTitleControlSet(); + case R.string.TEA_ctrl_when_pref: + return new DeadlineControlSet(); + case R.string.TEA_ctrl_importance_pref: + return new PriorityControlSet(); + case R.string.TEA_ctrl_notes_pref: + return new DescriptionControlSet(); + case R.string.TEA_ctrl_gcal: + return new CalendarControlSet(); + case R.string.TEA_ctrl_hide_until_pref: + return new HideUntilControlSet(); + case R.string.TEA_ctrl_reminders_pref: + return new ReminderControlSet(); + case R.string.TEA_ctrl_files_pref: + return new FilesControlSet(); + case R.string.TEA_ctrl_timer_pref: + return new TimerControlSet(); + case R.string.TEA_ctrl_lists_pref: + return new TagsControlSet(); + case R.string.TEA_ctrl_repeat_pref: + return new RepeatControlSet(); + default: + throw new RuntimeException("Unsupported fragment"); } - super.onTaskListItemClicked(taskId); } public void setListsTitle(String title) { @@ -393,19 +536,16 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic return; } - // manage task edit visibility - View taskeditFragmentContainer = findViewById(R.id.taskedit_fragment_container); - if(taskeditFragmentContainer != null && taskeditFragmentContainer.getVisibility() == View.VISIBLE) { - Flags.set(Flags.TLA_DISMISSED_FROM_TASK_EDIT); - onPostResume(); + if (getTaskEditFragment() != null) { + getTaskEditFragment().onBackPressed(); + return; } - super.onBackPressed(); - } - @Override - public void finish() { - super.finish(); - AndroidUtilities.callOverridePendingTransition(this, R.anim.slide_right_in, R.anim.slide_right_out); + if (isFinishing()) { + return; + } + + super.onBackPressed(); } @Override @@ -413,7 +553,13 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic Callback quickAddTask = new Callback() { @Override public void apply(String title) { - getTaskListFragment().quickAddBar.quickAddTask(title); + TaskListFragment taskListFragment = getTaskListFragment(); + Task task = taskListFragment.quickAddBar.quickAddTask(title); + taskCreator.addToCalendar(task); + onTaskListItemClicked(task.getId()); + taskListFragment.loadTaskListContent(); + taskListFragment.selectCustomId(task.getId()); + taskListFragment.onTaskCreated(task.getId(), task.getUUID()); } }; if (voiceInputAssistant.handleActivityResult(requestCode, resultCode, data, quickAddTask)) { @@ -434,23 +580,6 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic } navigationDrawer.refresh(); - } else if (requestCode == TaskListFragment.ACTIVITY_EDIT_TASK && resultCode != Activity.RESULT_CANCELED) { - // Handle switch to assigned filter when it comes from TaskEditActivity finishing - // For cases when we're in a multi-frame layout, the TaskEditFragment will notify us here directly - TaskListFragment tlf = getTaskListFragment(); - if (tlf != null) { - if (data != null) { - if (data.getBooleanExtra(TaskEditFragment.TOKEN_TAGS_CHANGED, false)) { - tagsChanged(true); - } - } - tlf.refresh(); - if (data != null) { - tlf.onTaskCreated( - data.getLongExtra(TaskEditFragment.TOKEN_ID, 0L), - data.getStringExtra(TaskEditFragment.TOKEN_UUID)); - } - } } else if (requestCode == REQUEST_EDIT_TAG) { if (resultCode == RESULT_OK) { String action = data.getAction(); @@ -509,9 +638,17 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic getTaskListFragment().setUpTaskList(); } } + } else if (requestCode == REQUEST_UPGRADE) { + if (resultCode == RESULT_OK) { + if (data != null && data.getBooleanExtra(UpgradeActivity.EXTRA_RESTART, false)) { + Timber.w("Upgrade requires restart"); + finish(); + startActivity(getIntent()); + } + } + } else { + super.onActivityResult(requestCode, resultCode, data); } - - super.onActivityResult(requestCode, resultCode, data); } protected void tagsChanged() { @@ -579,10 +716,130 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { TaskEditFragment tef = getTaskEditFragment(); - if (tef != null && tef.onKeyDown(keyCode)) { + if (tef != null) { + tef.onBackPressed(); return true; } } return super.onKeyDown(keyCode, event); } + + public TaskListFragment getTaskListFragment() { + return (TaskListFragment) getFragmentManager() + .findFragmentByTag(TaskListFragment.TAG_TASKLIST_FRAGMENT); + } + + public TaskEditFragment getTaskEditFragment() { + return (TaskEditFragment) getFragmentManager() + .findFragmentByTag(TaskEditFragment.TAG_TASKEDIT_FRAGMENT); + } + + protected void updateToolbar(int drawableResId, boolean showTitle) { + ActionBar supportActionBar = getSupportActionBar(); + if (supportActionBar != null) { + supportActionBar.setDisplayHomeAsUpEnabled(true); + supportActionBar.setDisplayShowTitleEnabled(showTitle); + Drawable drawable = DrawableCompat.wrap(getResources().getDrawable(drawableResId)); + DrawableCompat.setTint(drawable, getResources().getColor(android.R.color.white)); + supportActionBar.setHomeAsUpIndicator(drawable); + } + } + + protected Bundle configureIntentAndExtrasWithFilter(Intent intent, Filter filter) { + if(filter instanceof FilterWithCustomIntent) { + int lastSelectedList = intent.getIntExtra(NavigationDrawerFragment.TOKEN_LAST_SELECTED, 0); + intent = ((FilterWithCustomIntent)filter).getCustomIntent(); + intent.putExtra(NavigationDrawerFragment.TOKEN_LAST_SELECTED, lastSelectedList); + } else { + intent.putExtra(TaskListFragment.TOKEN_FILTER, filter); + } + + setIntent(intent); + + Bundle extras = intent.getExtras(); + if (extras != null) { + extras = (Bundle) extras.clone(); + } + return extras; + } + + /** + * Loads action item from the given intent + */ + private Task loadItem(long taskId) { + Task model = null; + + if (taskId> -1L) { + model = taskService.fetchById(taskId, Task.PROPERTIES); + } + + // not found by id or was never passed an id + if (model == null) { + Intent intent = getIntent(); + String valuesAsString = intent.getStringExtra(TaskEditFragment.TOKEN_VALUES); + ContentValues values = null; + try { + if (valuesAsString != null) { + valuesAsString = PermaSql.replacePlaceholders(valuesAsString); + values = AndroidUtilities.contentValuesFromSerializedString(valuesAsString); + } + } catch (Exception e) { + // oops, can't serialize + Timber.e(e, e.getMessage()); + } + model = taskService.createWithValues(values, null); + } + + if (model.getTitle().length() == 0) { + // set deletion date until task gets a title + model.setDeletionDate(DateUtilities.now()); + } + + return model; + } + + @Override + public void onPriorityChange(int priority) { + getTaskEditFragment().onPriorityChange(priority); + } + + @Override + public void repeatChanged(boolean repeat) { + getTaskEditFragment().onRepeatChanged(repeat); + } + + @Override + public Task stopTimer() { + return getTaskEditFragment().stopTimer(); + } + + @Override + public Task startTimer() { + return getTaskEditFragment().startTimer(); + } + + public boolean isSinglePaneLayout() { + return !isDoublePaneLayout(); + } + + public boolean isDoublePaneLayout() { + return getResources().getBoolean(R.bool.two_pane_layout); + } + + @Override + public void taskEditFinished() { + getFragmentManager().popBackStack(TaskEditFragment.TAG_TASKEDIT_FRAGMENT, FragmentManager.POP_BACK_STACK_INCLUSIVE); + if (isSinglePaneLayout()) { + updateToolbar(R.drawable.ic_menu_24dp, true); + } + hideKeyboard(); + } + + private void hideKeyboard() { + View view = getCurrentFocus(); + if (view != null) { + InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + } } diff --git a/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java b/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java index 375af39de..2ef5dbcc8 100644 --- a/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java +++ b/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java @@ -6,7 +6,6 @@ package com.todoroo.astrid.activity; import android.app.Activity; -import android.app.Fragment; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; @@ -44,7 +43,6 @@ import com.todoroo.astrid.adapter.TaskAdapter.OnCompletedTaskListener; import com.todoroo.astrid.adapter.TaskAdapter.ViewHolder; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.Filter; -import com.todoroo.astrid.api.FilterWithCustomIntent; import com.todoroo.astrid.core.BuiltInFilterExposer; import com.todoroo.astrid.core.SortHelper; import com.todoroo.astrid.dao.TaskAttachmentDao; @@ -77,7 +75,6 @@ import org.tasks.injection.InjectingListFragment; import org.tasks.injection.Injector; import org.tasks.notifications.NotificationManager; import org.tasks.preferences.ActivityPreferences; -import org.tasks.ui.NavigationDrawerFragment; import java.util.Timer; import java.util.TimerTask; @@ -87,8 +84,6 @@ import javax.inject.Inject; import timber.log.Timber; -import static org.tasks.intents.TaskIntents.getNewTaskIntent; - /** * Primary activity for the Bente application. Shows a list of upcoming tasks * and a user's coaches. @@ -105,7 +100,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr public static final long AUTOSYNC_INTERVAL = 90000L; private static final long BACKGROUND_REFRESH_INTERVAL = 120000L; private static final long WAIT_BEFORE_AUTOSYNC = 2000L; - public static final int ACTIVITY_EDIT_TASK = 0; public static final int ACTIVITY_REQUEST_NEW_FILTER = 5; // --- menu codes @@ -120,7 +114,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr /** token for passing a {@link Filter} object through extras */ public static final String TOKEN_FILTER = "filter"; //$NON-NLS-1$ - private static final String TOKEN_EXTRAS = "extras"; //$NON-NLS-1$ + public static final String TOKEN_EXTRAS = "extras"; //$NON-NLS-1$ // --- instance variables @@ -137,7 +131,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr @Inject GtasksPreferenceService gtasksPreferenceService; @Inject DialogBuilder dialogBuilder; - protected Resources resources; protected TaskAdapter taskAdapter = null; protected RefreshReceiver refreshReceiver = new RefreshReceiver(); protected final AtomicReference sqlQueryTemplate = new AtomicReference<>(); @@ -153,7 +146,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr // --- fragment handling variables protected OnTaskListItemClickedListener mListener; - private boolean mDualFragments = false; protected SwipeRefreshLayout listView; protected SwipeRefreshLayout emptyView; @@ -164,43 +156,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr * ====================================================================== */ - /** - * Instantiates and returns an instance of TaskListFragment (or some subclass). Custom types of - * TaskListFragment can be created, with the following precedence: - * - * --If the filter is of type {@link FilterWithCustomIntent}, the task list type it specifies will be used - * --Otherwise, the specified customComponent will be used - * - * See also: instantiateWithFilterAndExtras(Filter, Bundle) which uses TaskListFragment as the default - * custom component. - */ - public static TaskListFragment instantiateWithFilterAndExtras(Filter filter, Bundle extras, Class customComponent) { - Class component = customComponent; - if (filter instanceof FilterWithCustomIntent && component == null) { - try { - component = Class.forName(((FilterWithCustomIntent) filter).customTaskList.getClassName()); - } catch (Exception e) { - // Invalid - Timber.e(e, e.getMessage()); - } - } - if (component == null) { - component = TaskListFragment.class; - } - - TaskListFragment newFragment; - try { - newFragment = (TaskListFragment) component.newInstance(); - } catch (java.lang.InstantiationException | IllegalAccessException e) { - Timber.e(e, e.getMessage()); - newFragment = new TaskListFragment(); - } - Bundle args = new Bundle(); - args.putBundle(TOKEN_EXTRAS, extras); - newFragment.setArguments(args); - return newFragment; - } - @Override public void onRefresh() { if (!syncActionHelper.performSyncAction()) { @@ -224,14 +179,8 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr @Override public void onAttach(Activity activity) { super.onAttach(activity); - // Check that the container activity has implemented the callback - // interface - try { - mListener = (OnTaskListItemClickedListener) activity; - } catch (ClassCastException e) { - throw new ClassCastException(activity.toString() - + " must implement OnTaskListItemClickedListener"); //$NON-NLS-1$ - } + + mListener = (OnTaskListItemClickedListener) activity; } /** @@ -262,12 +211,8 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr parent.findViewById(R.id.fab).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - if (getResources().getBoolean(R.bool.two_pane_layout)) { - Task task = quickAddBar.quickAddTask(); - onTaskListItemClicked(task.getId()); - } else { - ((AstridActivity) getActivity()).startEditActivity(getNewTaskIntent(getActivity(), filter)); - } + Task task = quickAddBar.quickAddTask(""); + onTaskListItemClicked(task.getId()); } }); View body = getListBody(parent); @@ -303,19 +248,13 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // We have a menu item to show in action bar. - resources = getResources(); setHasOptionsMenu(true); syncActionHelper = new SyncActionHelper(gtasksPreferenceService, syncService, getActivity(), preferences); setUpUiComponents(); initializeData(); - quickAddBar.initialize(injector, (TaskListActivity) getActivity(), this); - - Fragment filterlistFrame = getFragmentManager().findFragmentById( - NavigationDrawerFragment.FRAGMENT_NAVIGATION_DRAWER); - mDualFragments = (filterlistFrame != null) - && filterlistFrame.isInLayout(); + quickAddBar.initialize(injector, this); - if (mDualFragments) { + if (getResources().getBoolean(R.bool.two_pane_layout)) { // In dual-pane mode, the list view highlights the selected item. getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); getListView().setItemsCanFocus(false); @@ -352,9 +291,9 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr protected void initializeData() { if (extras != null && extras.containsKey(TOKEN_FILTER)) { filter = extras.getParcelable(TOKEN_FILTER); - extras.remove(TOKEN_FILTER); // Otherwise writing this filter to parcel gives infinite recursion +// extras.remove(TOKEN_FILTER); // Otherwise writing this filter to parcel gives infinite recursion } else { - filter = BuiltInFilterExposer.getMyTasksFilter(resources); + filter = BuiltInFilterExposer.getMyTasksFilter(getResources()); } filter.setFilterQueryOverride(null); isInbox = BuiltInFilterExposer.isInbox(context, filter); @@ -366,7 +305,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr initializeTaskListMetadata(); setUpTaskList(); - ((AstridActivity) getActivity()).setupActivityFragment(getActiveTagData()); } protected void initializeTaskListMetadata() { @@ -450,11 +388,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr }); } - public void transitionForTaskEdit() { - AndroidUtilities.callOverridePendingTransition(getActivity(), - R.anim.slide_left_in, R.anim.slide_left_out); - } - private void setUpBackgroundJobs() { backgroundTimer = new Timer(); @@ -503,7 +436,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr } protected boolean isCurrentTaskListFragment() { - AstridActivity activity = (AstridActivity) getActivity(); + TaskListActivity activity = (TaskListActivity) getActivity(); if (activity != null) { return activity.getTaskListFragment() == this; } @@ -511,11 +444,11 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr } public final void initiateAutomaticSync() { - final AstridActivity activity = (AstridActivity) getActivity(); + final TaskListActivity activity = (TaskListActivity) getActivity(); if (activity == null) { return; } - if (activity.fragmentLayout != AstridActivity.LAYOUT_SINGLE) { + if (activity.isDoublePaneLayout()) { initiateAutomaticSyncImpl(); } else { // In single fragment case, we're using swipe between lists, @@ -584,16 +517,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr * broadcast. Subclasses should override this. */ protected void refresh() { - try { - AstridActivity astridActivity = (AstridActivity) getActivity(); - TaskEditFragment taskEditFragment = astridActivity == null ? null : astridActivity.getTaskEditFragment(); - Task model = taskEditFragment == null ? null : taskEditFragment.model; - taskDeleter.deleteTasksWithEmptyTitles(model == null ? null : model.getId()); - } catch(Exception e) { - Timber.e(e, e.getMessage()); - } loadTaskListContent(); - setSyncOngoing(false); } /* @@ -623,6 +547,8 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr getListView().setSelection(oldListItemSelected); } } + + setSyncOngoing(gtasksPreferenceService.isOngoing()); } protected TaskAdapter createTaskAdapter(TodorooCursor cursor) { @@ -786,8 +712,8 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr protected void onTaskDelete(Task task) { Activity a = getActivity(); - if (a instanceof AstridActivity) { - AstridActivity activity = (AstridActivity) a; + if (a instanceof TaskListActivity) { + TaskListActivity activity = (TaskListActivity) a; TaskEditFragment tef = activity.getTaskEditFragment(); if (tef != null) { if (task.getId() == tef.model.getId()) { @@ -807,7 +733,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr @Override public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); - if (mDualFragments) { + if (getResources().getBoolean(R.bool.two_pane_layout)) { setSelection(position); } } @@ -865,12 +791,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr protected void duplicateTask(long itemId) { long cloneId = taskDuplicator.duplicateTask(itemId); - - Intent intent = new Intent(getActivity(), TaskEditActivity.class); - intent.putExtra(TaskEditFragment.TOKEN_ID, cloneId); - intent.putExtra(TOKEN_FILTER, filter); - getActivity().startActivityForResult(intent, ACTIVITY_EDIT_TASK); - transitionForTaskEdit(); + onTaskListItemClicked(cloneId); } public void onTaskListItemClicked(long taskId) { diff --git a/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java b/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java index befe32ae4..36c5471a0 100644 --- a/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java +++ b/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java @@ -19,7 +19,7 @@ import android.widget.ListView; import android.widget.TextView; import com.todoroo.astrid.actfm.TagSettingsActivity; -import com.todoroo.astrid.activity.AstridActivity; +import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.Filter; @@ -155,8 +155,8 @@ public class FilterAdapter extends ArrayAdapter { populateItem(viewHolder); Filter selected = null; - if (activity instanceof AstridActivity) { - TaskListFragment tlf = ((AstridActivity) activity).getTaskListFragment(); + if (activity instanceof TaskListActivity) { + TaskListFragment tlf = ((TaskListActivity) activity).getTaskListFragment(); selected = tlf.getFilter(); } diff --git a/src/main/java/com/todoroo/astrid/api/FilterListItem.java b/src/main/java/com/todoroo/astrid/api/FilterListItem.java index 57167d738..c1c08f94f 100644 --- a/src/main/java/com/todoroo/astrid/api/FilterListItem.java +++ b/src/main/java/com/todoroo/astrid/api/FilterListItem.java @@ -59,4 +59,11 @@ abstract public class FilterListItem implements Parcelable { source.createStringArray(); // old context menu labels source.createTypedArray(Intent.CREATOR); // old context menu intents } + + @Override + public String toString() { + return "FilterListItem{" + + "listingTitle='" + listingTitle + '\'' + + '}'; + } } diff --git a/src/main/java/com/todoroo/astrid/core/CustomFilterActivity.java b/src/main/java/com/todoroo/astrid/core/CustomFilterActivity.java index 320cddedc..effc6fdf7 100644 --- a/src/main/java/com/todoroo/astrid/core/CustomFilterActivity.java +++ b/src/main/java/com/todoroo/astrid/core/CustomFilterActivity.java @@ -221,7 +221,6 @@ public class CustomFilterActivity extends InjectingAppCompatActivity { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(filterName.getWindowToken(), 0); super.finish(); - AndroidUtilities.callOverridePendingTransition(this, R.anim.slide_right_in, R.anim.slide_right_out); } diff --git a/src/main/java/com/todoroo/astrid/data/Task.java b/src/main/java/com/todoroo/astrid/data/Task.java index ea3aa7cd4..83d27fc2d 100644 --- a/src/main/java/com/todoroo/astrid/data/Task.java +++ b/src/main/java/com/todoroo/astrid/data/Task.java @@ -7,7 +7,6 @@ package com.todoroo.astrid.data; import android.content.ContentValues; -import android.content.res.Resources; import android.net.Uri; import com.todoroo.andlib.data.Property; @@ -19,7 +18,6 @@ import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.utility.DateUtilities; import org.tasks.BuildConfig; -import org.tasks.R; import org.tasks.time.DateTime; import static org.tasks.date.DateTimeUtils.newDateTime; diff --git a/src/main/java/com/todoroo/astrid/files/FilesControlSet.java b/src/main/java/com/todoroo/astrid/files/FilesControlSet.java index c1bbe25ef..9c8f87a98 100644 --- a/src/main/java/com/todoroo/astrid/files/FilesControlSet.java +++ b/src/main/java/com/todoroo/astrid/files/FilesControlSet.java @@ -52,6 +52,8 @@ import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop; public class FilesControlSet extends TaskEditControlFragment { + public static final int TAG = R.string.TEA_ctrl_files_pref; + private static final int REQUEST_ADD_ATTACHMENT = 50; private static final String EXTRA_UUID = "extra_uuid"; @@ -107,6 +109,11 @@ public class FilesControlSet extends TaskEditControlFragment { return R.drawable.ic_attachment_24dp; } + @Override + public int controlId() { + return TAG; + } + @Override public void initialize(boolean isNewTask, Task task) { taskUuid = task.getUuid(); diff --git a/src/main/java/com/todoroo/astrid/gcal/CalendarAlarmListCreator.java b/src/main/java/com/todoroo/astrid/gcal/CalendarAlarmListCreator.java index 3729ffb83..db1decf99 100644 --- a/src/main/java/com/todoroo/astrid/gcal/CalendarAlarmListCreator.java +++ b/src/main/java/com/todoroo/astrid/gcal/CalendarAlarmListCreator.java @@ -53,7 +53,6 @@ public class CalendarAlarmListCreator extends InjectingAppCompatActivity { private void dismissWithAnimation() { finish(); - AndroidUtilities.callOverridePendingTransition(CalendarAlarmListCreator.this, 0, android.R.anim.fade_out); } @Override diff --git a/src/main/java/com/todoroo/astrid/gcal/CalendarReminderActivity.java b/src/main/java/com/todoroo/astrid/gcal/CalendarReminderActivity.java index 50959e877..79daa2ffd 100644 --- a/src/main/java/com/todoroo/astrid/gcal/CalendarReminderActivity.java +++ b/src/main/java/com/todoroo/astrid/gcal/CalendarReminderActivity.java @@ -72,7 +72,6 @@ public class CalendarReminderActivity extends InjectingAppCompatActivity { @Override public void onClick(View v) { finish(); - AndroidUtilities.callOverridePendingTransition(CalendarReminderActivity.this, 0, android.R.anim.fade_out); } }; diff --git a/src/main/java/com/todoroo/astrid/notes/EditNoteActivity.java b/src/main/java/com/todoroo/astrid/notes/EditNoteActivity.java index e0b3bfb9d..d3992d99e 100644 --- a/src/main/java/com/todoroo/astrid/notes/EditNoteActivity.java +++ b/src/main/java/com/todoroo/astrid/notes/EditNoteActivity.java @@ -35,8 +35,8 @@ import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.actfm.ActFmCameraModule; import com.todoroo.astrid.actfm.ActFmCameraModule.ClearImageCallback; -import com.todoroo.astrid.activity.AstridActivity; import com.todoroo.astrid.activity.TaskEditFragment; +import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.UserActivityDao; import com.todoroo.astrid.data.Metadata; @@ -78,7 +78,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene private Uri pendingCommentPicture = null; private final Fragment fragment; - private final AstridActivity activity; + private final TaskListActivity activity; private final int cameraButton; @@ -105,7 +105,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene this.fragment = fragment; - this.activity = (AstridActivity) fragment.getActivity(); + this.activity = (TaskListActivity) fragment.getActivity(); cameraButton = R.drawable.ic_camera_alt_white_24dp; diff --git a/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.java b/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.java index 285106632..9ab179348 100644 --- a/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.java +++ b/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.java @@ -67,6 +67,8 @@ import static org.tasks.date.DateTimeUtils.newDateTime; */ public class RepeatControlSet extends TaskEditControlFragment { + public static final int TAG = R.string.TEA_ctrl_repeat_pref; + public interface RepeatChangedListener { void repeatChanged(boolean repeat); } @@ -274,6 +276,11 @@ public class RepeatControlSet extends TaskEditControlFragment { return R.drawable.ic_repeat_24dp; } + @Override + public int controlId() { + return TAG; + } + @Override public void initialize(boolean isNewTask, Task task) { repeatAfterCompletion = task.repeatAfterCompletion(); diff --git a/src/main/java/com/todoroo/astrid/service/StartupService.java b/src/main/java/com/todoroo/astrid/service/StartupService.java index 9d4b02d1e..a7e298c02 100644 --- a/src/main/java/com/todoroo/astrid/service/StartupService.java +++ b/src/main/java/com/todoroo/astrid/service/StartupService.java @@ -14,7 +14,7 @@ import android.database.sqlite.SQLiteException; import com.todoroo.andlib.data.DatabaseDao.ModelUpdateListener; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.utility.AndroidUtilities; -import com.todoroo.astrid.activity.AstridActivity; +import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.backup.TasksXmlImporter; import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.DatabaseUpdateListener; @@ -123,7 +123,7 @@ public class StartupService { if(lastVersion > 0) { activity.startActivityForResult(new Intent(activity, UpgradeActivity.class) {{ putExtra(UpgradeActivity.TOKEN_FROM_VERSION, lastVersion); - }}, AstridActivity.REQUEST_UPGRADE); + }}, TaskListActivity.REQUEST_UPGRADE); } preferences.setDefaults(); preferences.setCurrentVersion(currentVersion); diff --git a/src/main/java/com/todoroo/astrid/service/TaskCreator.java b/src/main/java/com/todoroo/astrid/service/TaskCreator.java index 35d52be2a..e39492313 100644 --- a/src/main/java/com/todoroo/astrid/service/TaskCreator.java +++ b/src/main/java/com/todoroo/astrid/service/TaskCreator.java @@ -38,14 +38,14 @@ public class TaskCreator { title = title.trim(); Task task = taskService.createWithValues(null, title); - addToCalendar(task, title); + addToCalendar(task); return task; } - public void addToCalendar(Task task, String title) { + public void addToCalendar(Task task) { boolean gcalCreateEventEnabled = preferences.isDefaultCalendarSet() && task.hasDueDate(); //$NON-NLS-1$ - if (!TextUtils.isEmpty(title) && gcalCreateEventEnabled && TextUtils.isEmpty(task.getCalendarURI())) { + if (!TextUtils.isEmpty(task.getTitle()) && gcalCreateEventEnabled && TextUtils.isEmpty(task.getCalendarURI())) { Uri calendarUri = gcalHelper.createTaskEvent(task, context.getContentResolver(), new ContentValues()); task.setCalendarUri(calendarUri.toString()); diff --git a/src/main/java/com/todoroo/astrid/service/TaskService.java b/src/main/java/com/todoroo/astrid/service/TaskService.java index 9eacba998..9c944f08c 100644 --- a/src/main/java/com/todoroo/astrid/service/TaskService.java +++ b/src/main/java/com/todoroo/astrid/service/TaskService.java @@ -31,7 +31,6 @@ import org.tasks.filters.FilterCounter; import org.tasks.scheduling.RefreshScheduler; import java.util.ArrayList; -import java.util.List; import java.util.Map.Entry; import javax.inject.Inject; @@ -202,21 +201,6 @@ public class TaskService { } } - /** - * Save task, parsing quick-add mark-up: - *
    - *
  • #tag - add the tag "tag" - *
  • @context - add the tag "@context" - *
  • !4 - set priority to !!!! - */ - private void quickAdd(Task task, List tags) { - saveWithoutPublishingFilterUpdate(task); - for(String tag : tags) { - createLink(task, tag); - } - broadcastFilterListUpdated(); - } - private void broadcastFilterListUpdated() { filterCounter.refreshFilterCounts(new Runnable() { @Override @@ -239,17 +223,12 @@ public class TaskService { * doesn't need to start with a base task model. */ public Task createWithValues(ContentValues values, String title) { - Task task = new Task(); - return createWithValues(task, values, title); + return createWithValues(new Task(), values, title); } - /** - * Create task from the given content values, saving it. - * @param task base task to start with - */ - public Task createWithValues(Task task, ContentValues values, String title) { + Task createWithValues(Task task, ContentValues values, String title) { if (title != null) { - task.setTitle(title); + task.setTitle(title.trim()); } ArrayList tags = new ArrayList<>(); @@ -282,7 +261,10 @@ public class TaskService { task.mergeWithoutReplacement(forTask); } - quickAdd(task, tags); + saveWithoutPublishingFilterUpdate(task); + for(String tag : tags) { + createLink(task, tag); + } if (forMetadata != null && forMetadata.size() > 0) { Metadata metadata = new Metadata(); diff --git a/src/main/java/com/todoroo/astrid/tags/TagsControlSet.java b/src/main/java/com/todoroo/astrid/tags/TagsControlSet.java index a40091dd9..e6ba667ab 100644 --- a/src/main/java/com/todoroo/astrid/tags/TagsControlSet.java +++ b/src/main/java/com/todoroo/astrid/tags/TagsControlSet.java @@ -70,6 +70,8 @@ import static com.google.common.collect.Sets.newHashSet; */ public final class TagsControlSet extends TaskEditControlFragment { + public static final int TAG = R.string.TEA_ctrl_lists_pref; + private static final String EXTRA_TAGS = "extra_tags"; @Inject MetadataDao metadataDao; @@ -315,6 +317,11 @@ public final class TagsControlSet extends TaskEditControlFragment { return R.drawable.ic_label_24dp; } + @Override + public int controlId() { + return TAG; + } + protected void refreshDisplayView() { String tagString = buildTagString(); if (!TextUtils.isEmpty(tagString)) { diff --git a/src/main/java/com/todoroo/astrid/timers/TimerControlSet.java b/src/main/java/com/todoroo/astrid/timers/TimerControlSet.java index 837021824..7b7904722 100644 --- a/src/main/java/com/todoroo/astrid/timers/TimerControlSet.java +++ b/src/main/java/com/todoroo/astrid/timers/TimerControlSet.java @@ -50,6 +50,8 @@ import butterknife.OnClick; */ public class TimerControlSet extends TaskEditControlFragment { + public static final int TAG = R.string.TEA_ctrl_timer_pref; + public interface TimerControlSetCallback { Task stopTimer(); Task startTimer(); @@ -171,6 +173,11 @@ public class TimerControlSet extends TaskEditControlFragment { return R.drawable.ic_timer_24dp; } + @Override + public int controlId() { + return TAG; + } + @Override public void initialize(boolean isNewTask, Task task) { timerStarted = task.getTimerStart(); diff --git a/src/main/java/com/todoroo/astrid/ui/EditTitleControlSet.java b/src/main/java/com/todoroo/astrid/ui/EditTitleControlSet.java index 61c635a41..8dfed6c40 100644 --- a/src/main/java/com/todoroo/astrid/ui/EditTitleControlSet.java +++ b/src/main/java/com/todoroo/astrid/ui/EditTitleControlSet.java @@ -6,20 +6,16 @@ package com.todoroo.astrid.ui; import android.app.Activity; +import android.content.Context; import android.graphics.Paint; import android.os.Bundle; import android.support.annotation.Nullable; import android.text.TextUtils; -import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnKeyListener; import android.view.ViewGroup; -import android.view.WindowManager; -import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; import android.widget.EditText; -import android.widget.TextView; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.astrid.data.Task; @@ -42,6 +38,8 @@ import butterknife.OnClick; */ 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"; @@ -81,31 +79,6 @@ public class EditTitleControlSet extends TaskEditControlFragment { editText.setTextKeepState(title); editText.setHorizontallyScrolling(false); editText.setMaxLines(Integer.MAX_VALUE); - editText.setOnKeyListener(new OnKeyListener() { - @Override - public boolean onKey(View v, int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_ENTER) { - AndroidUtilities.hideSoftInputForViews(getActivity(), editText); - return true; - } - return false; - } - }); - editText.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - editText.setCursorVisible(true); - } - }); - editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if (actionId == EditorInfo.IME_ACTION_DONE) { - editText.setCursorVisible(false); - } - return false; - } - }); updateCompleteBox(); return view; } @@ -126,15 +99,13 @@ public class EditTitleControlSet extends TaskEditControlFragment { } @Override - public void onStart() { - super.onStart(); + public void onResume() { + super.onResume(); if (isNewTask) { editText.requestFocus(); - editText.setCursorVisible(true); - getActivity().getWindow() - .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE - | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); + InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); } } @@ -176,6 +147,11 @@ public class EditTitleControlSet extends TaskEditControlFragment { return -1; } + @Override + public int controlId() { + return TAG; + } + @Override public void initialize(boolean isNewTask, Task task) { this.isNewTask = isNewTask; @@ -201,6 +177,5 @@ public class EditTitleControlSet extends TaskEditControlFragment { public void hideKeyboard() { AndroidUtilities.hideSoftInputForViews(getActivity(), editText); - editText.setCursorVisible(false); } } diff --git a/src/main/java/com/todoroo/astrid/ui/HideUntilControlSet.java b/src/main/java/com/todoroo/astrid/ui/HideUntilControlSet.java index 08bb4dfb6..ce1f27769 100644 --- a/src/main/java/com/todoroo/astrid/ui/HideUntilControlSet.java +++ b/src/main/java/com/todoroo/astrid/ui/HideUntilControlSet.java @@ -50,6 +50,8 @@ import static org.tasks.date.DateTimeUtils.newDateTime; */ public class HideUntilControlSet extends TaskEditControlFragment implements OnItemSelectedListener { + public static final int TAG = R.string.TEA_ctrl_hide_until_pref; + private static String EXTRA_CUSTOM = "extra_custom"; private static String EXTRA_SELECTION = "extra_selection"; @@ -128,6 +130,11 @@ public class HideUntilControlSet extends TaskEditControlFragment implements OnIt return R.drawable.ic_visibility_off_24dp; } + @Override + public int controlId() { + return TAG; + } + @Override public void initialize(boolean isNewTask, Task task) { long dueDate = task.getDueDate(); diff --git a/src/main/java/com/todoroo/astrid/ui/QuickAddBar.java b/src/main/java/com/todoroo/astrid/ui/QuickAddBar.java index ec2a83172..14ed94cc9 100644 --- a/src/main/java/com/todoroo/astrid/ui/QuickAddBar.java +++ b/src/main/java/com/todoroo/astrid/ui/QuickAddBar.java @@ -5,7 +5,6 @@ */ package com.todoroo.astrid.ui; -import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.Task; @@ -29,31 +28,21 @@ import timber.log.Timber; public class QuickAddBar { @Inject TaskService taskService; - @Inject TaskCreator taskCreator; @Inject DialogBuilder dialogBuilder; - private TaskListActivity activity; private TaskListFragment fragment; - public void initialize(Injector injector, TaskListActivity myActivity, TaskListFragment myFragment) { + public void initialize(Injector injector, TaskListFragment myFragment) { injector.inject(this); // TODO: get rid of this - activity = myActivity; fragment = myFragment; } - // --- quick add task logic - - public Task quickAddTask() { - return quickAddTask(""); - } - /** * Quick-add a new task */ public Task quickAddTask(String title) { TagData tagData = fragment.getActiveTagData(); - if(tagData != null && (!tagData.containsNonNullValue(TagData.NAME) || - tagData.getName().length() == 0)) { + if(tagData != null && (!tagData.containsNonNullValue(TagData.NAME) || tagData.getName().length() == 0)) { dialogBuilder.newMessageDialog(R.string.tag_no_title_error) .setPositiveButton(android.R.string.ok, null) .show(); @@ -61,25 +50,7 @@ public class QuickAddBar { } try { - if (title != null) { - title = title.trim(); - } - - Task task = new Task(); - if (title != null) { - task.setTitle(title); // need this for calendar - } - - taskService.createWithValues(task, fragment.getFilter().valuesForNewTasks, title); - - taskCreator.addToCalendar(task, title); - - fragment.loadTaskListContent(); - fragment.selectCustomId(task.getId()); - activity.onTaskListItemClicked(task.getId()); - - fragment.onTaskCreated(task.getId(), task.getUUID()); - return task; + return taskService.createWithValues(fragment.getFilter().valuesForNewTasks, title); } catch (Exception e) { Timber.e(e, e.getMessage()); } diff --git a/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java b/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java index 6049b7237..dc25f9b73 100644 --- a/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java +++ b/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java @@ -65,6 +65,8 @@ import static org.tasks.date.DateTimeUtils.newDateTime; */ public class ReminderControlSet extends TaskEditControlFragment { + public static final int TAG = R.string.TEA_ctrl_reminders_pref; + private static final int REQUEST_NEW_ALARM = 12152; private static final int REQUEST_LOCATION_REMINDER = 12153; @@ -172,6 +174,11 @@ public class ReminderControlSet extends TaskEditControlFragment { return R.drawable.ic_notifications_24dp; } + @Override + public int controlId() { + return TAG; + } + @Override public void initialize(boolean isNewTask, Task task) { taskId = task.getId(); diff --git a/src/main/java/com/todoroo/astrid/utility/Flags.java b/src/main/java/com/todoroo/astrid/utility/Flags.java index a036b3d57..122402183 100644 --- a/src/main/java/com/todoroo/astrid/utility/Flags.java +++ b/src/main/java/com/todoroo/astrid/utility/Flags.java @@ -21,11 +21,6 @@ public class Flags { */ public static final int TAGS_CHANGED = 1 << 1; - /** - * If set, indicates that the edit popover was dismissed by the edit fragment/back button - */ - public static final int TLA_DISMISSED_FROM_TASK_EDIT = 1 << 5; - /** * If set, indicates that TaskListFragmentPager should not intercept touch events */ diff --git a/src/main/java/com/todoroo/astrid/widget/TasksWidget.java b/src/main/java/com/todoroo/astrid/widget/TasksWidget.java index 45c8b981a..3a80de1fb 100644 --- a/src/main/java/com/todoroo/astrid/widget/TasksWidget.java +++ b/src/main/java/com/todoroo/astrid/widget/TasksWidget.java @@ -34,6 +34,7 @@ public class TasksWidget extends InjectingAppWidgetProvider { public static final String COMPLETE_TASK = "COMPLETE_TASK"; public static final String EDIT_TASK = "EDIT_TASK"; + public static final String TOKEN_ID = "id"; //$NON-NLS-1$ public static long suppressUpdateFlag = 0; // Timestamp--don't update widgets if this flag is non-zero and now() is within 5 minutes private static final long SUPPRESS_TIME = DateUtilities.ONE_MINUTE * 5; @@ -44,13 +45,13 @@ public class TasksWidget extends InjectingAppWidgetProvider { switch(intent.getAction()) { case COMPLETE_TASK: - broadcaster.toggleCompletedState(intent.getLongExtra(TaskEditFragment.TOKEN_ID, 0)); + broadcaster.toggleCompletedState(intent.getLongExtra(TOKEN_ID, 0)); break; case EDIT_TASK: getEditTaskStack( context, (Filter) intent.getParcelableExtra(TaskListFragment.TOKEN_FILTER), - intent.getLongExtra(TaskEditFragment.TOKEN_ID, 0)) + intent.getLongExtra(TOKEN_ID, 0)) .startActivities(); break; case BROADCAST_EVENT_REFRESH: diff --git a/src/main/java/org/tasks/injection/ActivityModule.java b/src/main/java/org/tasks/injection/ActivityModule.java index 1cab16bb6..7e3934d1a 100644 --- a/src/main/java/org/tasks/injection/ActivityModule.java +++ b/src/main/java/org/tasks/injection/ActivityModule.java @@ -8,7 +8,6 @@ import com.todoroo.astrid.activity.BeastModePreferences; import com.todoroo.astrid.activity.FilterShortcutActivity; import com.todoroo.astrid.activity.ShareLinkActivity; import com.todoroo.astrid.activity.ShortcutActivity; -import com.todoroo.astrid.activity.TaskEditActivity; import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.core.CustomFilterActivity; import com.todoroo.astrid.core.DefaultsPreferences; @@ -60,7 +59,6 @@ import dagger.Provides; @Module(addsTo = TasksModule.class, injects = { TaskListActivity.class, - TaskEditActivity.class, ShareLinkActivity.class, TagSettingsActivity.class, FilterSettingsActivity.class, diff --git a/src/main/java/org/tasks/intents/TaskIntents.java b/src/main/java/org/tasks/intents/TaskIntents.java index 7f192d194..f1330af27 100644 --- a/src/main/java/org/tasks/intents/TaskIntents.java +++ b/src/main/java/org/tasks/intents/TaskIntents.java @@ -6,28 +6,18 @@ import android.os.Bundle; import android.support.v4.app.TaskStackBuilder; import com.todoroo.andlib.utility.AndroidUtilities; -import com.todoroo.astrid.activity.TaskEditActivity; import com.todoroo.astrid.activity.TaskEditFragment; import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.FilterWithCustomIntent; -import org.tasks.R; - public class TaskIntents { public static Intent getNewTaskIntent(Context context, Filter filter) { Intent intent; - boolean twoPaneLayout = context.getResources().getBoolean(R.bool.two_pane_layout); - if (twoPaneLayout) { - intent = new Intent(context, TaskListActivity.class); - intent.putExtra(TaskListActivity.OPEN_TASK, 0L); - } else { - intent = new Intent(context, TaskEditActivity.class); - } - - intent.putExtra(TaskEditFragment.OVERRIDE_FINISH_ANIM, false); + intent = new Intent(context, TaskListActivity.class); + intent.putExtra(TaskListActivity.OPEN_TASK, 0L); if (filter != null) { intent.putExtra(TaskListFragment.TOKEN_FILTER, filter); if (filter.valuesForNewTasks != null) { @@ -35,11 +25,9 @@ public class TaskIntents { intent.putExtra(TaskEditFragment.TOKEN_VALUES, values); intent.setAction("E" + values); } - if (twoPaneLayout) { - if (filter instanceof FilterWithCustomIntent) { - Bundle customExtras = ((FilterWithCustomIntent) filter).customExtras; - intent.putExtras(customExtras); - } + if (filter instanceof FilterWithCustomIntent) { + Bundle customExtras = ((FilterWithCustomIntent) filter).customExtras; + intent.putExtras(customExtras); } } else { intent.setAction("E"); @@ -48,25 +36,16 @@ public class TaskIntents { } public static TaskStackBuilder getEditTaskStack(Context context, final Filter filter, final long taskId) { - TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(context); - boolean twoPaneLayout = context.getResources().getBoolean(R.bool.two_pane_layout); - if (twoPaneLayout) { - taskStackBuilder.addNextIntent(new Intent(context, TaskListActivity.class) {{ - putExtra(TaskListActivity.OPEN_TASK, taskId); - if (filter != null && filter instanceof FilterWithCustomIntent) { - Bundle customExtras = ((FilterWithCustomIntent) filter).customExtras; - putExtras(customExtras); - } - }}); - } else { - taskStackBuilder.addParentStack(TaskEditActivity.class); - taskStackBuilder.addNextIntent(new Intent(context, TaskEditActivity.class) {{ - putExtra(TaskEditFragment.TOKEN_ID, taskId); - }}); - if (filter != null) { - taskStackBuilder.editIntentAt(0).putExtra(TaskListFragment.TOKEN_FILTER, filter); - } - } - return taskStackBuilder; + return TaskStackBuilder.create(context) + .addNextIntent(new Intent(context, TaskListActivity.class) {{ + putExtra(TaskListActivity.OPEN_TASK, taskId); + if (filter != null) { + putExtra(TaskListFragment.TOKEN_FILTER, filter); + if (filter instanceof FilterWithCustomIntent) { + Bundle customExtras = ((FilterWithCustomIntent) filter).customExtras; + putExtras(customExtras); + } + } + }}); } } diff --git a/src/main/java/org/tasks/preferences/ActivityPreferences.java b/src/main/java/org/tasks/preferences/ActivityPreferences.java index c1fd0efcc..b6360c8b0 100644 --- a/src/main/java/org/tasks/preferences/ActivityPreferences.java +++ b/src/main/java/org/tasks/preferences/ActivityPreferences.java @@ -1,11 +1,8 @@ package org.tasks.preferences; import android.app.Activity; -import android.content.Context; -import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.PixelFormat; -import android.util.DisplayMetrics; import android.view.Window; import org.tasks.R; @@ -18,9 +15,6 @@ import static com.todoroo.andlib.utility.AndroidUtilities.preLollipop; @Singleton public class ActivityPreferences extends Preferences { - public static final int MIN_TABLET_WIDTH = 550; - public static final int MIN_TABLET_HEIGHT = 800; - private final Activity activity; @Inject @@ -29,10 +23,6 @@ public class ActivityPreferences extends Preferences { this.activity = activity; } - public boolean useTabletLayout() { - return isTabletSized(context); - } - public void applyThemeAndStatusBarColor() { applyTheme(); applyStatusBarColor(); @@ -83,30 +73,4 @@ public class ActivityPreferences extends Preferences { public boolean isDarkTheme() { return getBoolean(R.string.p_use_dark_theme, false); } - - /** - * Returns true if the screen is large or xtra large - */ - public static boolean isTabletSized(Context context) { - if (context.getPackageManager().hasSystemFeature("com.google.android.tv")) { //$NON-NLS-1$ - return true; - } - int size = context.getResources().getConfiguration().screenLayout - & Configuration.SCREENLAYOUT_SIZE_MASK; - - if (size == Configuration.SCREENLAYOUT_SIZE_XLARGE) { - return true; - } else if (size == Configuration.SCREENLAYOUT_SIZE_LARGE) { - DisplayMetrics metrics = context.getResources().getDisplayMetrics(); - float width = metrics.widthPixels / metrics.density; - float height = metrics.heightPixels / metrics.density; - - float effectiveWidth = Math.min(width, height); - float effectiveHeight = Math.max(width, height); - - return (effectiveWidth >= MIN_TABLET_WIDTH && effectiveHeight >= MIN_TABLET_HEIGHT); - } else { - return false; - } - } } diff --git a/src/main/java/org/tasks/ui/CalendarControlSet.java b/src/main/java/org/tasks/ui/CalendarControlSet.java index 9bedf0e5a..e9e05fa33 100644 --- a/src/main/java/org/tasks/ui/CalendarControlSet.java +++ b/src/main/java/org/tasks/ui/CalendarControlSet.java @@ -35,6 +35,8 @@ import static com.google.common.base.Strings.isNullOrEmpty; public class CalendarControlSet extends TaskEditControlFragment { + public static final int TAG = R.string.TEA_ctrl_gcal; + private static final int REQUEST_CODE_CALENDAR = 70; private static final String EXTRA_URI = "extra_uri"; private static final String EXTRA_ID = "extra_id"; @@ -88,6 +90,11 @@ public class CalendarControlSet extends TaskEditControlFragment { return R.drawable.ic_event_24dp; } + @Override + public int controlId() { + return TAG; + } + @Override public void initialize(boolean isNewTask, Task task) { this.isNewTask = isNewTask; diff --git a/src/main/java/org/tasks/ui/DeadlineControlSet.java b/src/main/java/org/tasks/ui/DeadlineControlSet.java index a076310d1..319530475 100644 --- a/src/main/java/org/tasks/ui/DeadlineControlSet.java +++ b/src/main/java/org/tasks/ui/DeadlineControlSet.java @@ -34,19 +34,22 @@ import butterknife.Bind; import butterknife.OnClick; import butterknife.OnItemSelected; +import static com.google.common.collect.Lists.newArrayList; import static java.util.Arrays.asList; import static org.tasks.date.DateTimeUtils.newDateTime; import static org.tasks.preferences.ResourceResolver.getData; public class DeadlineControlSet extends TaskEditControlFragment { + public static final int TAG = R.string.TEA_ctrl_when_pref; + private static final int REQUEST_DATE = 504; private static final int REQUEST_TIME = 505; private static final String EXTRA_DATE = "extra_date"; private static final String EXTRA_TIME = "extra_time"; - private final List dueDateOptions = new ArrayList<>(); - private final List dueTimeOptions = new ArrayList<>(); + private List dueDateOptions = new ArrayList<>(); + private List dueTimeOptions = new ArrayList<>(); private List dueTimeHint = new ArrayList<>(); private int dateShortcutMorning; private int dateShortcutAfternoon; @@ -94,20 +97,20 @@ public class DeadlineControlSet extends TaskEditControlFragment { noTimeString = activity.getString(R.string.TEA_no_time); todayString = activity.getString(R.string.today); tomorrowString = activity.getString(R.string.tomorrow); - dueDateOptions.addAll(asList( + dueDateOptions = newArrayList( "", todayString, tomorrowString, "", - activity.getString(R.string.pick_a_date))); - dueTimeOptions.addAll(asList( + activity.getString(R.string.pick_a_date)); + dueTimeOptions = newArrayList( "", noTimeString, morningString, afternoonString, eveningString, nightString, - activity.getString(R.string.pick_a_time))); + activity.getString(R.string.pick_a_time)); } @Nullable @@ -247,6 +250,11 @@ public class DeadlineControlSet extends TaskEditControlFragment { return R.drawable.ic_schedule_24dp; } + @Override + public int controlId() { + return TAG; + } + @Override public void initialize(boolean isNewTask, Task task) { if (task.hasDueDate()) { diff --git a/src/main/java/org/tasks/ui/DescriptionControlSet.java b/src/main/java/org/tasks/ui/DescriptionControlSet.java index a40c48b2d..c83b74ca1 100644 --- a/src/main/java/org/tasks/ui/DescriptionControlSet.java +++ b/src/main/java/org/tasks/ui/DescriptionControlSet.java @@ -17,6 +17,7 @@ import butterknife.OnTextChanged; public class DescriptionControlSet extends TaskEditControlFragment { + public static final int TAG = R.string.TEA_ctrl_notes_pref; private static final String EXTRA_DESCRIPTION = "extra_description"; @Bind(R.id.notes) EditText editText; @@ -53,6 +54,11 @@ public class DescriptionControlSet extends TaskEditControlFragment { return R.drawable.ic_event_note_24dp; } + @Override + public int controlId() { + return TAG; + } + @OnTextChanged(R.id.notes) void textChanged(CharSequence text) { description = text.toString().trim(); diff --git a/src/main/java/org/tasks/ui/NavigationDrawerFragment.java b/src/main/java/org/tasks/ui/NavigationDrawerFragment.java index 972cd7568..c0a4dd539 100644 --- a/src/main/java/org/tasks/ui/NavigationDrawerFragment.java +++ b/src/main/java/org/tasks/ui/NavigationDrawerFragment.java @@ -103,7 +103,6 @@ public class NavigationDrawerFragment extends InjectingFragment { getActivity().getIntent().putExtra(TaskListActivity.TOKEN_SWITCH_TO_FILTER, newList); clear(); } - } else { super.onActivityResult(requestCode, resultCode, data); } @@ -224,7 +223,7 @@ public class NavigationDrawerFragment extends InjectingFragment { } public interface OnFilterItemClickedListener { - boolean onFilterItemClicked(FilterListItem item); + void onFilterItemClicked(FilterListItem item); } public void clear() { diff --git a/src/main/java/org/tasks/ui/PriorityControlSet.java b/src/main/java/org/tasks/ui/PriorityControlSet.java index 5dc04a37a..804191a38 100644 --- a/src/main/java/org/tasks/ui/PriorityControlSet.java +++ b/src/main/java/org/tasks/ui/PriorityControlSet.java @@ -22,6 +22,8 @@ import butterknife.OnClick; public class PriorityControlSet extends TaskEditControlFragment { + public static final int TAG = R.string.TEA_ctrl_importance_pref; + public interface OnPriorityChanged { void onPriorityChange(int priority); } @@ -83,6 +85,11 @@ public class PriorityControlSet extends TaskEditControlFragment { return R.drawable.ic_flag_24dp; } + @Override + public int controlId() { + return TAG; + } + @Override public void initialize(boolean isNewTask, Task task) { priority = task.getImportance(); diff --git a/src/main/java/org/tasks/ui/TaskEditControlFragment.java b/src/main/java/org/tasks/ui/TaskEditControlFragment.java index 8bf8bf223..501f50b89 100644 --- a/src/main/java/org/tasks/ui/TaskEditControlFragment.java +++ b/src/main/java/org/tasks/ui/TaskEditControlFragment.java @@ -33,6 +33,8 @@ public abstract class TaskEditControlFragment extends InjectingFragment { protected abstract int getIcon(); + public abstract int controlId(); + public abstract void initialize(boolean isNewTask, Task task); public abstract void apply(Task task); diff --git a/src/main/java/org/tasks/widget/ScrollableViewsFactory.java b/src/main/java/org/tasks/widget/ScrollableViewsFactory.java index 7904171f6..4061c55b7 100644 --- a/src/main/java/org/tasks/widget/ScrollableViewsFactory.java +++ b/src/main/java/org/tasks/widget/ScrollableViewsFactory.java @@ -164,7 +164,7 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac Intent editIntent = new Intent(); editIntent.setAction(TasksWidget.EDIT_TASK); editIntent.putExtra(TaskListFragment.TOKEN_FILTER, filter); - editIntent.putExtra(TaskEditFragment.TOKEN_ID, task.getId()); + editIntent.putExtra(TasksWidget.TOKEN_ID, task.getId()); editIntent.putExtra(TaskListActivity.OPEN_TASK, task.getId()); row.setOnClickFillInIntent(R.id.text, editIntent); @@ -173,7 +173,7 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac } else { Intent completeIntent = new Intent(); completeIntent.setAction(TasksWidget.COMPLETE_TASK); - completeIntent.putExtra(TaskEditFragment.TOKEN_ID, task.getId()); + completeIntent.putExtra(TasksWidget.TOKEN_ID, task.getId()); row.setOnClickFillInIntent(R.id.completeBox, completeIntent); } diff --git a/src/main/res/anim/slide_left_in.xml b/src/main/res/anim/slide_left_in.xml deleted file mode 100644 index 291a0f127..000000000 --- a/src/main/res/anim/slide_left_in.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/src/main/res/anim/slide_left_out.xml b/src/main/res/anim/slide_left_out.xml deleted file mode 100644 index 2f3a5dfb1..000000000 --- a/src/main/res/anim/slide_left_out.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/src/main/res/anim/slide_right_in.xml b/src/main/res/anim/slide_right_in.xml deleted file mode 100644 index 749fb14cb..000000000 --- a/src/main/res/anim/slide_right_in.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/src/main/res/anim/slide_right_out.xml b/src/main/res/anim/slide_right_out.xml deleted file mode 100644 index 84dacfca6..000000000 --- a/src/main/res/anim/slide_right_out.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/src/main/res/layout-w820dp/task_edit_wrapper_activity.xml b/src/main/res/layout-w820dp/task_edit_wrapper_activity.xml deleted file mode 100644 index 408292118..000000000 --- a/src/main/res/layout-w820dp/task_edit_wrapper_activity.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - diff --git a/src/main/res/layout-w820dp/task_list_wrapper.xml b/src/main/res/layout-w820dp/task_list_wrapper.xml index 332c2dc74..625cd0b8c 100644 --- a/src/main/res/layout-w820dp/task_list_wrapper.xml +++ b/src/main/res/layout-w820dp/task_list_wrapper.xml @@ -26,7 +26,7 @@ @@ -38,11 +38,10 @@ + android:layout_weight="40" /> diff --git a/src/main/res/layout/control_set_title.xml b/src/main/res/layout/control_set_title.xml index cc47ddb92..854ebf15d 100644 --- a/src/main/res/layout/control_set_title.xml +++ b/src/main/res/layout/control_set_title.xml @@ -36,13 +36,11 @@ android:layout_height="wrap_content" android:layout_weight="100" android:background="?attr/asEditTextBackground" - android:cursorVisible="false" - android:freezesText="true" android:hint="@string/TEA_title_hint" - android:imeOptions="flagNoExtractUi|actionDone" + android:freezesText="true" + android:imeOptions="flagNoExtractUi" android:inputType="textCapSentences" android:scrollbars="vertical" - android:text="" android:textColor="?attr/asTextColor" android:textColorHint="?attr/asTextColorHint" /> diff --git a/src/main/res/layout/task_edit_activity.xml b/src/main/res/layout/task_edit_fragment.xml similarity index 59% rename from src/main/res/layout/task_edit_activity.xml rename to src/main/res/layout/task_edit_fragment.xml index f367c2285..0313e839e 100644 --- a/src/main/res/layout/task_edit_activity.xml +++ b/src/main/res/layout/task_edit_fragment.xml @@ -24,11 +24,71 @@ android:orientation="vertical" android:gravity="center_horizontal" > - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - diff --git a/src/main/res/layout/task_list_wrapper.xml b/src/main/res/layout/task_list_wrapper.xml index e01754a74..5a5970a08 100644 --- a/src/main/res/layout/task_list_wrapper.xml +++ b/src/main/res/layout/task_list_wrapper.xml @@ -14,7 +14,7 @@