HMN-mob-app-addendum
Задача:
Реализовать загрузку большого количества PDF.
Проблематика:
Flutter сам по себе однопоточный. Если мы ставим загружаться или делаем просто какое-то долгое действие — интерфейс зависает. Такое было в первой версии приложения, когда оооочень долго шла загрузка всех ассетов и секунд 10-20 приложение просто как будто висело. Чтобы решить эту проблему во флатере предусмотрен механизм изолятов. Это грубо говоря небольшие потоки параллельного выполнения. Мы можем в изоляте запустить скачивание файла, и он будет работать в фоне. Но если мы запустим много изолятов — приложение упадет. Поэтому нам необходимо контролировать их количество. Для мобильного приложения это 3-4 потока загрузки одновременно.
Сценарии:
Загрузка одного, ранее не загруженного, PDF
Пользователь нажал на кнопку скачать отдельный PDF. Запускается изолят (фоновый процесс загрузки), привязанный к элементу дизайна лоадер. По мере загрузки передается процент загрузки.
Загрузка второго, ранее не загруженного, PDF
Пользователь нажал кнопку скачать, когда у него уже идет скачивание 3-4х PDF файлов, в этом случае мы не создаем изолят, а ставим задачу в очередь на выполнение.
Пользователь отменил скачивание PDF
В этом случае мы уничтожаем изолят, меняем элемент дизайна напротив файла назад, на кнопку загрузить. После чего запускаем изолят для следующего файла в очереди. Этого сценария нет в дизайне, и вероятно он не нужен для зарузки файлов по одному.
Произошла ошибка загрузки PDF файла в режиме единичной загрузки
Мы должны сменить визуальное представление в списке загрузки на ошибку, вместе с показом кнопки скачать. Что я вижу сейчас: элемент переходит в состояние готов к загрузке, но нет информации об ошибке. Ожидается дополнительный элемент дизайна оповещающий об ошибке загрузки.
Удалить загружённый файл
Я хочу удалить ранее скачанный PDF. На данный момент отсутствует кнопка удаления. Возможно это не есть проблемой, потому что в экране настроек есть кнопка очистки application cache. Проблема: удаление кеша не останавливает уже запущенные загрузки. Необходимо останавливать и удалять несохранённые части.
Массовая загрузка документов
Я как пользователь нажимаю кнопку загрузить все. Происходит проверка какие языки выбраны как активные. После этого выбирается список всех документов на этих языках. Все файлы попадающие под фильтр языков ставятся в очередь загрузки. Индикатор зарузки всех файлов переходит в активное состояние. Проблемы, которые есть сейчас:
- при активной массовой загрузке кнопка скачивания отдельного файла не деактивируется.
- при ошибке скачивания одного файла из очереди происходит переход в режим повторной скачки файла несколько раз. Никакой информации об ошибках пользователю недоступно.
- Невозможно остановить загрузку. Предлагаемое решение: при запуске массовой загрузки менять кнопку на — "отменить все загрузки". При этом переводить все файлы в состояние загрузки (спиннер в интерфейсе). Скачивание всего включает в себя так же и скачивание всех доступных обновлений. Для реализации предлагается сделать конкурентную очередь, которая бы обрабатывала обшибу
Индикатор оставшегося размера загрузки
На главном экране, в реальном времени мы следим за прогрессом загрузки всех файлов и считаем сколько осталось загрузить. Это процесс происходит независимо от приложения (в отдельном изоляте), чтобы не блокировать работы с приложением пока идет загрузка.
Скрытие кнопки "скачать все"
Если у нас уже скачаны все файлы — необходимо скрывать кнопку скачать все файлы
Уведомление о наличии файлов
Заходя в приложение, я не вижу никакого уведомления, что со стороны PIM произошло обновление каких либо файлов. Вероятно, нужно показать какой-то нотиф о доступном обновлении и кнопку — обновить все.
Показ кнопки обновить все
В футере приложения, кроме кнопки "скачать все", должна быть кнопка обновить все.
Обновление одного файла
При загрузке новой версии файла должна происходить так называемая безопасная замена. Сначала файл скачивается во временную папку, и уже после успешного скачивания файла должна быть замена старого файла на новый. В этом случае при ошибках скачивания не будет утерян доступ к оригинальному файлу.
Просмотр файла в ходе обновления
Благодаря безопасной замене, старая версия файла должна быть доступна пока идет загрузка новой версии.
Обновление всех доступных для обновления файлов
По нажатию кнопки обновить все, мы должны изменить ее на состояние - отменить все загрузки. Важно: кнопка отменить все загрузки отменяет все активные загрузки, без учета того были ли они поставлены на выполнение задачей, но обновление или индивидуальным запросом на скачивание.
Ошибки скачивания в режиме обновления
В случае ошибки обновления одного файла сейчас запускается режим повторного скачивания. Я предлагаю изменить логику, так чтобы при ошибках скачивания ошибочный файл перемещался в конец очереди для повторной загрузки после всех остальных. Так же предлагается ограничить попытки повторного скачивания 3мя разами. Если один файл не удалось обновить — просто игнорировать его обновление, оставив в интерфейсе старую версию и кнопку обновить.
Обновление списка файлов по свайпу
Добавить при свайпе запрос на проверку обновлений
Фоновое задание проверки обновлений
Раз в сутки необходимо проверять наличие обновлений в фоне, и если они есть показывать пуш уведомление с запросом на обновление. (очень опциональная задача, скорее всего нафиг не нужно)
==========================================================
В нас зроблена пофайлова загрузка на ізолятах (окремих процесах, по-одному на одну загрузку файла). Загрузки всіх файлів не зроблено й не продумано, є лише костиль різдвяний, який робився аби встигнути за обмеженням часу. Що втупу грузить по 30 файлів список яких бере з віртуальної файлової системи, доки не пройдеться по всім. Цей костиль потрібно замінити на повноцінний обробник сценаріїв. Обробник сценаріїв потрібно продумати й це займе декілька днів.
І лише на обробник сценаріїв можна буде натягнути оновлення, щоб обробляти і завантаження й оновлення всіх файлів одночасно.
Проблема бекапу !одного! попереднього файлу при завантаженні нового за тою ж адресою та спроба відкривати файлу із кешу якщо за адресою немає, вже була вирішена за попередні 5 годин. Але потребує більше часу на тестування, коли саме оновлення працюватиме. Також потрібно покращити віртуальну файлову систему щодо відношень оновлених файлів з усіма адресами файлів, бо вона робилася для повної синхронізації, а не зберігання попередніх (старих) файлів, бо це не планувалось.
Потрібно:
- Сам обробник сценаріїв з прогресом виконання в окремому ізоляті
- Сценарій завантаження всіх незавантажених файлів не піднімаючи багато ізолятів (бо це призводить до помилок й нестабільно), це борг.
Збереження та відкриття користувачем файлів що ще оновлюються (було зроблено)- Ізолят що перевіряє оновлення кожних n хвилин, "наглядач", або коли його про те попросять свайпом
- Оновлення файлової системи списком файлів що можуть бути оновленими, а не лише завантажений/доступний для завантаження, оскільки ми не робимо повної синхронізації при запуску. Після цього можливе як пофайлове оновлення, так і оновлення всіх файлів сценарієм.
- Пофайлове оновлення (лише дизайн)
- Сценарій завантаження лише оновлених файлів, якщо попередні вже були завантажені.
- Сценарій завантаження незавантажених та оновлених файлів одночасно
- Кожен сценарій повинен реагувати на припинення з'єднання з інтернетом чи помилки мобільної файлової системи
Можна зробити лише оновлення файлової системи та пофайлове оновлення (дизайн), бо для цього все є