Refactored quick add bar from Task List Fragment out into QuickAddBar. Seems like it works... like a boss!

pull/14/head
Tim Su 12 years ago
parent e8c06cd7d4
commit 3d02188f7d

@ -36,7 +36,6 @@ import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.actfm.sync.ActFmSyncService;
@ -213,7 +212,7 @@ public class TagViewFragment extends TaskListFragment {
}
@Override
protected TagData getActiveTagData() {
public TagData getActiveTagData() {
return tagData;
}
@ -451,16 +450,6 @@ public class TagViewFragment extends TaskListFragment {
getActivity().unregisterReceiver(notifyReceiver);
}
@Override
protected Task quickAddTask(String title, boolean selectNewTask) {
if(!tagData.containsNonNullValue(TagData.NAME) ||
tagData.getValue(TagData.NAME).length() == 0) {
DialogUtilities.okDialog(getActivity(), getString(R.string.tag_no_title_error), null);
return null;
}
return super.quickAddTask(title, selectNewTask);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_SETTINGS && resultCode == Activity.RESULT_OK) {

@ -53,7 +53,6 @@ import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.OAuthLoginActivity;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.helper.TaskEditControlSet;
@ -239,7 +238,7 @@ public class TaskRabbitActivity extends FragmentActivity {
} catch (Exception e) {
// oops, can't serialize
}
model = TaskListFragment.createWithValues(values, null,
model = TaskService.createWithValues(values, null,
taskService, metadataService);
}

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- See the file "LICENSE" for the full license governing this code. -->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:minHeight="50dip"
android:padding="3dip"
android:paddingBottom="0dip"
android:gravity="center_vertical"
android:orientation="horizontal">
<!-- Voice Add Button -->
<ImageButton android:id="@+id/voiceAddButton"
android:layout_width="39dip"
android:layout_height="39dip"
android:layout_gravity="top"
android:layout_marginLeft="5dip"
android:layout_marginRight="3dip"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:layout_weight="1"
android:visibility="gone"
android:background="@android:color/transparent"
android:src="?attr/asMicButtonImg"
android:scaleType="center"/>
<!-- Quick Add Task -->
<EditText android:id="@+id/quickAddText"
android:layout_width="wrap_content"
android:layout_height="39dip"
android:layout_marginRight="8dip"
android:layout_marginLeft="5dip"
android:layout_marginBottom="2dip"
android:layout_weight="100"
android:paddingLeft="5dip"
android:background="@drawable/edit_title_background"
android:hint="@string/TLA_quick_add_hint"
android:textSize="16sp"
android:autoText="true"
android:textColor="@android:color/black"
android:capitalize="sentences"/>
<!-- Extended Add Button -->
<ImageButton android:id="@+id/quickAddButton"
android:layout_width="39dip"
android:layout_height="39dip"
android:layout_gravity="top"
android:layout_marginRight="5dip"
android:layout_weight="1"
android:background="@android:color/transparent"
android:src="?attr/asAddButtonImg"
android:scaleType="center"/>
</LinearLayout>
<LinearLayout
android:id="@+id/taskListQuickaddControlsContainer"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginBottom="5dip"
android:visibility="gone">
<LinearLayout
android:id="@+id/taskListQuickaddControls"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:orientation="horizontal">
<View
android:layout_height="fill_parent"
android:layout_width="1px"
android:background="?attr/asSeparatorBackground"/>
</LinearLayout>
</LinearLayout>
</merge>

@ -21,92 +21,12 @@
<!-- Body goes here -->
<!-- Footer -->
<LinearLayout
<com.todoroo.astrid.ui.QuickAddBar
android:id="@+id/taskListFooter"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
style="@style/Content">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:minHeight="50dip"
android:padding="3dip"
android:paddingBottom="0dip"
android:gravity="center_vertical"
android:orientation="horizontal">
<!-- Voice Add Button -->
<ImageButton android:id="@+id/voiceAddButton"
android:layout_width="39dip"
android:layout_height="39dip"
android:layout_gravity="top"
android:layout_marginLeft="5dip"
android:layout_marginRight="3dip"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:layout_weight="1"
android:visibility="gone"
android:background="@android:color/transparent"
android:src="?attr/asMicButtonImg"
android:scaleType="center"/>
<!-- Quick Add Task -->
<EditText android:id="@+id/quickAddText"
android:layout_width="wrap_content"
android:layout_height="39dip"
android:layout_marginRight="8dip"
android:layout_marginLeft="5dip"
android:layout_marginBottom="2dip"
android:layout_weight="100"
android:paddingLeft="5dip"
android:background="@drawable/edit_title_background"
android:hint="@string/TLA_quick_add_hint"
android:textSize="16sp"
android:autoText="true"
android:textColor="@android:color/black"
android:capitalize="sentences"/>
<!-- Extended Add Button -->
<ImageButton android:id="@+id/quickAddButton"
android:layout_width="39dip"
android:layout_height="39dip"
android:layout_gravity="top"
android:layout_marginRight="5dip"
android:layout_weight="1"
android:background="@android:color/transparent"
android:src="?attr/asAddButtonImg"
android:scaleType="center"/>
</LinearLayout>
<LinearLayout
android:id="@+id/taskListQuickaddControlsContainer"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginBottom="5dip"
android:visibility="gone">
<LinearLayout
android:id="@+id/taskListQuickaddControls"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:orientation="horizontal">
<View
android:layout_height="fill_parent"
android:layout_width="1px"
android:background="?attr/asSeparatorBackground"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
style="@style/Content" />
</LinearLayout>

@ -52,7 +52,7 @@ public final class ShareLinkActivity extends TaskListActivity {
if (!handled) {
Intent callerIntent = getIntent();
Task task = tlf.quickAddTask(subject, false);
Task task = tlf.quickAddBar.quickAddTask(subject, false);
task.setValue(Task.NOTES, callerIntent.getStringExtra(Intent.EXTRA_TEXT));
taskService.save(task);
handled = true;

@ -805,7 +805,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
} catch (Exception e) {
// oops, can't serialize
}
model = TaskListFragment.createWithValues(values, null,
model = TaskService.createWithValues(values, null,
taskService, metadataService);
}

@ -1,8 +1,6 @@
package com.todoroo.astrid.activity;
import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicReference;
@ -11,7 +9,6 @@ import android.app.Activity;
import android.app.AlertDialog;
import android.app.SearchManager;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
@ -21,7 +18,6 @@ import android.content.SharedPreferences.Editor;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.ActionBar;
import android.support.v4.app.Fragment;
@ -38,27 +34,17 @@ import android.view.MenuInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.view.View.OnKeyListener;
import android.view.View.OnLongClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import com.crittercism.NewFeedbackSpringboardActivity;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
@ -67,10 +53,8 @@ import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.ActFmLoginActivity;
import com.todoroo.astrid.actfm.EditPeopleControlSet;
import com.todoroo.astrid.actfm.TagUpdatesActivity;
import com.todoroo.astrid.actfm.TagViewFragment;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
@ -80,23 +64,18 @@ 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.PermaSql;
import com.todoroo.astrid.api.TaskContextActionExposer;
import com.todoroo.astrid.api.TaskDecoration;
import com.todoroo.astrid.core.CoreFilterExposer;
import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gcal.GCalControlSet;
import com.todoroo.astrid.gcal.GCalHelper;
import com.todoroo.astrid.helper.SyncActionHelper;
import com.todoroo.astrid.helper.TaskListContextMenuExtensionLoader;
import com.todoroo.astrid.helper.TaskListContextMenuExtensionLoader.ContextMenuItem;
import com.todoroo.astrid.reminders.ReminderDebugContextActions;
import com.todoroo.astrid.repeats.RepeatControlSet;
import com.todoroo.astrid.service.AddOnService;
import com.todoroo.astrid.service.AstridDependencyInjector;
import com.todoroo.astrid.service.MetadataService;
@ -105,12 +84,10 @@ import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.service.UpgradeService;
import com.todoroo.astrid.ui.DateChangedAlerts;
import com.todoroo.astrid.ui.DeadlineControlSet;
import com.todoroo.astrid.ui.QuickAddBar;
import com.todoroo.astrid.utility.AstridPreferences;
import com.todoroo.astrid.utility.Constants;
import com.todoroo.astrid.utility.Flags;
import com.todoroo.astrid.voice.VoiceInputAssistant;
import com.todoroo.astrid.welcome.HelpInfoPopover;
import com.todoroo.astrid.welcome.tutorial.WelcomeWalkthrough;
import com.todoroo.astrid.widget.TasksWidget;
@ -163,8 +140,6 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
public static final String TOKEN_OVERRIDE_ANIM = "finishAnim"; //$NON-NLS-1$
private static final String QUICK_ADD_MARKUP = "markup"; //$NON-NLS-1$
// --- instance variables
@Autowired
@ -199,28 +174,17 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
protected int sortFlags;
protected int sortSort;
protected boolean overrideFinishAnim;
protected QuickAddBar quickAddBar;
private ImageButton voiceAddButton;
private ImageButton quickAddButton;
private EditText quickAddBox;
private LinearLayout quickAddControls;
private View quickAddControlsContainer;
private Timer backgroundTimer;
private boolean isFilter;
private final TaskListContextMenuExtensionLoader contextMenuExtensionLoader = new TaskListContextMenuExtensionLoader();
private VoiceInputAssistant voiceInputAssistant;
// --- fragment handling variables
protected OnTaskListItemClickedListener mListener;
private boolean mDualFragments = false;
private DeadlineControlSet deadlineControl;
private RepeatControlSet repeatControl;
private GCalControlSet gcalControl;
private EditPeopleControlSet peopleControl;
/*
* ======================================================================
* ======================================================= initialization
@ -353,7 +317,7 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
/**
* @return the current tag you are viewing, or null if you're not viewing a tag
*/
protected TagData getActiveTagData() {
public TagData getActiveTagData() {
return null;
}
@ -392,7 +356,6 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
setUpTaskList();
((AstridActivity) getActivity()).setupActivityFragment(getActiveTagData());
setUpQuickAddControlSets();
contextMenuExtensionLoader.loadInNewThread(getActivity());
}
@ -498,84 +461,22 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
}
});
quickAddBar = (QuickAddBar) getView().findViewById(R.id.taskListFooter);
quickAddBar.initialize(getActivity(), this, mListener);
getListView().setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
quickAddBox.clearFocus();
return false;
}
});
quickAddControls = (LinearLayout) getView().findViewById(R.id.taskListQuickaddControls);
quickAddControlsContainer = getView().findViewById(R.id.taskListQuickaddControlsContainer);
// set listener for pressing enter in quick-add box
quickAddBox = (EditText) getView().findViewById(R.id.quickAddText);
quickAddBox.setOnEditorActionListener(new OnEditorActionListener() {
/**
* When user presses enter, quick-add the task
*/
@Override
public boolean onEditorAction(TextView view, int actionId,
KeyEvent event) {
if (actionId == EditorInfo.IME_NULL
&& !TextUtils.isEmpty(quickAddBox.getText().toString().trim())) {
quickAddTask(quickAddBox.getText().toString(), true);
return true;
}
quickAddBar.clearFocus();
return false;
}
});
quickAddBox.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
quickAddControlsContainer.setVisibility(hasFocus ? View.VISIBLE : View.GONE);
}
});
quickAddButton = ((ImageButton) getView().findViewById(
R.id.quickAddButton));
// set listener for quick add button
quickAddButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Task task = quickAddTask(quickAddBox.getText().toString(), true);
if (task != null && task.getValue(Task.TITLE).length() == 0) {
mListener.onTaskListItemClicked(task.getId());
}
}
});
// prepare and set listener for voice add button
voiceAddButton = (ImageButton) getView().findViewById(
R.id.voiceAddButton);
int prompt = R.string.voice_edit_title_prompt;
if (Preferences.getBoolean(R.string.p_voiceInputCreatesTask, false))
prompt = R.string.voice_create_prompt;
voiceInputAssistant = new VoiceInputAssistant(this,
voiceAddButton, quickAddBox);
voiceInputAssistant.configureMicrophoneButton(prompt);
// set listener for extended addbutton
quickAddButton.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Task task = quickAddTask(quickAddBox.getText().toString(),
false);
if (task == null)
return true;
mListener.onTaskListItemClicked(task.getId());
return true;
}
});
// set listener for astrid icon
((TextView) getView().findViewById(android.R.id.empty)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
quickAddButton.performClick();
quickAddBar.performButtonClick();
}
});
@ -587,52 +488,6 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
getView().findViewById(R.id.progressBar).setVisibility(View.GONE);
}
private void setUpQuickAddControlSets() {
repeatControl = new RepeatControlSet(getActivity(),
R.layout.control_set_repeat,
R.layout.control_set_repeat_display, R.string.repeat_enabled);
gcalControl = new GCalControlSet(getActivity(),
R.layout.control_set_gcal, R.layout.control_set_gcal_display,
R.string.gcal_TEA_addToCalendar_label);
deadlineControl = new DeadlineControlSet(
getActivity(), R.layout.control_set_deadline,
R.layout.control_set_default_display, null,
repeatControl.getDisplayView(), gcalControl.getDisplayView());
deadlineControl.setIsQuickadd(true);
peopleControl = new EditPeopleControlSet(getActivity(), this,
R.layout.control_set_assigned,
R.layout.control_set_default_display,
R.string.actfm_EPA_assign_label, TaskEditFragment.REQUEST_LOG_IN);
resetControlSets();
LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1.0f);
quickAddControls.addView(peopleControl.getDisplayView(), 0, lp);
quickAddControls.addView(deadlineControl.getDisplayView(), 2, lp);
}
private void resetControlSets() {
Task empty = new Task();
TagData tagData = getActiveTagData();
if (tagData != null) {
HashSet<String> tagsTransitory = new HashSet<String>();
tagsTransitory.add(tagData.getValue(TagData.NAME));
empty.putTransitory("tags", tagsTransitory); // TODO MAKE THIS A CONSTANT OR DOCUMENT IT -- tim
}
repeatControl.readFromTask(empty);
gcalControl.readFromTask(empty);
deadlineControl.readFromTask(empty);
peopleControl.setUpData(empty, getActiveTagData());
peopleControl.assignToMe();
peopleControl.setTask(null);
}
// Subclasses can override these to customize extras in quickadd intent
protected Intent getOnClickQuickAddIntent(Task t) {
Intent intent = new Intent(getActivity(), TaskEditActivity.class);
@ -691,13 +546,6 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
super.onResume();
StatisticsService.sessionStart(getActivity());
if (addOnService.hasPowerPack()
&& Preferences.getBoolean(R.string.p_voiceInputEnabled, true)
&& voiceInputAssistant.isVoiceInputAvailable()) {
voiceAddButton.setVisibility(View.VISIBLE);
} else {
voiceAddButton.setVisibility(View.GONE);
}
getActivity().registerReceiver(detailReceiver,
new IntentFilter(AstridApiConstants.BROADCAST_SEND_DETAILS));
@ -823,20 +671,8 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// handle the result of voice recognition, put it into the textfield
if (voiceInputAssistant.handleActivityResult(requestCode, resultCode,
data)) {
// if user wants, create the task directly (with defaultvalues)
// after saying it
Flags.set(Flags.TLA_RESUMED_FROM_VOICE_ADD);
if (Preferences.getBoolean(R.string.p_voiceInputCreatesTask, false))
quickAddTask(quickAddBox.getText().toString(), true);
super.onActivityResult(requestCode, resultCode, data);
// the rest of onActivityResult is totally unrelated to
// voicerecognition, so bail out
if(quickAddBar.onActivityResult(requestCode, resultCode, data))
return;
}
if (requestCode == ACTIVITY_SETTINGS
&& resultCode == EditPreferences.RESULT_CODE_THEME_CHANGED) {
@ -853,12 +689,12 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
if (!Preferences.getBoolean(R.string.p_showed_add_task_help, false)) {
if(!AstridPreferences.canShowPopover())
return;
quickAddBox.postDelayed(new Runnable() {
quickAddBar.getQuickAddBox().postDelayed(new Runnable() {
@Override
public void run() {
Activity activity = getActivity();
if (activity != null) {
HelpInfoPopover.showPopover(getActivity(), quickAddBox,
HelpInfoPopover.showPopover(getActivity(), quickAddBar.getQuickAddBox(),
R.string.help_popover_add_task, null);
Preferences.setBoolean(R.string.p_showed_add_task_help, true);
}
@ -963,6 +799,10 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
loadTaskListContent(true);
}
public Filter getFilter() {
return filter;
}
/**
* Select a custom task id in the list. If it doesn't exist, create a new
* custom filter
@ -970,7 +810,7 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
* @param withCustomId
*/
@SuppressWarnings("nls")
private void selectCustomId(long withCustomId) {
public void selectCustomId(long withCustomId) {
// if already in the list, select it
TodorooCursor<Task> currentCursor = (TodorooCursor<Task>) taskAdapter.getCursor();
for (int i = 0; i < currentCursor.getCount(); i++) {
@ -1015,18 +855,16 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
return;
if (!Preferences.getBoolean(R.string.p_showed_add_task_help, false)) {
Preferences.setBoolean(R.string.p_showed_add_task_help, true);
HelpInfoPopover.showPopover(getActivity(), quickAddBox,
HelpInfoPopover.showPopover(getActivity(), quickAddBar.getQuickAddBox(),
R.string.help_popover_add_task, null);
}
}
private void showTaskEditHelpPopover() {
public void showTaskEditHelpPopover() {
if(!AstridPreferences.canShowPopover())
return;
if (!Preferences.getBoolean(R.string.p_showed_tap_task_help, false)) {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(quickAddBox.getWindowToken(), 0);
quickAddBar.hideKeyboard();
getListView().postDelayed(new Runnable() {
public void run() {
try {
@ -1089,138 +927,6 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
StatisticsService.reportEvent(StatisticsConstants.TASK_COMPLETED_FILTER);
}
/**
* Quick-add a new task
*
* @param title
* @return
*/
@SuppressWarnings("nls")
protected Task quickAddTask(String title, boolean selectNewTask) {
try {
if (title != null)
title = title.trim();
if (!peopleControl.willBeAssignedToMe() && !actFmPreferenceService.isLoggedIn()) {
DialogInterface.OnClickListener okListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int which) {
startActivity(new Intent(getActivity(), ActFmLoginActivity.class));
}
};
DialogInterface.OnClickListener cancelListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int which) {
// Reset people control
peopleControl.assignToMe();
}
};
DialogUtilities.okCancelCustomDialog(getActivity(), getActivity().getString(R.string.actfm_EPA_login_button),
getActivity().getString(R.string.actfm_EPA_login_to_share), R.string.actfm_EPA_login_button,
R.string.actfm_EPA_dont_share_button, android.R.drawable.ic_dialog_alert,
okListener, cancelListener);
return null;
}
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
Flags.set(Flags.GTASKS_SUPPRESS_SYNC);
Task task = createWithValues(filter.valuesForNewTasks, title,
taskService, metadataService);
if (repeatControl.isRecurrenceSet())
repeatControl.writeToModel(task);
if (deadlineControl.isDeadlineSet())
deadlineControl.writeToModel(task);
gcalControl.writeToModel(task);
peopleControl.setTask(task);
peopleControl.saveSharingSettings(null);
taskService.save(task);
resetControlSets();
boolean gcalCreateEventEnabled = Preferences.getStringValue(R.string.gcal_p_default) != null
&& !Preferences.getStringValue(R.string.gcal_p_default).equals(
"-1");
if (title.length() > 0 && gcalCreateEventEnabled) {
Uri calendarUri = GCalHelper.createTaskEvent(task,
getActivity().getContentResolver(), new ContentValues());
task.setValue(Task.CALENDAR_URI, calendarUri.toString());
taskService.save(task);
}
if(title.length() > 0)
showTaskEditHelpPopover();
TextView quickAdd = (TextView) getView().findViewById(
R.id.quickAddText);
quickAdd.setText(""); //$NON-NLS-1$
if (selectNewTask) {
loadTaskListContent(true);
selectCustomId(task.getId());
if (task.getTransitory(QUICK_ADD_MARKUP) != null) {
showAlertForMarkupTask((AstridActivity) getActivity(), task, title);
}
}
StatisticsService.reportEvent(StatisticsConstants.TASK_CREATED_TASKLIST);
return task;
} catch (Exception e) {
exceptionService.displayAndReportError(getActivity(),
"quick-add-task", e);
return new Task();
}
}
/**
* Create task from the given content values, saving it.
*
* @param values
* @param title
* @param taskService
* @param metadataService
* @return
*/
public static Task createWithValues(ContentValues values, String title,
TaskService taskService, MetadataService metadataService) {
Task task = new Task();
if (title != null)
task.setValue(Task.TITLE, title);
ContentValues forMetadata = null;
if (values != null && values.size() > 0) {
ContentValues forTask = new ContentValues();
forMetadata = new ContentValues();
outer: for (Entry<String, Object> item : values.valueSet()) {
String key = item.getKey();
Object value = item.getValue();
if (value instanceof String)
value = PermaSql.replacePlaceholders((String) value);
for (Property<?> property : Metadata.PROPERTIES)
if (property.name.equals(key)) {
AndroidUtilities.putInto(forMetadata, key, value);
continue outer;
}
AndroidUtilities.putInto(forTask, key, value);
}
task.mergeWith(forTask);
}
boolean markup = taskService.quickAdd(task);
if (markup)
task.putTransitory(QUICK_ADD_MARKUP, true);
if (forMetadata != null && forMetadata.size() > 0) {
Metadata metadata = new Metadata();
metadata.setValue(Metadata.TASK, task.getId());
metadata.mergeWith(forMetadata);
metadataService.save(metadata);
}
return task;
}
/**
* Comments button in action bar was clicked
*/
@ -1231,10 +937,6 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
AndroidUtilities.callOverridePendingTransition(getActivity(), R.anim.slide_left_in, R.anim.slide_left_out);
}
private static void showAlertForMarkupTask(AstridActivity activity, Task task, String originalText) {
DateChangedAlerts.showQuickAddMarkupDialog(activity, task, originalText);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {

@ -1,6 +1,7 @@
package com.todoroo.astrid.service;
import java.util.ArrayList;
import java.util.Map.Entry;
import org.weloveastrid.rmilk.data.MilkTaskFields;
@ -14,6 +15,7 @@ import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.PermaSql;
@ -40,6 +42,8 @@ import com.todoroo.astrid.utility.TitleParser;
*/
public class TaskService {
public static final String TRANS_QUICK_ADD_MARKUP = "markup"; //$NON-NLS-1$
@Autowired
private TaskDao taskDao;
@ -388,4 +392,54 @@ public class TaskService {
return clone.getId();
}
/**
* Create task from the given content values, saving it.
*
* @param values
* @param title
* @param taskService
* @param metadataService
* @return
*/
public static Task createWithValues(ContentValues values, String title,
TaskService taskService, MetadataService metadataService) {
Task task = new Task();
if (title != null)
task.setValue(Task.TITLE, title);
ContentValues forMetadata = null;
if (values != null && values.size() > 0) {
ContentValues forTask = new ContentValues();
forMetadata = new ContentValues();
outer: for (Entry<String, Object> item : values.valueSet()) {
String key = item.getKey();
Object value = item.getValue();
if (value instanceof String)
value = PermaSql.replacePlaceholders((String) value);
for (Property<?> property : Metadata.PROPERTIES)
if (property.name.equals(key)) {
AndroidUtilities.putInto(forMetadata, key, value);
continue outer;
}
AndroidUtilities.putInto(forTask, key, value);
}
task.mergeWith(forTask);
}
boolean markup = taskService.quickAdd(task);
if (markup)
task.putTransitory(TRANS_QUICK_ADD_MARKUP, true);
if (forMetadata != null && forMetadata.size() > 0) {
Metadata metadata = new Metadata();
metadata.setValue(Metadata.TASK, task.getId());
metadata.mergeWith(forMetadata);
metadataService.save(metadata);
}
return task;
}
}

@ -0,0 +1,361 @@
package com.todoroo.astrid.ui;
import java.util.HashSet;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import com.timsu.astrid.R;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.ActFmLoginActivity;
import com.todoroo.astrid.actfm.EditPeopleControlSet;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.activity.AstridActivity;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.activity.TaskListFragment.OnTaskListItemClickedListener;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gcal.GCalControlSet;
import com.todoroo.astrid.gcal.GCalHelper;
import com.todoroo.astrid.repeats.RepeatControlSet;
import com.todoroo.astrid.service.AddOnService;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.StatisticsConstants;
import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.utility.Flags;
import com.todoroo.astrid.voice.VoiceInputAssistant;
/**
* Quick Add Bar lets you add tasks.
*
* @author Tim Su <tim@astrid.com>
*
*/
public class QuickAddBar extends LinearLayout {
private static final String TRANS_TAGS = "tags"; //$NON-NLS-1$
private ImageButton voiceAddButton;
private ImageButton quickAddButton;
private EditText quickAddBox;
private LinearLayout quickAddControls;
private View quickAddControlsContainer;
private DeadlineControlSet deadlineControl;
private RepeatControlSet repeatControl;
private GCalControlSet gcalControl;
private EditPeopleControlSet peopleControl;
@Autowired AddOnService addOnService;
@Autowired ExceptionService exceptionService;
@Autowired TaskService taskService;
@Autowired MetadataService metadataService;
@Autowired ActFmPreferenceService actFmPreferenceService;
private VoiceInputAssistant voiceInputAssistant;
private Activity activity;
private TaskListFragment fragment;
public QuickAddBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public QuickAddBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
public QuickAddBar(Context context) {
super(context);
}
public void initialize(Activity myActivity, TaskListFragment myFragment,
final OnTaskListItemClickedListener mListener) {
activity = myActivity;
fragment = myFragment;
DependencyInjectionService.getInstance().inject(this);
LayoutInflater.from(activity).inflate(R.layout.quick_add_bar, this);
quickAddControls = (LinearLayout) findViewById(R.id.taskListQuickaddControls);
quickAddControlsContainer = findViewById(R.id.taskListQuickaddControlsContainer);
// set listener for pressing enter in quick-add box
quickAddBox = (EditText) findViewById(R.id.quickAddText);
quickAddBox.setOnEditorActionListener(new OnEditorActionListener() {
/**
* When user presses enter, quick-add the task
*/
@Override
public boolean onEditorAction(TextView view, int actionId,
KeyEvent event) {
if (actionId == EditorInfo.IME_NULL
&& !TextUtils.isEmpty(quickAddBox.getText().toString().trim())) {
quickAddTask(quickAddBox.getText().toString(), true);
return true;
}
return false;
}
});
quickAddBox.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
quickAddControlsContainer.setVisibility(hasFocus ? View.VISIBLE : View.GONE);
}
});
quickAddButton = ((ImageButton) findViewById(
R.id.quickAddButton));
// set listener for quick add button
quickAddButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Task task = quickAddTask(quickAddBox.getText().toString(), true);
if (task != null && task.getValue(Task.TITLE).length() == 0) {
mListener.onTaskListItemClicked(task.getId());
}
}
});
// prepare and set listener for voice add button
voiceAddButton = (ImageButton) findViewById(
R.id.voiceAddButton);
int prompt = R.string.voice_edit_title_prompt;
if (Preferences.getBoolean(R.string.p_voiceInputCreatesTask, false))
prompt = R.string.voice_create_prompt;
voiceInputAssistant = new VoiceInputAssistant(activity,
voiceAddButton, quickAddBox);
voiceInputAssistant.configureMicrophoneButton(prompt);
// set listener for extended addbutton
quickAddButton.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Task task = quickAddTask(quickAddBox.getText().toString(),
false);
if (task == null)
return true;
mListener.onTaskListItemClicked(task.getId());
return true;
}
});
if (addOnService.hasPowerPack()
&& Preferences.getBoolean(R.string.p_voiceInputEnabled, true)
&& voiceInputAssistant.isVoiceInputAvailable()) {
voiceAddButton.setVisibility(View.VISIBLE);
} else {
voiceAddButton.setVisibility(View.GONE);
}
setUpQuickAddControlSets();
}
private void setUpQuickAddControlSets() {
repeatControl = new RepeatControlSet(activity,
R.layout.control_set_repeat,
R.layout.control_set_repeat_display, R.string.repeat_enabled);
gcalControl = new GCalControlSet(activity,
R.layout.control_set_gcal, R.layout.control_set_gcal_display,
R.string.gcal_TEA_addToCalendar_label);
deadlineControl = new DeadlineControlSet(activity,
R.layout.control_set_deadline,
R.layout.control_set_default_display, null,
repeatControl.getDisplayView(), gcalControl.getDisplayView());
deadlineControl.setIsQuickadd(true);
peopleControl = new EditPeopleControlSet(activity, fragment,
R.layout.control_set_assigned,
R.layout.control_set_default_display,
R.string.actfm_EPA_assign_label,
TaskEditFragment.REQUEST_LOG_IN);
resetControlSets();
LayoutParams lp = new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1.0f);
quickAddControls.addView(peopleControl.getDisplayView(), 0, lp);
quickAddControls.addView(deadlineControl.getDisplayView(), 2, lp);
}
private void resetControlSets() {
Task empty = new Task();
TagData tagData = fragment.getActiveTagData();
if (tagData != null) {
HashSet<String> tagsTransitory = new HashSet<String>();
tagsTransitory.add(tagData.getValue(TagData.NAME));
empty.putTransitory(TRANS_TAGS, tagsTransitory);
}
repeatControl.readFromTask(empty);
gcalControl.readFromTask(empty);
deadlineControl.readFromTask(empty);
peopleControl.setUpData(empty, fragment.getActiveTagData());
peopleControl.assignToMe();
peopleControl.setTask(null);
}
// --- quick add task logic
/**
* Quick-add a new task
*
* @param title
* @return
*/
@SuppressWarnings("nls")
public Task quickAddTask(String title, boolean selectNewTask) {
TagData tagData = fragment.getActiveTagData();
if(tagData != null && (!tagData.containsNonNullValue(TagData.NAME) ||
tagData.getValue(TagData.NAME).length() == 0)) {
DialogUtilities.okDialog(activity, activity.getString(R.string.tag_no_title_error), null);
return null;
}
try {
if (title != null)
title = title.trim();
if (!peopleControl.willBeAssignedToMe() && !actFmPreferenceService.isLoggedIn()) {
DialogInterface.OnClickListener okListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int which) {
activity.startActivity(new Intent(activity, ActFmLoginActivity.class));
}
};
DialogInterface.OnClickListener cancelListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int which) {
// Reset people control
peopleControl.assignToMe();
}
};
DialogUtilities.okCancelCustomDialog(activity, activity.getString(R.string.actfm_EPA_login_button),
activity.getString(R.string.actfm_EPA_login_to_share), R.string.actfm_EPA_login_button,
R.string.actfm_EPA_dont_share_button, android.R.drawable.ic_dialog_alert,
okListener, cancelListener);
return null;
}
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
Flags.set(Flags.GTASKS_SUPPRESS_SYNC);
Task task = TaskService.createWithValues(fragment.getFilter().valuesForNewTasks, title,
taskService, metadataService);
if (repeatControl.isRecurrenceSet())
repeatControl.writeToModel(task);
if (deadlineControl.isDeadlineSet())
deadlineControl.writeToModel(task);
gcalControl.writeToModel(task);
peopleControl.setTask(task);
peopleControl.saveSharingSettings(null);
taskService.save(task);
resetControlSets();
boolean gcalCreateEventEnabled = Preferences.getStringValue(R.string.gcal_p_default) != null
&& !Preferences.getStringValue(R.string.gcal_p_default).equals(
"-1");
if (title.length() > 0 && gcalCreateEventEnabled) {
Uri calendarUri = GCalHelper.createTaskEvent(task,
activity.getContentResolver(), new ContentValues());
task.setValue(Task.CALENDAR_URI, calendarUri.toString());
taskService.save(task);
}
if(title.length() > 0)
fragment.showTaskEditHelpPopover();
TextView quickAdd = (TextView) findViewById(R.id.quickAddText);
quickAdd.setText(""); //$NON-NLS-1$
if (selectNewTask) {
fragment.loadTaskListContent(true);
fragment.selectCustomId(task.getId());
if (task.getTransitory(TaskService.TRANS_QUICK_ADD_MARKUP) != null) {
showAlertForMarkupTask((AstridActivity) activity, task, title);
}
}
StatisticsService.reportEvent(StatisticsConstants.TASK_CREATED_TASKLIST);
return task;
} catch (Exception e) {
exceptionService.displayAndReportError(activity,
"quick-add-task", e);
return new Task();
}
}
private static void showAlertForMarkupTask(AstridActivity activity, Task task, String originalText) {
DateChangedAlerts.showQuickAddMarkupDialog(activity, task, originalText);
}
// --- instance methods
public EditText getQuickAddBox() {
return quickAddBox;
}
@Override
public void clearFocus() {
super.clearFocus();
quickAddBox.clearFocus();
}
public void performButtonClick() {
quickAddButton.performClick();
}
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
// handle the result of voice recognition, put it into the textfield
if (voiceInputAssistant.handleActivityResult(requestCode, resultCode,
data)) {
// if user wants, create the task directly (with defaultvalues)
// after saying it
Flags.set(Flags.TLA_RESUMED_FROM_VOICE_ADD);
if (Preferences.getBoolean(R.string.p_voiceInputCreatesTask, false))
quickAddTask(quickAddBox.getText().toString(), true);
// the rest of onActivityResult is totally unrelated to
// voicerecognition, so bail out
return true;
}
return false;
}
public void hideKeyboard() {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(quickAddBox.getWindowToken(), 0);
}
}

@ -25,7 +25,6 @@ import android.view.View;
import android.view.View.MeasureSpec;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
@ -33,8 +32,6 @@ import android.widget.FrameLayout;
import android.widget.HorizontalScrollView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.LinearLayout;
import com.cyrilmottier.android.greendroid.R;
@ -45,7 +42,7 @@ import com.cyrilmottier.android.greendroid.R;
* replacement for the long click UI pattern. For instance,
* {@link QuickActionBar} adds secondary actions to an item of a
* {@link ListView}.
*
*
* @author Benjamin Fellous
* @author Cyril Mottier
*/
@ -86,7 +83,7 @@ public class QuickActionBar extends QuickActionWidget {
@Override
protected void onMeasureAndLayout(Rect anchorRect, View contentView) {
contentView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
contentView.measure(MeasureSpec.makeMeasureSpec(getScreenWidth(), MeasureSpec.EXACTLY),
ViewGroup.LayoutParams.WRAP_CONTENT);

Loading…
Cancel
Save