Single master/detail activity

Closes #301
Closes #280
pull/384/head
Alex Baker 10 years ago
parent 0c0ae5c667
commit 27fa6f6e11

@ -174,26 +174,6 @@
</intent-filter> </intent-filter>
</activity> </activity>
<!-- Activity that creates or edits tasks -->
<activity
android:name="com.todoroo.astrid.activity.TaskEditActivity"
android:parentActivityName="com.todoroo.astrid.activity.TaskListActivity"
android:windowSoftInputMode="stateHidden">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.todoroo.astrid.activity.TaskListActivity" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/task" />
</intent-filter>
</activity>
<!-- Activity for preferences --> <!-- Activity for preferences -->
<activity <activity

@ -344,18 +344,6 @@ public class AndroidUtilities {
} }
} }
/**
* If you want to set a transition, please use this method rather than <code>callApiMethod</code> 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 * Capitalize the first character
*/ */

@ -18,7 +18,6 @@ import android.view.MenuItem;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.EditText; import android.widget.EditText;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.CustomFilter; import com.todoroo.astrid.api.CustomFilter;
import com.todoroo.astrid.dao.StoreObjectDao; import com.todoroo.astrid.dao.StoreObjectDao;
@ -94,7 +93,6 @@ public class FilterSettingsActivity extends InjectingAppCompatActivity {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(filterName.getWindowToken(), 0); imm.hideSoftInputFromWindow(filterName.getWindowToken(), 0);
super.finish(); super.finish();
AndroidUtilities.callOverridePendingTransition(this, R.anim.slide_right_in, R.anim.slide_right_out);
} }
@Override @Override

@ -23,7 +23,6 @@ import android.widget.EditText;
import android.widget.TextView; import android.widget.TextView;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TagDataDao; import com.todoroo.astrid.dao.TagDataDao;
@ -153,7 +152,6 @@ public class TagSettingsActivity extends InjectingAppCompatActivity {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(tagName.getWindowToken(), 0); imm.hideSoftInputFromWindow(tagName.getWindowToken(), 0);
super.finish(); super.finish();
AndroidUtilities.callOverridePendingTransition(this, R.anim.slide_right_in, R.anim.slide_right_out);
} }
@Override @Override

@ -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();
}
}

@ -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);
}
}

