Merge and resolve conflicts from upstream/master

pull/14/head
Sam Bosley 12 years ago
commit f8a40cfbfd

@ -16,6 +16,7 @@
package com.todoroo.astrid.gtasks.auth;
import java.io.IOException;
import java.util.ArrayList;
import android.accounts.Account;
import android.accounts.AccountManager;
@ -28,6 +29,8 @@ import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import com.google.api.client.googleapis.extensions.android2.auth.GoogleAccountManager;
/**
* AuthManager keeps track of the current auth token for a user. The advantage
* over just passing around a String is that this class can renew the auth
@ -209,10 +212,12 @@ public class ModernAuthManager implements AuthManager {
}
public static String[] getAccounts(Activity activity) {
final Account[] accounts = AccountManager.get(activity).getAccountsByType("com.google"); //$NON-NLS-1$
String[] accountNames = new String[accounts.length];
for(int i = 0; i < accounts.length; i++)
accountNames[i] = accounts[i].name;
return accountNames;
GoogleAccountManager accountManager = new GoogleAccountManager(activity);
Account[] accounts = accountManager.getAccounts();
ArrayList<String> accountNames = new ArrayList<String>();
for (Account a : accounts) {
accountNames.add(a.name);
}
return accountNames.toArray(new String[accountNames.size()]);
}
}

@ -181,10 +181,8 @@ public class AstridOrderedListFragmentHelper<LIST> implements OrderedListFragmen
public TaskAdapter createTaskAdapter(TodorooCursor<Task> cursor,
AtomicReference<String> sqlQueryTemplate) {
int resource = Preferences.getBoolean(R.string.p_taskRowStyle, false) ?
R.layout.task_adapter_row_simple : R.layout.task_adapter_row;
taskAdapter = new DraggableTaskAdapter(fragment, resource,
taskAdapter = new DraggableTaskAdapter(fragment, TaskListFragment.getTaskRowResource(),
cursor, sqlQueryTemplate, false, null);
getTouchListView().setItemHightNormal(taskAdapter.computeFullRowHeight());

@ -123,7 +123,11 @@ public class OrderedMetadataListFragmentHelper<LIST> implements OrderedListFragm
}
public Property<?>[] taskProperties() {
ArrayList<Property<?>> properties = new ArrayList<Property<?>>(Arrays.asList(TaskAdapter.PROPERTIES));
Property<?>[] baseProperties = TaskAdapter.PROPERTIES;
if (Preferences.getIntegerFromString(R.string.p_taskRowStyle_v2, 0) == 2)
baseProperties = TaskAdapter.BASIC_PROPERTIES;
ArrayList<Property<?>> properties = new ArrayList<Property<?>>(Arrays.asList(baseProperties));
properties.add(updater.indentProperty());
properties.add(updater.orderProperty());
return properties.toArray(new Property<?>[properties.size()]);
@ -194,10 +198,8 @@ public class OrderedMetadataListFragmentHelper<LIST> implements OrderedListFragm
public TaskAdapter createTaskAdapter(TodorooCursor<Task> cursor,
AtomicReference<String> sqlQueryTemplate) {
int resource = Preferences.getBoolean(R.string.p_taskRowStyle, false) ?
R.layout.task_adapter_row_simple : R.layout.task_adapter_row;
taskAdapter = new DraggableTaskAdapter(fragment, resource,
taskAdapter = new DraggableTaskAdapter(fragment, TaskListFragment.getTaskRowResource(),
cursor, sqlQueryTemplate, false, null);
taskAdapter.addOnCompletedTaskListener(new OnCompletedTaskListener() {

@ -7,6 +7,8 @@ public class SubtasksTagUpdater extends SubtasksUpdater<TagData> {
@Override
protected String getSerializedTree(TagData list, Filter filter) {
if (list == null)
return "[]"; //$NON-NLS-1$
String order = list.getValue(TagData.TAG_ORDERING);
if (order == null || "null".equals(order)) //$NON-NLS-1$
order = "[]"; //$NON-NLS-1$

@ -16,7 +16,6 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.widget.EditText;
@ -78,8 +77,6 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE
contentValues);
if(!RemoteModel.NO_UUID.equals(tag.uuid)) {
filter.listingTitle += " (" + tag.count + ")";
if(tag.count == 0)
filter.color = Color.GRAY;
}
int deleteIntentLabel;

@ -0,0 +1,60 @@
<?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"
xmlns:astrid="http://schemas.android.com/apk/res/com.timsu.astrid"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="?attr/asTaskRowSelector"
android:orientation="horizontal">
<RelativeLayout
android:id="@+id/rowBody"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dip"
android:layout_marginBottom="10dip">
<com.todoroo.astrid.ui.CheckableImageView
android:id="@+id/completeBox"
android:layout_width="45dip"
android:layout_marginLeft="4dip"
android:layout_height="wrap_content"
android:minHeight="45dip"
android:scaleType="center"
android:gravity="center"
android:layout_centerVertical="true" />
<LinearLayout
android:id="@+id/task_row"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="52dip"
android:layout_marginRight="10dip"
android:layout_centerVertical="true"
android:orientation="horizontal"
android:gravity="center_vertical"
android:paddingLeft="4dip" >
<!-- task name -->
<TextView
android:id="@+id/title"
style="@style/TextAppearance.TAd_ItemTitle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="100"
android:gravity="center_vertical"
android:maxLines="2" />
<!-- due date -->
</LinearLayout>
</RelativeLayout>
</LinearLayout>

@ -330,10 +330,6 @@
<string name="EPr_ideaAuto_title">Ideas Tab automatisch laden</string>
<string name="EPr_ideaAuto_desc_enabled">Internetsuche für Ideas Tab wird ausgeführt, wenn Haken gesetzt ist</string>
<string name="EPr_ideaAuto_desc_disabled">Internetsuche für Ideas Tab wird nur durchgeführt, wenn vom Nutzer gewünscht</string>
<string name="EPr_task_row_style_title_simple">Zeilen-Stil: Einfach</string>
<string name="EPr_task_row_style_title_legacy">Zeilen-Stil: Original</string>
<string name="EPr_task_row_style_summary_simple">Titel auf eine Zeile begrenzen, Datum und Listen darunter</string>
<string name="EPr_task_row_style_summary_legacy">Titel auf zwei Zeilen begrenzen mit Datum rechts</string>
<string name="EPr_theme_title">Farbschema</string>
<string name="EPr_theme_desc">Momentan: %s</string>
<string name="EPr_theme_desc_unsupported">Einstellungen benötigen mindestens Android 2.0</string>

@ -364,10 +364,6 @@
<string name="EPr_ideaAuto_title">Auto cargar la pestaña Ideas</string>
<string name="EPr_ideaAuto_desc_enabled">La búsqueda para la pestaña Ideas se realizará cuando a la pestaña se le de clic</string>
<string name="EPr_ideaAuto_desc_disabled">La búsqueda para la pestaña Ideas se realizará solo cuando sea pedida manualmente</string>
<string name="EPr_task_row_style_title_simple">Tipo de renglón: Simple</string>
<string name="EPr_task_row_style_title_legacy">Tipo de renglón: Original</string>
<string name="EPr_task_row_style_summary_simple">Truncar el título a una línea con la fecha y listas debajo</string>
<string name="EPr_task_row_style_summary_legacy">Truncar el título a dos líneas con la fecha a la derecha</string>
<string name="EPr_theme_title">Combinación de colores</string>
<string name="EPr_theme_desc">Actualmente: %s</string>
<string name="EPr_theme_desc_unsupported">La configuración requiere Android 2.0+</string>

@ -339,10 +339,6 @@
<string name="EPr_ideaAuto_title">Charger automatiquement l\'onglet d\'idées</string>
<string name="EPr_ideaAuto_desc_enabled">Les recherches web pour l\'onglet d\'idées seront effectuées quand vous cliquerez sur l\'onglet</string>
<string name="EPr_ideaAuto_desc_disabled">Les recherches web pour l\'onglet d\'idées seront effectuées quand vous le demanderez</string>
<string name="EPr_task_row_style_title_simple">Style de ligne : simple</string>
<string name="EPr_task_row_style_title_legacy">Style de ligne : original</string>
<string name="EPr_task_row_style_summary_simple">Tronquer le titre en une ligne avec la date et les listes en dessous</string>
<string name="EPr_task_row_style_summary_legacy">Tronquer le titre en deux lignes avec la date sur la droite</string>
<string name="EPr_theme_title">Thème de couleur</string>
<string name="EPr_theme_desc">Actuellement : %s</string>
<string name="EPr_theme_desc_unsupported">Ce paramètre requiert Android 2.0+.</string>

@ -364,10 +364,6 @@
<string name="EPr_ideaAuto_title">아이디어 탭 자동 불러오기</string>
<string name="EPr_ideaAuto_desc_enabled">아이디어 탭의 웹 검색은 탭을 클릭했을 때 실행될 것입니다</string>
<string name="EPr_ideaAuto_desc_disabled">아이디어 탭의 웹 검색은 수동으로 요청했을 때만 실행될 것입니다</string>
<string name="EPr_task_row_style_title_simple">가로줄 스타일: 간단히</string>
<string name="EPr_task_row_style_title_legacy">가로줄 스타일: 원래대로</string>
<string name="EPr_task_row_style_summary_simple">제목을 한 줄로 줄이고 날짜와 목록을 그 아래에 출력</string>
<string name="EPr_task_row_style_summary_legacy">제목을 두 줄로 줄이고 날짜를 오른쪽에 출력</string>
<string name="EPr_theme_title">색상 테마</string>
<string name="EPr_theme_desc">현재: %s</string>
<string name="EPr_theme_desc_unsupported">설정은 안드로이드 2.0 이상이 필요합니다</string>

@ -347,10 +347,6 @@
<string name="EPr_ideaAuto_title">Auto-carregar aba de idéias</string>
<string name="EPr_ideaAuto_desc_enabled">As pesquisas Web serão feitas quando a aba for tocada</string>
<string name="EPr_ideaAuto_desc_disabled">As pesquisas Web somente serão feitas quando requisitadas manualmente</string>
<string name="EPr_task_row_style_title_simple">Estilo de linha: Simples</string>
<string name="EPr_task_row_style_title_legacy">Estilo de linha: Original</string>
<string name="EPr_task_row_style_summary_simple">Truncar título para uma única linha com data e lista abaixo</string>
<string name="EPr_task_row_style_summary_legacy">Truncar título para duas linhas com data à direita</string>
<string name="EPr_theme_title">Tema</string>
<string name="EPr_theme_desc">Atualmente: %s</string>
<string name="EPr_theme_desc_unsupported">Esta opção requer Android 2.0+</string>

@ -364,10 +364,6 @@
<string name="EPr_ideaAuto_title">Автозагрузка закладки Идеи</string>
<string name="EPr_ideaAuto_desc_enabled">Веб-поиск для закладки Идеи будет выполняться при нажатии на закладку</string>
<string name="EPr_ideaAuto_desc_disabled">Веб-поиск для закладки Идеи будет выполняться только при вызове вручную</string>
<string name="EPr_task_row_style_title_simple">Стиль пункта: Простой</string>
<string name="EPr_task_row_style_title_legacy">Стиль пункта: Оригинальный</string>
<string name="EPr_task_row_style_summary_simple">Сократить заголовок до одной строки с указанием даты и списков ниже</string>
<string name="EPr_task_row_style_summary_legacy">Сократить заголовок до двух строк с указанием даты справа</string>
<string name="EPr_theme_title">Цветовая тема</string>
<string name="EPr_theme_desc">Текущая: %s</string>
<string name="EPr_theme_desc_unsupported">Настройка требует Android 2.0+</string>

@ -346,8 +346,6 @@
<string name="EPr_ideaAuto_title">Fikirleri Kendiliğinden-Yükle Sekmesi</string>
<string name="EPr_ideaAuto_desc_enabled">Fikirler için olan aramalar sekmesi, sekme tıklandığında belirecek</string>
<string name="EPr_ideaAuto_desc_disabled">Fikirler için olan aramalar sekmesi, yalnızca kullanıcı isteğiyle belirecek</string>
<string name="EPr_task_row_style_title_simple">Sıralama biçimi: Basit</string>
<string name="EPr_task_row_style_title_legacy">Sıralama biçimi: Özgün</string>
<string name="EPr_theme_title">Renk Teması</string>
<string name="EPr_theme_desc">Geçerli: %s</string>
<string name="EPr_theme_desc_unsupported">Ayarlar için Android 2.0+ zorunludur.</string>

@ -328,10 +328,6 @@
<string name="EPr_ideaAuto_title">自动加载意见选项标签</string>
<string name="EPr_ideaAuto_desc_enabled">点击标签后,网页将会搜索意见选项。</string>
<string name="EPr_ideaAuto_desc_disabled">只有手动请求后,网页将会搜索意见选项。</string>
<string name="EPr_task_row_style_title_simple">列表布局:简单</string>
<string name="EPr_task_row_style_title_legacy">列表布局:原始</string>
<string name="EPr_task_row_style_summary_simple">截取标题为一行,并在下方显示日期和列表</string>
<string name="EPr_task_row_style_summary_legacy">截取标题至两行,并在右边显示日期</string>
<string name="EPr_theme_title">主题</string>
<string name="EPr_theme_desc">当前:%s</string>
<string name="EPr_theme_desc_unsupported">该设置需要 Android 2.0+</string>

@ -328,10 +328,6 @@
<string name="EPr_ideaAuto_title">自動加載意見選項標籤</string>
<string name="EPr_ideaAuto_desc_enabled">點擊標籤後,網頁將會搜索意見選項。</string>
<string name="EPr_ideaAuto_desc_disabled">只有手動請求後,網頁將會搜索意見選項。</string>
<string name="EPr_task_row_style_title_simple">列表佈局:簡單</string>
<string name="EPr_task_row_style_title_legacy">列表佈局:原始</string>
<string name="EPr_task_row_style_summary_simple">截取標題為一行,並在下方顯示日期和列表</string>
<string name="EPr_task_row_style_summary_legacy">截取標題至兩行,並在右邊顯示日期</string>
<string name="EPr_theme_title">主題</string>
<string name="EPr_theme_desc">目前設定: %s</string>
<string name="EPr_theme_desc_unsupported">該設置需要 Android 2.0+</string>

@ -217,7 +217,13 @@
<!-- ======================================================= APPEARANCE == -->
<string name="p_fontSize">font_size</string>
<string name="p_taskRowStyle">p_taskRowStyle</string>
<string name="p_taskRowStyle">p_taskRowStyle</string> <!-- DEPRECATED -->
<string name="p_taskRowStyle_v2">p_taskRowStyle_v2</string>
<string-array name="EPr_task_row_style_values">
<item>0</item>
<item>1</item>
<item>2</item>
</string-array>
<string name="p_showNotes">notesVisible</string>
<string name="p_beastMode">beastMode</string>
<string name="p_transparent_deprecated">transparent</string>

@ -707,10 +707,20 @@
<string name="EPr_ideaAuto_desc_disabled">Web searches for ideas tab will be performed only when manually requested</string>
<!-- Preferences: task row style -->
<string name="EPr_task_row_style_title_simple">Row style: Simple</string>
<string name="EPr_task_row_style_title_legacy">Row style: Original</string>
<string name="EPr_task_row_style_summary_simple">Truncate title to one line with date and lists below</string>
<string name="EPr_task_row_style_summary_legacy">Truncate title to two lines with date on right</string>
<string-array name="EPr_task_row_styles">
<item>Original</item>
<item>Simple</item>
<item>Title only</item>
</string-array>
<string-array name="EPr_task_row_style_descriptions">
<item>Truncate title to two lines with date on right</item>
<item>Truncate title to one line with date and lists below</item>
<item>Single line title only</item>
</string-array>
<!-- task row style title (%s -> style) -->
<string name="EPr_task_row_style_title">Row style: %s</string>
<!-- Preference: custom filters enabled -->
<string name="EPr_use_filters_title">Use filters</string>

@ -49,9 +49,10 @@
android:title="@string/EPr_fontSize_title"
android:summary="@string/EPr_fontSize_desc" />
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:key="@string/p_taskRowStyle"
android:defaultValue="false"/>
<com.todoroo.astrid.ui.MultilineListPreference
android:key="@string/p_taskRowStyle_v2"
android:entries="@array/EPr_task_row_styles"
android:entryValues="@array/EPr_task_row_style_values" />
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:key="@string/p_fullTaskTitle"

@ -253,7 +253,7 @@ public class EditPreferences extends TodorooPreferenceActivity {
}
preference = screen.findPreference(getString(R.string.p_showNotes));
preference.setEnabled(!Preferences.getBoolean(R.string.p_taskRowStyle, false));
preference.setEnabled(Preferences.getIntegerFromString(R.string.p_taskRowStyle_v2, 0) == 0);
removeForbiddenPreferences(screen, r);
}
@ -500,14 +500,18 @@ public class EditPreferences extends TodorooPreferenceActivity {
}
preference.setTitle(title);
preference.setSummary(summary);
} else if (r.getString(R.string.p_taskRowStyle).equals(preference.getKey())) {
if (value != null && !(Boolean)value) {
preference.setTitle(R.string.EPr_task_row_style_title_legacy);
preference.setSummary(R.string.EPr_task_row_style_summary_legacy);
} else {
preference.setTitle(R.string.EPr_task_row_style_title_simple);
preference.setSummary(R.string.EPr_task_row_style_summary_simple);
} else if (r.getString(R.string.p_taskRowStyle_v2).equals(preference.getKey())) {
try {
Integer valueInt = Integer.parseInt((String) value);
String[] titles = getResources().getStringArray(R.array.EPr_task_row_styles);
String[] descriptions = getResources().getStringArray(R.array.EPr_task_row_style_descriptions);
preference.setTitle(getString(R.string.EPr_task_row_style_title, titles[valueInt]));
preference.setSummary(descriptions[valueInt]);
} catch (Exception e) {
//
}
preference.setOnPreferenceChangeListener(new SetResultOnPreferenceChangeListener(RESULT_CODE_PERFORMANCE_PREF_CHANGED) {
@Override
public boolean onPreferenceChange(Preference p, Object newValue) {
@ -515,7 +519,14 @@ public class EditPreferences extends TodorooPreferenceActivity {
StatisticsService.reportEvent(StatisticsConstants.PREF_CHANGED_PREFIX + "row-style", //$NON-NLS-1$
"changed-to", valueString); //$NON-NLS-1$
Preference notes = findPreference(getString(R.string.p_showNotes));
notes.setEnabled(!(Boolean) newValue);
Preference fullTitle = findPreference(getString(R.string.p_fullTaskTitle));
try {
int newValueInt = Integer.parseInt((String) newValue);
fullTitle.setEnabled(newValueInt != 2);
notes.setEnabled(newValueInt == 0);
} catch (Exception e) {
e.printStackTrace();
}
return super.onPreferenceChange(p, newValue);
};
});
@ -736,6 +747,7 @@ public class EditPreferences extends TodorooPreferenceActivity {
findPreference(getString(R.string.p_showNotes)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
updatePreferences(preference, newValue);
StatisticsService.reportEvent(StatisticsConstants.PREF_SHOW_NOTES_IN_ROW, "enabled", newValue.toString()); //$NON-NLS-1$
return true;
}
@ -744,6 +756,7 @@ public class EditPreferences extends TodorooPreferenceActivity {
findPreference(getString(R.string.p_fullTaskTitle)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
updatePreferences(preference, newValue);
StatisticsService.reportEvent(StatisticsConstants.PREF_CHANGED_PREFIX + "full-title", "full-title", newValue.toString()); //$NON-NLS-1$ //$NON-NLS-2$
return true;
}

@ -880,11 +880,22 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
syncActionHelper.request();
}
public static int getTaskRowResource() {
int rowStyle = Preferences.getIntegerFromString(R.string.p_taskRowStyle_v2, 0);
switch(rowStyle) {
case 1:
return R.layout.task_adapter_row_simple;
case 2:
return R.layout.task_adapter_row_title_only;
case 0:
default:
return R.layout.task_adapter_row;
}
}
protected TaskAdapter createTaskAdapter(TodorooCursor<Task> cursor) {
int resource = Preferences.getBoolean(R.string.p_taskRowStyle, false) ?
R.layout.task_adapter_row_simple : R.layout.task_adapter_row;
return new TaskAdapter(this, resource,
return new TaskAdapter(this, getTaskRowResource(),
cursor, sqlQueryTemplate, false,
new OnCompletedTaskListener() {
@Override
@ -924,6 +935,8 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
}
public Property<?>[] taskProperties() {
if (Preferences.getIntegerFromString(R.string.p_taskRowStyle_v2, 0) == 2)
return TaskAdapter.BASIC_PROPERTIES;
return TaskAdapter.PROPERTIES;
}

@ -52,6 +52,7 @@ import com.todoroo.astrid.api.FilterCategory;
import com.todoroo.astrid.api.FilterCategoryWithNewButton;
import com.todoroo.astrid.api.FilterListHeader;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import com.todoroo.astrid.api.FilterWithUpdate;
import com.todoroo.astrid.helper.AsyncImageView;
import com.todoroo.astrid.service.MarketStrategy.NookMarketStrategy;
@ -538,14 +539,22 @@ public class FilterAdapter extends ArrayAdapter<Filter> {
}
// title / size
int countInt = -1;
if(filterCounts.containsKey(filter) || filter.listingTitle.matches(".* \\(\\d+\\)$")) { //$NON-NLS-1$
viewHolder.size.setVisibility(View.VISIBLE);
String count;
if (filterCounts.containsKey(filter)) {
count = filterCounts.get(filter).toString();
Integer c = filterCounts.get(filter);
countInt = c;
count = c.toString();
} else {
count = filter.listingTitle.substring(filter.listingTitle.lastIndexOf('(') + 1,
filter.listingTitle.length() - 1);
try {
countInt = Integer.parseInt(count);
} catch (NumberFormatException e) {
//
}
}
viewHolder.size.setText(count);
@ -560,8 +569,12 @@ public class FilterAdapter extends ArrayAdapter<Filter> {
} else {
viewHolder.name.setText(filter.listingTitle);
viewHolder.size.setVisibility(View.GONE);
countInt = -1;
}
if(countInt == 0 && filter instanceof FilterWithCustomIntent)
viewHolder.name.setTextColor(Color.GRAY);
viewHolder.name.getLayoutParams().height = (int) (58 * metrics.density);
if(!nook && filter instanceof FilterWithUpdate) {
viewHolder.urlImage.setVisibility(View.VISIBLE);
@ -574,7 +587,7 @@ public class FilterAdapter extends ArrayAdapter<Filter> {
params.setMargins((int) (8 * metrics.density), 0, 0, 0);
}
if(filter.color != 0)
if (filter.color != 0)
viewHolder.name.setTextColor(filter.color);
// selection

@ -35,6 +35,7 @@ import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.TextUtils.TruncateAt;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
@ -143,6 +144,17 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
TAGS // Concatenated list of tags
};
public static final Property<?>[] BASIC_PROPERTIES = new Property<?>[] {
Task.ID,
Task.TITLE,
Task.FLAGS,
Task.IMPORTANCE,
Task.RECURRENCE,
Task.COMPLETION_DATE,
Task.HIDE_UNTIL,
Task.DELETION_DATE
};
public static int[] IMPORTANCE_RESOURCES = new int[] {
R.drawable.importance_check_1,
R.drawable.importance_check_2,
@ -202,6 +214,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
protected final DisplayMetrics displayMetrics;
private final boolean simpleLayout;
private final boolean titleOnlyLayout;
protected final int minRowHeight;
// --- task detail and decoration soft caches
@ -229,6 +242,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
this.query = query;
this.resource = resource;
this.titleOnlyLayout = resource == R.layout.task_adapter_row_title_only;
this.fragment = fragment;
this.resources = fragment.getResources();
this.onCompletedTaskListener = onCompletedTaskListener;
@ -260,7 +274,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
protected int computeMinRowHeight() {
DisplayMetrics metrics = resources.getDisplayMetrics();
if (simpleLayout) {
if (simpleLayout || titleOnlyLayout) {
return (int) (metrics.density * 40);
} else {
return (int) (metrics.density * 45);
@ -277,15 +291,17 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
}
private void startDetailThread() {
if (Preferences.getBoolean(R.string.p_showNotes, false) && !simpleLayout) {
if (Preferences.getBoolean(R.string.p_showNotes, false) && !simpleLayout && !titleOnlyLayout) {
detailLoader = new DetailLoaderThread();
detailLoader.start();
}
}
private void startTaskActionsThread() {
actionsLoader = new ActionsLoaderThread();
actionsLoader.start();
if (!titleOnlyLayout) {
actionsLoader = new ActionsLoaderThread();
actionsLoader.start();
}
}
/* ======================================================================
@ -336,13 +352,17 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
boolean showFullTaskTitle = Preferences.getBoolean(R.string.p_fullTaskTitle, false);
boolean showNotes = Preferences.getBoolean(R.string.p_showNotes, false);
if (showFullTaskTitle) {
if (showFullTaskTitle && !titleOnlyLayout) {
viewHolder.nameView.setMaxLines(Integer.MAX_VALUE);
viewHolder.nameView.setSingleLine(false);
viewHolder.nameView.setEllipsize(null);
} else if (titleOnlyLayout) {
viewHolder.nameView.setMaxLines(1);
viewHolder.nameView.setSingleLine(true);
viewHolder.nameView.setEllipsize(TruncateAt.END);
}
if (showNotes && !simpleLayout) {
if (showNotes && !simpleLayout && !titleOnlyLayout) {
RelativeLayout.LayoutParams taskRowParams = (RelativeLayout.LayoutParams)viewHolder.taskRow.getLayoutParams();
taskRowParams.addRule(RelativeLayout.CENTER_VERTICAL, 0);
}
@ -355,7 +375,8 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
viewHolder.details1.setTag(viewHolder);
// add UI component listeners
addListeners(view);
if (!titleOnlyLayout)
addListeners(view);
return view;
}
@ -366,15 +387,18 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
TodorooCursor<Task> cursor = (TodorooCursor<Task>)c;
ViewHolder viewHolder = ((ViewHolder)view.getTag());
viewHolder.isTaskRabbit = (cursor.get(TASK_RABBIT_ID) > 0);
viewHolder.tagsString = cursor.get(TAGS);
if (!titleOnlyLayout) {
viewHolder.isTaskRabbit = (cursor.get(TASK_RABBIT_ID) > 0);
viewHolder.tagsString = cursor.get(TAGS);
}
Task task = viewHolder.task;
task.clear();
task.readFromCursor(cursor);
setFieldContentsAndVisibility(view);
setTaskAppearance(viewHolder, task);
if (!titleOnlyLayout)
setTaskAppearance(viewHolder, task);
}
/**
@ -407,7 +431,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
public synchronized void setFieldContentsAndVisibility(View view) {
ViewHolder viewHolder = (ViewHolder)view.getTag();
Task task = viewHolder.task;
if (fontSize < 16) {
if (fontSize < 16 || titleOnlyLayout) {
viewHolder.rowBody.setMinimumHeight(0);
viewHolder.completeBox.setMinimumHeight(0);
} else {
@ -432,6 +456,11 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
nameView.setText(nameValue);
}
if (titleOnlyLayout) {
setupCompleteBox(viewHolder);
return;
}
float dueDateTextWidth = setupDueDateAndTags(viewHolder, task);
String details;
@ -543,31 +572,35 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
viewHolder.completeBox.setOnTouchListener(otl);
viewHolder.completeBox.setOnClickListener(completeBoxListener);
viewHolder.picture.setOnTouchListener(otl);
viewHolder.picture.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
viewHolder.completeBox.performClick();
}
});
if (viewHolder.picture != null) {
viewHolder.picture.setOnTouchListener(otl);
viewHolder.picture.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
viewHolder.completeBox.performClick();
}
});
}
viewHolder.taskActionContainer.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
TaskAction action = (TaskAction) viewHolder.taskActionIcon.getTag();
if (action instanceof NotesAction) {
showEditNotesDialog(viewHolder.task);
} else if (action instanceof FilesAction) {
showFilesDialog(viewHolder.task);
} else if (action != null) {
try {
action.intent.send();
} catch (CanceledException e) {
// Oh well
if (viewHolder.taskActionContainer != null) {
viewHolder.taskActionContainer.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
TaskAction action = (TaskAction) viewHolder.taskActionIcon.getTag();
if (action instanceof NotesAction) {
showEditNotesDialog(viewHolder.task);
} else if (action instanceof FilesAction) {
showFilesDialog(viewHolder.task);
} else if (action != null) {
try {
action.intent.send();
} catch (CanceledException e) {
// Oh well
}
}
}
}
});
});
}
}
private void showEditNotesDialog(final Task task) {
@ -1124,7 +1157,14 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
}
}
// complete box
setupCompleteBox(viewHolder);
}
private void setupCompleteBox(ViewHolder viewHolder) {
// complete box
final Task task = viewHolder.task;
final AsyncImageView pictureView = viewHolder.picture;
final CheckableImageView checkBoxView = viewHolder.completeBox; {
checkBoxView.setChecked(task.isCompleted());
// disable checkbox if task is readonly
@ -1138,6 +1178,8 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
} else {
checkBoxView.setImageResource(IMPORTANCE_RESOURCES[value]);
}
if (titleOnlyLayout)
return;
if (checkBoxView.isChecked()) {
if (pictureView != null)
@ -1154,7 +1196,6 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
checkBoxView.setVisibility(View.VISIBLE);
}
}
}
// Returns due date text width

@ -185,6 +185,8 @@ public final class UpgradeService {
Preferences.setInt(AstridPreferences.P_UPGRADE_FROM, from);
inlineUpgrades(context, from); // Migrations that are short or don't require launching a separate activity
if(from < maxWithUpgrade) {
Intent upgrade = new Intent(context, UpgradeActivity.class);
upgrade.putExtra(UpgradeActivity.TOKEN_FROM_VERSION, from);
@ -260,6 +262,17 @@ public final class UpgradeService {
}
}
private void inlineUpgrades(Context context, int from) {
if (from < V4_5_1) {
String key = context.getString(R.string.p_taskRowStyle);
if (Preferences.isSet(key)) {
boolean value = Preferences.getBoolean(key, false);
Preferences.clear(key);
Preferences.setString(R.string.p_taskRowStyle_v2, value ? "1" : "0"); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
/**
* Return a change log string. Releases occur often enough that we don't
* expect change sets to be localized.
@ -278,6 +291,13 @@ public final class UpgradeService {
Preferences.clear(AstridPreferences.P_UPGRADE_FROM);
StringBuilder changeLog = new StringBuilder();
if (from >= V4_5_0 && from < V4_5_1) {
newVersionString(changeLog, "4.5.1 (1/15/13)", new String[] {
"New 'Titles only' style option for task lists (Settings > Appearance > Task row appearance)",
"Bug and crash fixes"
});
}
if (from < V4_5_0) {
newVersionString(changeLog, "4.5.0 (12/19/12)", new String[] {
"Several interface and usability enhancements",

@ -143,8 +143,13 @@ public class ABTests {
public static final String AB_USE_DATE_SHORTCUTS = "android_use_date_shortcuts_v2"; //$NON-NLS-1$
public static final String AB_TITLE_ONLY = "android_title_only"; //$NON-NLS-1$
private void initialize() {
addTest(AB_USE_DATE_SHORTCUTS, new int[] { 1, 1 },
new int[] { 1, 9 }, new String[] { "date-shortcuts-off", "date-shortcuts-on" }, false); //$NON-NLS-1$ //$NON-NLS-2$
addTest(AB_TITLE_ONLY, new int[] { 9, 1 },
new int[] { 1, 0 }, new String[] { "default-row-style", "title-only-style" }, false); //$NON-NLS-1$//$NON-NLS-2$
}
}

@ -117,8 +117,6 @@ public class AstridDefaultPreferenceSpec extends AstridPreferenceSpec {
setPreference(prefs, editor, r, R.string.p_show_menu_sort, true, ifUnset);
setPreference(prefs, editor, r, R.string.p_show_menu_addons, true, ifUnset);
setPreference(prefs, editor, r, R.string.p_taskRowStyle, false, ifUnset);
setPreference(prefs, editor, r, R.string.p_calendar_reminders, true, ifUnset);
setPreference(prefs, editor, r, R.string.p_use_filters, true, ifUnset);
@ -136,6 +134,9 @@ public class AstridDefaultPreferenceSpec extends AstridPreferenceSpec {
setPreference(prefs, editor, r, R.string.p_show_task_edit_comments, true, ifUnset);
setPreference(prefs, editor, r, R.string.p_taskRowStyle_v2,
ABChooser.readChoiceForTest(ABTests.AB_TITLE_ONLY) == 0 ? "0" : "2", ifUnset); //$NON-NLS-1$ //$NON-NLS-2$
setPreference(prefs, editor, r, R.string.p_use_date_shortcuts,
ABChooser.readChoiceForTest(ABTests.AB_USE_DATE_SHORTCUTS) != 0, ifUnset);

@ -91,8 +91,6 @@ public class AstridLitePreferenceSpec extends AstridPreferenceSpec {
setPreference(prefs, editor, r, R.string.p_ideas_tab_enabled, false, ifUnset);
setPreference(prefs, editor, r, R.string.p_autoIdea, false, ifUnset);
setPreference(prefs, editor, r, R.string.p_taskRowStyle, true, ifUnset);
setPreference(prefs, editor, r, R.string.p_calendar_reminders, true, ifUnset);
setPreference(prefs, editor, r, R.string.p_use_filters, false, ifUnset);
@ -122,6 +120,8 @@ public class AstridLitePreferenceSpec extends AstridPreferenceSpec {
setPreference(prefs, editor, r, R.string.p_show_task_edit_comments, false, ifUnset);
setPreference(prefs, editor, r, R.string.p_taskRowStyle_v2, "2", ifUnset); //$NON-NLS-1$
setPreference(prefs, editor, r, R.string.p_use_date_shortcuts, false, ifUnset);
extras.setExtras(context, prefs, editor, r, ifUnset);

Loading…
Cancel
Save