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>
</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

@ -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
*/

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

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

@ -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;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
@ -17,7 +14,6 @@ import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.ViewPager;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@ -29,30 +25,22 @@ import android.view.ViewGroup.LayoutParams;
import android.view.ViewParent;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.actfm.ActFmCameraModule;
import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.UserActivityDao;
import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskAttachment;
import com.todoroo.astrid.files.AACRecordingActivity;
import com.todoroo.astrid.files.FilesControlSet;
import com.todoroo.astrid.notes.EditNoteActivity;
import com.todoroo.astrid.repeats.RepeatControlSet;
import com.todoroo.astrid.service.TaskDeleter;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.tags.TagsControlSet;
import com.todoroo.astrid.timers.TimerControlSet;
import com.todoroo.astrid.timers.TimerPlugin;
import com.todoroo.astrid.ui.EditTitleControlSet;
import com.todoroo.astrid.ui.HideUntilControlSet;
import com.todoroo.astrid.ui.ReminderControlSet;
import com.todoroo.astrid.utility.Flags;
import org.tasks.R;
@ -62,24 +50,13 @@ import org.tasks.injection.ForActivity;
import org.tasks.injection.InjectingFragment;
import org.tasks.notifications.NotificationManager;
import org.tasks.preferences.ActivityPreferences;
import org.tasks.ui.CalendarControlSet;
import org.tasks.ui.DeadlineControlSet;
import org.tasks.ui.DescriptionControlSet;
import org.tasks.ui.MenuColorizer;
import org.tasks.ui.PriorityControlSet;
import org.tasks.ui.TaskEditControlFragment;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import butterknife.Bind;
import butterknife.ButterKnife;
import timber.log.Timber;
import static android.app.Activity.RESULT_OK;
@ -93,16 +70,22 @@ import static android.app.Activity.RESULT_OK;
*/
public final class TaskEditFragment extends InjectingFragment implements EditNoteActivity.UpdatesChangedListener {
public interface TaskEditFragmentCallbackHandler {
void taskEditFinished();
}
public static TaskEditFragment newTaskEditFragment(boolean isNewTask, Task task) {
TaskEditFragment taskEditFragment = new TaskEditFragment();
taskEditFragment.isNewTask = isNewTask;
taskEditFragment.model = task;
taskEditFragment.applyModel = true;
return taskEditFragment;
}
public static final String TAG_TASKEDIT_FRAGMENT = "taskedit_fragment"; //$NON-NLS-1$
// --- bundle tokens
/**
* Task ID
*/
public static final String TOKEN_ID = "id"; //$NON-NLS-1$
public static final String TOKEN_UUID = "uuid";
/**
* Content Values to set
*/
@ -111,12 +94,8 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
/**
* Task in progress (during orientation change)
*/
private static final String TASK_IN_PROGRESS = "task_in_progress"; //$NON-NLS-1$
/**
* Task remote id (during orientation change)
*/
private static final String TASK_UUID = "task_uuid"; //$NON-NLS-1$
private static final String EXTRA_TASK = "extra_task"; //$NON-NLS-1$
private static final String EXTRA_APPLY_MODEL = "extra_apply_model";
/**
* Token for saving a bitmap in the intent before it has been added with a comment
@ -128,12 +107,6 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
public static final int REQUEST_CODE_RECORD = 30; // TODO: move this to file control set
public static final int REQUEST_CODE_CAMERA = 60;
// --- result codes
public static final String OVERRIDE_FINISH_ANIM = "finishAnim"; //$NON-NLS-1$
public static final String TOKEN_TAGS_CHANGED = "tags_changed"; //$NON-NLS-1$
// --- services
public static final int TAB_VIEW_UPDATES = 0;
@ -150,16 +123,27 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
// --- UI components
private final Map<String, Integer> controlSetFragments = new HashMap<>();
private final List<Integer> displayedFragments = new ArrayList<>();
private EditNoteActivity editNotes;
@Bind(R.id.pager) ViewPager mPager;
@Bind(R.id.updatesFooter) View commentsBar;
@Bind(R.id.basic_controls) LinearLayout basicControls;
@Bind(R.id.edit_scroll) ScrollView scrollView;
@Bind(R.id.commentField) EditText commentField;
public static final int[] rowIds = new int[] {
R.id.row_1,
R.id.row_2,
R.id.row_3,
R.id.row_4,
R.id.row_5,
R.id.row_6,
R.id.row_7,
R.id.row_8,
R.id.row_9,
R.id.row_10,
R.id.row_11,
};
// --- other instance variables
/** true if editing started with a new task */
@ -167,15 +151,10 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
/** task model */
Task model = null;
/** whether task should be saved when this activity exits */
private boolean shouldSaveState = true;
private boolean overrideFinishAnim;
private String uuid = RemoteModel.NO_UUID;
private boolean applyModel = false;
private boolean showEditComments;
private TaskEditFragmentCallbackHandler callback;
/*
* ======================================================================
@ -188,15 +167,9 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
super.onCreate(savedInstanceState);
// if we were editing a task already, restore it
if (savedInstanceState != null
&& savedInstanceState.containsKey(TASK_IN_PROGRESS)) {
Task task = savedInstanceState.getParcelable(TASK_IN_PROGRESS);
if (task != null) {
model = task;
}
if (savedInstanceState.containsKey(TASK_UUID)) {
uuid = savedInstanceState.getString(TASK_UUID);
}
if (savedInstanceState != null) {
model = savedInstanceState.getParcelable(EXTRA_TASK);
applyModel = savedInstanceState.getBoolean(EXTRA_APPLY_MODEL);
}
showEditComments = preferences.getBoolean(R.string.p_show_task_edit_comments, true);
@ -204,6 +177,13 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
getActivity().setResult(RESULT_OK);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
callback = (TaskEditFragmentCallbackHandler) activity;
}
/*
* ======================================================================
* ==================================================== UI initialization
@ -213,51 +193,12 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.task_edit_activity, container, false);
View view = inflater.inflate(R.layout.task_edit_fragment, container, false);
ButterKnife.bind(this, view);
loadItem(getActivity().getIntent());
registerFragment(R.string.TEA_ctrl_title_pref);
registerFragment(R.string.TEA_ctrl_when_pref);
registerFragment(R.string.TEA_ctrl_gcal);
registerFragment(R.string.TEA_ctrl_importance_pref);
registerFragment(R.string.TEA_ctrl_notes_pref);
registerFragment(R.string.TEA_ctrl_hide_until_pref);
registerFragment(R.string.TEA_ctrl_reminders_pref);
registerFragment(R.string.TEA_ctrl_files_pref);
registerFragment(R.string.TEA_ctrl_timer_pref);
registerFragment(R.string.TEA_ctrl_lists_pref);
registerFragment(R.string.TEA_ctrl_repeat_pref);
ArrayList<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);
}
}
}
notificationManager.cancel(model.getId());
fragmentTransaction.commit();
applyModel = false;
if (!showEditComments) {
commentsBar.setVisibility(View.GONE);
@ -266,38 +207,6 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
return view;
}
private void registerFragment(int resId) {
controlSetFragments.put(getString(resId), resId);
}
private TaskEditControlFragment createFragment(int fragmentId) {
switch (fragmentId) {
case R.string.TEA_ctrl_title_pref:
return new EditTitleControlSet();
case R.string.TEA_ctrl_when_pref:
return new DeadlineControlSet();
case R.string.TEA_ctrl_importance_pref:
return new PriorityControlSet();
case R.string.TEA_ctrl_notes_pref:
return new DescriptionControlSet();
case R.string.TEA_ctrl_gcal:
return new CalendarControlSet();
case R.string.TEA_ctrl_hide_until_pref:
return new HideUntilControlSet();
case R.string.TEA_ctrl_reminders_pref:
return new ReminderControlSet();
case R.string.TEA_ctrl_files_pref:
return new FilesControlSet();
case R.string.TEA_ctrl_timer_pref:
return new TimerControlSet();
case R.string.TEA_ctrl_lists_pref:
return new TagsControlSet();
case R.string.TEA_ctrl_repeat_pref:
return new RepeatControlSet();
default:
throw new RuntimeException("Unsupported fragment");
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
@ -306,25 +215,14 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
// We have a menu item to show in action bar.
setHasOptionsMenu(true);
AstridActivity activity = (AstridActivity) getActivity();
overrideFinishAnim = false;
if (activity != null) {
if (activity.getIntent() != null) {
overrideFinishAnim = activity.getIntent().getBooleanExtra(
OVERRIDE_FINISH_ANIM, true);
}
}
// Load task data in background
new TaskEditBackgroundLoader().start();
}
private void instantiateEditNotes() {
if (showEditComments) {
long idParam = getActivity().getIntent().getLongExtra(TOKEN_ID, -1L);
editNotes = new EditNoteActivity(actFmCameraModule, metadataDao, userActivityDao,
taskService, this, getView(), idParam);
taskService, this, getView(), model.getId());
editNotes.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
@ -333,8 +231,6 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
}
private void loadMoreContainer() {
long idParam = getActivity().getIntent().getLongExtra(TOKEN_ID, -1L);
int tabStyle = TaskEditViewPager.TAB_SHOW_ACTIVITY;
if (!showEditComments) {
@ -344,7 +240,7 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
if (editNotes == null) {
instantiateEditNotes();
} else {
editNotes.loadViewForTaskID(idParam);
editNotes.loadViewForTaskID(model.getId());
}
if (editNotes != null) {
@ -424,76 +320,12 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
* ======================================================================
*/
/**
* Loads action item from the given intent
*/
private void loadItem(Intent intent) {
if (model != null) {
// came from bundle
setIsNewTask(model.getTitle().length() == 0);
return;
}
long idParam = intent.getLongExtra(TOKEN_ID, -1L);
if (idParam > -1L) {
model = taskService.fetchById(idParam, Task.PROPERTIES);
if (model != null && model.containsNonNullValue(Task.UUID)) {
uuid = model.getUUID();
}
}
// not found by id or was never passed an id
if (model == null) {
String valuesAsString = intent.getStringExtra(TOKEN_VALUES);
ContentValues values = null;
try {
if (valuesAsString != null) {
valuesAsString = PermaSql.replacePlaceholders(valuesAsString);
values = AndroidUtilities.contentValuesFromSerializedString(valuesAsString);
}
} catch (Exception e) {
// oops, can't serialize
Timber.e(e, e.getMessage());
}
model = taskService.createWithValues(values, null);
getActivity().getIntent().putExtra(TOKEN_ID, model.getId());
}
if (model.getTitle().length() == 0) {
// set deletion date until task gets a title
model.setDeletionDate(DateUtilities.now());
}
setIsNewTask(model.getTitle().length() == 0);
if (model == null) {
Timber.e(new NullPointerException("model"), "task-edit-no-task");
getActivity().onBackPressed();
return;
}
notificationManager.cancel(model.getId());
}
private void setIsNewTask(boolean isNewTask) {
this.isNewTask = isNewTask;
}
/** Convenience method to populate fields after setting model to null */
public void repopulateFromScratch(Intent intent) {
model = null;
uuid = RemoteModel.NO_UUID;
loadMoreContainer();
}
private String getTitle() {
return getEditTitleControlSet().getTitle();
}
/** Save task model from values in UI components */
public void save(boolean onPause) {
public void save() {
String title = getTitle();
if (title == null) {
return;
@ -507,24 +339,17 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
return;
}
if (!onPause) {
for (Integer fragmentId : displayedFragments) {
getFragment(fragmentId).apply(model);
for (int fragmentId : rowIds) {
TaskEditControlFragment fragment = (TaskEditControlFragment) getFragmentManager().findFragmentById(fragmentId);
if (fragment == null) {
break;
}
fragment.apply(model);
}
taskService.save(model);
boolean taskEditActivity = (getActivity() instanceof TaskEditActivity);
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
// since the activity isn't actually finishing
TaskListActivity tla = (TaskListActivity) getActivity();
@ -536,24 +361,20 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
if (isNewTask) {
tla.getTaskListFragment().onTaskCreated(model.getId(), model.getUuid());
}
}
removeExtrasFromIntent(getActivity().getIntent());
shouldSaveState = false;
getActivity().onBackPressed();
}
}
private EditTitleControlSet getEditTitleControlSet() {
return getFragment(R.string.TEA_ctrl_title_pref);
return getFragment(EditTitleControlSet.TAG);
}
private FilesControlSet getFilesControlSet() {
return getFragment(R.string.TEA_ctrl_files_pref);
return getFragment(FilesControlSet.TAG);
}
private TimerControlSet getTimerControl() {
return getFragment(R.string.TEA_ctrl_timer_pref);
return getFragment(TimerControlSet.TAG );
}
@SuppressWarnings("unchecked")
@ -561,39 +382,13 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
return (T) getFragmentManager().findFragmentByTag(getString(tag));
}
public boolean onKeyDown(int keyCode) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
public void onBackPressed() {
if(getTitle().length() == 0) {
discardButtonClick();
} else {
saveButtonClick();
}
return true;
}
return false;
}
@Override
public void onDetach() {
super.onDetach();
// abandon editing and delete the newly created task if
// no title was entered
Activity activity = getActivity();
if (overrideFinishAnim) {
AndroidUtilities.callOverridePendingTransition(activity,
R.anim.slide_right_in, R.anim.slide_right_out);
}
if (activity instanceof TaskListActivity) {
if (getTitle().length() == 0 && isNewTask && model != null && model.isSaved()) {
taskDeleter.delete(model);
}
} else if (activity instanceof TaskEditActivity) {
if (getTitle().length() == 0 && isNewTask && model != null && model.isSaved()) {
taskDeleter.delete(model);
}
save();
}
callback.taskEditFinished();
}
/**
@ -601,6 +396,7 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
*/
public static void removeExtrasFromIntent(Intent intent) {
if (intent != null) {
intent.removeExtra(TaskListActivity.TOKEN_SWITCH_TO_FILTER);
intent.removeExtra(TaskListActivity.OPEN_TASK);
intent.removeExtra(TOKEN_PICTURE_IN_PROGRESS);
}
@ -612,13 +408,7 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
* ======================================================================
*/
protected void saveButtonClick() {
save(false);
}
protected void discardButtonClick() {
shouldSaveState = false;
// abandon editing in this case
if (getTitle().trim().length() == 0 || TextUtils.isEmpty(model.getTitle())) {
if (isNewTask) {
@ -632,7 +422,6 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
}
removeExtrasFromIntent(getActivity().getIntent());
getActivity().onBackPressed();
}
protected void deleteButtonClick() {
@ -642,19 +431,7 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
public void onClick(DialogInterface dialog, int which) {
TimerPlugin.stopTimer(notificationManager, taskService, getActivity(), model);
taskDeleter.delete(model);
shouldSaveState = false;
Activity a = getActivity();
if (a instanceof TaskEditActivity) {
getActivity().setResult(RESULT_OK);
getActivity().onBackPressed();
} else if (a instanceof TaskListActivity) {
discardButtonClick();
TaskListFragment tlf = ((TaskListActivity) a).getTaskListFragment();
if (tlf != null) {
tlf.refresh();
}
}
callback.taskEditFinished();
}
})
.setNegativeButton(android.R.string.cancel, null)
@ -672,10 +449,12 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
switch (item.getItemId()) {
case R.id.menu_save:
saveButtonClick();
save();
callback.taskEditFinished();
return true;
case R.id.menu_discard:
discardButtonClick();
callback.taskEditFinished();
return true;
case R.id.menu_record_note:
startRecordingAudio();
@ -687,8 +466,9 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
if (getTitle().trim().length() == 0) {
discardButtonClick();
} else {
saveButtonClick();
save();
}
callback.taskEditFinished();
return true;
}
@ -699,18 +479,11 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.task_edit_fragment, menu);
MenuColorizer.colorMenu(getActivity(), menu, getResources().getColor(android.R.color.white));
if (preferences.useTabletLayout()) {
menu.findItem(R.id.menu_save).setVisible(true);
}
for (int i = 0 ; i < menu.size() ; i++) {
MenuColorizer.colorMenuItem(menu.getItem(i), getResources().getColor(android.R.color.white));
}
@Override
public void onPause() {
super.onPause();
if (shouldSaveState) {
save(true);
if (getResources().getBoolean(R.bool.two_pane_layout)) {
menu.findItem(R.id.menu_save).setVisible(true);
}
}
@ -738,9 +511,8 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// stick our task into the outState
outState.putParcelable(TASK_IN_PROGRESS, model);
outState.putString(TASK_UUID, uuid);
outState.putParcelable(EXTRA_TASK, model);
outState.putBoolean(EXTRA_APPLY_MODEL, applyModel);
}
/*

@ -8,11 +8,11 @@ package com.todoroo.astrid.activity;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.ContentValues;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.DrawerLayout;
@ -23,64 +23,101 @@ import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import com.todoroo.andlib.data.Callback;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.actfm.FilterSettingsActivity;
import com.todoroo.astrid.actfm.TagSettingsActivity;
import com.todoroo.astrid.actfm.TagViewFragment;
import com.todoroo.astrid.adapter.FilterAdapter;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.CustomFilter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.core.BuiltInFilterExposer;
import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.files.FilesControlSet;
import com.todoroo.astrid.gtasks.GtasksListFragment;
import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.repeats.RepeatControlSet;
import com.todoroo.astrid.service.StartupService;
import com.todoroo.astrid.service.TaskCreator;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.service.UpgradeActivity;
import com.todoroo.astrid.subtasks.SubtasksHelper;
import com.todoroo.astrid.subtasks.SubtasksListFragment;
import com.todoroo.astrid.subtasks.SubtasksTagListFragment;
import com.todoroo.astrid.tags.TagFilterExposer;
import com.todoroo.astrid.utility.Flags;
import com.todoroo.astrid.tags.TagsControlSet;
import com.todoroo.astrid.timers.TimerControlSet;
import com.todoroo.astrid.ui.EditTitleControlSet;
import com.todoroo.astrid.ui.HideUntilControlSet;
import com.todoroo.astrid.ui.ReminderControlSet;
import com.todoroo.astrid.voice.VoiceInputAssistant;
import com.todoroo.astrid.widget.TasksWidget;
import org.tasks.R;
import org.tasks.activities.SortActivity;
import org.tasks.analytics.Tracker;
import org.tasks.injection.InjectingAppCompatActivity;
import org.tasks.preferences.ActivityPreferences;
import org.tasks.preferences.BasicPreferences;
import org.tasks.receivers.RepeatConfirmationReceiver;
import org.tasks.ui.CalendarControlSet;
import org.tasks.ui.DeadlineControlSet;
import org.tasks.ui.DescriptionControlSet;
import org.tasks.ui.MenuColorizer;
import org.tasks.ui.NavigationDrawerFragment;
import org.tasks.ui.PriorityControlSet;
import org.tasks.ui.TaskEditControlFragment;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import butterknife.Bind;
import butterknife.ButterKnife;
import timber.log.Timber;
import static com.todoroo.astrid.activity.TaskEditFragment.newTaskEditFragment;
import static com.todoroo.astrid.voice.VoiceInputAssistant.voiceInputAvailable;
import static org.tasks.ui.NavigationDrawerFragment.OnFilterItemClickedListener;
public class TaskListActivity extends AstridActivity implements OnFilterItemClickedListener {
public class TaskListActivity extends InjectingAppCompatActivity implements
OnFilterItemClickedListener,
TaskListFragment.OnTaskListItemClickedListener,
PriorityControlSet.OnPriorityChanged,
TimerControlSet.TimerControlSetCallback,
RepeatControlSet.RepeatChangedListener,
TaskEditFragment.TaskEditFragmentCallbackHandler {
@Inject TagDataDao tagDataDao;
@Inject ActivityPreferences preferences;
@Inject GtasksPreferenceService gtasksPreferenceService;
@Inject VoiceInputAssistant voiceInputAssistant;
@Inject Tracker tracker;
@Inject StartupService startupService;
@Inject SubtasksHelper subtasksHelper;
@Inject TaskService taskService;
@Inject TaskCreator taskCreator;
@Bind(R.id.toolbar) Toolbar toolbar;
public static final int REQUEST_UPGRADE = 505;
private static final int REQUEST_EDIT_TAG = 11543;
private static final int REQUEST_EDIT_FILTER = 11544;
private static final int REQUEST_SORT = 11545;
private final RepeatConfirmationReceiver repeatConfirmationReceiver = new RepeatConfirmationReceiver(this);
private final Map<String, Integer> controlSetFragments = new HashMap<>();
private NavigationDrawerFragment navigationDrawer;
private ArrayList<String> controlOrder;
public static final String TOKEN_SWITCH_TO_FILTER = "newListCreated"; //$NON-NLS-1$
@ -96,23 +133,24 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startupService.onStartupApplication(this);
preferences.applyTheme();
setContentView(R.layout.task_list_wrapper);
ButterKnife.bind(this);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null) {
supportActionBar.setDisplayHomeAsUpEnabled(true);
Drawable drawable = DrawableCompat.wrap(getResources().getDrawable(R.drawable.ic_menu_24dp));
DrawableCompat.setTint(drawable, getResources().getColor(android.R.color.white));
toolbar.setNavigationIcon(drawable);
}
updateToolbar(R.drawable.ic_menu_24dp, true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TaskEditFragment taskEditFragment = getTaskEditFragment();
if (isDoublePaneLayout() || taskEditFragment == null) {
hideKeyboard();
navigationDrawer.openDrawer();
} else {
taskEditFragment.onBackPressed();
}
}
});
@ -120,13 +158,20 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
navigationDrawer.setUp(drawerLayout);
View editFragment = findViewById(R.id.taskedit_fragment_container);
if(editFragment != null) {
fragmentLayout = LAYOUT_DOUBLE;
} else {
fragmentLayout = LAYOUT_SINGLE;
}
registerFragment(EditTitleControlSet.TAG);
registerFragment(DeadlineControlSet.TAG);
registerFragment(CalendarControlSet.TAG);
registerFragment(PriorityControlSet.TAG);
registerFragment(DescriptionControlSet.TAG);
registerFragment(HideUntilControlSet.TAG);
registerFragment(ReminderControlSet.TAG);
registerFragment(FilesControlSet.TAG);
registerFragment(TimerControlSet.TAG);
registerFragment(TagsControlSet.TAG);
registerFragment(RepeatControlSet.TAG);
controlOrder = BeastModePreferences.constructOrderedControlList(preferences, this);
controlOrder.add(0, getString(EditTitleControlSet.TAG));
readIntent();
}
@ -141,7 +186,8 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
}
private void readIntent() {
Bundle extras = getIntent().getExtras();
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
extras = (Bundle) extras.clone();
}
@ -150,15 +196,76 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
extras = new Bundle();
}
Filter savedFilter = getIntent().getParcelableExtra(TaskListFragment.TOKEN_FILTER);
if (savedFilter == null) {
savedFilter = getDefaultFilter();
extras.putAll(configureIntentAndExtrasWithFilter(getIntent(), savedFilter));
TaskListFragment taskListFragment;
if (intent.hasExtra(TaskListFragment.TOKEN_FILTER)) {
Filter filter = intent.getParcelableExtra(TaskListFragment.TOKEN_FILTER);
extras.putAll(configureIntentAndExtrasWithFilter(intent, filter));
setListsTitle(filter.listingTitle);
taskListFragment = newTaskListFragment(filter, extras);
} else {
taskListFragment = getTaskListFragment();
if (taskListFragment == null) {
Filter filter = getDefaultFilter();
extras.putAll(configureIntentAndExtrasWithFilter(intent, filter));
setListsTitle(filter.listingTitle);
taskListFragment = newTaskListFragment(filter, extras);
}
}
extras.putParcelable(TaskListFragment.TOKEN_FILTER, savedFilter);
setupTasklistFragmentWithFilter(savedFilter, extras);
setListsTitle(savedFilter.listingTitle);
TaskEditFragment taskEditFragment = getTaskEditFragment();
List<TaskEditControlFragment> taskEditControlFragments = new ArrayList<>();
if (taskEditFragment != null) {
for (int rowId : TaskEditFragment.rowIds) {
TaskEditControlFragment fragment = (TaskEditControlFragment) getFragmentManager().findFragmentById(rowId);
if (fragment == null) {
break;
}
taskEditControlFragments.add(fragment);
}
}
loadTaskListFragment(true, taskListFragment);
if (taskEditFragment != null) {
loadTaskEditFragment(true, taskEditFragment, taskEditControlFragments);
}
}
private void loadTaskListFragment(boolean onCreate, TaskListFragment taskListFragment) {
FragmentManager fragmentManager = getFragmentManager();
if (onCreate) {
fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
} else {
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
fragmentManager.beginTransaction()
.replace(isDoublePaneLayout() ? R.id.master_dual : R.id.single_pane, taskListFragment, TaskListFragment.TAG_TASKLIST_FRAGMENT)
.addToBackStack(TaskListFragment.TAG_TASKLIST_FRAGMENT)
.commit();
}
private void loadTaskEditFragment(boolean onCreate, TaskEditFragment taskEditFragment, List<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() {
@ -173,7 +280,6 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
registerReceiver(
repeatConfirmationReceiver,
new IntentFilter(AstridApiConstants.BROADCAST_EVENT_TASK_REPEATED));
getTaskListFragment().setSyncOngoing(gtasksPreferenceService.isOngoing());
}
@Override
@ -226,17 +332,17 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
Filter savedFilter = new Filter(title,
new QueryTemplate().where
(Criterion.or(Task.NOTES.
like (
like(
"%" + //$NON-NLS-1$
query + "%"
),
Task.TITLE.
like (
like(
"%" + //$NON-NLS-1$
query + "%"
)
)
),null);
), null);
onFilterItemClicked(savedFilter);
MenuItemCompat.collapseActionView(item);
@ -256,11 +362,11 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
}
@Override
public boolean onFilterItemClicked(FilterListItem item) {
public void onFilterItemClicked(FilterListItem item) {
TaskEditFragment.removeExtrasFromIntent(getIntent());
TaskEditFragment tef = getTaskEditFragment();
if (tef != null) {
onBackPressed();
getTaskEditFragment().onBackPressed();
}
if ((item instanceof Filter)) {
@ -273,73 +379,53 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
Filter filter = (Filter)item;
Bundle extras = configureIntentAndExtrasWithFilter(intent, filter);
if (fragmentLayout == LAYOUT_DOUBLE && getTaskEditFragment() != null) {
onBackPressed(); // remove the task edit fragment when switching between lists
}
setupTasklistFragmentWithFilter(filter, extras);
TaskListFragment newFragment = newTaskListFragment(filter, extras);
// no animation for dualpane-layout
AndroidUtilities.callOverridePendingTransition(this, 0, 0);
return true;
loadTaskListFragment(false, newFragment);
}
return false;
}
public void setupTasklistFragmentWithFilter(Filter filter, Bundle extras) {
private TaskListFragment newTaskListFragment(Filter filter, Bundle extras) {
Class<?> customTaskList = null;
if (subtasksHelper.shouldUseSubtasksFragmentForFilter(filter)) {
customTaskList = SubtasksHelper.subtasksClassForFilter(filter);
}
TaskListFragment newFragment = TaskListFragment.instantiateWithFilterAndExtras(filter, extras, customTaskList);
Class<?> component = customTaskList;
if (filter instanceof FilterWithCustomIntent && component == null) {
try {
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.tasklist_fragment_container, newFragment, TaskListFragment.TAG_TASKLIST_FRAGMENT);
transaction.commit();
runOnUiThread(new Runnable() {
@Override
public void run() {
getFragmentManager().executePendingTransactions();
}
});
component = Class.forName(((FilterWithCustomIntent) filter).customTaskList.getClassName());
} catch (Exception e) {
// Don't worry about it
// Invalid
Timber.e(e, e.getMessage());
}
}
@Override
public void setupActivityFragment(TagData tagData) {
super.setupActivityFragment(tagData);
if (fragmentLayout == LAYOUT_DOUBLE) {
View container = findViewById(R.id.taskedit_fragment_container);
if (container != null) {
container.setVisibility(View.VISIBLE);
if (component == null) {
component = TaskListFragment.class;
}
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
protected void onPostResume() {
super.onPostResume();
if (!Flags.checkAndClear(Flags.TLA_DISMISSED_FROM_TASK_EDIT)) {
TaskEditFragment tea = getTaskEditFragment();
if (tea != null) {
onBackPressed();
}
}
if (getIntent().hasExtra(TOKEN_SWITCH_TO_FILTER)) {
Filter newList = getIntent().getParcelableExtra(TOKEN_SWITCH_TO_FILTER);
getIntent().removeExtra(TOKEN_SWITCH_TO_FILTER);
onFilterItemClicked(newList);
// } else {
// navigationDrawer.restoreLastSelected();
}
if (getIntent().hasExtra(OPEN_TASK)) {
@ -349,33 +435,90 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
} else {
TaskListFragment tlf = getTaskListFragment();
if (tlf != null) {
tlf.quickAddBar.quickAddTask(); //$NON-NLS-1$
Task task = tlf.quickAddBar.quickAddTask("");//$NON-NLS-1$
onTaskListItemClicked(task.getId());
}
}
if (fragmentLayout == LAYOUT_SINGLE) {
getIntent().removeExtra(OPEN_TASK);
}
}
if (getIntent().getBooleanExtra(TOKEN_CREATE_NEW_LIST, false)) {
newListFromLaunch();
}
}
private void newListFromLaunch() {
Intent thisIntent = getIntent();
Intent newTagIntent = new Intent(this, TagSettingsActivity.class);
newTagIntent.putExtra(TagSettingsActivity.TOKEN_AUTOPOPULATE_NAME, thisIntent.getStringExtra(TOKEN_CREATE_NEW_LIST_NAME));
thisIntent.removeExtra(TOKEN_CREATE_NEW_LIST_NAME);
startActivityForResult(newTagIntent, NavigationDrawerFragment.REQUEST_NEW_LIST);
}
}
@Override
public void onTaskListItemClicked(long taskId) {
if (fragmentLayout != LAYOUT_SINGLE) {
getIntent().putExtra(OPEN_TASK, taskId);
TaskEditFragment taskEditFragment = getTaskEditFragment();
if (taskEditFragment != null) {
taskEditFragment.onBackPressed();
}
Task task = loadItem(taskId);
if (task == null) {
Timber.e(new NullPointerException(), "Failed to load task id %s", taskId);
return;
}
boolean isNewTask = task.getTitle().length() == 0;
String hideAlwaysTrigger = getString(R.string.TEA_ctrl_hide_section_pref);
taskEditFragment = newTaskEditFragment(isNewTask, task);
List<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) {
@ -393,19 +536,16 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
return;
}
// manage task edit visibility
View taskeditFragmentContainer = findViewById(R.id.taskedit_fragment_container);
if(taskeditFragmentContainer != null && taskeditFragmentContainer.getVisibility() == View.VISIBLE) {
Flags.set(Flags.TLA_DISMISSED_FROM_TASK_EDIT);
onPostResume();
if (getTaskEditFragment() != null) {
getTaskEditFragment().onBackPressed();
return;
}
super.onBackPressed();
if (isFinishing()) {
return;
}
@Override
public void finish() {
super.finish();
AndroidUtilities.callOverridePendingTransition(this, R.anim.slide_right_in, R.anim.slide_right_out);
super.onBackPressed();
}
@Override
@ -413,7 +553,13 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
Callback<String> quickAddTask = new Callback<String>() {
@Override
public void apply(String title) {
getTaskListFragment().quickAddBar.quickAddTask(title);
TaskListFragment taskListFragment = getTaskListFragment();
Task task = taskListFragment.quickAddBar.quickAddTask(title);
taskCreator.addToCalendar(task);
onTaskListItemClicked(task.getId());
taskListFragment.loadTaskListContent();
taskListFragment.selectCustomId(task.getId());
taskListFragment.onTaskCreated(task.getId(), task.getUUID());
}
};
if (voiceInputAssistant.handleActivityResult(requestCode, resultCode, data, quickAddTask)) {
@ -434,23 +580,6 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
}
navigationDrawer.refresh();
} else if (requestCode == TaskListFragment.ACTIVITY_EDIT_TASK && resultCode != Activity.RESULT_CANCELED) {
// Handle switch to assigned filter when it comes from TaskEditActivity finishing
// For cases when we're in a multi-frame layout, the TaskEditFragment will notify us here directly
TaskListFragment tlf = getTaskListFragment();
if (tlf != null) {
if (data != null) {
if (data.getBooleanExtra(TaskEditFragment.TOKEN_TAGS_CHANGED, false)) {
tagsChanged(true);
}
}
tlf.refresh();
if (data != null) {
tlf.onTaskCreated(
data.getLongExtra(TaskEditFragment.TOKEN_ID, 0L),
data.getStringExtra(TaskEditFragment.TOKEN_UUID));
}
}
} else if (requestCode == REQUEST_EDIT_TAG) {
if (resultCode == RESULT_OK) {
String action = data.getAction();
@ -509,10 +638,18 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
getTaskListFragment().setUpTaskList();
}
}
} else if (requestCode == REQUEST_UPGRADE) {
if (resultCode == RESULT_OK) {
if (data != null && data.getBooleanExtra(UpgradeActivity.EXTRA_RESTART, false)) {
Timber.w("Upgrade requires restart");
finish();
startActivity(getIntent());
}
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
protected void tagsChanged() {
tagsChanged(false);
@ -579,10 +716,130 @@ public class TaskListActivity extends AstridActivity implements OnFilterItemClic
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
TaskEditFragment tef = getTaskEditFragment();
if (tef != null && tef.onKeyDown(keyCode)) {
if (tef != null) {
tef.onBackPressed();
return true;
}
}
return super.onKeyDown(keyCode, event);
}
public TaskListFragment getTaskListFragment() {
return (TaskListFragment) getFragmentManager()
.findFragmentByTag(TaskListFragment.TAG_TASKLIST_FRAGMENT);
}
public TaskEditFragment getTaskEditFragment() {
return (TaskEditFragment) getFragmentManager()
.findFragmentByTag(TaskEditFragment.TAG_TASKEDIT_FRAGMENT);
}
protected void updateToolbar(int drawableResId, boolean showTitle) {
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null) {
supportActionBar.setDisplayHomeAsUpEnabled(true);
supportActionBar.setDisplayShowTitleEnabled(showTitle);
Drawable drawable = DrawableCompat.wrap(getResources().getDrawable(drawableResId));
DrawableCompat.setTint(drawable, getResources().getColor(android.R.color.white));
supportActionBar.setHomeAsUpIndicator(drawable);
}
}
protected Bundle configureIntentAndExtrasWithFilter(Intent intent, Filter filter) {
if(filter instanceof FilterWithCustomIntent) {
int lastSelectedList = intent.getIntExtra(NavigationDrawerFragment.TOKEN_LAST_SELECTED, 0);
intent = ((FilterWithCustomIntent)filter).getCustomIntent();
intent.putExtra(NavigationDrawerFragment.TOKEN_LAST_SELECTED, lastSelectedList);
} else {
intent.putExtra(TaskListFragment.TOKEN_FILTER, filter);
}
setIntent(intent);
Bundle extras = intent.getExtras();
if (extras != null) {
extras = (Bundle) extras.clone();
}
return extras;
}
/**
* Loads action item from the given intent
*/
private Task loadItem(long taskId) {
Task model = null;
if (taskId> -1L) {
model = taskService.fetchById(taskId, Task.PROPERTIES);
}
// not found by id or was never passed an id
if (model == null) {
Intent intent = getIntent();
String valuesAsString = intent.getStringExtra(TaskEditFragment.TOKEN_VALUES);
ContentValues values = null;
try {
if (valuesAsString != null) {
valuesAsString = PermaSql.replacePlaceholders(valuesAsString);
values = AndroidUtilities.contentValuesFromSerializedString(valuesAsString);
}
} catch (Exception e) {
// oops, can't serialize
Timber.e(e, e.getMessage());
}
model = taskService.createWithValues(values, null);
}
if (model.getTitle().length() == 0) {
// set deletion date until task gets a title
model.setDeletionDate(DateUtilities.now());
}
return model;
}
@Override
public void onPriorityChange(int priority) {
getTaskEditFragment().onPriorityChange(priority);
}
@Override
public void repeatChanged(boolean repeat) {
getTaskEditFragment().onRepeatChanged(repeat);
}
@Override
public Task stopTimer() {
return getTaskEditFragment().stopTimer();
}
@Override
public Task startTimer() {
return getTaskEditFragment().startTimer();
}
public boolean isSinglePaneLayout() {
return !isDoublePaneLayout();
}
public boolean isDoublePaneLayout() {
return getResources().getBoolean(R.bool.two_pane_layout);
}
@Override
public void taskEditFinished() {
getFragmentManager().popBackStack(TaskEditFragment.TAG_TASKEDIT_FRAGMENT, FragmentManager.POP_BACK_STACK_INCLUSIVE);
if (isSinglePaneLayout()) {
updateToolbar(R.drawable.ic_menu_24dp, true);
}
hideKeyboard();
}
private void hideKeyboard() {
View view = getCurrentFocus();
if (view != null) {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
}

@ -6,7 +6,6 @@
package com.todoroo.astrid.activity;
import android.app.Activity;
import android.app.Fragment;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
@ -44,7 +43,6 @@ import com.todoroo.astrid.adapter.TaskAdapter.OnCompletedTaskListener;
import com.todoroo.astrid.adapter.TaskAdapter.ViewHolder;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import com.todoroo.astrid.core.BuiltInFilterExposer;
import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.dao.TaskAttachmentDao;
@ -77,7 +75,6 @@ import org.tasks.injection.InjectingListFragment;
import org.tasks.injection.Injector;
import org.tasks.notifications.NotificationManager;
import org.tasks.preferences.ActivityPreferences;
import org.tasks.ui.NavigationDrawerFragment;
import java.util.Timer;
import java.util.TimerTask;
@ -87,8 +84,6 @@ import javax.inject.Inject;
import timber.log.Timber;
import static org.tasks.intents.TaskIntents.getNewTaskIntent;
/**
* Primary activity for the Bente application. Shows a list of upcoming tasks
* and a user's coaches.
@ -105,7 +100,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
public static final long AUTOSYNC_INTERVAL = 90000L;
private static final long BACKGROUND_REFRESH_INTERVAL = 120000L;
private static final long WAIT_BEFORE_AUTOSYNC = 2000L;
public static final int ACTIVITY_EDIT_TASK = 0;
public static final int ACTIVITY_REQUEST_NEW_FILTER = 5;
// --- menu codes
@ -120,7 +114,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
/** token for passing a {@link Filter} object through extras */
public static final String TOKEN_FILTER = "filter"; //$NON-NLS-1$
private static final String TOKEN_EXTRAS = "extras"; //$NON-NLS-1$
public static final String TOKEN_EXTRAS = "extras"; //$NON-NLS-1$
// --- instance variables
@ -137,7 +131,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
@Inject GtasksPreferenceService gtasksPreferenceService;
@Inject DialogBuilder dialogBuilder;
protected Resources resources;
protected TaskAdapter taskAdapter = null;
protected RefreshReceiver refreshReceiver = new RefreshReceiver();
protected final AtomicReference<String> sqlQueryTemplate = new AtomicReference<>();
@ -153,7 +146,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
// --- fragment handling variables
protected OnTaskListItemClickedListener mListener;
private boolean mDualFragments = false;
protected SwipeRefreshLayout listView;
protected SwipeRefreshLayout emptyView;
@ -164,43 +156,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
* ======================================================================
*/
/**
* Instantiates and returns an instance of TaskListFragment (or some subclass). Custom types of
* TaskListFragment can be created, with the following precedence:
*
* --If the filter is of type {@link FilterWithCustomIntent}, the task list type it specifies will be used
* --Otherwise, the specified customComponent will be used
*
* See also: instantiateWithFilterAndExtras(Filter, Bundle) which uses TaskListFragment as the default
* custom component.
*/
public static TaskListFragment instantiateWithFilterAndExtras(Filter filter, Bundle extras, Class<?> customComponent) {
Class<?> component = customComponent;
if (filter instanceof FilterWithCustomIntent && component == null) {
try {
component = Class.forName(((FilterWithCustomIntent) filter).customTaskList.getClassName());
} catch (Exception e) {
// Invalid
Timber.e(e, e.getMessage());
}
}
if (component == null) {
component = TaskListFragment.class;
}
TaskListFragment newFragment;
try {
newFragment = (TaskListFragment) component.newInstance();
} catch (java.lang.InstantiationException | IllegalAccessException e) {
Timber.e(e, e.getMessage());
newFragment = new TaskListFragment();
}
Bundle args = new Bundle();
args.putBundle(TOKEN_EXTRAS, extras);
newFragment.setArguments(args);
return newFragment;
}
@Override
public void onRefresh() {
if (!syncActionHelper.performSyncAction()) {
@ -224,14 +179,8 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// Check that the container activity has implemented the callback
// interface
try {
mListener = (OnTaskListItemClickedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnTaskListItemClickedListener"); //$NON-NLS-1$
}
}
/**
@ -262,12 +211,8 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
parent.findViewById(R.id.fab).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (getResources().getBoolean(R.bool.two_pane_layout)) {
Task task = quickAddBar.quickAddTask();
Task task = quickAddBar.quickAddTask("");
onTaskListItemClicked(task.getId());
} else {
((AstridActivity) getActivity()).startEditActivity(getNewTaskIntent(getActivity(), filter));
}
}
});
View body = getListBody(parent);
@ -303,19 +248,13 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// We have a menu item to show in action bar.
resources = getResources();
setHasOptionsMenu(true);
syncActionHelper = new SyncActionHelper(gtasksPreferenceService, syncService, getActivity(), preferences);
setUpUiComponents();
initializeData();
quickAddBar.initialize(injector, (TaskListActivity) getActivity(), this);
quickAddBar.initialize(injector, this);
Fragment filterlistFrame = getFragmentManager().findFragmentById(
NavigationDrawerFragment.FRAGMENT_NAVIGATION_DRAWER);
mDualFragments = (filterlistFrame != null)
&& filterlistFrame.isInLayout();
if (mDualFragments) {
if (getResources().getBoolean(R.bool.two_pane_layout)) {
// In dual-pane mode, the list view highlights the selected item.
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
getListView().setItemsCanFocus(false);
@ -352,9 +291,9 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
protected void initializeData() {
if (extras != null && extras.containsKey(TOKEN_FILTER)) {
filter = extras.getParcelable(TOKEN_FILTER);
extras.remove(TOKEN_FILTER); // Otherwise writing this filter to parcel gives infinite recursion
// extras.remove(TOKEN_FILTER); // Otherwise writing this filter to parcel gives infinite recursion
} else {
filter = BuiltInFilterExposer.getMyTasksFilter(resources);
filter = BuiltInFilterExposer.getMyTasksFilter(getResources());
}
filter.setFilterQueryOverride(null);
isInbox = BuiltInFilterExposer.isInbox(context, filter);
@ -366,7 +305,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
initializeTaskListMetadata();
setUpTaskList();
((AstridActivity) getActivity()).setupActivityFragment(getActiveTagData());
}
protected void initializeTaskListMetadata() {
@ -450,11 +388,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
});
}
public void transitionForTaskEdit() {
AndroidUtilities.callOverridePendingTransition(getActivity(),
R.anim.slide_left_in, R.anim.slide_left_out);
}
private void setUpBackgroundJobs() {
backgroundTimer = new Timer();
@ -503,7 +436,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
}
protected boolean isCurrentTaskListFragment() {
AstridActivity activity = (AstridActivity) getActivity();
TaskListActivity activity = (TaskListActivity) getActivity();
if (activity != null) {
return activity.getTaskListFragment() == this;
}
@ -511,11 +444,11 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
}
public final void initiateAutomaticSync() {
final AstridActivity activity = (AstridActivity) getActivity();
final TaskListActivity activity = (TaskListActivity) getActivity();
if (activity == null) {
return;
}
if (activity.fragmentLayout != AstridActivity.LAYOUT_SINGLE) {
if (activity.isDoublePaneLayout()) {
initiateAutomaticSyncImpl();
} else {
// In single fragment case, we're using swipe between lists,
@ -584,16 +517,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
* broadcast. Subclasses should override this.
*/
protected void refresh() {
try {
AstridActivity astridActivity = (AstridActivity) getActivity();
TaskEditFragment taskEditFragment = astridActivity == null ? null : astridActivity.getTaskEditFragment();
Task model = taskEditFragment == null ? null : taskEditFragment.model;
taskDeleter.deleteTasksWithEmptyTitles(model == null ? null : model.getId());
} catch(Exception e) {
Timber.e(e, e.getMessage());
}
loadTaskListContent();
setSyncOngoing(false);
}
/*
@ -623,6 +547,8 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
getListView().setSelection(oldListItemSelected);
}
}
setSyncOngoing(gtasksPreferenceService.isOngoing());
}
protected TaskAdapter createTaskAdapter(TodorooCursor<Task> cursor) {
@ -786,8 +712,8 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
protected void onTaskDelete(Task task) {
Activity a = getActivity();
if (a instanceof AstridActivity) {
AstridActivity activity = (AstridActivity) a;
if (a instanceof TaskListActivity) {
TaskListActivity activity = (TaskListActivity) a;
TaskEditFragment tef = activity.getTaskEditFragment();
if (tef != null) {
if (task.getId() == tef.model.getId()) {
@ -807,7 +733,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
if (mDualFragments) {
if (getResources().getBoolean(R.bool.two_pane_layout)) {
setSelection(position);
}
}
@ -865,12 +791,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
protected void duplicateTask(long itemId) {
long cloneId = taskDuplicator.duplicateTask(itemId);
Intent intent = new Intent(getActivity(), TaskEditActivity.class);
intent.putExtra(TaskEditFragment.TOKEN_ID, cloneId);
intent.putExtra(TOKEN_FILTER, filter);
getActivity().startActivityForResult(intent, ACTIVITY_EDIT_TASK);
transitionForTaskEdit();
onTaskListItemClicked(cloneId);
}
public void onTaskListItemClicked(long taskId) {

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

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

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

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

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

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

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

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

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

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

@ -38,14 +38,14 @@ public class TaskCreator {
title = title.trim();
Task task = taskService.createWithValues(null, title);
addToCalendar(task, title);
addToCalendar(task);
return task;
}
public void addToCalendar(Task task, String title) {
public void addToCalendar(Task task) {
boolean gcalCreateEventEnabled = preferences.isDefaultCalendarSet() && task.hasDueDate(); //$NON-NLS-1$
if (!TextUtils.isEmpty(title) && gcalCreateEventEnabled && TextUtils.isEmpty(task.getCalendarURI())) {
if (!TextUtils.isEmpty(task.getTitle()) && gcalCreateEventEnabled && TextUtils.isEmpty(task.getCalendarURI())) {
Uri calendarUri = gcalHelper.createTaskEvent(task,
context.getContentResolver(), new ContentValues());
task.setCalendarUri(calendarUri.toString());

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

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

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

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

@ -50,6 +50,8 @@ import static org.tasks.date.DateTimeUtils.newDateTime;
*/
public class HideUntilControlSet extends TaskEditControlFragment implements OnItemSelectedListener {
public static final int TAG = R.string.TEA_ctrl_hide_until_pref;
private static String EXTRA_CUSTOM = "extra_custom";
private static String EXTRA_SELECTION = "extra_selection";
@ -128,6 +130,11 @@ public class HideUntilControlSet extends TaskEditControlFragment implements OnIt
return R.drawable.ic_visibility_off_24dp;
}
@Override
public int controlId() {
return TAG;
}
@Override
public void initialize(boolean isNewTask, Task task) {
long dueDate = task.getDueDate();

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

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

@ -21,11 +21,6 @@ public class Flags {
*/
public static final int TAGS_CHANGED = 1 << 1;
/**
* If set, indicates that the edit popover was dismissed by the edit fragment/back button
*/
public static final int TLA_DISMISSED_FROM_TASK_EDIT = 1 << 5;
/**
* If set, indicates that TaskListFragmentPager should not intercept touch events
*/

@ -34,6 +34,7 @@ public class TasksWidget extends InjectingAppWidgetProvider {
public static final String COMPLETE_TASK = "COMPLETE_TASK";
public static final String EDIT_TASK = "EDIT_TASK";
public static final String TOKEN_ID = "id"; //$NON-NLS-1$
public static long suppressUpdateFlag = 0; // Timestamp--don't update widgets if this flag is non-zero and now() is within 5 minutes
private static final long SUPPRESS_TIME = DateUtilities.ONE_MINUTE * 5;
@ -44,13 +45,13 @@ public class TasksWidget extends InjectingAppWidgetProvider {
switch(intent.getAction()) {
case COMPLETE_TASK:
broadcaster.toggleCompletedState(intent.getLongExtra(TaskEditFragment.TOKEN_ID, 0));
broadcaster.toggleCompletedState(intent.getLongExtra(TOKEN_ID, 0));
break;
case EDIT_TASK:
getEditTaskStack(
context,
(Filter) intent.getParcelableExtra(TaskListFragment.TOKEN_FILTER),
intent.getLongExtra(TaskEditFragment.TOKEN_ID, 0))
intent.getLongExtra(TOKEN_ID, 0))
.startActivities();
break;
case BROADCAST_EVENT_REFRESH:

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

@ -6,28 +6,18 @@ import android.os.Bundle;
import android.support.v4.app.TaskStackBuilder;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.activity.TaskEditActivity;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import org.tasks.R;
public class TaskIntents {
public static Intent getNewTaskIntent(Context context, Filter filter) {
Intent intent;
boolean twoPaneLayout = context.getResources().getBoolean(R.bool.two_pane_layout);
if (twoPaneLayout) {
intent = new Intent(context, TaskListActivity.class);
intent.putExtra(TaskListActivity.OPEN_TASK, 0L);
} else {
intent = new Intent(context, TaskEditActivity.class);
}
intent.putExtra(TaskEditFragment.OVERRIDE_FINISH_ANIM, false);
if (filter != null) {
intent.putExtra(TaskListFragment.TOKEN_FILTER, filter);
if (filter.valuesForNewTasks != null) {
@ -35,12 +25,10 @@ public class TaskIntents {
intent.putExtra(TaskEditFragment.TOKEN_VALUES, values);
intent.setAction("E" + values);
}
if (twoPaneLayout) {
if (filter instanceof FilterWithCustomIntent) {
Bundle customExtras = ((FilterWithCustomIntent) filter).customExtras;
intent.putExtras(customExtras);
}
}
} else {
intent.setAction("E");
}
@ -48,25 +36,16 @@ public class TaskIntents {
}
public static TaskStackBuilder getEditTaskStack(Context context, final Filter filter, final long taskId) {
TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(context);
boolean twoPaneLayout = context.getResources().getBoolean(R.bool.two_pane_layout);
if (twoPaneLayout) {
taskStackBuilder.addNextIntent(new Intent(context, TaskListActivity.class) {{
return TaskStackBuilder.create(context)
.addNextIntent(new Intent(context, TaskListActivity.class) {{
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;
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;
import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.PixelFormat;
import android.util.DisplayMetrics;
import android.view.Window;
import org.tasks.R;
@ -18,9 +15,6 @@ import static com.todoroo.andlib.utility.AndroidUtilities.preLollipop;
@Singleton
public class ActivityPreferences extends Preferences {
public static final int MIN_TABLET_WIDTH = 550;
public static final int MIN_TABLET_HEIGHT = 800;
private final Activity activity;
@Inject
@ -29,10 +23,6 @@ public class ActivityPreferences extends Preferences {
this.activity = activity;
}
public boolean useTabletLayout() {
return isTabletSized(context);
}
public void applyThemeAndStatusBarColor() {
applyTheme();
applyStatusBarColor();
@ -83,30 +73,4 @@ public class ActivityPreferences extends Preferences {
public boolean isDarkTheme() {
return getBoolean(R.string.p_use_dark_theme, false);
}
/**
* Returns true if the screen is large or xtra large
*/
public static boolean isTabletSized(Context context) {
if (context.getPackageManager().hasSystemFeature("com.google.android.tv")) { //$NON-NLS-1$
return true;
}
int size = context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK;
if (size == Configuration.SCREENLAYOUT_SIZE_XLARGE) {
return true;
} else if (size == Configuration.SCREENLAYOUT_SIZE_LARGE) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
float width = metrics.widthPixels / metrics.density;
float height = metrics.heightPixels / metrics.density;
float effectiveWidth = Math.min(width, height);
float effectiveHeight = Math.max(width, height);
return (effectiveWidth >= MIN_TABLET_WIDTH && effectiveHeight >= MIN_TABLET_HEIGHT);
} else {
return false;
}
}
}

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

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

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

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

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

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

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

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

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

@ -24,11 +24,71 @@
android:orientation="vertical"
android:gravity="center_horizontal" >
<LinearLayout
android:id="@+id/basic_controls"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"/>
<FrameLayout
android:id="@+id/row_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
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: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" />
<FrameLayout
android:id="@+id/tasklist_fragment_container"
android:id="@+id/single_pane"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/asContentBackground" />

Loading…
Cancel
Save