Fixed various minor usability issues. A lot more smooth now.

pull/14/head
Tim Su 14 years ago
parent acccf78cd0
commit 4f61c9b5a4

@ -182,13 +182,13 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<receiver android:name="com.todoroo.astrid.tags.FilterExposer">
<receiver android:name="com.todoroo.astrid.tags.TagFilterExposer">
<intent-filter>
<action android:name="com.todoroo.astrid.REQUEST_FILTERS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<receiver android:name="com.todoroo.astrid.tags.DetailExposer">
<receiver android:name="com.todoroo.astrid.tags.TagDetailExposer">
<intent-filter>
<action android:name="com.todoroo.astrid.REQUEST_DETAILS" />
<category android:name="android.intent.category.DEFAULT" />

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.android.ide.eclipse.adt.debug.LaunchConfigType">
<stringAttribute key="bad_container_name" value="/astrid.launch"/>
<intAttribute key="com.android.ide.eclipse.adt.action" value="0"/>
<stringAttribute key="com.android.ide.eclipse.adt.commandline" value="-scale 0.7"/>
<intAttribute key="com.android.ide.eclipse.adt.delay" value="0"/>
<booleanAttribute key="com.android.ide.eclipse.adt.nobootanim" value="true"/>
<intAttribute key="com.android.ide.eclipse.adt.speed" value="0"/>
<booleanAttribute key="com.android.ide.eclipse.adt.target" value="true"/>
<booleanAttribute key="com.android.ide.eclipse.adt.wipedata" value="false"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/astrid"/>
<listEntry value="/astrid/AndroidManifest.xml"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
<listEntry value="1"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.launching.ALLOW_TERMINATE" value="true"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="astrid"/>
</launchConfiguration>

