From f781da3daf2547d3c44d856684df6e7d9c13ea58 Mon Sep 17 00:00:00 2001 From: "nemo.nihil" Date: Wed, 20 May 2009 01:46:04 +0000 Subject: [PATCH] Tag List shows the number of [Untagged] tasks (doesn't show if there are zero). Task List (when filtered by Tag/accessed through Tag List) can show all Untagged tasks. Added an entry 'tagList_untagged' in strings.xml under the <--Tag List--> section, for multiple language support. Next steps: -Tag List context menu on the [Untagged] category shows some inapplicable commands, e.g. delete this tag. -Making a new Task from the [Untagged] Task List auto-fills in the first Tag field of the task -- it should be blank. --- .classpath | 16 +- res/values-de/strings.xml | 1 + res/values-ja/strings.xml | 416 ++++++++++++++++++ res/values-nn/strings.xml | 414 +++++++++++++++++ res/values-zh/strings.xml | 415 +++++++++++++++++ res/values/strings.xml | 1 + .../astrid/activities/TagListSubActivity.java | 24 +- .../activities/TaskListSubActivity.java | 23 +- .../timsu/astrid/data/tag/TagController.java | 43 +- .../astrid/data/tag/TagModelForView.java | 30 +- 10 files changed, 1362 insertions(+), 21 deletions(-) create mode 100644 res/values-ja/strings.xml create mode 100644 res/values-nn/strings.xml create mode 100644 res/values-zh/strings.xml diff --git a/.classpath b/.classpath index 63aa76a37..e55760e3e 100644 --- a/.classpath +++ b/.classpath @@ -1,8 +1,8 @@ - - - - - - - - + + + + + + + + diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 28ddc4241..39fb928c4 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -236,6 +236,7 @@ Wenn Du die neue Aufgabe nicht gleich nach der Fertigstellung der alten sehen wi Verknüpfung erstellen Verknüpfung wurde auf der Startseite erstellt! Tag: + -- Not tagged -- Sortiere alphabetisch Sortiere nach Größe diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml new file mode 100644 index 000000000..ba7651a11 --- /dev/null +++ b/res/values-ja/strings.xml @@ -0,0 +1,416 @@ + + + + + Astrid + + + + + + !!!! + !!! + !! + ! + + + 毎日 + 毎週 + 毎月 + 毎時 + + + + 1 タスク + %d タスク + + + %d / %d 有効 + %d / %d 有効 + + + 1 アラーム + 2 アラーム + %d アラーム + + + 1 タグ + %d タグ + + + + MMM d + + + + 1 日 + %d 日 + + + 1 時 + %d 時 + + + 1 分 + %d 分 + + + 1 秒 + %d 秒 + + + 1 時 + %d 時 + + + 1 分 + %d 分 + + + 1 秒 + %d 秒 + + + + + + + Astrid: + Tagged \"%s\": + 非表示 + 新規タスク + Could Not Find Requested Tag! + + + + 予定日まで + 予定日 + 目標 + 遅延 + 完了 + 概要: + 経過: + 通知周期 + 繰り返し周期 + 次のアラーム: + タグ: + メモ: + 登録: + + + 追加 + タグ + 表示 + 同期 + More + 同期 + 設定 + ヘルプ (ブラウザで開く) + Astridの概要! + ヒント + Clean Up Old Tasks + + タスク編集 + タスク削除 + タイマースタート + タイマーストップ + 延期 + + + ソート/フィルター + 隠し/処理待ちタスク + 完了したタスク + タグ \'%s\' + オートソート + 名前順 + 予定日順 + 逆順 + + Select an Action: + Times You\'ve Postponed: %d + どの程度の期間延期しますか? + "Delete completed tasks older than # days:" + + + + + + Astrid: タスク編集中 + Astrid: 編集中 + Astrid: 新規タスク + + + 基本情報 + 日付 + アラート + + + 概要 + タスクの説明 + どれくらい重要? + タグ: + + 所要時間は? + 既にタスクに費やした時間 + 期限 + 目標日時 + カレンダーにタスクを追加 + カレンダーのイベントを開く + この日時まで隠す + 繰り返し周期 + 繰り返しはしない + このタスクが処理されるまで隠す + メモ + メモをここに入力します... + + リマインダー + 周期 + 以下の場合通知する... + 期限が近づいたとき + 期限になったとき + 期限を過ぎた後 + タスクを確認するまで停止しない + 日時指定リマインダー + リマインダーの追加 + + + 時間 (時:分) + リマインダーの周期 + 繰り返し周期 (0で無効化) + ヘルプ: Astridの繰り返しについて + +繰り返しを使うために、上記の期限のうちの少なくとも1つを決めてください。あなたがこのタスクを完了したタイミングで、期限は自動的に繰り越されます。 +\n\n +もしあなたが現在のタスクを消化し終えるまで次回のタスクを見たくないならば、「〜まで隠す」の項目を使って自動的に繰り越すべきです。 +\n + + もうヘルプを表示しない + + + 保存 + 破棄 + 編集 + 削除 + 指定する + タイマースタート + タイマーストップ + + 保存 + Task Saved: due in %s + Task Saved + + + + + Astridより... + + + + Astrid: タグビュー: + タグを使ってタスク生成 + タグ編集 + タグ削除 + ホームページを表示 + ホームページを隠す + Create Shortcut + Shortcut created on your home screen! + Tag: + -- Not tagged -- + + A-Z順 + サイズ順 + + + + + 同期サービス + アクション + オプション + sync_rtm + Remember The Milk + http://www.rememberthemilk.com + sync_every + 同期する頻度 + 指定した場合、#時間毎に同期処理を実行します + sync_button + メインメニューへのショートカット + Astridのメニューの中に\"Synchronize\"を表示します + sync_dialogs + ダイアログの非表示 + 同期処理の結果ダイアログを表示しない + sync_background + バッググラウンドで + 簡易同期 + 同期エラー発生! ご迷惑をおかけします! エラー内容: + +同期処理を行うため、あなたの%sアカウントを使ってログインし、Astridにあなたのデータの読み込み許可を与えてください。 +\n\n +終了したら、Astridを再起動してからこの画面に戻ってきてください。 + + +AstridのRTM同期機能へようこそ! +\n\n +同期しないもの:\n +- 通知と繰り返し\n +- RTMで、消した、またはリネームして移動したタスク\n +\n +幸運を!\n + + 今すぐ同期する! + 個人データをクリアする + 選択されたサービスのデータをクリアしますか? + 同期機能が有効になっていません! + + + + Loading... + Updating List... + インフォメーション + 質問 + タスク確認 + 既に完了しています! + スヌーズ + 終了 + スヌーズのための時/分は? + + 削除 + このタスクを削除しますか? + すべてのタスクからこのタグを削除しますか? + + タイマーをストップしますか? + + +Astridについて知らないかもしれないいくつかのこと:\n +\n +-タスクをつくるためには、ちょっと入力するだけです!\n +-タスクを編集している時は、戻るボタンを押すことで保存できます。\n +-素早く優先順位を変えるには、1から4のキーを押してタスクを選択してください。\n +-タスクに期限があるならば、それを延長するために、長押ししてください。\n +\n +Astridを利用してくれてありがとう!\n + + + + + + + 期限! + 目標日時! + タイマー実行中: + + + + + この項目が見つかりませんでした: + 保存できませんでした: + + + + + 通知 + + notif_qstart + 静かにする時間の始まり + Astridが静かにすべき時間の始まり (例:22時) + + notif_qend + 静かにする時間の終わり + Astridが静かにすべき時間の終わり (例:08時) + + notif_default_reminder + 標準リマインダー + For new tasks, in days (i.e. 7). Blank to disable + + notif_annoy + 継続モード + チェックしたなら、それをクリアする前にリマインダーを見なければなりません。(LEDもね) + + notification_ringtone + 通知音 + Astridのアラート音を選択 + + notif_theme + 通知アイコン + Astridの通知用アイコンを選択 + + 外観 + + 色分け + 色分けしたタスクリスト + 優先順位毎に色分け + + font_size + タスクリストのフォントサイズ + メイン画面のフォントサイズ (例:サイズ22) + + その他 + nagging + Nag Messages + Show Astrid\'s comments when viewing reminders and postponing tasks? + + + deadline_time + 期限の初期値 + 新しい期限を設定するための現在からの日数 # + + 表示する項目 + タスクリストの内表示する項目を選択 + + + titleVisible + タスク名 + タスクの説明 + true + deadlineVisible + 日付 + 次の期限 / 完了日 + true + timeVisible + 時間 + 予定日と経過時間 + true + importanceVisible + 重要性 + タスクの重要度 + true + tagsVisible + タグ + このタスクの関連タグ + true + repeatVisible + 繰り返し + タスクの繰り返し情報 + true + reminderVisible + リマインダー + このタスクにリマインダーが設定されていれば表示される + false + notesVisible + メモ + このタスクの関連メモ + false + diff --git a/res/values-nn/strings.xml b/res/values-nn/strings.xml new file mode 100644 index 000000000..e1977f39b --- /dev/null +++ b/res/values-nn/strings.xml @@ -0,0 +1,414 @@ + + + + + Astrid + + + + + + !!!! + !!! + !! + ! + + + Dag(er) + Uke(r) + Månede(r) + Time(r) + + + + 1 oppgave + %d oppgaver + + + %d / %d aktive + %d / %d aktive + + + En alarm + To alarmer + %d alarmer + + + 1 tagg + %d tagger + + + + d. MMM + D\na\ny\ns + H\no\nu\nr\ns + + 1 dag + %d dager + + + 1 time + %d timer + + + 1 minutt + %d minutter + + + 1 sekund + %d sekunder + + + 1t + %dt + + + 1m + %dm + + + 1s + %ds + + siden + + + + + Astrid: + Tagget \"%s\": + skjult + Ny oppgave + Fant ikke forespurt tagg! + + + S + Utløper + Utløper på + Mål + Forfaller ved + Fullført + Estimert: + Tid brukt: + Påminnelse hver + Gjentas Hver + Neste Alarm: + Tagger: + Notater: + Opprettet: + Slettet + + + Legg Til + Tagger + Visning + Synk + Mer + Synkronisering + Instillinger + Hjelp (åpner i nettleser) + Ta Astrid\'s brukerundersøkelse! + Småtips + Rydd opp gamle oppgaver + + Rediger Oppgave + Slett Oppgave + Start Tidtaker + Stopp Tidtaker + Utsett + + + Sortering/filtre + Skjulte/blokkerte oppgaver + Fullførte oppgaver + Taggede \'%s\' + Sorter automatisk + Sorter på navn + Sorter på utløpsdato + Reversert sortering + + Velg en handling: + Antall ganger du har utsatt: %d + Hvor lenge vil du utsette? + "Slett fullførte oppgaver som er eldre enn # dager:" + + + + + Astrid: Redigerer oppgave + Astrid: Redigerer + Astrid: Ny oppgave + + + Grunndata + Datoer + Alarmer + + + Oppsummering + Oppgavebeskrivelse + Hvor viktig er det? + Tagger: + + Hvor lang tid vil det ta? + Tid allerede brukt på oppgaven + Absolutt frist + Målfrist + Legg oppgave til kalender + Åpne kalenderhendelse + Gjem til denne datoen + Gjenta hver + Ikke spesifisert + Gjem til denne oppgaven er ferdig + Notater + Legg inn oppgavenotater + + Periodiske påminnelser + Hver + Varsle meg... + Når utløpstidspunkt nærmer seg + Ved utløpstidspunkt + Etter at utløpstidspunkt har passert + Uten stopp til jeg ser på oppgaven + Faste påminnelser + Legg til ny påminnelse + + + Tid (timer : minutter) + Varsle meg hvert + Gjenta hvert (0 for å deaktivere) + Hjelp: Astrid-gjentakelser + +For å bruke gjentakelser må du sette minst ett av utløpstidspunktene over. Når du fullfører denne oppgaven, vil utløpstidspunktet automatisk bli flyttet. +\n\n +Hvis du ikke ønsker å se den nye oppgaven rett etter at du fullfører den gamle, bør du bruke "Gjem Til"-feltet, som også vil bli flyttet automatisk. +\n + + Skjul hjelp + + + Lagre + Forkast + Rediger + Slett + Klikk for å sette + Start tidtaker + Stopp tidtaker + + Lagre + Oppgave lagret: utløper om %s + Oppgave lagret + + + + + Astrid sier... + + + + Astrid: Taggvisning: + Opprett oppgave med tagg + Rediger tagg + Slett tagg + Vis på hovedside + Skjul på hovedside + Lag snarvei + Snarvei opprettet på hovedsiden! + Tagg: + -- Not tagged -- + + Sorter alfabetisk + Sorter etter størrelse + + + + + Synkroniseringstjenester + Handlinger + Valg + sync_rtm + Remember The Milk + http://www.rememberthemilk.com + sync_every + Synkroniseringsfrekvens + Hvis satt, utfør synkronisering hver # time(r) + sync_button + Hovedmeny-snarvei + Vis \"Synkronisér\" i Astrid\'s meny + sync_dialogs + Skjul dialogvinduer + Skjul dialogvindu med synkroniseringsresultat + sync_background + I bakgrunnen + Synkroniser uten å mase på deg + Synkroniseringsfeil! Beklager ulempen. Feilmelding: + +For å kunne synkronisere må du logge deg inn på din %s-konto og autorisere Astrid til å lese dine data. +\n\n +Når dette er fullført kan du starte Astrid å komme tilbake hit. + + +Velkommen til Astrid\'s RTM-synkronisering! +\n\n +Gjenstander som ikke vil bli synkronisert: +- Påminnelser og repetisjoner +- Sletting eller omdøping av oppgaver i RTM +\n +Ønsk meg lykke til!\n + + Synkroniser nå! + Slett personlig data + Slett data for valgte tjenester? + Ingen synkroniserere aktivert! + + + + Laster... + Laster opp liste... + Informasjon + Spørsmål + Vis oppgave + Allerede utført! + Slumre + Avslutt + Timer/minutter å slumre? + + Slett + Slette denne oppgaven? + Fjerne denne taggen fra alle oppgaver? + + Stopp tidtakeren? + + +Noen ting du kanskje ikke visste om Astrid:\n +\n +- For å opprette en oppgave, bare begynn å skrive!\n +- Mens du redigerer en oppgave, trykk \'tilbake'\ for å lagre den\n +- Velg en oppgave og trykk 1-4 for å raskt endre dens prioritet\n +- Dersom en oppgave har en utløpsfrist, trykk på den lenge for å utsette\n +\n +Takk for at du bruker Astrid!\n + + + + + + + Absolutt utløpsfrist! + Målfrist! + Arbeider med: + + + + + Kunne ikke finne denne gjenstanden!: + Kunne ikke lagre: + + + + + Notifications + + notif_qstart + Start på stilletimer + Tidspunkt fra når Astrid skal være stille (f.eks. 22) + + notif_qend + Slutt på stilletimer + Tidspunkt fra når Astrid ikke lenger skal være stille (f.eks. 08) + + notif_default_reminder + Standardpåminnelser + For nye oppgaver, i dager (f.eks. 7). Blank for å slå av. + + notif_annoy + Iherdig-modus + Dersom denne er avkryssen må du se påminnelser før du kan fjerne dem (gjelder også LED-lampen) + + notification_ringtone + Ringetone for påminnelser + Velg ringetone for Astrid\'s påminnelser + + notif_theme + Ikon for påminnelser + Choose Astrid\'s notification bar icon + + Utseende + + colorize + Fargelegg oppgavelisten + Ulike farger for ulike prioriteter + + font_size + Font for oppgavelisten + For på hovedsiden (f.eks. 22) + + Other + + nagging + Masemeldinger + Vis Astid\'s kommentarer ved visning av påminnere og ved utsettelse av oppgaver? + + deadline_time + Standard utløpstidspunkt + Utløpstidspunkt blir satt # dager fra nå + + Feltvisning + Velg feltene som skal vises i oppgavelisten + + + titleVisible + Task Title + Task description + true + deadlineVisible + Dates + Upcoming deadlines / completed date + true + timeVisible + Times + Estimated & Elapsed Times + true + importanceVisible + Importance + Task importance indicator + true + tagsVisible + Tags + Tags associated with this task + true + repeatVisible + Repeats + Task repeat information + true + reminderVisible + Reminders + Displayed if this task has reminders + false + notesVisible + Notes + Notes associated with this task + false + diff --git a/res/values-zh/strings.xml b/res/values-zh/strings.xml new file mode 100644 index 000000000..ff5300de5 --- /dev/null +++ b/res/values-zh/strings.xml @@ -0,0 +1,415 @@ + + + + + Astrid + + + + + + !!!! + !!! + !! + ! + + + + 星期 + + 小时 + + + + 一个任务 + 两个任务 + %d个任务 + + + %d / %d 需要作 + %d / %d 需要作 + + + 一个闹钟 + 两个闹钟 + %d个闹钟 + + + 一个标签 + 两个标签 + %d个标签 + + + + MMM d + + 小\n时 + + 一天 + %d天 + + + 一小时 + %d小时 + + + 一分钟 + %d分钟 + + + 一秒钟 + %d秒钟 + + + 一小时 + %d小时 + + + 一分钟 + %d分钟 + + + 一秒钟 + %d秒钟 + + 以前 + + + + + Astrid: + \"%s\"标签: + + 新任务 + 没有这个标签! + + + + 到期还有 + 到期在 + 希望 + 过期 + 完成了 + 估计: + 花了: + Poke Every + Repeats Every + Next Alarm: + 标签: + 笔记: + 造时: + 删时: + + + + 标签 + Display + 同步 + 。。。 + 同步 + 设定 + 帮助 + 忠告 + 打扫老任务 + + 编辑 + 删除 + 计时 + 停计时 + 延期 + + + 分类 + Hidden/Blocked Tasks + Completed Tasks + Tagged \'%s\' + Auto Sort + Sort By Name + Sort By Due Date + Sort Reverse + + Select an Action: + 延期了%d次 + 延期多少时间? + "Delete completed tasks older than # days:" + + + + + Astrid: 编辑任务 + Astrid: 编辑 + Astrid: 新任务 + + + 细目 + + 闹钟 + + + 总结 + 任务总结 + 多少要紧 + 标签: + + 需要多少时间? + 已经花了多少时间? + Absolute Deadline + Goal Deadline + Add Task To Calendar + Open Calendar Event + Hide Until This Date + Repeat Every + No Repeat Set + Hide Until This Task is Done + Notes + Enter Task Notes + + Periodic Reminders + Every + Notify me... + As Deadlines Approach + At Deadlines + After Absolute Deadline Passes + Nonstop Until I View the Task + Fixed Reminders + Add New Reminder + + + Time (hours : minutes) + Remind Me Every + Repeat Every (0 to disable) + Help: Astrid Repeats + +To use repeats, set at least one of the deadlines above. When you complete this task, the deadline will be automatically advanced. +\n\n +If you don\'t want to see the new task right after you complete the old one, you should use the "Hide Until" field, which will also be advanced automatically. +\n + + Don't Show Help Anymore + + + Save + Discard + Edit + Delete + Click to Set + Start Timer + Stop Timer + + Save + Task Saved: due in %s + Task Saved + + + + + Astrid says... + + + + Astrid: Tag View: + Create Task With Tag + Edit Tag + Delete Tag + Show on Home Page + Hide on Home Page + Create Shortcut + Shortcut created on your home screen! + Tag: + -- Not tagged -- + + Sort A-Z + Sort by Size + + + + + Synchronization Services + Actions + Options + sync_rtm + Remember The Milk + http://www.rememberthemilk.com + sync_every + Synchronize Frequency + If set, perform sync every # hours + sync_button + Main Menu Shortcut + Show \"Synchronize\" in Astrid\'s menu + sync_dialogs + Hide Dialogs + Hide the Sync Results dialogs + sync_background + In Background + Synchronize without bothering you + Sync Error! Sorry for the inconvenience! Error: + +In order to synchronize, please log in to your %s account and authorize Astrid to read your data. +\n\n +When finished, restart Astrid and come back here. + + +Welcome to Astrid\'s RTM sync! +\n\n +Things that don\'t sync:\n +- Notifications and repeats\n +- In RTM, deleting, or moving+renaming tasks\n +\n +Wish me luck!\n + + Synchronize Now! + Clear Personal Data + Clear data for selected services? + No Synchronizers Enabled! + + + + Loading... + Updating List... + Information + Question + View Task + Already Done! + Snooze + Quit + Hours/minutes to snooze? + + Delete + Delete this task? + Remove this tag from all tasks? + + Stop the timer? + + +Some things you may not know about Astrid:\n +\n +- To create a task, just start typing!\n +- While editing a task, hit \'back\' to save it\n +- Select a task & press 1-4 to quickly change it\'s priority\n +- If a task has a deadline, long-press to postpone it\n +\n +Thanks for using Astrid!\n + + + + + + + Absolute Deadline! + Goal Deadline! + Working on: + + + + + Couldn't find this item: + Couldn't save: + + + + + Notifications + + notif_qstart + Quiet Hours Start + Starting hour when Astrid should be quiet (e.g. 22) + + notif_qend + Quiet Hours End + Ending hour when Astrid should be quiet (e.g. 08) + + notif_default_reminder + Default Reminders + For new tasks, in days (i.e. 7). Blank to disable + + notif_annoy + Persistent Mode + If checked, you must view reminders before clearing them (also LED) + + notification_ringtone + Notification Ringtone + Choose a ringtone for Astrid\'s alerts + + notif_theme + Notification Icons + Choose Astrid\'s notification bar icon + + Appearance + + colorize + Colorize Task List + Different colors for different priorities + + font_size + Task List Font + Font on the main listing page (i.e. 22) + + Other + + nagging + Nag Messages + Show Astrid\'s comments when viewing reminders and postponing tasks? + + deadline_time + Default Deadlines + # of days from now to set new deadlines + + Displayed Fields + Select the fields to show in task list + + + titleVisible + Task Title + Task description + true + deadlineVisible + Dates + Upcoming deadlines / completed date + true + timeVisible + Times + Estimated & Elapsed Times + true + importanceVisible + Importance + Task importance indicator + true + tagsVisible + Tags + Tags associated with this task + true + repeatVisible + Repeats + Task repeat information + true + reminderVisible + Reminders + Displayed if this task has reminders + false + notesVisible + Notes + Notes associated with this task + false + diff --git a/res/values/strings.xml b/res/values/strings.xml index c19e92891..88fc1ba4b 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -243,6 +243,7 @@ If you don\'t want to see the new task right after you complete the old one, you Create Shortcut Shortcut created on your home screen! Tag: + [untagged] Sort A-Z Sort by Size diff --git a/src/com/timsu/astrid/activities/TagListSubActivity.java b/src/com/timsu/astrid/activities/TagListSubActivity.java index cac6ff10b..41358830c 100644 --- a/src/com/timsu/astrid/activities/TagListSubActivity.java +++ b/src/com/timsu/astrid/activities/TagListSubActivity.java @@ -134,13 +134,25 @@ public class TagListSubActivity extends SubActivity { // get task count for each tag tagToTaskCount = new HashMap(); for(TagModelForView tag : tagArray) { - LinkedList tasks = getTagController().getTaggedTasks( - tag.getTagIdentifier()); + LinkedList tasks; + + // Tagged vs. Untagged tasks + boolean taggedTask = !tag.getTagIdentifier().equals(TagModelForView.UNTAGGED_IDENTIFIER); + if (taggedTask) + tasks = getTagController().getTaggedTasks(tag.getTagIdentifier()); + else + tasks = getTagController().getUntaggedTasks(activeTasks); + int count = 0; for(TaskIdentifier task : tasks) if(activeTasks.contains(task)) count++; - tagToTaskCount.put(tag, count); + + // don't show Untagged if there aren't any untagged tasks + if (taggedTask || count!=0) + tagToTaskCount.put(tag, count); + else + tagArray.remove(tag); } // do sort @@ -159,7 +171,11 @@ public class TagListSubActivity extends SubActivity { private synchronized void fillData() { try { tagArray = getTagController().getAllTags(); - sortTagArray(); + + // Show "Untagged" as a category, in the proper language/localization + String untaggedLabel = getResources().getString(R.string.tagList_untagged); + tagArray.add(TagModelForView.getUntaggedModel(untaggedLabel)); + sortTagArray(); // count and sort each tag } catch (StaleDataException e) { // happens when you rotate the screen while the thread is // still running. i don't think it's avoidable? diff --git a/src/com/timsu/astrid/activities/TaskListSubActivity.java b/src/com/timsu/astrid/activities/TaskListSubActivity.java index 405f1ab81..6c2c66a55 100644 --- a/src/com/timsu/astrid/activities/TaskListSubActivity.java +++ b/src/com/timsu/astrid/activities/TaskListSubActivity.java @@ -23,6 +23,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.Map; @@ -206,12 +207,14 @@ public class TaskListSubActivity extends SubActivity { if(selectedTaskId == null) context.selectedTask = null; - // process tag to filter, if any + // process tag to filter, if any (intercept UNTAGGED identifier, if applicable) if(variables != null && variables.containsKey(TAG_TOKEN)) { TagIdentifier identifier = new TagIdentifier(variables.getLong(TAG_TOKEN)); context.tagMap = getTagController().getAllTagsAsMap(); if(context.tagMap.containsKey(identifier)) context.filterTag = context.tagMap.get(identifier); + else if(identifier.equals(TagModelForView.UNTAGGED_IDENTIFIER)) + context.filterTag = TagModelForView.getUntaggedModel(); else Toast.makeText(getParent(), R.string.missing_tag, Toast.LENGTH_SHORT).show(); } @@ -483,10 +486,20 @@ public class TaskListSubActivity extends SubActivity { try { // get a cursor to the task list Cursor tasksCursor; - if(context.filterTag != null) { - LinkedList tasks = getTagController().getTaggedTasks( - context.filterTag.getTagIdentifier()); - tasksCursor = getTaskController().getTaskListCursorById(tasks); + if(context.filterTag != null) { // Filter by TAG + LinkedList tasks; + + // Check "named" Tag vs. "Untagged" + TagIdentifier tagId = context.filterTag.getTagIdentifier(); + if (!tagId.equals(TagModelForView.UNTAGGED_IDENTIFIER)) { + tasks = getTagController().getTaggedTasks(tagId); + } else { + HashSet activeTasks = + getTaskController().getActiveTaskIdentifiers(); + tasks = getTagController().getUntaggedTasks(activeTasks); + } + tasksCursor = getTaskController().getTaskListCursorById(tasks); + } else { if(filterShowDone) tasksCursor = getTaskController().getAllTaskListCursor(); diff --git a/src/com/timsu/astrid/data/tag/TagController.java b/src/com/timsu/astrid/data/tag/TagController.java index f0e26abcf..31856a8e8 100644 --- a/src/com/timsu/astrid/data/tag/TagController.java +++ b/src/com/timsu/astrid/data/tag/TagController.java @@ -20,6 +20,7 @@ package com.timsu.astrid.data.tag; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import android.app.Activity; @@ -93,9 +94,11 @@ public class TagController extends AbstractController { return list; } - /** Get a list of task identifiers for the given tag */ - public LinkedList getTaggedTasks(TagIdentifier - tagId) throws SQLException { + /** Get a list of task identifiers for the given tag. + * This searches for TAGGED tasks only. + * Use getUntaggedTasks() to get a list of UNTAGGED tasks **/ + public LinkedList getTaggedTasks(TagIdentifier tagId) + throws SQLException { LinkedList list = new LinkedList(); Cursor cursor = tagToTaskMapDatabase.query(TAG_TASK_MAP_NAME, TagToTaskMapping.FIELD_LIST, TagToTaskMapping.TAG + " = ?", @@ -115,6 +118,40 @@ public class TagController extends AbstractController { return list; } + + /** Returns a list of task identifiers in the provided set that are UNtagged. + * + * The calling SubActivity must provide the set of tasks, since + * TagController cannot access the appropriate instance of TaskController. + * + * The current implementation is not very efficient, because queries + * the TagToTask map once for each active task. + **/ + public LinkedList getUntaggedTasks(HashSet + activeTasks) throws SQLException { + + LinkedList list = new LinkedList(); + + for (TaskIdentifier taskId : activeTasks) { + Cursor cursor; + cursor = tagToTaskMapDatabase.query(TAG_TASK_MAP_NAME, + TagToTaskMapping.FIELD_LIST, TagToTaskMapping.TASK + " = ?", + new String[] { taskId.idAsString() }, null, null, null); + + if (cursor.getCount() == 0) { + list.add(taskId); + } + cursor.close(); + } + + // Equivalent SQL Query: + // SELECT * FROM tasks_tbl LEFT OUTER JOIN mapping_tbl ON tasks_tbl.id = + // mapping_tbl.task_id WHERE mapping_tbl.task_id ISNULL; + + return list; + } + + // --- single tag operations public TagIdentifier createTag(String name) throws SQLException { diff --git a/src/com/timsu/astrid/data/tag/TagModelForView.java b/src/com/timsu/astrid/data/tag/TagModelForView.java index e6c73584c..560b5560b 100644 --- a/src/com/timsu/astrid/data/tag/TagModelForView.java +++ b/src/com/timsu/astrid/data/tag/TagModelForView.java @@ -32,9 +32,37 @@ public class TagModelForView extends AbstractTagModel { NAME, }; - public static final TagModelForView UNTAGGED_TASKS = new TagModelForView("[untagged]"); + // negative number, should not conflict with database row #'s + public static final TagIdentifier UNTAGGED_IDENTIFIER = new TagIdentifier(Long.MIN_VALUE); + public static final String UNTAGGED_DEFAULT_NAME = "[untagged]"; + private static TagModelForView UNTAGGED_TASKS = new TagModelForView(UNTAGGED_DEFAULT_NAME); + public static final String HIDDEN_FROM_MAIN_LIST_PREFIX = "_"; + /** + * Returns a TagModelForView object to represent "Untagged" tasks, + * whose Identifier is defined by the static final UNTAGGED_IDENTIFIER. + * + * Pass in a string to show the "Untagged" name in the desired language. + * @param untaggedLabel + * @return + */ + public static TagModelForView getUntaggedModel(String untaggedLabel) { + UNTAGGED_TASKS = new TagModelForView(untaggedLabel); + UNTAGGED_TASKS.setTagIdentifier(UNTAGGED_IDENTIFIER); + return UNTAGGED_TASKS; + } + + /** + * Returns the default/last-used TagModelForView representing "Untagged" + * tasks. Set the localized name using getUntaggedModel(String...) + */ + public static TagModelForView getUntaggedModel() { + UNTAGGED_TASKS.setTagIdentifier(UNTAGGED_IDENTIFIER); + return UNTAGGED_TASKS; + } + + // --- constructors /** Constructor for creating a new model */