@ -6,9 +6,6 @@
package com.todoroo.astrid.activity; package com.todoroo.astrid.activity;
import android.app.Activity; import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
@ -17,7 +14,6 @@ import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
@ -29,30 +25,22 @@ import android.view.ViewGroup.LayoutParams;
import android.view.ViewParent; import android.view.ViewParent;
import android.widget.EditText; import android.widget.EditText;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ScrollView; import android.widget.ScrollView;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.actfm.ActFmCameraModule; import com.todoroo.astrid.actfm.ActFmCameraModule;
import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.UserActivityDao; import com.todoroo.astrid.dao.UserActivityDao;
import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskAttachment; import com.todoroo.astrid.data.TaskAttachment;
import com.todoroo.astrid.files.AACRecordingActivity; import com.todoroo.astrid.files.AACRecordingActivity;
import com.todoroo.astrid.files.FilesControlSet; import com.todoroo.astrid.files.FilesControlSet;
import com.todoroo.astrid.notes.EditNoteActivity; import com.todoroo.astrid.notes.EditNoteActivity;
import com.todoroo.astrid.repeats.RepeatControlSet;
import com.todoroo.astrid.service.TaskDeleter; import com.todoroo.astrid.service.TaskDeleter;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.tags.TagsControlSet;
import com.todoroo.astrid.timers.TimerControlSet; import com.todoroo.astrid.timers.TimerControlSet;
import com.todoroo.astrid.timers.TimerPlugin; import com.todoroo.astrid.timers.TimerPlugin;
import com.todoroo.astrid.ui.EditTitleControlSet; 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 com.todoroo.astrid.utility.Flags;
import org.tasks.R; import org.tasks.R;
@ -62,24 +50,13 @@ import org.tasks.injection.ForActivity;
import org.tasks.injection.InjectingFragment; import org.tasks.injection.InjectingFragment;
import org.tasks.notifications.NotificationManager; import org.tasks.notifications.NotificationManager;
import org.tasks.preferences.ActivityPreferences; 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.MenuColorizer;
import org.tasks.ui.PriorityControlSet;
import org.tasks.ui.TaskEditControlFragment; 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 javax.inject.Inject;
import butterknife.Bind; import butterknife.Bind;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import timber.log.Timber;
import static android.app.Activity.RESULT_OK; 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 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$ public static final String TAG_TASKEDIT_FRAGMENT = "taskedit_fragment"; //$NON-NLS-1$
// --- bundle tokens // --- 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 * Content Values to set
*/ */
@ -111,12 +94,8 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
/** /**
* Task in progress (during orientation change) * Task in progress (during orientation change)
*/ */
private static final String TASK_IN_PROGRESS = "task_in_progress"; //$NON-NLS-1$ private static final String EXTRA_TASK = "extra_task"; //$NON-NLS-1$
private static final String EXTRA_APPLY_MODEL = "extra_apply_model";
/**
* Task remote id (during orientation change)
*/
private static final String TASK_UUID = "task_uuid"; //$NON-NLS-1$
/** /**
* Token for saving a bitmap in the intent before it has been added with a comment * 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_RECORD = 30; // TODO: move this to file control set
public static final int REQUEST_CODE_CAMERA = 60; 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 // --- services
public static final int TAB_VIEW_UPDATES = 0; public static final int TAB_VIEW_UPDATES = 0;
@ -150,16 +123,27 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
// --- UI components // --- UI components
private final Map<String, Integer> controlSetFragments = new HashMap<>();
private final List<Integer> displayedFragments = new ArrayList<>();
private EditNoteActivity editNotes; private EditNoteActivity editNotes;
@Bind(R.id.pager) ViewPager mPager; @Bind(R.id.pager) ViewPager mPager;
@Bind(R.id.updatesFooter) View commentsBar; @Bind(R.id.updatesFooter) View commentsBar;
@Bind(R.id.basic_controls) LinearLayout basicControls;
@Bind(R.id.edit_scroll) ScrollView scrollView; @Bind(R.id.edit_scroll) ScrollView scrollView;
@Bind(R.id.commentField) EditText commentField; @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 // --- other instance variables
/** true if editing started with a new task */ /** true if editing started with a new task */
@ -167,15 +151,10 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
/** task model */ /** task model */
Task model = null; Task model = null;
private boolean applyModel = false;
/** whether task should be saved when this activity exits */
private boolean shouldSaveState = true;
private boolean overrideFinishAnim;
private String uuid = RemoteModel.NO_UUID;
private boolean showEditComments; private boolean showEditComments;
private TaskEditFragmentCallbackHandler callback;
/* /*
* ====================================================================== * ======================================================================
@ -188,15 +167,9 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
// if we were editing a task already, restore it // if we were editing a task already, restore it
if (savedInstanceState != null if (savedInstanceState != null) {
&& savedInstanceState.containsKey(TASK_IN_PROGRESS)) { model = savedInstanceState.getParcelable(EXTRA_TASK);
Task task = savedInstanceState.getParcelable(TASK_IN_PROGRESS); applyModel = savedInstanceState.getBoolean(EXTRA_APPLY_MODEL);
if (task != null) {
model = task;
}
if (savedInstanceState.containsKey(TASK_UUID)) {
uuid = savedInstanceState.getString(TASK_UUID);
}
} }
showEditComments = preferences.getBoolean(R.string.p_show_task_edit_comments, true); showEditComments = preferences.getBoolean(R.string.p_show_task_edit_comments, true);
@ -204,6 +177,13 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
getActivity().setResult(RESULT_OK); getActivity().setResult(RESULT_OK);
} }
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
callback = (TaskEditFragmentCallbackHandler) activity;
}
/* /*
* ====================================================================== * ======================================================================
* ==================================================== UI initialization * ==================================================== UI initialization
@ -213,51 +193,12 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { 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); ButterKnife.bind(this, view);
loadItem(getActivity().getIntent()); notificationManager.cancel(model.getId());
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<String> 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);
}
}
}
fragmentTransaction.commit(); applyModel = false;
if (!showEditComments) { if (!showEditComments) {
commentsBar.setVisibility(View.GONE); commentsBar.setVisibility(View.GONE);
@ -266,38 +207,6 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
return view; 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 @Override
public void onActivityCreated(Bundle savedInstanceState) { 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. // We have a menu item to show in action bar.
setHasOptionsMenu(true); 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 // Load task data in background
new TaskEditBackgroundLoader().start(); new TaskEditBackgroundLoader().start();
} }
private void instantiateEditNotes() { private void instantiateEditNotes() {
if (showEditComments) { if (showEditComments) {
long idParam = getActivity().getIntent().getLongExtra(TOKEN_ID, -1L);
editNotes = new EditNoteActivity(actFmCameraModule, metadataDao, userActivityDao, editNotes = new EditNoteActivity(actFmCameraModule, metadataDao, userActivityDao,
taskService, this, getView(), idParam); taskService, this, getView(), model.getId());
editNotes.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, editNotes.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT)); LayoutParams.WRAP_CONTENT));
@ -333,8 +231,6 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
} }
private void loadMoreContainer() { private void loadMoreContainer() {
long idParam = getActivity().getIntent().getLongExtra(TOKEN_ID, -1L);
int tabStyle = TaskEditViewPager.TAB_SHOW_ACTIVITY; int tabStyle = TaskEditViewPager.TAB_SHOW_ACTIVITY;
if (!showEditComments) { if (!showEditComments) {
@ -344,7 +240,7 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
if (editNotes == null) { if (editNotes == null) {
instantiateEditNotes(); instantiateEditNotes();
} else { } else {
editNotes.loadViewForTaskID(idParam); editNotes.loadViewForTaskID(model.getId());
} }
if (editNotes != null) { 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() { private String getTitle() {
return getEditTitleControlSet().getTitle(); return getEditTitleControlSet().getTitle();
} }
/** Save task model from values in UI components */ /** Save task model from values in UI components */
public void save(boolean onPause) { public void save() {
String title = getTitle(); String title = getTitle();
if (title == null) { if (title == null) {
return; return;
@ -507,24 +339,17 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
return; return;
} }
if (!onPause) { for (int fragmentId : rowIds) {
for (Integer fragmentId : displayedFragments) { TaskEditControlFragment fragment = (TaskEditControlFragment) getFragmentManager().findFragmentById(fragmentId);
getFragment(fragmentId).apply(model); if (fragment == null) {
break;
}
fragment.apply(model);
} }
taskService.save(model); taskService.save(model);
boolean taskEditActivity = (getActivity() instanceof TaskEditActivity);
boolean tagsChanged = Flags.check(Flags.TAGS_CHANGED); boolean tagsChanged = Flags.check(Flags.TAGS_CHANGED);
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);
} else {
// Notify task list fragment in multi-column case // Notify task list fragment in multi-column case
// since the activity isn't actually finishing // since the activity isn't actually finishing
TaskListActivity tla = (TaskListActivity) getActivity(); TaskListActivity tla = (TaskListActivity) getActivity();
@ -536,24 +361,20 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
if (isNewTask) { if (isNewTask) {
tla.getTaskListFragment().onTaskCreated(model.getId(), model.getUuid()); tla.getTaskListFragment().onTaskCreated(model.getId(), model.getUuid());
} }
}
removeExtrasFromIntent(getActivity().getIntent()); removeExtrasFromIntent(getActivity().getIntent());
shouldSaveState = false;
getActivity().onBackPressed();
}
} }
private EditTitleControlSet getEditTitleControlSet() { private EditTitleControlSet getEditTitleControlSet() {
return getFragment(R.string.TEA_ctrl_title_pref); return getFragment(EditTitleControlSet.TAG);
} }
private FilesControlSet getFilesControlSet() { private FilesControlSet getFilesControlSet() {
return getFragment(R.string.TEA_ctrl_files_pref); return getFragment(FilesControlSet.TAG);
} }
private TimerControlSet getTimerControl() { private TimerControlSet getTimerControl() {
return getFragment(R.string.TEA_ctrl_timer_pref); return getFragment(TimerControlSet.TAG );
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@ -561,39 +382,13 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
return (T) getFragmentManager().findFragmentByTag(getString(tag)); return (T) getFragmentManager().findFragmentByTag(getString(tag));
} }
public boolean onKeyDown(int keyCode) { public void onBackPressed() {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if(getTitle().length() == 0) { if(getTitle().length() == 0) {
discardButtonClick(); discardButtonClick();
} else { } else {
saveButtonClick(); save();
}
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);
}
} }
callback.taskEditFinished();
} }
/** /**
@ -601,6 +396,7 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
*/ */
public static void removeExtrasFromIntent(Intent intent) { public static void removeExtrasFromIntent(Intent intent) {
if (intent != null) { if (intent != null) {
intent.removeExtra(TaskListActivity.TOKEN_SWITCH_TO_FILTER);
intent.removeExtra(TaskListActivity.OPEN_TASK); intent.removeExtra(TaskListActivity.OPEN_TASK);
intent.removeExtra(TOKEN_PICTURE_IN_PROGRESS); 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() { protected void discardButtonClick() {
shouldSaveState = false;
// abandon editing in this case // abandon editing in this case
if (getTitle().trim().length() == 0 || TextUtils.isEmpty(model.getTitle())) { if (getTitle().trim().length() == 0 || TextUtils.isEmpty(model.getTitle())) {
if (isNewTask) { if (isNewTask) {
@ -632,7 +422,6 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
} }
removeExtrasFromIntent(getActivity().getIntent()); removeExtrasFromIntent(getActivity().getIntent());
getActivity().onBackPressed();
} }
protected void deleteButtonClick() { protected void deleteButtonClick() {
@ -642,19 +431,7 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
TimerPlugin.stopTimer(notificationManager, taskService, getActivity(), model); TimerPlugin.stopTimer(notificationManager, taskService, getActivity(), model);
taskDeleter.delete(model); taskDeleter.delete(model);
shouldSaveState = false; callback.taskEditFinished();
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();
}
}
} }
}) })
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
@ -672,10 +449,12 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.menu_save: case R.id.menu_save:
saveButtonClick(); save();
callback.taskEditFinished();
return true; return true;
case R.id.menu_discard: case R.id.menu_discard:
discardButtonClick(); discardButtonClick();
callback.taskEditFinished();
return true; return true;
case R.id.menu_record_note: case R.id.menu_record_note:
startRecordingAudio(); startRecordingAudio();
@ -687,8 +466,9 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
if (getTitle().trim().length() == 0) { if (getTitle().trim().length() == 0) {
discardButtonClick(); discardButtonClick();
} else { } else {
saveButtonClick(); save();
} }
callback.taskEditFinished();
return true; return true;
} }
@ -699,18 +479,11 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear(); menu.clear();
inflater.inflate(R.menu.task_edit_fragment, menu); inflater.inflate(R.menu.task_edit_fragment, menu);
MenuColorizer.colorMenu(getActivity(), menu, getResources().getColor(android.R.color.white)); for (int i = 0 ; i < menu.size() ; i++) {
if (preferences.useTabletLayout()) { MenuColorizer.colorMenuItem(menu.getItem(i), getResources().getColor(android.R.color.white));
menu.findItem(R.id.menu_save).setVisible(true);
}
} }
if (getResources().getBoolean(R.bool.two_pane_layout)) {
@Override menu.findItem(R.id.menu_save).setVisible(true);
public void onPause() {
super.onPause();
if (shouldSaveState) {
save(true);
} }
} }
@ -738,9 +511,8 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
public void onSaveInstanceState(Bundle outState) { public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
// stick our task into the outState outState.putParcelable(EXTRA_TASK, model);
outState.putParcelable(TASK_IN_PROGRESS, model); outState.putBoolean(EXTRA_APPLY_MODEL, applyModel);
outState.putString(TASK_UUID, uuid);
} }
/* /*

@ -8,11 +8,11 @@ package com.todoroo.astrid.activity;
import android.app.Activity; import android.app.Activity;
import android.app.FragmentManager; import android.app.FragmentManager;
import android.app.FragmentTransaction; import android.app.FragmentTransaction;
import android.content.ContentValues;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v4.view.MenuItemCompat; import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.DrawerLayout;
@ -23,64 +23,101 @@ import android.view.KeyEvent;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.inputmethod.InputMethodManager;
import com.todoroo.andlib.data.Callback; import com.todoroo.andlib.data.Callback;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.actfm.FilterSettingsActivity; import com.todoroo.astrid.actfm.FilterSettingsActivity;
import com.todoroo.astrid.actfm.TagSettingsActivity; import com.todoroo.astrid.actfm.TagSettingsActivity;
import com.todoroo.astrid.actfm.TagViewFragment; import com.todoroo.astrid.actfm.TagViewFragment;
import com.todoroo.astrid.adapter.FilterAdapter;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.CustomFilter; import com.todoroo.astrid.api.CustomFilter;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem; 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.core.BuiltInFilterExposer;
import com.todoroo.astrid.dao.TagDataDao; import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.files.FilesControlSet;
import com.todoroo.astrid.gtasks.GtasksListFragment; 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.SubtasksHelper;
import com.todoroo.astrid.subtasks.SubtasksListFragment; import com.todoroo.astrid.subtasks.SubtasksListFragment;
import com.todoroo.astrid.subtasks.SubtasksTagListFragment; import com.todoroo.astrid.subtasks.SubtasksTagListFragment;
import com.todoroo.astrid.tags.TagFilterExposer; 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.voice.VoiceInputAssistant;
import com.todoroo.astrid.widget.TasksWidget; import com.todoroo.astrid.widget.TasksWidget;
import org.tasks.R; import org.tasks.R;
import org.tasks.activities.SortActivity; import org.tasks.activities.SortActivity;
import org.tasks.analytics.Tracker; import org.tasks.injection.InjectingAppCompatActivity;
import org.tasks.preferences.ActivityPreferences; import org.tasks.preferences.ActivityPreferences;
import org.tasks.preferences.BasicPreferences;
import org.tasks.receivers.RepeatConfirmationReceiver; 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.MenuColorizer;
import org.tasks.ui.NavigationDrawerFragment; 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 javax.inject.Inject;
import butterknife.Bind;
import butterknife.ButterKnife;
import timber.log.Timber; import timber.log.Timber;
import static com.todoroo.astrid.activity.TaskEditFragment.newTaskEditFragment;
import static com.todoroo.astrid.voice.VoiceInputAssistant.voiceInputAvailable; import static com.todoroo.astrid.voice.VoiceInputAssistant.voiceInputAvailable;
import static org.tasks.ui.NavigationDrawerFragment.OnFilterItemClickedListener; 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 TagDataDao tagDataDao;
@Inject ActivityPreferences preferences; @Inject ActivityPreferences preferences;
@Inject GtasksPreferenceService gtasksPreferenceService;
@Inject VoiceInputAssistant voiceInputAssistant; @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_TAG = 11543;
private static final int REQUEST_EDIT_FILTER = 11544; private static final int REQUEST_EDIT_FILTER = 11544;
private static final int REQUEST_SORT = 11545; private static final int REQUEST_SORT = 11545;
private final RepeatConfirmationReceiver repeatConfirmationReceiver = new RepeatConfirmationReceiver(this); private final RepeatConfirmationReceiver repeatConfirmationReceiver = new RepeatConfirmationReceiver(this);
private final Map<String, Integer> controlSetFragments = new HashMap<>();
private NavigationDrawerFragment navigationDrawer; private NavigationDrawerFragment navigationDrawer;
private ArrayList<String> controlOrder;
public static final String TOKEN_SWITCH_TO_FILTER = "newListCreated"; //$NON-NLS-1$ public static final String TOKEN_SWITCH_TO_FILTER = "newListCreated"; //$NON-NLS-1$
@ -96,23 +133,24 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
startupService.onStartupApplication(this);
preferences.applyTheme(); preferences.applyTheme();
setContentView(R.layout.task_list_wrapper); setContentView(R.layout.task_list_wrapper);
ButterKnife.bind(this);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
ActionBar supportActionBar = getSupportActionBar(); updateToolbar(R.drawable.ic_menu_24dp, true);
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);
}
toolbar.setNavigationOnClickListener(new View.OnClickListener() { toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
TaskEditFragment taskEditFragment = getTaskEditFragment();
if (isDoublePaneLayout() || taskEditFragment == null) {
hideKeyboard();
navigationDrawer.openDrawer(); navigationDrawer.openDrawer();
} else {
taskEditFragment.onBackPressed();
}
} }
}); });
@ -120,13 +158,20 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
navigationDrawer.setUp(drawerLayout); navigationDrawer.setUp(drawerLayout);
View editFragment = findViewById(R.id.taskedit_fragment_container); registerFragment(EditTitleControlSet.TAG);
registerFragment(DeadlineControlSet.TAG);
if(editFragment != null) { registerFragment(CalendarControlSet.TAG);
fragmentLayout = LAYOUT_DOUBLE; registerFragment(PriorityControlSet.TAG);
} else { registerFragment(DescriptionControlSet.TAG);
fragmentLayout = LAYOUT_SINGLE; 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(); readIntent();
} }
@ -141,7 +186,8 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
} }
private void readIntent() { private void readIntent() {
Bundle extras = getIntent().getExtras(); Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) { if (extras != null) {
extras = (Bundle) extras.clone(); extras = (Bundle) extras.clone();
} }
@ -150,15 +196,76 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
extras = new Bundle(); extras = new Bundle();
} }
Filter savedFilter = getIntent().getParcelableExtra(TaskListFragment.TOKEN_FILTER); TaskListFragment taskListFragment;
if (savedFilter == null) { if (intent.hasExtra(TaskListFragment.TOKEN_FILTER)) {
savedFilter = getDefaultFilter(); Filter filter = intent.getParcelableExtra(TaskListFragment.TOKEN_FILTER);
extras.putAll(configureIntentAndExtrasWithFilter(getIntent(), savedFilter)); 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); TaskEditFragment taskEditFragment = getTaskEditFragment();
setupTasklistFragmentWithFilter(savedFilter, extras); List<TaskEditControlFragment> taskEditControlFragments = new ArrayList<>();
setListsTitle(savedFilter.listingTitle); 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<TaskEditControlFragment> 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() { public NavigationDrawerFragment getNavigationDrawerFragment() {
@ -173,7 +280,6 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
registerReceiver( registerReceiver(
repeatConfirmationReceiver, repeatConfirmationReceiver,
new IntentFilter(AstridApiConstants.BROADCAST_EVENT_TASK_REPEATED)); new IntentFilter(AstridApiConstants.BROADCAST_EVENT_TASK_REPEATED));
getTaskListFragment().setSyncOngoing(gtasksPreferenceService.isOngoing());
} }
@Override @Override
@ -226,17 +332,17 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
Filter savedFilter = new Filter(title, Filter savedFilter = new Filter(title,
new QueryTemplate().where new QueryTemplate().where
(Criterion.or(Task.NOTES. (Criterion.or(Task.NOTES.
like ( like(
"%" + //$NON-NLS-1$ "%" + //$NON-NLS-1$
query + "%" query + "%"
), ),
Task.TITLE. Task.TITLE.
like ( like(
"%" + //$NON-NLS-1$ "%" + //$NON-NLS-1$
query + "%" query + "%"
) )
) )
),null); ), null);
onFilterItemClicked(savedFilter); onFilterItemClicked(savedFilter);
MenuItemCompat.collapseActionView(item); MenuItemCompat.collapseActionView(item);
@ -256,11 +362,11 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
} }
@Override @Override
public boolean onFilterItemClicked(FilterListItem item) { public void onFilterItemClicked(FilterListItem item) {
TaskEditFragment.removeExtrasFromIntent(getIntent()); TaskEditFragment.removeExtrasFromIntent(getIntent());
TaskEditFragment tef = getTaskEditFragment(); TaskEditFragment tef = getTaskEditFragment();
if (tef != null) { if (tef != null) {
onBackPressed(); getTaskEditFragment().onBackPressed();
} }
if ((item instanceof Filter)) { if ((item instanceof Filter)) {
@ -273,73 +379,53 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
Filter filter = (Filter)item; Filter filter = (Filter)item;
Bundle extras = configureIntentAndExtrasWithFilter(intent, filter); Bundle extras = configureIntentAndExtrasWithFilter(intent, filter);
if (fragmentLayout == LAYOUT_DOUBLE && getTaskEditFragment() != null) { TaskListFragment newFragment = newTaskListFragment(filter, extras);
onBackPressed(); // remove the task edit fragment when switching between lists
}
setupTasklistFragmentWithFilter(filter, extras);
// no animation for dualpane-layout loadTaskListFragment(false, newFragment);
AndroidUtilities.callOverridePendingTransition(this, 0, 0);
return true;
} }
return false;
} }
public void setupTasklistFragmentWithFilter(Filter filter, Bundle extras) { private TaskListFragment newTaskListFragment(Filter filter, Bundle extras) {
Class<?> customTaskList = null; Class<?> customTaskList = null;
if (subtasksHelper.shouldUseSubtasksFragmentForFilter(filter)) { if (subtasksHelper.shouldUseSubtasksFragmentForFilter(filter)) {
customTaskList = SubtasksHelper.subtasksClassForFilter(filter); customTaskList = SubtasksHelper.subtasksClassForFilter(filter);
} }
TaskListFragment newFragment = TaskListFragment.instantiateWithFilterAndExtras(filter, extras, customTaskList); Class<?> component = customTaskList;
if (filter instanceof FilterWithCustomIntent && component == null) {
try { try {
FragmentManager manager = getFragmentManager(); component = Class.forName(((FilterWithCustomIntent) filter).customTaskList.getClassName());
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) { } catch (Exception e) {
// Don't worry about it // Invalid
Timber.e(e, e.getMessage()); Timber.e(e, e.getMessage());
} }
} }
if (component == null) {
@Override component = TaskListFragment.class;
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);
} }
TaskListFragment newFragment;
try {
newFragment = (TaskListFragment) component.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
Timber.e(e, e.getMessage());
newFragment = new TaskListFragment();
} }
Bundle args = new Bundle();
args.putBundle(TaskListFragment.TOKEN_EXTRAS, extras);
newFragment.setArguments(args);
return newFragment;
} }
@Override @Override
protected void onPostResume() { protected void onPostResume() {
super.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)) { if (getIntent().hasExtra(TOKEN_SWITCH_TO_FILTER)) {
Filter newList = getIntent().getParcelableExtra(TOKEN_SWITCH_TO_FILTER); Filter newList = getIntent().getParcelableExtra(TOKEN_SWITCH_TO_FILTER);
getIntent().removeExtra(TOKEN_SWITCH_TO_FILTER); getIntent().removeExtra(TOKEN_SWITCH_TO_FILTER);
onFilterItemClicked(newList); onFilterItemClicked(newList);
// } else {
// navigationDrawer.restoreLastSelected();
} }
if (getIntent().hasExtra(OPEN_TASK)) { if (getIntent().hasExtra(OPEN_TASK)) {
@ -349,33 +435,90 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
} else { } else {
TaskListFragment tlf = getTaskListFragment(); TaskListFragment tlf = getTaskListFragment();
if (tlf != null) { 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)) { if (getIntent().getBooleanExtra(TOKEN_CREATE_NEW_LIST, false)) {
newListFromLaunch();
}
}
private void newListFromLaunch() {
Intent thisIntent = getIntent(); Intent thisIntent = getIntent();
Intent newTagIntent = new Intent(this, TagSettingsActivity.class); Intent newTagIntent = new Intent(this, TagSettingsActivity.class);
newTagIntent.putExtra(TagSettingsActivity.TOKEN_AUTOPOPULATE_NAME, thisIntent.getStringExtra(TOKEN_CREATE_NEW_LIST_NAME)); newTagIntent.putExtra(TagSettingsActivity.TOKEN_AUTOPOPULATE_NAME, thisIntent.getStringExtra(TOKEN_CREATE_NEW_LIST_NAME));
thisIntent.removeExtra(TOKEN_CREATE_NEW_LIST_NAME); thisIntent.removeExtra(TOKEN_CREATE_NEW_LIST_NAME);
startActivityForResult(newTagIntent, NavigationDrawerFragment.REQUEST_NEW_LIST); startActivityForResult(newTagIntent, NavigationDrawerFragment.REQUEST_NEW_LIST);
} }
}
@Override @Override
public void onTaskListItemClicked(long taskId) { public void onTaskListItemClicked(long taskId) {
if (fragmentLayout != LAYOUT_SINGLE) { TaskEditFragment taskEditFragment = getTaskEditFragment();
getIntent().putExtra(OPEN_TASK, taskId);
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<TaskEditControlFragment> 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) { public void setListsTitle(String title) {
@ -393,19 +536,16 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
return; return;
} }
// manage task edit visibility if (getTaskEditFragment() != null) {
View taskeditFragmentContainer = findViewById(R.id.taskedit_fragment_container); getTaskEditFragment().onBackPressed();
if(taskeditFragmentContainer != null && taskeditFragmentContainer.getVisibility() == View.VISIBLE) { return;
Flags.set(Flags.TLA_DISMISSED_FROM_TASK_EDIT);
onPostResume();
} }
super.onBackPressed();
if (isFinishing()) {
return;
} }
@Override super.onBackPressed();
public void finish() {
super.finish();
AndroidUtilities.callOverridePendingTransition(this, R.anim.slide_right_in, R.anim.slide_right_out);
} }
@Override @Override
@ -413,7 +553,13 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
Callback<String> quickAddTask = new Callback<String>() { Callback<String> quickAddTask = new Callback<String>() {
@Override @Override
public void apply(String title) { 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)) { if (voiceInputAssistant.handleActivityResult(requestCode, resultCode, data, quickAddTask)) {
@ -434,23 +580,6 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
} }
navigationDrawer.refresh(); 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) { } else if (requestCode == REQUEST_EDIT_TAG) {
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
String action = data.getAction(); String action = data.getAction();
@ -509,10 +638,18 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
getTaskListFragment().setUpTaskList(); 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() { protected void tagsChanged() {
tagsChanged(false); tagsChanged(false);
@ -579,10 +716,130 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
public boolean onKeyDown(int keyCode, KeyEvent event) { public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) { if (keyCode == KeyEvent.KEYCODE_BACK) {
TaskEditFragment tef = getTaskEditFragment(); TaskEditFragment tef = getTaskEditFragment();
if (tef != null && tef.onKeyDown(keyCode)) { if (tef != null) {
tef.onBackPressed();
return true; return true;
} }
} }
return super.onKeyDown(keyCode, event); 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);
}
}
} }

@ -6,7 +6,6 @@
package com.todoroo.astrid.activity; package com.todoroo.astrid.activity;
import android.app.Activity; import android.app.Activity;
import android.app.Fragment;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; 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.adapter.TaskAdapter.ViewHolder;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import com.todoroo.astrid.core.BuiltInFilterExposer; import com.todoroo.astrid.core.BuiltInFilterExposer;
import com.todoroo.astrid.core.SortHelper; import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.dao.TaskAttachmentDao; import com.todoroo.astrid.dao.TaskAttachmentDao;
@ -77,7 +75,6 @@ import org.tasks.injection.InjectingListFragment;
import org.tasks.injection.Injector; import org.tasks.injection.Injector;
import org.tasks.notifications.NotificationManager; import org.tasks.notifications.NotificationManager;
import org.tasks.preferences.ActivityPreferences; import org.tasks.preferences.ActivityPreferences;
import org.tasks.ui.NavigationDrawerFragment;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
@ -87,8 +84,6 @@ import javax.inject.Inject;
import timber.log.Timber; import timber.log.Timber;
import static org.tasks.intents.TaskIntents.getNewTaskIntent;
/** /**
* Primary activity for the Bente application. Shows a list of upcoming tasks * Primary activity for the Bente application. Shows a list of upcoming tasks
* and a user's coaches. * and a user's coaches.
@ -105,7 +100,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
public static final long AUTOSYNC_INTERVAL = 90000L; public static final long AUTOSYNC_INTERVAL = 90000L;
private static final long BACKGROUND_REFRESH_INTERVAL = 120000L; private static final long BACKGROUND_REFRESH_INTERVAL = 120000L;
private static final long WAIT_BEFORE_AUTOSYNC = 2000L; 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; public static final int ACTIVITY_REQUEST_NEW_FILTER = 5;
// --- menu codes // --- menu codes
@ -120,7 +114,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
/** token for passing a {@link Filter} object through extras */ /** token for passing a {@link Filter} object through extras */
public static final String TOKEN_FILTER = "filter"; //$NON-NLS-1$ 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 // --- instance variables
@ -137,7 +131,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
@Inject GtasksPreferenceService gtasksPreferenceService; @Inject GtasksPreferenceService gtasksPreferenceService;
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
protected Resources resources;
protected TaskAdapter taskAdapter = null; protected TaskAdapter taskAdapter = null;
protected RefreshReceiver refreshReceiver = new RefreshReceiver(); protected RefreshReceiver refreshReceiver = new RefreshReceiver();
protected final AtomicReference<String> sqlQueryTemplate = new AtomicReference<>(); protected final AtomicReference<String> sqlQueryTemplate = new AtomicReference<>();
@ -153,7 +146,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
// --- fragment handling variables // --- fragment handling variables
protected OnTaskListItemClickedListener mListener; protected OnTaskListItemClickedListener mListener;
private boolean mDualFragments = false;
protected SwipeRefreshLayout listView; protected SwipeRefreshLayout listView;
protected SwipeRefreshLayout emptyView; 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 @Override
public void onRefresh() { public void onRefresh() {
if (!syncActionHelper.performSyncAction()) { if (!syncActionHelper.performSyncAction()) {
@ -224,14 +179,8 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
@Override @Override
public void onAttach(Activity activity) { public void onAttach(Activity activity) {
super.onAttach(activity); super.onAttach(activity);
// Check that the container activity has implemented the callback
// interface
try {
mListener = (OnTaskListItemClickedListener) activity; mListener = (OnTaskListItemClickedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnTaskListItemClickedListener"); //$NON-NLS-1$
}
} }
/** /**
@ -262,12 +211,8 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
parent.findViewById(R.id.fab).setOnClickListener(new OnClickListener() { parent.findViewById(R.id.fab).setOnClickListener(new OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (getResources().getBoolean(R.bool.two_pane_layout)) { Task task = quickAddBar.quickAddTask("");
Task task = quickAddBar.quickAddTask();
onTaskListItemClicked(task.getId()); onTaskListItemClicked(task.getId());
} else {
((AstridActivity) getActivity()).startEditActivity(getNewTaskIntent(getActivity(), filter));
}
} }
}); });
View body = getListBody(parent); View body = getListBody(parent);
@ -303,19 +248,13 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
public void onActivityCreated(Bundle savedInstanceState) { public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
// We have a menu item to show in action bar. // We have a menu item to show in action bar.
resources = getResources();
setHasOptionsMenu(true); setHasOptionsMenu(true);
syncActionHelper = new SyncActionHelper(gtasksPreferenceService, syncService, getActivity(), preferences); syncActionHelper = new SyncActionHelper(gtasksPreferenceService, syncService, getActivity(), preferences);
setUpUiComponents(); setUpUiComponents();
initializeData(); initializeData();
quickAddBar.initialize(injector, (TaskListActivity) getActivity(), this); quickAddBar.initialize(injector, this);
Fragment filterlistFrame = getFragmentManager().findFragmentById( if (getResources().getBoolean(R.bool.two_pane_layout)) {
NavigationDrawerFragment.FRAGMENT_NAVIGATION_DRAWER);
mDualFragments = (filterlistFrame != null)
&& filterlistFrame.isInLayout();
if (mDualFragments) {
// In dual-pane mode, the list view highlights the selected item. // In dual-pane mode, the list view highlights the selected item.
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
getListView().setItemsCanFocus(false); getListView().setItemsCanFocus(false);
@ -352,9 +291,9 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
protected void initializeData() { protected void initializeData() {
if (extras != null && extras.containsKey(TOKEN_FILTER)) { if (extras != null && extras.containsKey(TOKEN_FILTER)) {
filter = extras.getParcelable(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 { } else {
filter = BuiltInFilterExposer.getMyTasksFilter(resources); filter = BuiltInFilterExposer.getMyTasksFilter(getResources());
} }
filter.setFilterQueryOverride(null); filter.setFilterQueryOverride(null);
isInbox = BuiltInFilterExposer.isInbox(context, filter); isInbox = BuiltInFilterExposer.isInbox(context, filter);
@ -366,7 +305,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
initializeTaskListMetadata(); initializeTaskListMetadata();
setUpTaskList(); setUpTaskList();
((AstridActivity) getActivity()).setupActivityFragment(getActiveTagData());
} }
protected void initializeTaskListMetadata() { 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() { private void setUpBackgroundJobs() {
backgroundTimer = new Timer(); backgroundTimer = new Timer();
@ -503,7 +436,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
} }
protected boolean isCurrentTaskListFragment() { protected boolean isCurrentTaskListFragment() {
AstridActivity activity = (AstridActivity) getActivity(); TaskListActivity activity = (TaskListActivity) getActivity();
if (activity != null) { if (activity != null) {
return activity.getTaskListFragment() == this; return activity.getTaskListFragment() == this;
} }
@ -511,11 +444,11 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
} }
public final void initiateAutomaticSync() { public final void initiateAutomaticSync() {
final AstridActivity activity = (AstridActivity) getActivity(); final TaskListActivity activity = (TaskListActivity) getActivity();
if (activity == null) { if (activity == null) {
return; return;
} }
if (activity.fragmentLayout != AstridActivity.LAYOUT_SINGLE) { if (activity.isDoublePaneLayout()) {
initiateAutomaticSyncImpl(); initiateAutomaticSyncImpl();
} else { } else {
// In single fragment case, we're using swipe between lists, // 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. * broadcast. Subclasses should override this.
*/ */
protected void refresh() { 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(); loadTaskListContent();
setSyncOngoing(false);
} }
/* /*
@ -623,6 +547,8 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
getListView().setSelection(oldListItemSelected); getListView().setSelection(oldListItemSelected);
} }
} }
setSyncOngoing(gtasksPreferenceService.isOngoing());
} }
protected TaskAdapter createTaskAdapter(TodorooCursor<Task> cursor) { protected TaskAdapter createTaskAdapter(TodorooCursor<Task> cursor) {
@ -786,8 +712,8 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
protected void onTaskDelete(Task task) { protected void onTaskDelete(Task task) {
Activity a = getActivity(); Activity a = getActivity();
if (a instanceof AstridActivity) { if (a instanceof TaskListActivity) {
AstridActivity activity = (AstridActivity) a; TaskListActivity activity = (TaskListActivity) a;
TaskEditFragment tef = activity.getTaskEditFragment(); TaskEditFragment tef = activity.getTaskEditFragment();
if (tef != null) { if (tef != null) {
if (task.getId() == tef.model.getId()) { if (task.getId() == tef.model.getId()) {
@ -807,7 +733,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
@Override @Override
public void onListItemClick(ListView l, View v, int position, long id) { public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id); super.onListItemClick(l, v, position, id);
if (mDualFragments) { if (getResources().getBoolean(R.bool.two_pane_layout)) {
setSelection(position); setSelection(position);
} }
} }
@ -865,12 +791,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
protected void duplicateTask(long itemId) { protected void duplicateTask(long itemId) {
long cloneId = taskDuplicator.duplicateTask(itemId); long cloneId = taskDuplicator.duplicateTask(itemId);
onTaskListItemClicked(cloneId);
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();
} }
public void onTaskListItemClicked(long taskId) { public void onTaskListItemClicked(long taskId) {

@ -19,7 +19,7 @@ import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
import com.todoroo.astrid.actfm.TagSettingsActivity; 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.activity.TaskListFragment;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
@ -155,8 +155,8 @@ public class FilterAdapter extends ArrayAdapter<FilterListItem> {
populateItem(viewHolder); populateItem(viewHolder);
Filter selected = null; Filter selected = null;
if (activity instanceof AstridActivity) { if (activity instanceof TaskListActivity) {
TaskListFragment tlf = ((AstridActivity) activity).getTaskListFragment(); TaskListFragment tlf = ((TaskListActivity) activity).getTaskListFragment();
selected = tlf.getFilter(); selected = tlf.getFilter();
} }

@ -59,4 +59,11 @@ abstract public class FilterListItem implements Parcelable {
source.createStringArray(); // old context menu labels source.createStringArray(); // old context menu labels
source.createTypedArray(Intent.CREATOR); // old context menu intents source.createTypedArray(Intent.CREATOR); // old context menu intents
} }
@Override
public String toString() {
return "FilterListItem{" +
"listingTitle='" + listingTitle + '\'' +
'}';
}
} }

@ -221,7 +221,6 @@ public class CustomFilterActivity extends InjectingAppCompatActivity {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(filterName.getWindowToken(), 0); imm.hideSoftInputFromWindow(filterName.getWindowToken(), 0);
super.finish(); super.finish();
AndroidUtilities.callOverridePendingTransition(this, R.anim.slide_right_in, R.anim.slide_right_out);
} }

@ -7,7 +7,6 @@ package com.todoroo.astrid.data;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.res.Resources;
import android.net.Uri; import android.net.Uri;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
@ -19,7 +18,6 @@ import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import org.tasks.BuildConfig; import org.tasks.BuildConfig;
import org.tasks.R;
import org.tasks.time.DateTime; import org.tasks.time.DateTime;
import static org.tasks.date.DateTimeUtils.newDateTime; import static org.tasks.date.DateTimeUtils.newDateTime;

@ -52,6 +52,8 @@ import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
public class FilesControlSet extends TaskEditControlFragment { 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 int REQUEST_ADD_ATTACHMENT = 50;
private static final String EXTRA_UUID = "extra_uuid"; private static final String EXTRA_UUID = "extra_uuid";
@ -107,6 +109,11 @@ public class FilesControlSet extends TaskEditControlFragment {
return R.drawable.ic_attachment_24dp; return R.drawable.ic_attachment_24dp;
} }
@Override
public int controlId() {
return TAG;
}
@Override @Override
public void initialize(boolean isNewTask, Task task) { public void initialize(boolean isNewTask, Task task) {
taskUuid = task.getUuid(); taskUuid = task.getUuid();

@ -53,7 +53,6 @@ public class CalendarAlarmListCreator extends InjectingAppCompatActivity {
private void dismissWithAnimation() { private void dismissWithAnimation() {
finish(); finish();
AndroidUtilities.callOverridePendingTransition(CalendarAlarmListCreator.this, 0, android.R.anim.fade_out);
} }
@Override @Override

@ -72,7 +72,6 @@ public class CalendarReminderActivity extends InjectingAppCompatActivity {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
finish(); finish();
AndroidUtilities.callOverridePendingTransition(CalendarReminderActivity.this, 0, android.R.anim.fade_out);
} }
}; };

@ -35,8 +35,8 @@ import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.actfm.ActFmCameraModule; import com.todoroo.astrid.actfm.ActFmCameraModule;
import com.todoroo.astrid.actfm.ActFmCameraModule.ClearImageCallback; import com.todoroo.astrid.actfm.ActFmCameraModule.ClearImageCallback;
import com.todoroo.astrid.activity.AstridActivity;
import com.todoroo.astrid.activity.TaskEditFragment; import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.UserActivityDao; import com.todoroo.astrid.dao.UserActivityDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
@ -78,7 +78,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
private Uri pendingCommentPicture = null; private Uri pendingCommentPicture = null;
private final Fragment fragment; private final Fragment fragment;
private final AstridActivity activity; private final TaskListActivity activity;
private final int cameraButton; private final int cameraButton;
@ -105,7 +105,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
this.fragment = fragment; this.fragment = fragment;
this.activity = (AstridActivity) fragment.getActivity(); this.activity = (TaskListActivity) fragment.getActivity();
cameraButton = R.drawable.ic_camera_alt_white_24dp; cameraButton = R.drawable.ic_camera_alt_white_24dp;

@ -67,6 +67,8 @@ import static org.tasks.date.DateTimeUtils.newDateTime;
*/ */
public class RepeatControlSet extends TaskEditControlFragment { public class RepeatControlSet extends TaskEditControlFragment {
public static final int TAG = R.string.TEA_ctrl_repeat_pref;
public interface RepeatChangedListener { public interface RepeatChangedListener {
void repeatChanged(boolean repeat); void repeatChanged(boolean repeat);
} }
@ -274,6 +276,11 @@ public class RepeatControlSet extends TaskEditControlFragment {
return R.drawable.ic_repeat_24dp; return R.drawable.ic_repeat_24dp;
} }
@Override
public int controlId() {
return TAG;
}
@Override @Override
public void initialize(boolean isNewTask, Task task) { public void initialize(boolean isNewTask, Task task) {
repeatAfterCompletion = task.repeatAfterCompletion(); repeatAfterCompletion = task.repeatAfterCompletion();

@ -14,7 +14,7 @@ import android.database.sqlite.SQLiteException;
import com.todoroo.andlib.data.DatabaseDao.ModelUpdateListener; import com.todoroo.andlib.data.DatabaseDao.ModelUpdateListener;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.utility.AndroidUtilities; 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.backup.TasksXmlImporter;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.DatabaseUpdateListener; import com.todoroo.astrid.dao.DatabaseUpdateListener;
@ -123,7 +123,7 @@ public class StartupService {
if(lastVersion > 0) { if(lastVersion > 0) {
activity.startActivityForResult(new Intent(activity, UpgradeActivity.class) {{ activity.startActivityForResult(new Intent(activity, UpgradeActivity.class) {{
putExtra(UpgradeActivity.TOKEN_FROM_VERSION, lastVersion); putExtra(UpgradeActivity.TOKEN_FROM_VERSION, lastVersion);
}}, AstridActivity.REQUEST_UPGRADE); }}, TaskListActivity.REQUEST_UPGRADE);
} }
preferences.setDefaults(); preferences.setDefaults();
preferences.setCurrentVersion(currentVersion); preferences.setCurrentVersion(currentVersion);

@ -38,14 +38,14 @@ public class TaskCreator {
title = title.trim(); title = title.trim();
Task task = taskService.createWithValues(null, title); Task task = taskService.createWithValues(null, title);
addToCalendar(task, title); addToCalendar(task);
return task; return task;
} }
public void addToCalendar(Task task, String title) { public void addToCalendar(Task task) {
boolean gcalCreateEventEnabled = preferences.isDefaultCalendarSet() && task.hasDueDate(); //$NON-NLS-1$ 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, Uri calendarUri = gcalHelper.createTaskEvent(task,
context.getContentResolver(), new ContentValues()); context.getContentResolver(), new ContentValues());
task.setCalendarUri(calendarUri.toString()); task.setCalendarUri(calendarUri.toString());

@ -31,7 +31,6 @@ import org.tasks.filters.FilterCounter;
import org.tasks.scheduling.RefreshScheduler; import org.tasks.scheduling.RefreshScheduler;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import javax.inject.Inject; import javax.inject.Inject;
@ -202,21 +201,6 @@ public class TaskService {
} }
} }
/**
* Save task, parsing quick-add mark-up:
* <ul>
* <li>#tag - add the tag "tag"
* <li>@context - add the tag "@context"
* <li>!4 - set priority to !!!!
*/
private void quickAdd(Task task, List<String> tags) {
saveWithoutPublishingFilterUpdate(task);
for(String tag : tags) {
createLink(task, tag);
}
broadcastFilterListUpdated();
}
private void broadcastFilterListUpdated() { private void broadcastFilterListUpdated() {
filterCounter.refreshFilterCounts(new Runnable() { filterCounter.refreshFilterCounts(new Runnable() {
@Override @Override
@ -239,17 +223,12 @@ public class TaskService {
* doesn't need to start with a base task model. * doesn't need to start with a base task model.
*/ */
public Task createWithValues(ContentValues values, String title) { public Task createWithValues(ContentValues values, String title) {
Task task = new Task(); return createWithValues(new Task(), values, title);
return createWithValues(task, values, title);
} }
/** Task createWithValues(Task task, ContentValues values, String 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) {
if (title != null) { if (title != null) {
task.setTitle(title); task.setTitle(title.trim());
} }
ArrayList<String> tags = new ArrayList<>(); ArrayList<String> tags = new ArrayList<>();
@ -282,7 +261,10 @@ public class TaskService {
task.mergeWithoutReplacement(forTask); task.mergeWithoutReplacement(forTask);
} }
quickAdd(task, tags); saveWithoutPublishingFilterUpdate(task);
for(String tag : tags) {
createLink(task, tag);
}
if (forMetadata != null && forMetadata.size() > 0) { if (forMetadata != null && forMetadata.size() > 0) {
Metadata metadata = new Metadata(); Metadata metadata = new Metadata();

@ -70,6 +70,8 @@ import static com.google.common.collect.Sets.newHashSet;
*/ */
public final class TagsControlSet extends TaskEditControlFragment { 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"; private static final String EXTRA_TAGS = "extra_tags";
@Inject MetadataDao metadataDao; @Inject MetadataDao metadataDao;
@ -315,6 +317,11 @@ public final class TagsControlSet extends TaskEditControlFragment {
return R.drawable.ic_label_24dp; return R.drawable.ic_label_24dp;
} }
@Override
public int controlId() {
return TAG;
}
protected void refreshDisplayView() { protected void refreshDisplayView() {
String tagString = buildTagString(); String tagString = buildTagString();
if (!TextUtils.isEmpty(tagString)) { if (!TextUtils.isEmpty(tagString)) {

@ -50,6 +50,8 @@ import butterknife.OnClick;
*/ */
public class TimerControlSet extends TaskEditControlFragment { public class TimerControlSet extends TaskEditControlFragment {
public static final int TAG = R.string.TEA_ctrl_timer_pref;
public interface TimerControlSetCallback { public interface TimerControlSetCallback {
Task stopTimer(); Task stopTimer();
Task startTimer(); Task startTimer();
@ -171,6 +173,11 @@ public class TimerControlSet extends TaskEditControlFragment {
return R.drawable.ic_timer_24dp; return R.drawable.ic_timer_24dp;
} }
@Override
public int controlId() {
return TAG;
}
@Override @Override
public void initialize(boolean isNewTask, Task task) { public void initialize(boolean isNewTask, Task task) {
timerStarted = task.getTimerStart(); timerStarted = task.getTimerStart();

@ -6,20 +6,16 @@
package com.todoroo.astrid.ui; package com.todoroo.astrid.ui;
import android.app.Activity; import android.app.Activity;
import android.content.Context;
import android.graphics.Paint; import android.graphics.Paint;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.WindowManager; import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText; import android.widget.EditText;
import android.widget.TextView;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
@ -42,6 +38,8 @@ import butterknife.OnClick;
*/ */
public class EditTitleControlSet extends TaskEditControlFragment { 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_COMPLETE = "extra_complete";
private static final String EXTRA_TITLE = "extra_title"; private static final String EXTRA_TITLE = "extra_title";
private static final String EXTRA_REPEATING = "extra_repeating"; private static final String EXTRA_REPEATING = "extra_repeating";
@ -81,31 +79,6 @@ public class EditTitleControlSet extends TaskEditControlFragment {
editText.setTextKeepState(title); editText.setTextKeepState(title);
editText.setHorizontallyScrolling(false); editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE); 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(); updateCompleteBox();
return view; return view;
} }
@ -126,15 +99,13 @@ public class EditTitleControlSet extends TaskEditControlFragment {
} }
@Override @Override
public void onStart() { public void onResume() {
super.onStart(); super.onResume();
if (isNewTask) { if (isNewTask) {
editText.requestFocus(); editText.requestFocus();
editText.setCursorVisible(true); InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
getActivity().getWindow() imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE
| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
} }
} }
@ -176,6 +147,11 @@ public class EditTitleControlSet extends TaskEditControlFragment {
return -1; return -1;
} }
@Override
public int controlId() {
return TAG;
}
@Override @Override
public void initialize(boolean isNewTask, Task task) { public void initialize(boolean isNewTask, Task task) {
this.isNewTask = isNewTask; this.isNewTask = isNewTask;
@ -201,6 +177,5 @@ public class EditTitleControlSet extends TaskEditControlFragment {
public void hideKeyboard() { public void hideKeyboard() {
AndroidUtilities.hideSoftInputForViews(getActivity(), editText); AndroidUtilities.hideSoftInputForViews(getActivity(), editText);
editText.setCursorVisible(false);
} }
} }

@ -50,6 +50,8 @@ import static org.tasks.date.DateTimeUtils.newDateTime;
*/ */
public class HideUntilControlSet extends TaskEditControlFragment implements OnItemSelectedListener { 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_CUSTOM = "extra_custom";
private static String EXTRA_SELECTION = "extra_selection"; 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; return R.drawable.ic_visibility_off_24dp;
} }
@Override
public int controlId() {
return TAG;
}
@Override @Override
public void initialize(boolean isNewTask, Task task) { public void initialize(boolean isNewTask, Task task) {
long dueDate = task.getDueDate(); long dueDate = task.getDueDate();

@ -5,7 +5,6 @@
*/ */
package com.todoroo.astrid.ui; package com.todoroo.astrid.ui;
import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
@ -29,31 +28,21 @@ import timber.log.Timber;
public class QuickAddBar { public class QuickAddBar {
@Inject TaskService taskService; @Inject TaskService taskService;
@Inject TaskCreator taskCreator;
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
private TaskListActivity activity;
private TaskListFragment fragment; 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 injector.inject(this); // TODO: get rid of this
activity = myActivity;
fragment = myFragment; fragment = myFragment;
} }
// --- quick add task logic
public Task quickAddTask() {
return quickAddTask("");
}
/** /**
* Quick-add a new task * Quick-add a new task
*/ */
public Task quickAddTask(String title) { public Task quickAddTask(String title) {
TagData tagData = fragment.getActiveTagData(); TagData tagData = fragment.getActiveTagData();
if(tagData != null && (!tagData.containsNonNullValue(TagData.NAME) || if(tagData != null && (!tagData.containsNonNullValue(TagData.NAME) || tagData.getName().length() == 0)) {
tagData.getName().length() == 0)) {
dialogBuilder.newMessageDialog(R.string.tag_no_title_error) dialogBuilder.newMessageDialog(R.string.tag_no_title_error)
.setPositiveButton(android.R.string.ok, null) .setPositiveButton(android.R.string.ok, null)
.show(); .show();
@ -61,25 +50,7 @@ public class QuickAddBar {
} }
try { try {
if (title != null) { return taskService.createWithValues(fragment.getFilter().valuesForNewTasks, title);
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;
} catch (Exception e) { } catch (Exception e) {
Timber.e(e, e.getMessage()); Timber.e(e, e.getMessage());
} }

@ -65,6 +65,8 @@ import static org.tasks.date.DateTimeUtils.newDateTime;
*/ */
public class ReminderControlSet extends TaskEditControlFragment { 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_NEW_ALARM = 12152;
private static final int REQUEST_LOCATION_REMINDER = 12153; private static final int REQUEST_LOCATION_REMINDER = 12153;
@ -172,6 +174,11 @@ public class ReminderControlSet extends TaskEditControlFragment {
return R.drawable.ic_notifications_24dp; return R.drawable.ic_notifications_24dp;
} }
@Override
public int controlId() {
return TAG;
}
@Override @Override
public void initialize(boolean isNewTask, Task task) { public void initialize(boolean isNewTask, Task task) {
taskId = task.getId(); taskId = task.getId();

@ -21,11 +21,6 @@ public class Flags {
*/ */
public static final int TAGS_CHANGED = 1 << 1; 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 * If set, indicates that TaskListFragmentPager should not intercept touch events
*/ */

@ -34,6 +34,7 @@ public class TasksWidget extends InjectingAppWidgetProvider {
public static final String COMPLETE_TASK = "COMPLETE_TASK"; public static final String COMPLETE_TASK = "COMPLETE_TASK";
public static final String EDIT_TASK = "EDIT_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 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; private static final long SUPPRESS_TIME = DateUtilities.ONE_MINUTE * 5;
@ -44,13 +45,13 @@ public class TasksWidget extends InjectingAppWidgetProvider {
switch(intent.getAction()) { switch(intent.getAction()) {
case COMPLETE_TASK: case COMPLETE_TASK:
broadcaster.toggleCompletedState(intent.getLongExtra(TaskEditFragment.TOKEN_ID, 0)); broadcaster.toggleCompletedState(intent.getLongExtra(TOKEN_ID, 0));
break; break;
case EDIT_TASK: case EDIT_TASK:
getEditTaskStack( getEditTaskStack(
context, context,
(Filter) intent.getParcelableExtra(TaskListFragment.TOKEN_FILTER), (Filter) intent.getParcelableExtra(TaskListFragment.TOKEN_FILTER),
intent.getLongExtra(TaskEditFragment.TOKEN_ID, 0)) intent.getLongExtra(TOKEN_ID, 0))
.startActivities(); .startActivities();
break; break;
case BROADCAST_EVENT_REFRESH: case BROADCAST_EVENT_REFRESH:

@ -8,7 +8,6 @@ import com.todoroo.astrid.activity.BeastModePreferences;
import com.todoroo.astrid.activity.FilterShortcutActivity; import com.todoroo.astrid.activity.FilterShortcutActivity;
import com.todoroo.astrid.activity.ShareLinkActivity; import com.todoroo.astrid.activity.ShareLinkActivity;
import com.todoroo.astrid.activity.ShortcutActivity; import com.todoroo.astrid.activity.ShortcutActivity;
import com.todoroo.astrid.activity.TaskEditActivity;
import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.core.CustomFilterActivity; import com.todoroo.astrid.core.CustomFilterActivity;
import com.todoroo.astrid.core.DefaultsPreferences; import com.todoroo.astrid.core.DefaultsPreferences;
@ -60,7 +59,6 @@ import dagger.Provides;
@Module(addsTo = TasksModule.class, @Module(addsTo = TasksModule.class,
injects = { injects = {
TaskListActivity.class, TaskListActivity.class,
TaskEditActivity.class,
ShareLinkActivity.class, ShareLinkActivity.class,
TagSettingsActivity.class, TagSettingsActivity.class,
FilterSettingsActivity.class, FilterSettingsActivity.class,

@ -6,28 +6,18 @@ import android.os.Bundle;
import android.support.v4.app.TaskStackBuilder; import android.support.v4.app.TaskStackBuilder;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.activity.TaskEditActivity;
import com.todoroo.astrid.activity.TaskEditFragment; import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterWithCustomIntent; import com.todoroo.astrid.api.FilterWithCustomIntent;
import org.tasks.R;
public class TaskIntents { public class TaskIntents {
public static Intent getNewTaskIntent(Context context, Filter filter) { public static Intent getNewTaskIntent(Context context, Filter filter) {
Intent intent; Intent intent;
boolean twoPaneLayout = context.getResources().getBoolean(R.bool.two_pane_layout);
if (twoPaneLayout) {
intent = new Intent(context, TaskListActivity.class); intent = new Intent(context, TaskListActivity.class);
intent.putExtra(TaskListActivity.OPEN_TASK, 0L); intent.putExtra(TaskListActivity.OPEN_TASK, 0L);
} else {
intent = new Intent(context, TaskEditActivity.class);
}
intent.putExtra(TaskEditFragment.OVERRIDE_FINISH_ANIM, false);
if (filter != null) { if (filter != null) {
intent.putExtra(TaskListFragment.TOKEN_FILTER, filter); intent.putExtra(TaskListFragment.TOKEN_FILTER, filter);
if (filter.valuesForNewTasks != null) { if (filter.valuesForNewTasks != null) {
@ -35,12 +25,10 @@ public class TaskIntents {
intent.putExtra(TaskEditFragment.TOKEN_VALUES, values); intent.putExtra(TaskEditFragment.TOKEN_VALUES, values);
intent.setAction("E" + values); intent.setAction("E" + values);
} }
if (twoPaneLayout) {
if (filter instanceof FilterWithCustomIntent) { if (filter instanceof FilterWithCustomIntent) {
Bundle customExtras = ((FilterWithCustomIntent) filter).customExtras; Bundle customExtras = ((FilterWithCustomIntent) filter).customExtras;
intent.putExtras(customExtras); intent.putExtras(customExtras);
} }
}
} else { } else {
intent.setAction("E"); intent.setAction("E");
} }
@ -48,25 +36,16 @@ public class TaskIntents {
} }
public static TaskStackBuilder getEditTaskStack(Context context, final Filter filter, final long taskId) { public static TaskStackBuilder getEditTaskStack(Context context, final Filter filter, final long taskId) {
TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(context); return TaskStackBuilder.create(context)
boolean twoPaneLayout = context.getResources().getBoolean(R.bool.two_pane_layout); .addNextIntent(new Intent(context, TaskListActivity.class) {{
if (twoPaneLayout) {
taskStackBuilder.addNextIntent(new Intent(context, TaskListActivity.class) {{
putExtra(TaskListActivity.OPEN_TASK, taskId); putExtra(TaskListActivity.OPEN_TASK, taskId);
if (filter != null && filter instanceof FilterWithCustomIntent) { if (filter != null) {
putExtra(TaskListFragment.TOKEN_FILTER, filter);
if (filter instanceof FilterWithCustomIntent) {
Bundle customExtras = ((FilterWithCustomIntent) filter).customExtras; Bundle customExtras = ((FilterWithCustomIntent) filter).customExtras;
putExtras(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; }});
} }
} }

@ -1,11 +1,8 @@
package org.tasks.preferences; package org.tasks.preferences;
import android.app.Activity; import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.PixelFormat; import android.graphics.PixelFormat;
import android.util.DisplayMetrics;
import android.view.Window; import android.view.Window;
import org.tasks.R; import org.tasks.R;
@ -18,9 +15,6 @@ import static com.todoroo.andlib.utility.AndroidUtilities.preLollipop;
@Singleton @Singleton
public class ActivityPreferences extends Preferences { 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; private final Activity activity;
@Inject @Inject
@ -29,10 +23,6 @@ public class ActivityPreferences extends Preferences {
this.activity = activity; this.activity = activity;
} }
public boolean useTabletLayout() {
return isTabletSized(context);
}
public void applyThemeAndStatusBarColor() { public void applyThemeAndStatusBarColor() {
applyTheme(); applyTheme();
applyStatusBarColor(); applyStatusBarColor();
@ -83,30 +73,4 @@ public class ActivityPreferences extends Preferences {
public boolean isDarkTheme() { public boolean isDarkTheme() {
return getBoolean(R.string.p_use_dark_theme, false); 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;
}
}
} }

@ -35,6 +35,8 @@ import static com.google.common.base.Strings.isNullOrEmpty;
public class CalendarControlSet extends TaskEditControlFragment { 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 int REQUEST_CODE_CALENDAR = 70;
private static final String EXTRA_URI = "extra_uri"; private static final String EXTRA_URI = "extra_uri";
private static final String EXTRA_ID = "extra_id"; private static final String EXTRA_ID = "extra_id";
@ -88,6 +90,11 @@ public class CalendarControlSet extends TaskEditControlFragment {
return R.drawable.ic_event_24dp; return R.drawable.ic_event_24dp;
} }
@Override
public int controlId() {
return TAG;
}
@Override @Override
public void initialize(boolean isNewTask, Task task) { public void initialize(boolean isNewTask, Task task) {
this.isNewTask = isNewTask; this.isNewTask = isNewTask;

@ -34,19 +34,22 @@ import butterknife.Bind;
import butterknife.OnClick; import butterknife.OnClick;
import butterknife.OnItemSelected; import butterknife.OnItemSelected;
import static com.google.common.collect.Lists.newArrayList;
import static java.util.Arrays.asList; import static java.util.Arrays.asList;
import static org.tasks.date.DateTimeUtils.newDateTime; import static org.tasks.date.DateTimeUtils.newDateTime;
import static org.tasks.preferences.ResourceResolver.getData; import static org.tasks.preferences.ResourceResolver.getData;
public class DeadlineControlSet extends TaskEditControlFragment { 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_DATE = 504;
private static final int REQUEST_TIME = 505; private static final int REQUEST_TIME = 505;
private static final String EXTRA_DATE = "extra_date"; private static final String EXTRA_DATE = "extra_date";
private static final String EXTRA_TIME = "extra_time"; private static final String EXTRA_TIME = "extra_time";
private final List<String> dueDateOptions = new ArrayList<>(); private List<String> dueDateOptions = new ArrayList<>();
private final List<String> dueTimeOptions = new ArrayList<>(); private List<String> dueTimeOptions = new ArrayList<>();
private List<String> dueTimeHint = new ArrayList<>(); private List<String> dueTimeHint = new ArrayList<>();
private int dateShortcutMorning; private int dateShortcutMorning;
private int dateShortcutAfternoon; private int dateShortcutAfternoon;
@ -94,20 +97,20 @@ public class DeadlineControlSet extends TaskEditControlFragment {
noTimeString = activity.getString(R.string.TEA_no_time); noTimeString = activity.getString(R.string.TEA_no_time);
todayString = activity.getString(R.string.today); todayString = activity.getString(R.string.today);
tomorrowString = activity.getString(R.string.tomorrow); tomorrowString = activity.getString(R.string.tomorrow);
dueDateOptions.addAll(asList( dueDateOptions = newArrayList(
"", "",
todayString, todayString,
tomorrowString, tomorrowString,
"", "",
activity.getString(R.string.pick_a_date))); activity.getString(R.string.pick_a_date));
dueTimeOptions.addAll(asList( dueTimeOptions = newArrayList(
"", "",
noTimeString, noTimeString,
morningString, morningString,
afternoonString, afternoonString,
eveningString, eveningString,
nightString, nightString,
activity.getString(R.string.pick_a_time))); activity.getString(R.string.pick_a_time));
} }
@Nullable @Nullable
@ -247,6 +250,11 @@ public class DeadlineControlSet extends TaskEditControlFragment {
return R.drawable.ic_schedule_24dp; return R.drawable.ic_schedule_24dp;
} }
@Override
public int controlId() {
return TAG;
}
@Override @Override
public void initialize(boolean isNewTask, Task task) { public void initialize(boolean isNewTask, Task task) {
if (task.hasDueDate()) { if (task.hasDueDate()) {

@ -17,6 +17,7 @@ import butterknife.OnTextChanged;
public class DescriptionControlSet extends TaskEditControlFragment { public class DescriptionControlSet extends TaskEditControlFragment {
public static final int TAG = R.string.TEA_ctrl_notes_pref;
private static final String EXTRA_DESCRIPTION = "extra_description"; private static final String EXTRA_DESCRIPTION = "extra_description";
@Bind(R.id.notes) EditText editText; @Bind(R.id.notes) EditText editText;
@ -53,6 +54,11 @@ public class DescriptionControlSet extends TaskEditControlFragment {
return R.drawable.ic_event_note_24dp; return R.drawable.ic_event_note_24dp;
} }
@Override
public int controlId() {
return TAG;
}
@OnTextChanged(R.id.notes) @OnTextChanged(R.id.notes)
void textChanged(CharSequence text) { void textChanged(CharSequence text) {
description = text.toString().trim(); description = text.toString().trim();

@ -103,7 +103,6 @@ public class NavigationDrawerFragment extends InjectingFragment {
getActivity().getIntent().putExtra(TaskListActivity.TOKEN_SWITCH_TO_FILTER, newList); getActivity().getIntent().putExtra(TaskListActivity.TOKEN_SWITCH_TO_FILTER, newList);
clear(); clear();
} }
} else { } else {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
} }
@ -224,7 +223,7 @@ public class NavigationDrawerFragment extends InjectingFragment {
} }
public interface OnFilterItemClickedListener { public interface OnFilterItemClickedListener {
boolean onFilterItemClicked(FilterListItem item); void onFilterItemClicked(FilterListItem item);
} }
public void clear() { public void clear() {

@ -22,6 +22,8 @@ import butterknife.OnClick;
public class PriorityControlSet extends TaskEditControlFragment { public class PriorityControlSet extends TaskEditControlFragment {
public static final int TAG = R.string.TEA_ctrl_importance_pref;
public interface OnPriorityChanged { public interface OnPriorityChanged {
void onPriorityChange(int priority); void onPriorityChange(int priority);
} }
@ -83,6 +85,11 @@ public class PriorityControlSet extends TaskEditControlFragment {
return R.drawable.ic_flag_24dp; return R.drawable.ic_flag_24dp;
} }
@Override
public int controlId() {
return TAG;
}
@Override @Override
public void initialize(boolean isNewTask, Task task) { public void initialize(boolean isNewTask, Task task) {
priority = task.getImportance(); priority = task.getImportance();

@ -33,6 +33,8 @@ public abstract class TaskEditControlFragment extends InjectingFragment {
protected abstract int getIcon(); protected abstract int getIcon();
public abstract int controlId();
public abstract void initialize(boolean isNewTask, Task task); public abstract void initialize(boolean isNewTask, Task task);
public abstract void apply(Task task); public abstract void apply(Task task);

@ -164,7 +164,7 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac
Intent editIntent = new Intent(); Intent editIntent = new Intent();
editIntent.setAction(TasksWidget.EDIT_TASK); editIntent.setAction(TasksWidget.EDIT_TASK);
editIntent.putExtra(TaskListFragment.TOKEN_FILTER, filter); 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()); editIntent.putExtra(TaskListActivity.OPEN_TASK, task.getId());
row.setOnClickFillInIntent(R.id.text, editIntent); row.setOnClickFillInIntent(R.id.text, editIntent);
@ -173,7 +173,7 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac
} else { } else {
Intent completeIntent = new Intent(); Intent completeIntent = new Intent();
completeIntent.setAction(TasksWidget.COMPLETE_TASK); 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); row.setOnClickFillInIntent(R.id.completeBox, completeIntent);
} }

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="150"/>
</set>

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="150"/>
</set>

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="-100%p" android:toXDelta="0" android:duration="150"/>
</set>

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0" android:toXDelta="100%p" android:duration="150"/>
</set>

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
** Copyright (c) 2012 Todoroo Inc
**
** See the file "LICENSE" for the full license governing this code.
-->
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/taskedit_fragment_container">
<fragment
android:name="com.todoroo.astrid.activity.TaskEditFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="taskedit_fragment">
</fragment>
</FrameLayout>

@ -26,7 +26,7 @@
<!-- Task List --> <!-- Task List -->
<FrameLayout <FrameLayout
android:id="@+id/tasklist_fragment_container" android:id="@+id/master_dual"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="60" /> android:layout_weight="60" />
@ -38,11 +38,10 @@
<!-- Task Edit --> <!-- Task Edit -->
<FrameLayout <FrameLayout
android:id="@+id/taskedit_fragment_container" android:id="@+id/detail_dual"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="40" android:layout_weight="40" />
android:visibility="invisible" />
</LinearLayout> </LinearLayout>

@ -36,13 +36,11 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="100" android:layout_weight="100"
android:background="?attr/asEditTextBackground" android:background="?attr/asEditTextBackground"
android:cursorVisible="false"
android:freezesText="true"
android:hint="@string/TEA_title_hint" android:hint="@string/TEA_title_hint"
android:imeOptions="flagNoExtractUi|actionDone" android:freezesText="true"
android:imeOptions="flagNoExtractUi"
android:inputType="textCapSentences" android:inputType="textCapSentences"
android:scrollbars="vertical" android:scrollbars="vertical"
android:text=""
android:textColor="?attr/asTextColor" android:textColor="?attr/asTextColor"
android:textColorHint="?attr/asTextColorHint" /> android:textColorHint="?attr/asTextColorHint" />

@ -24,11 +24,71 @@
android:orientation="vertical" android:orientation="vertical"
android:gravity="center_horizontal" > android:gravity="center_horizontal" >
<LinearLayout <FrameLayout
android:id="@+id/basic_controls" android:id="@+id/row_1"
android:layout_width="fill_parent" android:layout_width="match_parent"
android:layout_height="fill_parent" android:layout_height="wrap_content"
android:orientation="vertical"/> android:background="?attr/asContentBackground" />
<FrameLayout
android:id="@+id/row_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
<FrameLayout
android:id="@+id/row_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
<FrameLayout
android:id="@+id/row_4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
<FrameLayout
android:id="@+id/row_5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
<FrameLayout
android:id="@+id/row_6"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
<FrameLayout
android:id="@+id/row_7"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
<FrameLayout
android:id="@+id/row_8"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
<FrameLayout
android:id="@+id/row_9"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
<FrameLayout
android:id="@+id/row_10"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
<FrameLayout
android:id="@+id/row_11"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
<android.support.v4.view.ViewPager <android.support.v4.view.ViewPager
android:id="@+id/pager" android:id="@+id/pager"

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
** Copyright (c) 2012 Todoroo Inc
**
** See the file "LICENSE" for the full license governing this code.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<include layout="@layout/toolbar" />
<include layout="@layout/toolbar_separator"/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/taskedit_fragment_container">
<fragment
android:name="com.todoroo.astrid.activity.TaskEditFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="taskedit_fragment">
</fragment>
</FrameLayout>
</LinearLayout>

@ -14,7 +14,7 @@
<include layout="@layout/toolbar_separator" /> <include layout="@layout/toolbar_separator" />
<FrameLayout <FrameLayout
android:id="@+id/tasklist_fragment_container" android:id="@+id/single_pane"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?attr/asContentBackground" /> android:background="?attr/asContentBackground" />

Loading…
Cancel
Save