@ -15,6 +15,9 @@ public class DialogUtilities {
@Autowired
public Integer informationDialogTitleResource;
@Autowired
public Integer confirmDialogTitleResource;
public DialogUtilities() {
DependencyInjectionService.getInstance().inject(this);
}
@ -32,7 +35,7 @@ public class DialogUtilities {
activity.runOnUiThread(new Runnable() {
public void run() {
new AlertDialog.Builder(activity)
.setTitle(informationDialogTitleResource)
.setTitle(confirmDialogTitleResource)
.setMessage(text)
.setView(view)
.setIcon(android.R.drawable.ic_dialog_alert)

@ -10,5 +10,5 @@
# Indicates whether an apk should be generated for each density.
split.density=false
# Project target.
target=android-7
target=android-8
apk-configurations=

@ -39,7 +39,8 @@ public final class CoreFilterExposer extends BroadcastReceiver {
Filter all = new Filter(CorePlugin.pluginIdentifier, r.getString(R.string.BFE_All),
r.getString(R.string.BFE_All),
new QueryTemplate().orderBy(Order.desc(Task.MODIFICATION_DATE)),
new QueryTemplate().where(Criterion.not(TaskCriteria.isDeleted())).
orderBy(Order.desc(Task.MODIFICATION_DATE)),
null);
all.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_all)).getBitmap();
@ -59,7 +60,7 @@ public final class CoreFilterExposer extends BroadcastReceiver {
@SuppressWarnings("nls")
public static Filter buildInboxFilter(Resources r) {
Filter inbox = new Filter(CorePlugin.pluginIdentifier, r.getString(R.string.BFE_Inbox),
r.getString(R.string.BFE_Inbox),
r.getString(R.string.BFE_Inbox_title),
new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(),
TaskCriteria.isVisible(DateUtilities.now()))).orderBy(
Order.asc(Functions.caseStatement(Task.DUE_DATE.eq(0),

@ -17,7 +17,7 @@ import com.todoroo.astrid.api.TaskDetail;
* @author Tim Su <tim@todoroo.com>
*
*/
public class DetailExposer extends BroadcastReceiver {
public class TagDetailExposer extends BroadcastReceiver {
private static TagService tagService = null;

@ -25,7 +25,7 @@ import com.todoroo.astrid.tags.TagService.Tag;
* @author Tim Su <tim@todoroo.com>
*
*/
public class FilterExposer extends BroadcastReceiver {
public class TagFilterExposer extends BroadcastReceiver {
private TagService tagService;

@ -2,8 +2,8 @@ package com.todoroo.astrid.tags;
import java.util.ArrayList;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Property.CountProperty;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
@ -112,7 +112,7 @@ public class TagService {
* Return tags on the given task
*
* @param taskId
* @return empty array if no tags, otherwise array
* @return cursor. PLEASE CLOSE THE CURSOR!
*/
public TodorooCursor<Metadata> getTags(long taskId) {
Query query = Query.select(Metadata.VALUE).where(Criterion.and(MetadataCriteria.withKey(KEY),
@ -129,14 +129,18 @@ public class TagService {
public String getTagsAsString(long taskId) {
StringBuilder tagBuilder = new StringBuilder();
TodorooCursor<Metadata> tags = getTags(taskId);
int length = tags.getCount();
Metadata metadata = new Metadata();
for (int i = 0; i < length; i++) {
tags.moveToNext();
metadata.readFromCursor(tags);
tagBuilder.append(metadata.getValue(Metadata.VALUE));
if (i < length - 1)
tagBuilder.append(", ");
try {
int length = tags.getCount();
Metadata metadata = new Metadata();
for (int i = 0; i < length; i++) {
tags.moveToNext();
metadata.readFromCursor(tags);
tagBuilder.append(metadata.getValue(Metadata.VALUE));
if (i < length - 1)
tagBuilder.append(", ");
}
} finally {
tags.close();
}
return tagBuilder.toString();
}

@ -15,7 +15,7 @@
<!-- completion check-box -->
<CheckBox android:id="@+id/completeBox"
android:layout_width="52px"
android:layout_height="52px"
android:layout_height="fill_parent"
android:layout_weight="1"
android:paddingLeft="10px"
android:button="@drawable/btn_check"
@ -25,7 +25,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="100"
android:paddingLeft="10px"
android:paddingLeft="14px"
android:paddingRight="2px"
android:orientation="vertical">
<!-- task name -->

@ -201,8 +201,11 @@ button: add task & go to the edit page.
<!-- Menu: Help -->
<string name="FLA_menu_help">Help</string>
<!-- Create Shortcut Dialog -->
<string name="FLA_shortcut_dialog">Create Shortcut:</string>
<!-- Create Shortcut Dialog Title -->
<string name="FLA_shortcut_dialog_title">Create Shortcut</string>
<!-- Create Shortcut Dialog (asks to name shortcut) -->
<string name="FLA_shortcut_dialog">Name of shortcut:</string>
<!-- Search Label-->
<string name="FLA_search_label">Search For Tasks</string>

@ -6,6 +6,9 @@
<!-- Inbox Filter -->
<string name="BFE_Inbox">Inbox</string>
<!-- Inbox Filter -->
<string name="BFE_Inbox_title">Astrid: Inbox</string>
<!-- Completed Filter -->
<string name="BFE_Completed">Completed</string>

@ -32,12 +32,17 @@
<style name="TextAppearance.TAd_ItemTitle">
<item name="android:textSize">22sp</item>
<item name="android:textStyle">bold</item>
</style>
<style name="TextAppearance.TAd_ItemTitle_Completed" parent="TextAppearance.TAd_ItemTitle">
<item name="android:textColor">#ff555555</item>
</style>
<style name="TextAppearance.TAd_ItemTitle_Deleted" parent="TextAppearance.TAd_ItemTitle" />
<style name="TextAppearance.TAd_ItemTitle_Overdue" parent="TextAppearance.TAd_ItemTitle">
<item name="android:textStyle">bold</item>
</style>
<style name="TextAppearance.TAd_ItemDetails">
<item name="android:textSize">14sp</item>

@ -3,6 +3,7 @@
*/
package com.todoroo.astrid.activity;
import android.app.AlertDialog;
import android.app.ExpandableListActivity;
import android.app.SearchManager;
import android.content.BroadcastReceiver;
@ -10,18 +11,20 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.EditText;
import android.widget.ExpandableListView;
import android.widget.Toast;
import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
import android.widget.Toast;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R;
@ -272,7 +275,9 @@ public class FilterListActivity extends ExpandableListActivity {
menuItem = menu.add(0, CONTEXT_MENU_SHORTCUT, 0, R.string.FLA_context_shortcut);
Intent shortcutIntent = new Intent(this, TaskListActivity.class);
shortcutIntent.setAction(Intent.ACTION_VIEW);
shortcutIntent.putExtra(TaskListActivity.TOKEN_FILTER, filter);
shortcutIntent.putExtra(TaskListActivity.TOKEN_FILTER_TITLE, filter.title);
shortcutIntent.putExtra(TaskListActivity.TOKEN_FILTER_SQL, filter.sqlQuery);
shortcutIntent.putExtra(TaskListActivity.TOKEN_FILTER_VALUES, filter.valuesForNewTasks);
menuItem.setIntent(shortcutIntent);
}
@ -287,6 +292,46 @@ public class FilterListActivity extends ExpandableListActivity {
menu.setHeaderTitle(item.listingTitle);
}
/**
* Creates a shortcut on the user's home screen
*
* @param shortcutIntent
* @param label
*/
private void createShortcut(Filter filter, Intent shortcutIntent, String label) {
Bitmap bitmap;
if(filter.listingIcon == null)
bitmap = ((BitmapDrawable) getResources().getDrawable(
R.drawable.icon_tag)).getBitmap();
else {
// create icon by superimposing astrid w/ icon
bitmap = ((BitmapDrawable) getResources().getDrawable(
R.drawable.icon)).getBitmap();
bitmap = bitmap.copy(bitmap.getConfig(), true);
Canvas canvas = new Canvas(bitmap);
/*canvas.drawBitmap(filter.listingIcon, bitmap.getWidth() -
filter.listingIcon.getWidth(), bitmap.getHeight() -
filter.listingIcon.getHeight(), null);*/
canvas.save();
}
Intent createShortcutIntent = new Intent();
createShortcutIntent.putExtra(
Intent.EXTRA_SHORTCUT_INTENT,
shortcutIntent);
createShortcutIntent.putExtra(
Intent.EXTRA_SHORTCUT_NAME, label);
createShortcutIntent.putExtra(
Intent.EXTRA_SHORTCUT_ICON, bitmap);
createShortcutIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); //$NON-NLS-1$
sendBroadcast(createShortcutIntent);
Toast.makeText(
FilterListActivity.this,
getString(
R.string.FLA_toast_onCreateShortcut,
label), Toast.LENGTH_LONG).show();
}
@Override
public boolean onMenuItemSelected(int featureId, final MenuItem item) {
@ -306,37 +351,24 @@ public class FilterListActivity extends ExpandableListActivity {
ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo)item.getMenuInfo();
final Intent shortcutIntent = item.getIntent();
Filter filter = (Filter)info.targetView.getTag();
final Filter filter = (Filter)info.targetView.getTag();
String dialogText = getString(R.string.FLA_shortcut_dialog);
final EditText editText = new EditText(this);
editText.setText(filter.listingTitle);
dialogUtilities.viewDialog(this, dialogText, editText,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
String label = editText.getText().toString();
Intent createShortcutIntent = new Intent();
createShortcutIntent.putExtra(
Intent.EXTRA_SHORTCUT_INTENT,
shortcutIntent);
createShortcutIntent.putExtra(
Intent.EXTRA_SHORTCUT_NAME, label);
createShortcutIntent.putExtra(
Intent.EXTRA_SHORTCUT_ICON,
((BitmapDrawable) getResources().getDrawable(
R.drawable.icon_tag)).getBitmap());
createShortcutIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); //$NON-NLS-1$
sendBroadcast(createShortcutIntent);
Toast.makeText(
FilterListActivity.this,
getString(
R.string.FLA_toast_onCreateShortcut,
label), Toast.LENGTH_LONG).show();
}
}, null);
new AlertDialog.Builder(this)
.setTitle(R.string.FLA_shortcut_dialog_title)
.setMessage(R.string.FLA_shortcut_dialog)
.setView(editText)
.setIcon(android.R.drawable.ic_dialog_info)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
String label = editText.getText().toString();
createShortcut(filter, shortcutIntent, label);
}
})
.setNegativeButton(android.R.string.cancel, null)
.show();
return true;
}

@ -27,9 +27,9 @@ import java.util.List;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.TabActivity;
import android.app.TimePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.ContentValues;
import android.content.DialogInterface;
@ -45,6 +45,7 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
@ -60,22 +61,21 @@ import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import android.widget.ToggleButton;
import android.widget.AdapterView.OnItemSelectedListener;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R;
import com.timsu.astrid.data.enums.RepeatInterval;
import com.timsu.astrid.data.task.TaskModelForEdit;
import com.timsu.astrid.data.task.AbstractTaskModel.RepeatInfo;
import com.timsu.astrid.data.task.TaskModelForEdit;
import com.timsu.astrid.utilities.AstridUtilities;
import com.timsu.astrid.widget.NumberPicker;
import com.timsu.astrid.widget.NumberPickerDialog;
import com.timsu.astrid.widget.TimeDurationControlSet;
import com.timsu.astrid.widget.NumberPickerDialog.OnNumberPickedListener;
import com.timsu.astrid.widget.TimeDurationControlSet;
import com.timsu.astrid.widget.TimeDurationControlSet.TimeDurationType;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Property.IntegerProperty;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService;
@ -804,7 +804,7 @@ public final class TaskEditActivity extends TabActivity {
@Override
public void writeToModel() {
UrgencyValue item = urgencyAdapter.getItem(urgency.getSelectedItemPosition());
model.setValue(Task.DUE_DATE, item.dueDate);
model.setDueDateAndTime(new Date(item.dueDate), item.hasDueTime);
}
}
@ -826,6 +826,7 @@ public final class TaskEditActivity extends TabActivity {
public HideUntilControlSet(int hideUntil) {
this.hideUntil = (Spinner) findViewById(hideUntil);
this.hideUntil.setOnItemSelectedListener(this);
}
private ArrayAdapter<HideUntilValue> adapter;

@ -17,19 +17,19 @@ import android.database.Cursor;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.AdapterContextMenuInfo;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R;
@ -38,6 +38,7 @@ import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.utility.Pair;
@ -83,8 +84,18 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
// --- constants
/** token for passing a {@link Filter} object through extras */
public static final String TOKEN_FILTER = "filter"; //$NON-NLS-1$
/** token for passing a {@link Filter}'s title through extras */
public static final String TOKEN_FILTER_TITLE = "title"; //$NON-NLS-1$
/** token for passing a {@link Filter}'s sql through extras */
public static final String TOKEN_FILTER_SQL = "sql"; //$NON-NLS-1$
/** token for passing a {@link Filter}'s values for new tasks through extras */
public static final String TOKEN_FILTER_VALUES = "values"; //$NON-NLS-1$
// --- instance variables
@Autowired
@ -126,7 +137,15 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
Bundle extras = getIntent().getExtras();
if(extras != null && extras.containsKey(TOKEN_FILTER)) {
// probably launched from filter list activity
filter = extras.getParcelable(TOKEN_FILTER);
} else if(extras != null && extras.containsKey(TOKEN_FILTER_SQL)) {
// launched from desktop shortcut, must create a fake filter
String title = extras.getString(TOKEN_FILTER_TITLE);
String sql = extras.getString(TOKEN_FILTER_SQL);
ContentValues values = extras.getParcelable(TOKEN_FILTER_VALUES);
filter = new Filter("", "", title, new QueryTemplate(), values);
filter.sqlQuery = sql;
} else {
filter = CoreFilterExposer.buildInboxFilter(getResources());
}

@ -11,11 +11,11 @@ import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Paint;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnCreateContextMenuListener;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CursorAdapter;
import android.widget.LinearLayout;
@ -185,14 +185,14 @@ public class TaskAdapter extends CursorAdapter {
ViewHolder viewHolder = (ViewHolder)view.getTag();
// don't bother instantiating views if we're busy
if(isFling) {
/*if(isFling) {
viewHolder.details.removeViews(2, viewHolder.details.getChildCount() - 2);
viewHolder.dueDate.setVisibility(View.INVISIBLE);
viewHolder.nameView.setText(R.string.TAd_flingText);
viewHolder.importance.setVisibility(View.INVISIBLE);
viewHolder.completeBox.setVisibility(View.INVISIBLE);
return;
}
}*/
// name
final TextView nameView = viewHolder.nameView; {
@ -239,8 +239,9 @@ public class TaskAdapter extends CursorAdapter {
}
}
// other information - send out a request for it
final LinearLayout detailsView = viewHolder.details; {
// other information - send out a request for it (only if not fling)
final LinearLayout detailsView = viewHolder.details;
if(!isFling) {
detailsView.removeViews(2, detailsView.getChildCount() - 2);
if(detailCache.containsKey(task.getId())) {
ArrayList<TaskDetail> details = detailCache.get(task.getId());

@ -267,7 +267,7 @@ public final class Task extends AbstractModel {
* @param date
* @param hasDueTime
*/
public void setDueDate(Date dueDate, boolean hasDueTime) {
public void setDueDateAndTime(Date dueDate, boolean hasDueTime) {
if(!hasDueTime) {
dueDate.setHours(23);
dueDate.setMinutes(59);

@ -70,6 +70,7 @@ public class AstridDependencyInjector implements AbstractDependencyInjector {
// com.todoroo.android.utility
injectables.put("dialogUtilities", DialogUtilities.class);
injectables.put("informationDialogTitleResource", R.string.DLG_information_title);
injectables.put("confirmDialogTitleResource", R.string.DLG_confirm_title);
injectables.put("dateUtilities", DateUtilities.class);
injectables.put("yearsResource", R.plurals.DUt_years);
injectables.put("monthsResource", R.plurals.DUt_months);

Loading…
Cancel
Save