Как избавиться от повторяющихся записей в списках вызовов?
В ранних моделях телефонов Siemens записи в списках набранных номеров, принятых и неотвеченных вызовов, соответствующие одному и тому же номеру, не накапливались, запись оставалась о последнем вызове. Позже компанией была добавлена возможность сохранения полной истории.
Однако благие намерения на деле обернулись неудобством для пользователей. Помимо необходимости пролистывать огромные списки, появляются еще и побочные эффекты, типа пропадания напоминания о днях рождения при переполнении списков. Поэтому рекомендуется списки вызовов периодически очищать.
Радикальным решением является полная очистка списков. Но, как правило, по одной записи на номер оставлять все-таки хотелось бы. И в таком случае на помощь приходит мидлет CallsSqueezer (автор hasherfrog).
Далее следует авторский текст:
Вашему вниманию предлагается упаковщик записей телефонных звонков. Кодовое имя CallsSqueezer. Текущая версия 1.1. Данная программка предназначена для удаления из памяти телефона (соответственно, и из списков вызовов) дублирующих записей. Особенно полезной программа может быть для людей, которые очень часто звонят (либо принимают звонки) и при этом забывают удалять ненужные записи из списков.
1. ТЗ :)1.1. Введение.Чистка списков вызовов с помощью стандартного меню - довольно утомительная процедура. Единожды «запустив» списки, их легче потом очистить, нежели отфильтровать. Избыточная информация о многократных звонках на один и тот же номер может оказаться полезной, поэтому Сименс не пакует списки автоматически. Но практика показывает, что в повседневной жизни обычному человеку не нужны такие подробности. Кроме того, точность записей явно не соответствует запланированному уровню. Поскольку низкоуровневое ПО для «ручной» работы со списками то ли находится в разработке, то ли вообще не предусмотрено, появилась идея написать Java-midlet, который бы справился с наиболее утомительными операциями.Идея витала в воздухе и приходила в голову многим. Но именно SiNgle подбросил мне мысль написать данную утилиту.1.2. Требования.Самым необходимым атрибутом должна быть возможность просматривать списки вызов с параллельным генерированием текстового файла-отчёта. На основе полученных данных из списков удаляются все записи звонков на один и тот же номер (или с одного и того же номера). Удаляться записи должны таким образом, чтобы в базе оставался последний звонок. При генерации отчёта желательно выводить максимум информации о звонке.
2. Реализация.Программа написана на языке программирования Java, выполнена в виде midlet’а. Предназначена для использования в телефонах Siemens 65-й линейки. При написании использовались SMTK 2.00.03b, MIDP 1.0, MIDP 2.0. Компиляция JAD/JAR выполнялась в среде Borland JBuilder 8.0. Автор hasherfrog. Тестирование проводилось на Siemens C65, SW 12.03.
3. Лицензионные соглашения.3.1. Программа бесплатная.3.2. Распространение программы должно сопровождаться либо обязательной ссылкой на сайт www.siemens-club.org, либо ссылкой на сайт www.oszone.net, либо обязательным указанием никнейма автора.3.3. Программа поставляется AsIs. Использование её добровольное и не налагает на автора никаких обязанностей.3.4. Исходники в настоящий момент являются собственностью автора и не предоставляются.
4. Инструкция по установке.4.1. Скачиваете отсюда архив zip.4.2. Распаковываете архив и получаете 2 файла, с расширениями .jad и .jar.4.3. На телефоне* в папке \\Data\Java\jam\Applications создаёте папку CallsSqueezer.* С помощью MPM, SiMoCo или иных средств.4.4. В созданную папку переливаете** два файла, полученных из архива. Теперь программа находится в памяти Вашего телефона и готова к использованию. Никаких дополнительных программ и телодвижений не требуется.** Через IRDa, USB либо ещё как.
5. Инструкция по эксплуатации.5.1. На телефоне заходите в «Основное меню -> Мои файлы -> Приложения». Запускаете CallsSqueezer.5.2. Терпеливо ждёте, пока исчезнет сплэш-алерт с именем программы.5.3. В появившемся окошечке с предупреждением системы о грядущих изменениях файловой системы следует ответить «для сессии». Предупреждение появляется из-за того, что программа не сертифицирована в лабораториях ни M$, ни Siemens. Ответ «разрешить один раз» приведёт к многократным (и весьма многочисленным) запросам на подтверждение. Ответы «не сейчас», «не для сессии» либо «никогда» приведут к выходу из программы с выводом сообщения «Error reading call lists. Haves any?». Кстати, ответ «никогда» может привести к ещё более печальному результату: телефон запомнит программу как «вредную» и больше не будет спрашивать подтверждений – вообще никогда. Чтобы исправить это, придётся менять security-настройки мидлета (в Меню "Приложения" наведите курсор на CallsSqueezer и нажмите "Опции", там найдёте).5.4. Ждёте, пока программа протестирует базу звонков (алерт «Checking file system...»). В случае возникновения ошибки будет выведено сообщение «Calls Lists seems to be damaged. Take a look.» Это означает, что база данных телефона некорректна и программа не будет ничего модифицировать из опасения повредить списки вызовов. Теоретически, ситуация разруливается простым входом/выходом в списки с помощью стандартного просмотровщика и последующего перезапуска CallsSqueezer.5.5. Если списки вызовов пусты, выдаётся сообщение «Calls Lists are empty. Nothing to do.», затем программа завершает работу.5.6. Если тестирование завершено успешно, Вам будет предложено определиться с дальнейшими действиями:5.6.1. Пункт «Squeeze Lists». Выполнить отсеивание одинаковых звонков. Собственно, ради этого мы тут и собрались. По умолчанию включено.5.6.2. Пункт «Separate lists». Включение данного пункта заставляет CallsSqueezer различать исходящие, входящие и пропущенные звонки. Даже если номер телефона будет совпадать, исходящий звонок не будет равнозначен входящему. Оба звонка останутся – каждый в своём списке. По умолчанию данная опция выключена, т.е. из всех звонков, как на номер, так и с номера, будет оставлен только один – последний. Это позволяет по максимуму сжать списки.5.6.3. Пункт «Generate report». Независимо от того, будет ли выполнено сжатие, включение данного пункта обяжет CallsSqueezer создать отчёт об имеющихся на данный момент звонках. Отчёт в виде текстового файла squeezer_log.txt будет выложен в папку \\Data\Text Module. По умолчанию генерация отчётов выключена.5.6.4. Пункт «Music & Beep». Чтобы Вам не было скучно, в процессе работы мидлет будет играть музычку, а по окончании работы бибикнет. По умолчанию выключено.5.6.5. Находясь на форме «ToDo», Вы можете менять опции задания (Джойстик, V), остановить программу (Cancel) и запустить задание (Go).5.7. После запуска Вам останется просмотреть несколько алертов: «Generating report...» (если включена опция генерации отчёта), «Clearing phone database...», «Squeezing call lists...» и «Saving datas...». После завершения работы выводится «All done. Exit...».5.8. Сжатые списки можно просмотреть стандартным просмотровщиком, отчёт доступен через Card Explorer.
6. Известные грабли и неразрешённые вопросы6.1. «Database error». Неизлечимый баг. Поскольку заставить телефон перечитать базы данных без перезагрузки самого телефона невозможно, данный баг неустраним. Я советую делать простую вещь: сразу после работы CallsSqueezer нажмите "зелёную трубку" и полюбуйтесь на сообщение об ошибке. Последующие заходы в списки звонков будут корректными.6.2. Неприятным моментом является упоминавшийся баг с детальным просмотром звонков. Дело в том, что при детальном просмотре создаётся индексная база записей, а сами файлы-звонки содержат внутри флажок «индексирован». Некорректная работа с этим флажком (вообще-то это всё имхо чистой воды) и приводит к периодическим «Ошибкам в базе данных». CallsSqueezer честно пытается «соответствовать» требовать стандартного просмотровщика, но… глючит сам просмотровщик. Т.е. это не моя ошибка.6.3. Глючные списки звонков. Не уверен, но, кажется, возможна ситуация, когда CallsSqueezer будет всячески упираться при запуске, греша на некорректные записи. Один из способов поправить списки – зайти в них стандартным просмотровщиком, войти в детальный просмотр, пролистать от начала до конца и выйти. Как вариант – очистить списки. Но иногда и это не помогает. Единственное решение - очистить //Data/system/apo/callrec вручную. Не смешно, я знаю. А кому сейчас легко?6.4. Почему на форме «ToDo» так странно скачут «Go» и «Cancel»? О, сие тайна великая есть. Спросите у сименсов. Насколько мне известно, тут ничего не сделать. Зато у меня выход по «красной трубке» есть.6.5. Почему так долго висит чёрный экран? Не знаю, наверное, сборщик мусора работает. Я вообще-то заметил интересный момент: если запускать мидлет не через «Приложения», а «Card Explorer», чёрный экран пропадает значительно быстрее. Когда-нибудь я узнаю, почему. Инглиш-мены тоже гадают над этой проблемой.
7. Детали7.
1. Звонки с неопределённого номера ("Подавл. звонки", они же "ID withheld") удаляются полностью из всех списков и не заносятся в отчёт.7.2. Завершение работы мидлета при неожиданном входящем звонке. Если Вы согласитесь принять звонок, CallsSqueezer закончит работу. Если Вы не согласитесь, CalssSqueezer всё равно закончит работу, выдав «Must not be paused! Start again, please». Почему? Потому что списки звонков нельзя модифицировать параллельно.7.3. Отображении типа звонка в отчёте. Есть 4 типа звонков - исходящие (Out), исходящие незавершённые (Out Failed), Входящие (In), Непринятые (In Ignored). Вы можете обратить внимание на то, что некоторые звонки некорректно считаются "незавершёнными" либо наоборот. Следует подробно объяснить несколько ситуаций. Если "входящий" звонок не был принят, он (Ignored). Но если Вы нажали "положить трубку" в момент звонка, то он уже считается обычным входящим - Вы же на него среагировали. С исходящими ещё более интересный случай может быть: например, мои звонки на сервисные номера beeoffice всегда считаются "проваленными", хотя я слышу, как автомат мне отвечает, что "заявка принята". Возможно, это происходит потому, что синенсы 1) считают короткий разговор несостоявшимся и 2) нигде наглядно не показывают разновидности исходящих зонков (хотя нужные флажки в файлах есть).7.4. Подробную документацию о формате файлов я так и не написал.7.5. Наличие «Cancel» на алертах "Подождите..." позволяет прервать любую длительную операцию.7.5. Как сменить музыку? В jar-файле мидлета есть папка sound, там лежат три файла: looped.mid - проигрывается при работе; finished.wav - проигрывается по окончанию работы; finished.mid - проигрывается в случае отсутствия .wav-аналога (если и .mid не будет, прога просто пикнет). Если возникнет проблема с запуском файла, нужно, наверное, прописать корректный (изменившийся) размер JAR в файле JAD. Не пробовал пока.7.6. Вопрос «Ну и сколько же всё-таки может быть всего звонков?» остался открытым. Я зашил в callsSqueezer реакцию на любой размер. Сам же думаю, что 512. Специально для информации "спорщикам": (размер main - 4) * 8.
8. Благодарности.8.1. Спасибо этому сайту за то, что он есть.8.2. Спасибо SiNgle – за идею и умелое руководство ;)8.3. Golomeen – за сотрудничество.8.4. aNd1CE - за поддержку.8.5. Matthew, nauris.nikos, diiima – за информацию.8.6. RodionSPb, Ringo41, Tricky@Colors, KiLLer13, kris - за участие в тестировании.8.7. Locke за музыку.8.8. Будущим тестерам – за смелость.8.9. Всем – за внимание :)
9. Feedback
Все вопросы, предложения и (обязательно) замечания просьба размещать в теме Утилита для работы со списками вызовов.