Dual toolbars

pull/384/head
Alex Baker 10 years ago
parent 3e998c3115
commit 607cb2afdb

@ -68,9 +68,6 @@ public class GtasksListFragment extends SubtasksListFragment {
@Override
protected void initiateAutomaticSyncImpl() {
if (!isCurrentTaskListFragment()) {
return;
}
if (list != null && syncThrottle.canSync(list.getId())) {
refreshData(false);
}
@ -95,13 +92,13 @@ public class GtasksListFragment extends SubtasksListFragment {
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
public boolean onMenuItemClick(MenuItem item) {
switch(item.getItemId()) {
case R.id.menu_clear_completed:
clearCompletedTasks();
return true;
default:
return super.onOptionsItemSelected(item);
return super.onMenuItemClick(item);
}
}

@ -80,9 +80,6 @@ public class TagViewFragment extends TaskListFragment {
@Override
protected void initiateAutomaticSyncImpl() {
if (!isCurrentTaskListFragment()) {
return;
}
if (tagData != null) {
long lastAutosync = tagData.getLastAutosync();
if(DateUtilities.now() - lastAutosync > AUTOSYNC_INTERVAL) {

@ -9,13 +9,15 @@ import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.MeasureSpec;
@ -70,7 +72,7 @@ import static android.app.Activity.RESULT_OK;
* @author timsu
*
*/
public final class TaskEditFragment extends InjectingFragment implements EditNoteActivity.UpdatesChangedListener {
public final class TaskEditFragment extends InjectingFragment implements EditNoteActivity.UpdatesChangedListener, Toolbar.OnMenuItemClickListener {
public interface TaskEditFragmentCallbackHandler {
void taskEditFinished();
@ -108,10 +110,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;
// --- services
public static final int TAB_VIEW_UPDATES = 0;
@Inject TaskService taskService;
@Inject MetadataDao metadataDao;
@Inject UserActivityDao userActivityDao;
@ -130,6 +128,7 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
@Bind(R.id.updatesFooter) View commentsBar;
@Bind(R.id.edit_scroll) ScrollView scrollView;
@Bind(R.id.commentField) EditText commentField;
@Bind(R.id.toolbar) Toolbar toolbar;
public static final int[] rowIds = new int[] {
R.id.row_1,
@ -193,9 +192,25 @@ 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_fragment, container, false);
View view = inflater.inflate(R.layout.fragment_task_edit, container, false);
ButterKnife.bind(this, view);
Drawable drawable = DrawableCompat.wrap(getResources().getDrawable(R.drawable.ic_save_24dp));
DrawableCompat.setTint(drawable, getResources().getColor(android.R.color.white));
toolbar.setNavigationIcon(drawable);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
save();
}
});
toolbar.inflateMenu(R.menu.task_edit_fragment);
Menu menu = toolbar.getMenu();
for (int i = 0 ; i < menu.size() ; i++) {
MenuColorizer.colorMenuItem(menu.getItem(i), getResources().getColor(android.R.color.white));
}
toolbar.setOnMenuItemClickListener(this);
notificationManager.cancel(model.getId());
if (!showEditComments) {
@ -206,13 +221,26 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
}
@Override
public boolean onMenuItemClick(MenuItem item) {
hideKeyboard();
switch (item.getItemId()) {
case R.id.menu_record_note:
startRecordingAudio();
return true;
case R.id.menu_delete:
deleteButtonClick();
return true;
}
return false;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// We have a menu item to show in action bar.
setHasOptionsMenu(true);
// Load task data in background
new TaskEditBackgroundLoader().start();
}
@ -229,12 +257,6 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
}
private void loadMoreContainer() {
int tabStyle = TaskEditViewPager.TAB_SHOW_ACTIVITY;
if (!showEditComments) {
tabStyle &= ~TaskEditViewPager.TAB_SHOW_ACTIVITY;
}
if (editNotes == null) {
instantiateEditNotes();
} else {
@ -249,16 +271,16 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
editNotes.addListener(this);
}
if (tabStyle == 0) {
if (!showEditComments) {
return;
}
TaskEditViewPager adapter = new TaskEditViewPager(getActivity(), tabStyle);
TaskEditViewPager adapter = new TaskEditViewPager();
adapter.parent = this;
mPager.setAdapter(adapter);
setCurrentTab(TAB_VIEW_UPDATES);
setCurrentTab(0);
setPagerHeightForPosition();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@ -444,40 +466,6 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
startActivityForResult(recordAudio, REQUEST_CODE_RECORD);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
hideKeyboard();
switch (item.getItemId()) {
case R.id.menu_save:
save();
return true;
case R.id.menu_record_note:
startRecordingAudio();
return true;
case R.id.menu_delete:
deleteButtonClick();
return true;
case android.R.id.home:
save();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.task_edit_fragment, menu);
for (int i = 0 ; i < menu.size() ; i++) {
MenuColorizer.colorMenuItem(menu.getItem(i), getResources().getColor(android.R.color.white));
}
if (getResources().getBoolean(R.bool.two_pane_layout)) {
menu.findItem(R.id.menu_save).setVisible(true);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (editNotes == null) {
@ -538,7 +526,7 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
// EditNoteActivity Listener when there are new updates/comments
@Override
public void updatesChanged() {
if (mPager != null && mPager.getCurrentItem() == TAB_VIEW_UPDATES) {
if (mPager != null) {
setPagerHeightForPosition();
}
}
@ -546,7 +534,6 @@ public final class TaskEditFragment extends InjectingFragment implements EditNot
// EditNoteActivity Lisener when there are new updates/comments
@Override
public void commentAdded() {
setCurrentTab(TAB_VIEW_UPDATES);
setPagerHeightForPosition();
scrollToView(editNotes);
}

@ -5,35 +5,18 @@
*/
package com.todoroo.astrid.activity;
import android.content.Context;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import org.tasks.R;
import java.util.ArrayList;
public class TaskEditViewPager extends PagerAdapter {
private final String[] titles;
public TaskEditFragment parent;
public static final int TAB_SHOW_ACTIVITY = 1;
public TaskEditViewPager(Context context, int tabStyleMask) {
ArrayList<String> titleList = new ArrayList<>();
if ((tabStyleMask & TAB_SHOW_ACTIVITY) > 0) {
titleList.add(context.getString(R.string.TEA_tab_activity));
}
titles = titleList.toArray(new String[titleList.size()]);
}
@Override
public int getCount() {
return titles.length;
return 1;
}
@Override

@ -11,65 +11,40 @@ 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.v4.graphics.drawable.DrawableCompat;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
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.astrid.actfm.FilterSettingsActivity;
import com.todoroo.astrid.actfm.TagSettingsActivity;
import com.todoroo.astrid.actfm.TagViewFragment;
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.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.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.injection.InjectingAppCompatActivity;
import org.tasks.preferences.ActivityPreferences;
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.EmptyTaskEditFragment;
import org.tasks.ui.NavigationDrawerFragment;
import org.tasks.ui.PriorityControlSet;
import org.tasks.ui.TaskEditControlFragment;
@ -81,36 +56,25 @@ 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 InjectingAppCompatActivity implements
OnFilterItemClickedListener,
TaskListFragment.OnTaskListItemClickedListener,
TaskListFragment.TaskListFragmentCallbackHandler,
PriorityControlSet.OnPriorityChanged,
TimerControlSet.TimerControlSetCallback,
RepeatControlSet.RepeatChangedListener,
TaskEditFragment.TaskEditFragmentCallbackHandler {
@Inject TagDataDao tagDataDao;
@Inject ActivityPreferences preferences;
@Inject VoiceInputAssistant voiceInputAssistant;
@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<>();
@ -132,23 +96,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
startupService.onStartupApplication(this);
preferences.applyTheme();
setContentView(R.layout.task_list_wrapper);
ButterKnife.bind(this);
setSupportActionBar(toolbar);
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.save();
}
}
});
setContentView(R.layout.task_list_activity);
navigationDrawer = getNavigationDrawerFragment();
DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
@ -224,14 +172,18 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
loadTaskListFragment(true, taskListFragment);
if (isDoublePaneLayout()) {
getFragmentManager().beginTransaction()
.replace(R.id.detail_dual, new EmptyTaskEditFragment())
.commit();
}
if (taskEditFragment != null) {
loadTaskEditFragment(true, taskEditFragment, taskEditControlFragments);
}
}
private void loadTaskListFragment(boolean onCreate, TaskListFragment taskListFragment) {
Filter filter = taskListFragment.getFilter();
getSupportActionBar().setTitle(filter.listingTitle);
FragmentManager fragmentManager = getFragmentManager();
if (onCreate) {
fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
@ -245,9 +197,6 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
}
private void loadTaskEditFragment(boolean onCreate, TaskEditFragment taskEditFragment, List<TaskEditControlFragment> taskEditControlFragments) {
if (isSinglePaneLayout()) {
updateToolbar(R.drawable.ic_save_24dp, false);
}
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(isDoublePaneLayout() ? R.id.detail_dual : R.id.single_pane, taskEditFragment, TaskEditFragment.TAG_TASKEDIT_FRAGMENT)
@ -289,74 +238,6 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
AndroidUtilities.tryUnregisterReceiver(this, repeatConfirmationReceiver);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.task_list_activity, menu);
MenuColorizer.colorMenu(this, menu, getResources().getColor(android.R.color.white));
TaskListFragment tlf = getTaskListFragment();
MenuItem hidden = menu.findItem(R.id.menu_show_hidden);
if (preferences.getBoolean(R.string.p_show_hidden_tasks, false)) {
hidden.setChecked(true);
}
MenuItem completed = menu.findItem(R.id.menu_show_completed);
if (preferences.getBoolean(R.string.p_show_completed_tasks, false)) {
completed.setChecked(true);
}
if (tlf instanceof GtasksListFragment) {
menu.findItem(R.id.menu_clear_completed).setVisible(true);
menu.findItem(R.id.menu_sort).setVisible(false);
completed.setChecked(true);
completed.setEnabled(false);
} else if(tlf instanceof TagViewFragment) {
menu.findItem(R.id.menu_tag_settings).setVisible(true);
} else if (tlf != null) {
Filter filter = tlf.getFilter();
if(filter != null && filter instanceof CustomFilter && ((CustomFilter) filter).getId() > 0) {
menu.findItem(R.id.menu_filter_settings).setVisible(true);
}
}
if (tlf instanceof SubtasksTagListFragment || tlf instanceof SubtasksListFragment) {
hidden.setChecked(true);
hidden.setEnabled(false);
}
menu.findItem(R.id.menu_voice_add).setVisible(voiceInputAvailable(this));
final MenuItem item = menu.findItem(R.id.menu_search);
final SearchView actionView = (SearchView) MenuItemCompat.getActionView(item);
actionView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
query = query.trim();
String title = getString(R.string.FLA_search_filter, query);
Filter savedFilter = new Filter(title,
new QueryTemplate().where
(Criterion.or(Task.NOTES.
like(
"%" + //$NON-NLS-1$
query + "%"
),
Task.TITLE.
like(
"%" + //$NON-NLS-1$
query + "%"
)
)
), null);
onFilterItemClicked(savedFilter);
MenuItemCompat.collapseActionView(item);
return true;
}
@Override
public boolean onQueryTextChange(String query) {
return false;
}
});
return true;
}
protected Filter getDefaultFilter() {
return BuiltInFilterExposer.getMyTasksFilter(getResources());
}
@ -477,6 +358,12 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
loadTaskEditFragment(false, taskEditFragment, taskEditControlFragments);
}
@Override
public void onNavigationIconClicked() {
hideKeyboard();
navigationDrawer.openDrawer();
}
private void registerFragment(int resId) {
controlSetFragments.put(getString(resId), resId);
}
@ -531,21 +418,6 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Callback<String> quickAddTask = new Callback<String>() {
@Override
public void apply(String title) {
TaskListFragment taskListFragment = getTaskListFragment();
Task task = taskListFragment.addTask(title);
taskCreator.addToCalendar(task);
onTaskListItemClicked(task.getId());
taskListFragment.loadTaskListContent();
taskListFragment.onTaskCreated(task.getId(), task.getUUID());
}
};
if (voiceInputAssistant.handleActivityResult(requestCode, resultCode, data, quickAddTask)) {
return;
}
if ((requestCode == NavigationDrawerFragment.REQUEST_NEW_LIST ||
requestCode == TaskListFragment.ACTIVITY_REQUEST_NEW_FILTER) &&
resultCode == Activity.RESULT_OK) {
@ -560,59 +432,6 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
}
navigationDrawer.refresh();
} else if (requestCode == REQUEST_EDIT_TAG) {
if (resultCode == RESULT_OK) {
String action = data.getAction();
String uuid = data.getStringExtra(TagViewFragment.EXTRA_TAG_UUID);
TaskListFragment tlf = getTaskListFragment();
if (AstridApiConstants.BROADCAST_EVENT_TAG_RENAMED.equals(action)) {
if (tlf != null) {
TagData td = tlf.getActiveTagData();
if (td != null && td.getUuid().equals(uuid)) {
td = tagDataDao.fetch(uuid, TagData.PROPERTIES);
if (td != null) {
Filter filter = TagFilterExposer.filterFromTagData(this, td);
onFilterItemClicked(filter);
}
} else {
tlf.refresh();
}
}
} else if (AstridApiConstants.BROADCAST_EVENT_TAG_DELETED.equals(action)) {
if (tlf != null) {
TagData tagData = tlf.getActiveTagData();
String activeUuid = RemoteModel.NO_UUID;
if (tagData != null) {
activeUuid = tagData.getUuid();
}
if (activeUuid.equals(uuid)) {
onFilterItemClicked(BuiltInFilterExposer.getMyTasksFilter(getResources()));
navigationDrawer.clear(); // Should auto refresh
} else {
tlf.refresh();
}
}
}
navigationDrawer.refresh();
}
} else if (requestCode == REQUEST_EDIT_FILTER) {
if (resultCode == RESULT_OK) {
String action = data.getAction();
if (AstridApiConstants.BROADCAST_EVENT_FILTER_RENAMED.equals(action)) {
CustomFilter customFilter = data.getParcelableExtra(FilterSettingsActivity.TOKEN_FILTER);
onFilterItemClicked(customFilter);
} else if(AstridApiConstants.BROADCAST_EVENT_FILTER_DELETED.equals(action)) {
onFilterItemClicked(BuiltInFilterExposer.getMyTasksFilter(getResources()));
}
navigationDrawer.refresh();
}
} else if (requestCode == REQUEST_SORT) {
if (resultCode == RESULT_OK) {
TasksWidget.updateWidgets(this);
onFilterItemClicked(getTaskListFragment().getFilter());
}
} else if (requestCode == REQUEST_UPGRADE) {
if (resultCode == RESULT_OK) {
if (data != null && data.getBooleanExtra(UpgradeActivity.EXTRA_RESTART, false)) {
@ -626,6 +445,14 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
}
}
public void refreshNavigationDrawer() {
navigationDrawer.refresh();
}
public void clearNavigationDrawer() {
navigationDrawer.clear();
}
protected void tagsChanged() {
tagsChanged(false);
}
@ -642,44 +469,6 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
navigationDrawer.refreshFilterCount();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
final TaskListFragment tlf = getTaskListFragment();
switch(item.getItemId()) {
case R.id.menu_voice_add:
voiceInputAssistant.startVoiceRecognitionActivity(R.string.voice_create_prompt);
return true;
case R.id.menu_sort:
startActivityForResult(new Intent(this, SortActivity.class) {{
putExtra(SortActivity.EXTRA_MANUAL_ENABLED, tlf.hasDraggableOption());
}}, REQUEST_SORT);
return true;
case R.id.menu_tag_settings:
startActivityForResult(new Intent(this, TagSettingsActivity.class) {{
putExtra(TagSettingsActivity.EXTRA_TAG_DATA, getTaskListFragment().getActiveTagData());
}}, REQUEST_EDIT_TAG);
return true;
case R.id.menu_show_hidden:
item.setChecked(!item.isChecked());
preferences.setBoolean(R.string.p_show_hidden_tasks, item.isChecked());
tlf.reconstructCursor();
TasksWidget.updateWidgets(this);
return true;
case R.id.menu_show_completed:
item.setChecked(!item.isChecked());
preferences.setBoolean(R.string.p_show_completed_tasks, item.isChecked());
tlf.reconstructCursor();
TasksWidget.updateWidgets(this);
return true;
case R.id.menu_filter_settings:
startActivityForResult(new Intent(this, FilterSettingsActivity.class) {{
putExtra(FilterSettingsActivity.TOKEN_FILTER, tlf.getFilter());
}}, REQUEST_EDIT_FILTER);
default:
return super.onOptionsItemSelected(item);
}
}
public TaskListFragment getTaskListFragment() {
return (TaskListFragment) getFragmentManager()
.findFragmentByTag(TaskListFragment.TAG_TASKLIST_FRAGMENT);
@ -690,17 +479,6 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
.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) {
Bundle extras;
if(filter instanceof FilterWithCustomIntent) {
@ -781,9 +559,6 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
@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();
}

@ -11,11 +11,15 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
@ -24,7 +28,6 @@ import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
@ -32,47 +35,68 @@ import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import com.todoroo.andlib.data.Callback;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Field;
import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.actfm.FilterSettingsActivity;
import com.todoroo.astrid.actfm.TagSettingsActivity;
import com.todoroo.astrid.actfm.TagViewFragment;
import com.todoroo.astrid.adapter.TaskAdapter;
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.CustomFilter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.core.BuiltInFilterExposer;
import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.dao.TaskAttachmentDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskAttachment;
import com.todoroo.astrid.gtasks.GtasksListFragment;
import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.helper.SyncActionHelper;
import com.todoroo.astrid.service.TaskCreator;
import com.todoroo.astrid.service.TaskDeleter;
import com.todoroo.astrid.service.TaskDuplicator;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.subtasks.SubtasksListFragment;
import com.todoroo.astrid.subtasks.SubtasksTagListFragment;
import com.todoroo.astrid.tags.TagFilterExposer;
import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.timers.TimerPlugin;
import com.todoroo.astrid.voice.VoiceInputAssistant;
import com.todoroo.astrid.widget.TasksWidget;
import org.tasks.R;
import org.tasks.activities.SortActivity;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.ForActivity;
import org.tasks.injection.InjectingListFragment;
import org.tasks.notifications.NotificationManager;
import org.tasks.preferences.ActivityPreferences;
import org.tasks.ui.CheckBoxes;
import org.tasks.ui.MenuColorizer;
import java.util.concurrent.atomic.AtomicReference;
import javax.inject.Inject;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import timber.log.Timber;
import static com.todoroo.astrid.voice.VoiceInputAssistant.voiceInputAvailable;
/**
* Primary activity for the Bente application. Shows a list of upcoming tasks
* and a user's coaches.
@ -80,17 +104,21 @@ import timber.log.Timber;
* @author Tim Su <tim@todoroo.com>
*
*/
public class TaskListFragment extends InjectingListFragment implements SwipeRefreshLayout.OnRefreshListener {
public class TaskListFragment extends InjectingListFragment implements SwipeRefreshLayout.OnRefreshListener, Toolbar.OnMenuItemClickListener {
private static final String EXTRA_FILTER = "extra_filter";
private static final String EXTRA_EXTRAS = "extra_extras";
public static final String TAG_TASKLIST_FRAGMENT = "tasklist_fragment"; //$NON-NLS-1$
public static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;
private static final int REQUEST_EDIT_TAG = 11543;
private static final int REQUEST_EDIT_FILTER = 11544;
private static final int REQUEST_SORT = 11545;
// --- activities
public static final long AUTOSYNC_INTERVAL = 90000L;
private static final long WAIT_BEFORE_AUTOSYNC = 2000L;
public static final int ACTIVITY_REQUEST_NEW_FILTER = 5;
// --- menu codes
@ -117,12 +145,18 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
@Inject GtasksPreferenceService gtasksPreferenceService;
@Inject DialogBuilder dialogBuilder;
@Inject SyncActionHelper syncActionHelper;
@Inject CheckBoxes checkBoxes;
@Inject VoiceInputAssistant voiceInputAssistant;
@Inject TaskCreator taskCreator;
@Inject TagDataDao tagDataDao;
@Bind(R.id.swipe_layout) SwipeRefreshLayout swipeRefreshLayout;
@Bind(R.id.swipe_layout_empty) SwipeRefreshLayout emptyView;
@Bind(R.id.toolbar) Toolbar toolbar;
private TaskAdapter taskAdapter = null;
private RefreshReceiver refreshReceiver = new RefreshReceiver();
private OnTaskListItemClickedListener mListener;
private SwipeRefreshLayout listView;
private SwipeRefreshLayout emptyView;
private TaskListFragmentCallbackHandler callbacks;
protected final AtomicReference<String> sqlQueryTemplate = new AtomicReference<>();
protected Filter filter;
@ -142,7 +176,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
}
public void setSyncOngoing(boolean ongoing) {
listView.setRefreshing(ongoing);
swipeRefreshLayout.setRefreshing(ongoing);
emptyView.setRefreshing(ongoing);
}
@ -150,15 +184,17 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
* Container Activity must implement this interface and we ensure that it
* does during the onAttach() callback
*/
public interface OnTaskListItemClickedListener {
public interface TaskListFragmentCallbackHandler {
void onTaskListItemClicked(long taskId);
void onNavigationIconClicked();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mListener = (OnTaskListItemClickedListener) activity;
callbacks = (TaskListFragmentCallbackHandler) activity;
}
/**
@ -166,9 +202,8 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
* elements, a view with id android:id/empty and a list view with id
* android:id/list. It should NOT be attached to root
*/
protected View getListBody(ViewGroup root) {
return getActivity().getLayoutInflater().inflate(
R.layout.task_list_body_standard, root, false);
protected int getListBody() {
return R.layout.task_list_body_standard;
}
/** Called when loading up the activity */
@ -207,25 +242,141 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ViewGroup parent = (ViewGroup) getActivity().getLayoutInflater().inflate(
R.layout.task_list_activity, container, false);
parent.findViewById(R.id.fab).setOnClickListener(new OnClickListener() {
View parent = inflater.inflate(R.layout.fragment_task_list, container, false);
((ViewGroup) parent.findViewById(R.id.task_list_body)).addView(inflater.inflate(getListBody(), null), 0);
ButterKnife.bind(this, parent);
setupRefresh(swipeRefreshLayout);
setupRefresh(emptyView);
ListView listView = (ListView) swipeRefreshLayout.findViewById(android.R.id.list);
listView.setEmptyView(emptyView);
toolbar.setTitle(filter.listingTitle);
Drawable drawable = DrawableCompat.wrap(getResources().getDrawable(R.drawable.ic_menu_24dp));
DrawableCompat.setTint(drawable, getResources().getColor(android.R.color.white));
toolbar.setNavigationIcon(drawable);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Task task = addTask("");
onTaskListItemClicked(task.getId());
callbacks.onNavigationIconClicked();
}
});
View body = getListBody(parent);
listView = (SwipeRefreshLayout) body.findViewById(R.id.swipe_layout);
emptyView = (SwipeRefreshLayout) parent.findViewById(R.id.swipe_layout_empty);
setupRefresh(listView);
setupRefresh(emptyView);
((ListView) listView.findViewById(android.R.id.list)).setEmptyView(emptyView);
((ViewGroup) parent.findViewById(R.id.task_list_body)).addView(body, 0);
toolbar.inflateMenu(R.menu.task_list_fragment);
Menu menu = toolbar.getMenu();
for (int i = 0 ; i < menu.size() ; i++) {
MenuColorizer.colorMenuItem(menu.getItem(i), getResources().getColor(android.R.color.white));
}
toolbar.setOnMenuItemClickListener(this);
setupMenu(menu);
return parent;
}
private void setupMenu(Menu menu) {
TaskListFragment tlf = this;
MenuItem hidden = menu.findItem(R.id.menu_show_hidden);
if (preferences.getBoolean(R.string.p_show_hidden_tasks, false)) {
hidden.setChecked(true);
}
MenuItem completed = menu.findItem(R.id.menu_show_completed);
if (preferences.getBoolean(R.string.p_show_completed_tasks, false)) {
completed.setChecked(true);
}
if (tlf instanceof GtasksListFragment) {
menu.findItem(R.id.menu_clear_completed).setVisible(true);
menu.findItem(R.id.menu_sort).setVisible(false);
completed.setChecked(true);
completed.setEnabled(false);
} else if(tlf instanceof TagViewFragment) {
menu.findItem(R.id.menu_tag_settings).setVisible(true);
} else {
if(filter instanceof CustomFilter && ((CustomFilter) filter).getId() > 0) {
menu.findItem(R.id.menu_filter_settings).setVisible(true);
}
}
if (tlf instanceof SubtasksTagListFragment || tlf instanceof SubtasksListFragment) {
hidden.setChecked(true);
hidden.setEnabled(false);
}
menu.findItem(R.id.menu_voice_add).setVisible(voiceInputAvailable(getActivity()));
final MenuItem item = menu.findItem(R.id.menu_search);
final SearchView actionView = (SearchView) MenuItemCompat.getActionView(item);
actionView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
query = query.trim();
String title = getString(R.string.FLA_search_filter, query);
Filter savedFilter = new Filter(title,
new QueryTemplate().where
(Criterion.or(Task.NOTES.
like(
"%" + //$NON-NLS-1$
query + "%"
),
Task.TITLE.
like(
"%" + //$NON-NLS-1$
query + "%"
)
)
), null);
((TaskListActivity) getActivity()).onFilterItemClicked(savedFilter);
MenuItemCompat.collapseActionView(item);
return true;
}
@Override
public boolean onQueryTextChange(String query) {
return false;
}
});
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch(item.getItemId()) {
case R.id.menu_voice_add:
voiceInputAssistant.startVoiceRecognitionActivity(R.string.voice_create_prompt);
return true;
case R.id.menu_sort:
startActivityForResult(new Intent(getActivity(), SortActivity.class) {{
putExtra(SortActivity.EXTRA_MANUAL_ENABLED, hasDraggableOption());
}}, REQUEST_SORT);
return true;
case R.id.menu_tag_settings:
startActivityForResult(new Intent(getActivity(), TagSettingsActivity.class) {{
putExtra(TagSettingsActivity.EXTRA_TAG_DATA, getActiveTagData());
}}, REQUEST_EDIT_TAG);
return true;
case R.id.menu_show_hidden:
item.setChecked(!item.isChecked());
preferences.setBoolean(R.string.p_show_hidden_tasks, item.isChecked());
reconstructCursor();
TasksWidget.updateWidgets(getActivity());
return true;
case R.id.menu_show_completed:
item.setChecked(!item.isChecked());
preferences.setBoolean(R.string.p_show_completed_tasks, item.isChecked());
reconstructCursor();
TasksWidget.updateWidgets(getActivity());
return true;
case R.id.menu_filter_settings:
startActivityForResult(new Intent(getActivity(), FilterSettingsActivity.class) {{
putExtra(FilterSettingsActivity.TOKEN_FILTER, filter);
}}, REQUEST_EDIT_FILTER);
default:
return super.onOptionsItemSelected(item);
}
}
@OnClick(R.id.fab)
void createNewTask() {
Task task = addTask("");
onTaskListItemClicked(task.getId());
}
public Task addTask(String title) {
return taskService.createWithValues(filter.valuesForNewTasks, title);
}
@ -241,19 +392,13 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
private void setupRefresh(SwipeRefreshLayout layout) {
layout.setOnRefreshListener(this);
Resources resources = getResources();
layout.setColorSchemeColors(
resources.getColor(R.color.importance_1),
resources.getColor(R.color.importance_2),
resources.getColor(R.color.importance_3),
resources.getColor(R.color.importance_4));
layout.setColorSchemeColors(checkBoxes.getPriorityColorsArray());
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// We have a menu item to show in action bar.
setHasOptionsMenu(true);
final ListView listView = getListView();
registerForContextMenu(listView);
@ -346,50 +491,17 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
refreshFilterCount();
initiateAutomaticSync();
initiateAutomaticSyncImpl();
refresh();
}
protected boolean isCurrentTaskListFragment() {
TaskListActivity activity = (TaskListActivity) getActivity();
if (activity != null) {
return activity.getTaskListFragment() == this;
}
return false;
}
public final void initiateAutomaticSync() {
final TaskListActivity activity = (TaskListActivity) getActivity();
if (activity == null) {
return;
}
if (activity.isDoublePaneLayout()) {
initiateAutomaticSyncImpl();
} else {
// In single fragment case, we're using swipe between lists,
// so wait a couple seconds before initiating the autosync.
new Thread() {
@Override
public void run() {
AndroidUtilities.sleepDeep(WAIT_BEFORE_AUTOSYNC);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
initiateAutomaticSyncImpl();
}
});
}
}.start();
}
}
/**
* Implementation of initiation automatic sync. Subclasses should override this method;
* the above method takes care of calling it in the correct way
*/
protected void initiateAutomaticSyncImpl() {
if (isCurrentTaskListFragment() && BuiltInFilterExposer.isInbox(context, filter)) {
if (BuiltInFilterExposer.isInbox(context, filter)) {
syncActionHelper.initiateAutomaticSync();
}
}
@ -620,6 +732,75 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == VOICE_RECOGNITION_REQUEST_CODE) {
if (resultCode == Activity.RESULT_OK) {
Callback<String> quickAddTask = new Callback<String>() {
@Override
public void apply(String title) {
Task task = addTask(title);
taskCreator.addToCalendar(task);
onTaskListItemClicked(task.getId());
loadTaskListContent();
onTaskCreated(task.getId(), task.getUUID());
}
};
voiceInputAssistant.handleActivityResult(data, quickAddTask);
}
} else if (requestCode == REQUEST_EDIT_TAG) {
if (resultCode == Activity.RESULT_OK) {
String action = data.getAction();
String uuid = data.getStringExtra(TagViewFragment.EXTRA_TAG_UUID);
if (AstridApiConstants.BROADCAST_EVENT_TAG_RENAMED.equals(action)) {
TagData td = getActiveTagData();
if (td != null && td.getUuid().equals(uuid)) {
td = tagDataDao.fetch(uuid, TagData.PROPERTIES);
if (td != null) {
Filter filter = TagFilterExposer.filterFromTagData(getActivity(), td);
((TaskListActivity) getActivity()).onFilterItemClicked(filter);
}
} else {
refresh();
}
} else if (AstridApiConstants.BROADCAST_EVENT_TAG_DELETED.equals(action)) {
TagData tagData = getActiveTagData();
String activeUuid = RemoteModel.NO_UUID;
if (tagData != null) {
activeUuid = tagData.getUuid();
}
if (activeUuid.equals(uuid)) {
((TaskListActivity) getActivity()).onFilterItemClicked(BuiltInFilterExposer.getMyTasksFilter(getResources()));
((TaskListActivity) getActivity()).clearNavigationDrawer(); // Should auto refresh
} else {
refresh();
}
}
((TaskListActivity) getActivity()).refreshNavigationDrawer();
}
} else if (requestCode == REQUEST_EDIT_FILTER) {
if (resultCode == Activity.RESULT_OK) {
String action = data.getAction();
if (AstridApiConstants.BROADCAST_EVENT_FILTER_RENAMED.equals(action)) {
CustomFilter customFilter = data.getParcelableExtra(FilterSettingsActivity.TOKEN_FILTER);
((TaskListActivity) getActivity()).onFilterItemClicked(customFilter);
} else if(AstridApiConstants.BROADCAST_EVENT_FILTER_DELETED.equals(action)) {
((TaskListActivity) getActivity()).onFilterItemClicked(BuiltInFilterExposer.getMyTasksFilter(getResources()));
}
((TaskListActivity) getActivity()).refreshNavigationDrawer();
}
} else if (requestCode == REQUEST_SORT) {
if (resultCode == Activity.RESULT_OK) {
TasksWidget.updateWidgets(getActivity());
((TaskListActivity) getActivity()).onFilterItemClicked(filter);
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
public boolean onContextItemSelected(android.view.MenuItem item) {
return onOptionsItemSelected(item);
@ -629,10 +810,6 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
public boolean onOptionsItemSelected(final MenuItem item) {
long itemId;
if (!isCurrentTaskListFragment()) {
return false;
}
switch (item.getItemId()) {
// --- context menu items
@ -677,7 +854,7 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
}
public void onTaskListItemClicked(long taskId) {
mListener.onTaskListItemClicked(taskId);
callbacks.onTaskListItemClicked(taskId);
}
protected boolean hasDraggableOption() {

@ -185,8 +185,6 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
viewHolder.completeBox = (CheckableImageView)view.findViewById(R.id.completeBox);
viewHolder.dueDate = (TextView)view.findViewById(R.id.dueDate);
viewHolder.tagsView = (TextView)view.findViewById(R.id.tagsDisplay);
viewHolder.details1 = (TextView)view.findViewById(R.id.details1);
viewHolder.details2 = (TextView)view.findViewById(R.id.details2);
viewHolder.taskActionContainer = view.findViewById(R.id.taskActionContainer);
viewHolder.taskActionIcon = (ImageView)view.findViewById(R.id.taskActionIcon);
@ -202,9 +200,6 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
for(int i = 0; i < view.getChildCount(); i++) {
view.getChildAt(i).setTag(viewHolder);
}
if(viewHolder.details1 != null) {
viewHolder.details1.setTag(viewHolder);
}
// add UI component listeners
addListeners(view);
@ -256,7 +251,6 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
public CheckableImageView completeBox;
public TextView dueDate;
public TextView tagsView;
public TextView details1, details2;
public View taskActionContainer;
public ImageView taskActionIcon;
public String tagsString; // From join query, not part of the task model
@ -276,8 +270,6 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
viewHolder.completeBox.setMinimumHeight(minRowHeight);
}
viewHolder.view.setBackgroundColor(resources.getColor(android.R.color.transparent));
// name
final TextView nameView = viewHolder.nameView; {
String nameValue = task.getTitle();
@ -294,11 +286,6 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
setupDueDateAndTags(viewHolder, task);
if(viewHolder.details1 != null) {
viewHolder.details1.setVisibility(View.GONE);
viewHolder.details2.setVisibility(View.GONE);
}
// Task action
ImageView taskAction = viewHolder.taskActionIcon;
if (taskAction != null) {
@ -457,12 +444,6 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
setupDueDateAndTags(viewHolder, task);
float detailTextSize = Math.max(10, fontSize * 14 / 20);
if(viewHolder.details1 != null) {
viewHolder.details1.setTextSize(detailTextSize);
}
if(viewHolder.details2 != null) {
viewHolder.details2.setTextSize(detailTextSize);
}
if(viewHolder.dueDate != null) {
viewHolder.dueDate.setTextSize(detailTextSize);
viewHolder.dueDate.setTypeface(null, 0);

@ -9,8 +9,6 @@ import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import com.todoroo.andlib.data.TodorooCursor;
@ -62,8 +60,8 @@ public class SubtasksListFragment extends TaskListFragment {
}
@Override
protected View getListBody(ViewGroup root) {
return getActivity().getLayoutInflater().inflate(R.layout.task_list_body_subtasks, root, false);
protected int getListBody() {
return R.layout.task_list_body_subtasks;
}
@Override

@ -8,8 +8,6 @@ package com.todoroo.astrid.subtasks;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.astrid.actfm.TagViewFragment;
@ -51,9 +49,8 @@ public class SubtasksTagListFragment extends TagViewFragment {
}
@Override
protected View getListBody(ViewGroup root) {
return getActivity().getLayoutInflater().inflate(
R.layout.task_list_body_subtasks, root, false);
protected int getListBody() {
return R.layout.task_list_body_subtasks;
}
@Override

@ -155,7 +155,8 @@ public class EditTitleControlSet extends TaskEditControlFragment {
@Override
public boolean hasChanges(Task original) {
return !getTitle().equals(original.getTitle());
return !getTitle().equals(original.getTitle()) ||
completeBox.isChecked() != original.isCompleted();
}
@Override

@ -5,7 +5,7 @@
*/
package com.todoroo.astrid.voice;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
@ -13,6 +13,7 @@ import android.content.pm.ResolveInfo;
import android.speech.RecognizerIntent;
import com.todoroo.andlib.data.Callback;
import com.todoroo.astrid.activity.TaskListFragment;
import java.util.ArrayList;
import java.util.List;
@ -35,7 +36,6 @@ import javax.inject.Singleton;
public class VoiceInputAssistant {
/** requestcode for activityresult from voicerecognizer-intent */
public static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;
/**
* Call this to see if your phone supports voiceinput in its current configuration.
@ -57,17 +57,15 @@ public class VoiceInputAssistant {
* Use the mightier constructor to specify your own requestCode in this case for every additional use on an fragment.
* If you only use one microphone-button on an fragment, you can leave it to its default, VOICE_RECOGNITION_REQUEST_CODE.
*/
private int requestCode = VOICE_RECOGNITION_REQUEST_CODE;
private Activity activity;
private Fragment fragment;
/**
* This constructor can be called from a widget with a voice-button calling a dummy-activity.
*
* @param activity dummy-activity that starts the voice-request.
*/
@Inject
public VoiceInputAssistant(Activity activity) {
this.activity = activity;
public VoiceInputAssistant(Fragment fragment) {
this.fragment = fragment;
}
/**
@ -80,8 +78,8 @@ public class VoiceInputAssistant {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, activity.getString(prompt));
activity.startActivityForResult(intent, requestCode);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, fragment.getString(prompt));
fragment.startActivityForResult(intent, TaskListFragment.VOICE_RECOGNITION_REQUEST_CODE);
}
/**
@ -94,31 +92,22 @@ public class VoiceInputAssistant {
* If this method returns false, then it wasnt a request with a RecognizerIntent, so you can handle
* these other requests as you need.
*
* @param activityRequestCode if this equals the requestCode specified by constructor, then results of voice-recognition
*/
public boolean handleActivityResult(int activityRequestCode, int resultCode, Intent data, Callback<String> onVoiceRecognition) {
boolean result = false;
public void handleActivityResult(Intent data, Callback<String> onVoiceRecognition) {
// handle the result of voice recognition, put it into the textfield
if (activityRequestCode == this.requestCode) {
// this was handled here, even if voicerecognition fails for any reason
// so your program flow wont get chaotic if you dont explicitly state
// your own requestCodes.
result = true;
if (resultCode == Activity.RESULT_OK) {
// Fill the quickAddBox-view with the string the recognizer thought it could have heard
ArrayList<String> match = data.getStringArrayListExtra(
RecognizerIntent.EXTRA_RESULTS);
// make sure we only do this if there is SomeThing (tm) returned
if (match != null && match.size() > 0 && match.get(0).length() > 0) {
String recognizedSpeech = match.get(0);
recognizedSpeech = recognizedSpeech.substring(0, 1).toUpperCase() +
recognizedSpeech.substring(1).toLowerCase();
// this was handled here, even if voicerecognition fails for any reason
// so your program flow wont get chaotic if you dont explicitly state
// your own requestCodes.
// Fill the quickAddBox-view with the string the recognizer thought it could have heard
ArrayList<String> match = data.getStringArrayListExtra(
RecognizerIntent.EXTRA_RESULTS);
// make sure we only do this if there is SomeThing (tm) returned
if (match != null && match.size() > 0 && match.get(0).length() > 0) {
String recognizedSpeech = match.get(0);
recognizedSpeech = recognizedSpeech.substring(0, 1).toUpperCase() +
recognizedSpeech.substring(1).toLowerCase();
onVoiceRecognition.apply(recognizedSpeech);
}
}
onVoiceRecognition.apply(recognizedSpeech);
}
return result;
}
}

@ -6,6 +6,7 @@ import android.graphics.drawable.Drawable;
import android.support.v4.graphics.drawable.DrawableCompat;
import com.google.common.collect.ImmutableList;
import com.google.common.primitives.Ints;
import org.tasks.R;
import org.tasks.injection.ForApplication;
@ -25,6 +26,7 @@ public class CheckBoxes {
private static List<Drawable> repeatingCheckboxes;
private static List<Drawable> completedCheckboxes;
private static List<Integer> priorityColors;
private static int[] priorityColorsArray;
@Inject
public CheckBoxes(@ForApplication Context context) {
@ -38,6 +40,7 @@ public class CheckBoxes {
context.getResources().getColor(R.color.importance_2),
context.getResources().getColor(R.color.importance_3),
context.getResources().getColor(R.color.importance_4));
priorityColorsArray = Ints.toArray(priorityColors);
initialized = true;
}
}
@ -46,6 +49,10 @@ public class CheckBoxes {
return priorityColors;
}
public int[] getPriorityColorsArray() {
return priorityColorsArray;
}
List<Drawable> getCheckBoxes() {
return checkboxes;
}

@ -0,0 +1,18 @@
package org.tasks.ui;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import org.tasks.R;
public class EmptyTaskEditFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_task_edit_empty, container, false);
}
}

@ -7,17 +7,23 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:background="?attr/asContentBackground"
android:orientation="horizontal"
android:baselineAligned="false">
<include layout="@layout/toolbar" />
<include layout="@layout/toolbar_separator" />
<!-- Task List -->
<FrameLayout
android:id="@+id/master_dual"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="60" />
<!-- Task Edit -->
<FrameLayout
android:id="@+id/single_pane"
android:id="@+id/detail_dual"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/asContentBackground" />
android:layout_weight="40" />
</LinearLayout>

@ -1,53 +0,0 @@
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/toolbar" />
<include layout="@layout/toolbar_separator"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/asContentBackground"
android:orientation="horizontal">
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="?attr/asSeparatorBackground" />
<!-- Task List -->
<FrameLayout
android:id="@+id/master_dual"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="60" />
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="?attr/asSeparatorBackground" />
<!-- Task Edit -->
<FrameLayout
android:id="@+id/detail_dual"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="40" />
</LinearLayout>
</LinearLayout>
<include layout="@layout/navigation_drawer" />
</android.support.v4.widget.DrawerLayout>

@ -3,10 +3,11 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:orientation="horizontal">
android:orientation="horizontal"
android:baselineAligned="false">
<LinearLayout
android:layout_width="fill_parent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="100"
android:orientation="horizontal">

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/edit_text_style"
android:id="@+id/notes"
android:layout_width="match_parent"
android:layout_height="wrap_content"

@ -6,50 +6,44 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:orientation="horizontal">
<LinearLayout
android:layout_width="fill_parent"
<com.todoroo.astrid.ui.CheckableImageView
android:id="@+id/completeBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingBottom="@dimen/task_edit_title_padding_top_bottom"
android:paddingEnd="@dimen/task_edit_drawable_padding_left_right"
android:layout_gravity="top"
android:paddingTop="@dimen/task_edit_drawable_padding_top_bottom"
android:paddingBottom="@dimen/task_edit_drawable_padding_top_bottom"
android:paddingLeft="@dimen/task_edit_drawable_padding_left_right"
android:paddingRight="@dimen/task_edit_drawable_padding_left_right"
android:paddingStart="@dimen/task_edit_drawable_padding_left_right"
android:paddingTop="@dimen/task_edit_title_padding_top_bottom">
android:paddingRight="@dimen/task_edit_drawable_padding_left_right"
android:paddingEnd="@dimen/task_edit_drawable_padding_left_right"
android:scaleType="center" />
<com.todoroo.astrid.ui.CheckableImageView
android:id="@+id/completeBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:paddingEnd="@dimen/task_edit_drawable_padding_left_right"
android:paddingRight="@dimen/task_edit_drawable_padding_left_right"
android:scaleType="center" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="@dimen/task_edit_padding_top_bottom"
android:layout_marginTop="@dimen/task_edit_padding_top_bottom" >
<EditText
android:id="@+id/title"
style="@style/edit_text_style"
android:layout_width="0dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="100"
android:background="?attr/asEditTextBackground"
android:hint="@string/TEA_title_hint"
android:freezesText="true"
android:hint="@string/TEA_title_hint"
android:imeOptions="flagNoExtractUi"
android:inputType="textCapSentences"
android:scrollbars="vertical"
android:textColor="?attr/asTextColor"
android:textColorHint="?attr/asTextColorHint" />
</LinearLayout>
<include layout="@layout/task_edit_divider" />
<View
android:layout_width="fill_parent"
android:layout_height="1px"
android:background="?attr/task_edit_divider" />
</LinearLayout>
</LinearLayout>

@ -1,94 +1,86 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?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:id="@+id/taskEditParent"
android:background="?attr/asContentBackground"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
android:background="?attr/asContentBackground"
android:orientation="vertical">
<include layout="@layout/toolbar" />
<include layout="@layout/toolbar_separator" />
<ScrollView
android:id="@+id/edit_scroll"
android:background="?attr/asContentBackground"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="100" >
android:layout_height="0dp"
android:layout_weight="100"
android:overScrollMode="never">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal" >
android:gravity="center_horizontal"
android:orientation="vertical">
<FrameLayout
android:id="@+id/row_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/row_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/row_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/row_4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/row_5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/row_6"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/row_7"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/row_8"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/row_9"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/row_10"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/row_11"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/asContentBackground" />
android:layout_height="wrap_content" />
<android.support.v4.view.ViewPager
android:id="@+id/pager"
@ -96,27 +88,24 @@
android:layout_height="wrap_content"
android:layout_margin="3dip"
android:layout_marginBottom="0dip"
android:orientation="vertical"/>
android:orientation="vertical" />
</LinearLayout>
</ScrollView>
<!-- Footer -->
<View
android:layout_width="fill_parent"
android:layout_height="1px"
android:background="?attr/asToolbarSeparator"/>
android:background="?attr/asToolbarSeparator" />
<LinearLayout
android:id="@+id/updatesFooter"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:minHeight="50dip"
android:background="?attr/asAbBackgroundColor"
android:gravity="center_vertical"
android:minHeight="50dp"
android:orientation="horizontal"
android:background="?attr/asAbBackgroundColor"
android:padding="3dip"
android:paddingBottom="0dip">
@ -128,32 +117,31 @@
android:layout_height="39dip"
android:layout_marginRight="3dip"
android:layout_weight="1"
android:background="@android:color/transparent"
android:paddingBottom="2dip"
android:scaleType="centerInside"
android:background="@android:color/transparent"
android:src="@drawable/ic_camera_alt_white_24dp" />
<!-- Quick Add Task -->
<EditText
style="@style/edit_text_style"
android:id="@+id/commentField"
android:layout_width="wrap_content"
android:layout_height="39dip"
android:layout_marginBottom="2dip"
android:layout_marginLeft="1dip"
android:layout_marginRight="1dip"
android:layout_marginBottom="2dip"
android:layout_marginTop="2dip"
android:layout_weight="100"
android:inputType="textCapSentences"
android:autoText="true"
android:background="?attr/asEditTextBackground"
android:capitalize="sentences"
android:imeOptions="flagNoExtractUi|actionDone"
android:hint="@string/TVA_add_comment"
android:imeOptions="flagNoExtractUi|actionDone"
android:inputType="textCapSentences"
android:paddingLeft="10dip"
android:textColor="@color/white_text"
android:textColorHint="@color/white_text_hint"
android:paddingLeft="10dip"
android:textSize="16sp" />
<!-- Extended Add Button -->
@ -165,9 +153,9 @@
android:layout_marginLeft="3dip"
android:layout_weight="1"
android:background="@android:color/transparent"
android:tint="@android:color/white"
android:src="@drawable/ic_add_24dp"
android:scaleType="center"
android:src="@drawable/ic_add_24dp"
android:tint="@android:color/white"
android:visibility="gone" />
</LinearLayout>

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/taskEditParent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="?attr/asContentBackground"
android:orientation="vertical">
<include layout="@layout/toolbar" />
<include layout="@layout/toolbar_separator" />
</LinearLayout>

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?><!--
** Copyright (c) 2012 Todoroo Inc
**
** See the file "LICENSE" for the full license governing this code.
-->
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/task_list_coordinator"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:descendantFocusability="beforeDescendants"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/toolbar" />
<include layout="@layout/toolbar_separator" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<FrameLayout
android:id="@+id/task_list_body"
style="@style/task_list_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="100">
<include layout="@layout/task_list_swipe_layout_empty" />
</FrameLayout>
<View style="@style/double_pane_divider" />
</LinearLayout>
</LinearLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:src="@drawable/ic_add_24dp"
android:tint="?attr/fab_tint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="@dimen/task_list_fab_margin"
android:padding="0dp"
app:borderWidth="0dp"/>
</android.support.design.widget.CoordinatorLayout>

@ -97,29 +97,6 @@
</LinearLayout>
</LinearLayout>
<!-- details line 1 -->
<TextView
android:id="@+id/details1"
style="@style/TextAppearance.TAd_ItemDetails"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/task_row"
android:layout_below="@id/task_row"
android:visibility="gone" />
<!-- details line 2 -->
<TextView
android:id="@+id/details2"
style="@style/TextAppearance.TAd_ItemDetails"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/task_row"
android:layout_below="@id/details1"
android:layout_marginLeft="5dip"
android:visibility="gone" />
</RelativeLayout>
<View

@ -1,37 +1,16 @@
<?xml version="1.0" encoding="utf-8"?><!--
** Copyright (c) 2012 Todoroo Inc
**
** See the file "LICENSE" for the full license governing this code.
-->
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/task_list_coordinator"
android:background="?attr/asContentBackground"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:descendantFocusability="beforeDescendants"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical">
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<RelativeLayout
android:id="@+id/task_list_body"
<FrameLayout
android:id="@+id/single_pane"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:background="?attr/asContentBackground" />
<include layout="@layout/task_list_swipe_layout_empty" />
<include layout="@layout/navigation_drawer" />
</RelativeLayout>
</android.support.v4.widget.DrawerLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:src="@drawable/ic_add_24dp"
android:tint="?attr/fab_tint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="@dimen/task_list_fab_margin"
android:padding="0dp"
app:borderWidth="0dp"/>
</android.support.design.widget.CoordinatorLayout>

@ -1,12 +1,14 @@
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_layout"
style="@style/task_list_container"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
android:layout_height="fill_parent"
android:elevation="@dimen/elevation_task_list">
<ListView
android:id="@android:id/list"
style="@style/TaskListView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
android:layout_height="fill_parent" />
</android.support.v4.widget.SwipeRefreshLayout>

@ -1,7 +1,9 @@
<org.tasks.ui.DraggableSwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_layout"
style="@style/task_list_container"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:elevation="@dimen/elevation_task_list" >
<com.todoroo.astrid.ui.DraggableListView
android:id="@android:id/list"

@ -4,7 +4,7 @@
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/asAbBackgroundColor"
android:elevation="4dp"
android:elevation="@dimen/elevation_toolbar"
tasks:popupTheme="?attr/popup_theme"
tasks:theme="@style/ActionBarThemeOverlay"
tasks:titleTextAppearance="@style/ActionBar.TitleText" />

@ -1,4 +1,5 @@
<View xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar_separator"
android:layout_width="match_parent"
android:layout_height="?attr/toolbarSeparatorHeight"
android:background="?attr/asToolbarSeparator" />

@ -2,12 +2,6 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tasks="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_save"
android:title="@string/TEA_menu_save"
android:icon="@drawable/ic_save_24dp"
android:visible="false"
tasks:showAsAction="ifRoom"/>
<item
android:id="@+id/menu_record_note"
android:title="@string/premium_record_audio"

@ -33,8 +33,6 @@
<string name="TEA_hideUntil_label">إخفاء حتى...</string>
<string name="TEA_note_label">وصف</string>
<string name="TEA_estimatedDuration_label">كم من الوقت ستأخذ؟</string>
<string name="TEA_menu_save">حفظ التغيرات</string>
<string name="TEA_tab_activity">نشاط</string>
<string name="due_date">التاريخ المحدد</string>
<string name="due_time">الوقت المحدد</string>
<string name="day_before_due">يوم قبل الموعد</string>

@ -61,7 +61,6 @@
<string name="TEA_note_label">Описание</string>
<string name="TEA_estimatedDuration_label">Колко време ще отнеме?</string>
<string name="TEA_elapsedDuration_label">Време, което вече е отделено</string>
<string name="TEA_menu_save">Запази промените</string>
<string name="save">Запази</string>
<string name="TEA_timer_est">Приблизително %s</string>
<string name="TEA_timer_elap">Изминали %s</string>

@ -50,8 +50,6 @@
<string name="TEA_note_label">Notes</string>
<string name="TEA_estimatedDuration_label">Quant temps us portarà?</string>
<string name="TEA_elapsedDuration_label">Temps que ja s\'ha invertit en la Tasca</string>
<string name="TEA_menu_save">Desa els canvis</string>
<string name="TEA_tab_activity">Activitat</string>
<string name="TEA_no_time">cap hora</string>
<string name="due_date">Al finalitzar la data límit</string>
<string name="day_before_due">El dia abans del venciment</string>

@ -53,8 +53,6 @@
<string name="TEA_note_label">Poznámky</string>
<string name="TEA_estimatedDuration_label">Kolik času asi zabere?</string>
<string name="TEA_elapsedDuration_label">Jak dlouho už na úkolu pracujete</string>
<string name="TEA_menu_save">Uložit změny</string>
<string name="TEA_tab_activity">Činnost</string>
<string name="TEA_timer_est">Zal. %s</string>
<string name="TEA_timer_elap">Uplynutí %s</string>
<string name="TEA_no_time">Bez času</string>

@ -47,8 +47,6 @@
<string name="TEA_note_label">Noter</string>
<string name="TEA_estimatedDuration_label">Hvor lang tid tager det?</string>
<string name="TEA_elapsedDuration_label">Tid allerede brugt på denne opgave</string>
<string name="TEA_menu_save">Gem ændringer</string>
<string name="TEA_tab_activity">Aktivitet</string>
<string name="TEA_control_importance">Vigtighed</string>
<string name="TEA_control_notes">Noter</string>
<string name="TEA_control_files">Filer</string>

@ -56,9 +56,7 @@
<string name="TEA_note_label">Beschreibung</string>
<string name="TEA_estimatedDuration_label">Wie lange wird es dauern?</string>
<string name="TEA_elapsedDuration_label">Zeit, die schon für die Aufgabe gebraucht wurde</string>
<string name="TEA_menu_save">Änderungen speichern</string>
<string name="save">Speichern</string>
<string name="TEA_tab_activity">Aktivität</string>
<string name="TEA_timer_est">Geschätzt %s</string>
<string name="TEA_timer_elap">%s verstrichen</string>
<string name="TEA_no_time">Ohne Uhrzeit</string>

@ -52,8 +52,6 @@
<string name="TEA_note_label">Περιγραφή</string>
<string name="TEA_estimatedDuration_label">Πόσο θα διαρκέσει?</string>
<string name="TEA_elapsedDuration_label">Χρόνος που ήδη πέρασε</string>
<string name="TEA_menu_save">Αποθήκευση αλλαγών</string>
<string name="TEA_tab_activity">Δραστηριότητα</string>
<string name="TEA_timer_est">Εκτιμώμενο %s</string>
<string name="TEA_timer_elap">Πέρασε %s</string>
<string name="TEA_no_time">Χωρίς ώρα</string>

@ -57,9 +57,7 @@
<string name="TEA_note_label">Descripción</string>
<string name="TEA_estimatedDuration_label">¿Cuanto tiempo llevará?</string>
<string name="TEA_elapsedDuration_label">Tiempo ya empleado en la tarea</string>
<string name="TEA_menu_save">Guardar cambios</string>
<string name="save">Guardar</string>
<string name="TEA_tab_activity">Actividad</string>
<string name="TEA_timer_elap">Transcurrido %s</string>
<string name="TEA_no_time">Sin horario</string>
<string name="due_date">Fecha de vencimiento</string>

@ -39,9 +39,7 @@
<string name="TEA_note_label">توضیحات</string>
<string name="TEA_estimatedDuration_label">این چقدر طول میکشد ؟</string>
<string name="TEA_elapsedDuration_label">زمان سپری شده</string>
<string name="TEA_menu_save">ذخیره تغییرات</string>
<string name="save">ذخیره</string>
<string name="TEA_tab_activity">فعالیت</string>
<string name="TEA_no_time">بدون زمان</string>
<string name="due_date">تاریخ موعود</string>
<string name="due_time">زمان موعود</string>

@ -21,8 +21,6 @@
<string name="TEA_note_label">Kuvaus</string>
<string name="TEA_estimatedDuration_label">Kuinka pitkään se kestää?</string>
<string name="TEA_elapsedDuration_label">Aika on jo käytetty</string>
<string name="TEA_menu_save">Tallenna muutokset</string>
<string name="TEA_tab_activity">Toiminta</string>
<string name="DB_corrupted_body">Uh oh! It looks like you may have a corrupted database.
If you see this error regularly, we suggest you clear all
data (Settings-&gt;Sync and backup-&gt;Manage old tasks-&gt;Clear all data) and restore

@ -56,9 +56,7 @@
<string name="TEA_hideUntil_display">Masquer jusqu\'à %s</string>
<string name="TEA_estimatedDuration_label">Combien de temps cela va-t-il prendre ?</string>
<string name="TEA_elapsedDuration_label">Temps déjà passé sur la tâche</string>
<string name="TEA_menu_save">Sauvegarder les modifications</string>
<string name="save">Sauvegarder</string>
<string name="TEA_tab_activity">Activité</string>
<string name="TEA_timer_est">Restant %s</string>
<string name="TEA_timer_elap">Passé %s</string>
<string name="TEA_no_time">Pas d\'heure</string>

@ -30,8 +30,6 @@
<string name="TEA_note_label">Leírás</string>
<string name="TEA_estimatedDuration_label">Meddig fog tartani?</string>
<string name="TEA_elapsedDuration_label">Már eltöltött idő</string>
<string name="TEA_menu_save">Módosítások mentése</string>
<string name="TEA_tab_activity">Tevékenység</string>
<string name="TEA_control_importance">Prioritás</string>
<string name="TEA_control_notes">Leírás</string>
<string name="TEA_control_files">Fájlok</string>

@ -58,9 +58,7 @@
<string name="TEA_note_label">Descrizione</string>
<string name="TEA_estimatedDuration_label">Quanto tempo impiegherà?</string>
<string name="TEA_elapsedDuration_label">Tempo già speso per l\'attività</string>
<string name="TEA_menu_save">Salva le modifiche</string>
<string name="save">Salva</string>
<string name="TEA_tab_activity">Attività</string>
<string name="TEA_timer_est">Stima %s</string>
<string name="TEA_timer_elap">Trascorso %s</string>
<string name="TEA_no_time">Senza ora</string>

@ -53,8 +53,6 @@
<string name="TEA_note_label">תיאור</string>
<string name="TEA_estimatedDuration_label">כמה זמן תיקח המשימה?</string>
<string name="TEA_elapsedDuration_label">זמן שכבר הושקע במשימה</string>
<string name="TEA_menu_save">שמירת השינויים</string>
<string name="TEA_tab_activity">פעילות</string>
<string name="TEA_timer_elap">זמן שעבר %s</string>
<string name="TEA_no_time">ללא שעה מסויימת</string>
<string name="due_date">עד ה</string>

@ -58,9 +58,7 @@
<string name="TEA_note_label">概要</string>
<string name="TEA_estimatedDuration_label">所要時間は?</string>
<string name="TEA_elapsedDuration_label">既にタスクに費やした時間</string>
<string name="TEA_menu_save">変更の保存</string>
<string name="save">保存</string>
<string name="TEA_tab_activity">活動</string>
<string name="TEA_timer_est">予定 %s</string>
<string name="TEA_timer_elap">経過時間 %s</string>
<string name="TEA_no_time">時間がありません</string>

@ -60,9 +60,7 @@
<string name="TEA_note_label">설명</string>
<string name="TEA_estimatedDuration_label">일정 완료 예상 시간은?</string>
<string name="TEA_elapsedDuration_label">일정에 이미 소모한 시간</string>
<string name="TEA_menu_save">변경사항 저장</string>
<string name="save">저장</string>
<string name="TEA_tab_activity">활동 내역</string>
<string name="TEA_timer_est">동부표준시 %s</string>
<string name="TEA_timer_elap">경과 시간: %s</string>
<string name="TEA_no_time">시한 없음</string>

@ -45,7 +45,6 @@
<string name="TEA_note_label">Notater</string>
<string name="TEA_estimatedDuration_label">Hvor lang tid vil det ta?</string>
<string name="TEA_elapsedDuration_label">Tid brukt på oppgaven til nå</string>
<string name="TEA_menu_save">Lagre endringer</string>
<string name="TEA_control_importance">Viktighet</string>
<string name="TEA_control_notes">Notater</string>
<string name="TEA_control_files">Filer</string>

@ -58,9 +58,7 @@
<string name="TEA_note_label">Omschrijving</string>
<string name="TEA_estimatedDuration_label">Tijdsduur</string>
<string name="TEA_elapsedDuration_label">Bestede tijd tot nu toe</string>
<string name="TEA_menu_save">Wijzigingen opslaan</string>
<string name="save">Opslaan</string>
<string name="TEA_tab_activity">Activiteit</string>
<string name="TEA_timer_est">Gesch. %s</string>
<string name="TEA_timer_elap">Verstreken %s</string>
<string name="TEA_no_time">Geen tijd</string>

@ -53,8 +53,6 @@
<string name="TEA_note_label">Opis</string>
<string name="TEA_estimatedDuration_label">Jak długo to zajmie?</string>
<string name="TEA_elapsedDuration_label">Czas dotychczas spędzony nad tym zadaniem</string>
<string name="TEA_menu_save">Zapisz zmiany</string>
<string name="TEA_tab_activity">Aktywność</string>
<string name="TEA_timer_elap">Minęło %s</string>
<string name="TEA_no_time">Bez godziny</string>
<string name="due_date">W terminie</string>

@ -52,8 +52,6 @@
<string name="TEA_note_label">Descrição</string>
<string name="TEA_estimatedDuration_label">Quanto tempo isto vai levar?</string>
<string name="TEA_elapsedDuration_label">Tempo já gasto na tarefa</string>
<string name="TEA_menu_save">Salvar alterações</string>
<string name="TEA_tab_activity">Atividades</string>
<string name="TEA_timer_elap">Decorrido %s</string>
<string name="TEA_no_time">Sem horário</string>
<string name="due_date">Data de vencimento</string>

@ -58,9 +58,7 @@
<string name="TEA_note_label">Descrição</string>
<string name="TEA_estimatedDuration_label">Quanto tempo irá durar?</string>
<string name="TEA_elapsedDuration_label">Tempo já gasto</string>
<string name="TEA_menu_save">Gravar alterações</string>
<string name="save">Guardar</string>
<string name="TEA_tab_activity">Atividade</string>
<string name="TEA_timer_elap">Decorrido %s</string>
<string name="TEA_no_time">Sem tempo</string>
<string name="due_date">Data limite</string>

@ -58,9 +58,7 @@
<string name="TEA_note_label">Описание</string>
<string name="TEA_estimatedDuration_label">Требуемое время</string>
<string name="TEA_elapsedDuration_label">Затраченное время</string>
<string name="TEA_menu_save">Сохранить изменения</string>
<string name="save">Сохранить </string>
<string name="TEA_tab_activity">Действия</string>
<string name="TEA_timer_est">Ост. %s</string>
<string name="TEA_timer_elap">Прошло %s</string>
<string name="TEA_no_time">Без времени</string>

@ -55,9 +55,7 @@
<string name="TEA_note_label">Popis</string>
<string name="TEA_estimatedDuration_label">Ako dlho to bude trvať?</string>
<string name="TEA_elapsedDuration_label">Ako dlho už pracujete na úlohe</string>
<string name="TEA_menu_save">Uložiť zmeny</string>
<string name="save">Uložiť</string>
<string name="TEA_tab_activity">Aktivita</string>
<string name="TEA_timer_est">Spolu %s</string>
<string name="TEA_timer_elap">Uplynulo %s</string>
<string name="TEA_no_time">Bez času</string>

@ -56,8 +56,6 @@
<string name="TEA_note_label">Opis</string>
<string name="TEA_estimatedDuration_label">Kako dolgo bo trajalo?</string>
<string name="TEA_elapsedDuration_label">Porabljen čas</string>
<string name="TEA_menu_save">Shrani spremembe</string>
<string name="TEA_tab_activity">Dejavnost</string>
<string name="TEA_timer_est">Cca. %s</string>
<string name="TEA_timer_elap">%s je potekel</string>
<string name="TEA_no_time">Čas ni določen</string>

@ -53,8 +53,6 @@
<string name="TEA_note_label">Beskrivning</string>
<string name="TEA_estimatedDuration_label">Hur lång tid kommer det att ta?</string>
<string name="TEA_elapsedDuration_label">Tid redan spenderad på uppgiften</string>
<string name="TEA_menu_save">Spara ändringar</string>
<string name="TEA_tab_activity">Aktivitet</string>
<string name="TEA_timer_est">Ung. %s</string>
<string name="TEA_timer_elap">Förfluten %s</string>
<string name="TEA_no_time">Ingen tid</string>

@ -23,7 +23,6 @@
<string name="TEA_title_hint">สรุปแผนงาน</string>
<string name="TEA_importance_label">ความสำคัญ</string>
<string name="TEA_note_label">บันทึกย่อ</string>
<string name="TEA_menu_save">บันทึกการเปลี่ยนแปลง</string>
<string name="TEA_control_importance">ความสำคัญ</string>
<string name="TEA_control_notes">บันทึกย่อ</string>
<string name="EPr_appearance_header">รูปโฉม</string>

@ -45,8 +45,6 @@
<string name="TEA_note_label">ıklama</string>
<string name="TEA_estimatedDuration_label">Ne kadar sürecek?</string>
<string name="TEA_elapsedDuration_label">Görev üzerinde çalışılan zaman</string>
<string name="TEA_menu_save">Değişiklikleri Kaydet</string>
<string name="TEA_tab_activity">Etkinlik</string>
<string name="TEA_no_time">Zaman yok</string>
<string name="TEA_control_when">Ne Zaman</string>
<string name="TEA_control_notes">ıklama</string>

@ -56,8 +56,6 @@
<string name="TEA_note_label">Опис</string>
<string name="TEA_estimatedDuration_label">Як довго це триватиме?</string>
<string name="TEA_elapsedDuration_label">Час вже потрачео</string>
<string name="TEA_menu_save">Зберегти зміни</string>
<string name="TEA_tab_activity">Активність</string>
<string name="TEA_timer_est">Зал. %s</string>
<string name="TEA_timer_elap">Час, що минув %s</string>
<string name="TEA_no_time">Без часу</string>

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="elevation_padding">3dp</dimen>
</resources>

@ -1,10 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="edit_text_style">
<style name="priority_button" parent="priority_button_base">
</style>
<style name="priority_button" parent="priority_button_base">
<style name="double_pane_divider">
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">0dp</item>
<item name="android:visibility">gone</item>
</style>
</resources>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="task_list_container" parent="task_list_container_base">
<item name="android:clipToPadding">false</item>
<item name="android:paddingRight">@dimen/elevation_padding</item>
<item name="android:paddingEnd">@dimen/elevation_padding</item>
</style>
</resources>

@ -45,8 +45,6 @@
<string name="TEA_note_label">描述</string>
<string name="TEA_estimatedDuration_label">要花多久时间?</string>
<string name="TEA_elapsedDuration_label">已用于任务的时间</string>
<string name="TEA_menu_save">保存更改</string>
<string name="TEA_tab_activity">活动</string>
<string name="TEA_no_time">没有时间</string>
<string name="TEA_control_when">时间</string>
<string name="TEA_control_notes">描述</string>

@ -51,8 +51,6 @@
<string name="TEA_note_label">描述</string>
<string name="TEA_estimatedDuration_label">要花多久時間?</string>
<string name="TEA_elapsedDuration_label">已經用掉的時間</string>
<string name="TEA_menu_save">儲存變更</string>
<string name="TEA_tab_activity">活動</string>
<string name="TEA_timer_elap">已經過 %s</string>
<string name="TEA_no_time">沒有時間</string>
<string name="TEA_control_when">時間</string>

@ -17,4 +17,8 @@
<item name="alpha_secondary_text_icons" format="float" type="dimen">0.54</item>
<item name="alpha_disabled_hint_text" format="float" type="dimen">0.38</item>
<item name="alpha_dividers" format="float" type="dimen">0.12</item>
<dimen name="elevation_toolbar">8dp</dimen>
<dimen name="elevation_task_list">6dp</dimen>
<dimen name="elevation_padding">0dp</dimen>
</resources>

@ -194,14 +194,8 @@ File %1$s contained %2$s.\n\n
<!-- Elapsed time label -->
<string name="TEA_elapsedDuration_label">Time already spent</string>
<!-- Menu: Save -->
<string name="TEA_menu_save">Save Changes</string>
<string name="save">Save</string>
<!-- slide 15b: Task edit tab: activity -->
<string name="TEA_tab_activity">Activity</string>
<string name="TEA_timer_est">Est. %s</string>
<string name="TEA_timer_elap">Elapsed %s</string>

@ -36,10 +36,6 @@
<item name="android:textColor">?attr/asTextColor</item>
</style>
<style name="edit_text_style">
<item name="android:textCursorDrawable">@null</item>
</style>
<!--================================================== Custom Dialogs == -->
<style name="ReminderDialog" parent="Theme.AppCompat.Dialog">
@ -53,16 +49,30 @@
<style name="ListView">
<item name="android:divider">@android:color/transparent</item>
<item name="android:dividerHeight">0px</item>
<item name="android:dividerHeight">1px</item>
<item name="android:scrollbars">vertical</item>
<item name="android:cacheColorHint">#00000000</item>
<item name="android:smoothScrollbar">true</item>
<item name="android:background">?attr/asContentBackground</item>
</style>
<style name="TaskListView" parent="ListView" />
<style name="double_pane_divider">
<item name="android:layout_height">match_parent</item>
<item name="android:layout_width">1px</item>
<item name="android:background">?attr/asListDividerColor</item>
<item name="android:minWidth">1px</item>
</style>
<!-- ==================================================== TaskAdapter == -->
<style name="task_list_container_base">
<item name="android:background">?attr/asContentBackground</item>
</style>
<style name="task_list_container" parent="task_list_container_base"/>
<style name="TextAppearance.TAd_ItemTitle">
<item name="android:textColorLink">#ff88aaff</item>
</style>

Loading…
Cancel
Save