Нужна библиотека, инкапсулирующая работу с 10-20 протоколами, для использования в приложении на Android (Kotlin), и тестовый GUI.<br><br>Сервисы для первого этапа: Google Drive, Яндекс Диск, SFTP (пароль/ключ), libarchive (SAF), Git (HTTP/S; ssh по паролю/ключу).<br><br>Функции API: <br><br><ul><li>Подключиться к хранилищу (возвращает внутренний дескриптор, держит соединение и базовые данные о сессии в памяти). Отключиться (освобождает память, разрывает соединение). Например, для архива (хранилища с бекендом libarchive) открывает файл архива и читает заголовок/список файлов в нем.</li><li>Вернуть информацию о типе хранилища (имя, иконка). Вернуть описание/заголовок на основе параметров подключения (например, для SFTP это хост + логин).</li><li>Вернуть список файлов в заданной папке. Вернуть список файлов/путей рекурсивно от заданной папки. Для каждой записи возвращается стандартный набор свойств ("папка или файл", имя, несжатый размер (для файлов), дата изменения) и дополнительный (все что предоставлено бекендом, например, libarchive).</li><li>Прочитать файл по пути (работа будет с мелкими файлами, поэтому допустимо читать все содержимое в память). Записать файл (с созданием нового файла, если путь не существует).</li><li>Переименовать файл/папку. Удалить файл/папку. Создать папку.</li></ul>Особенности API:<br><br><ul><li>Одновременно может быть подключено много хранилищ и читаться/писаться много файлов.</li><li>Хранилище может быть readonly, что отключает часть функций. Этот флаг передается при подключении (API), также он может выставляться автоматически (например, libarchive не умеет писать RAR).</li><li>Все операции асинхронные и предоставляют уведомления о прогрессе вида # done/# total.</li><li>Ошибки не замалчиваются, а четко передаются наверх, со всеми сообщениями и контекстом.</li><li>Если SDK для доступа к сервису требует от разработчика API-ключа или
чего-то подобного, то сообщать мне.</li><li>Нужен способ передачи в библиотеку специфичных для сервиса/SDK параметров, как для операций (например, логин, commit message для Git), так и глобальных (API-ключ, временная папка). Можно также предусмотреть вызов специфичных функций (например, создание нового архива для libarchive).</li><li>Каждая операция вызывает обновление хранилища: для libarchive архив пережимается после записи файла или создании папки, в Git делается коммит (на основе текущего HEAD, включая изменения с момента подключения, сообщение Update/Rename/Delete/Add <файл/папка>).</li></ul>Тестовый GUI (не часть библиотеки, но выступает ее клиентом; можно реализовать в отдельном или едином APK):<br><br><ul><li>Функциональный и максимально простой UI.</li><li>При выполнении библиотечных вызовов показывать прогрессбар, при ошибках - сообщение.</li><li>Наверху экрана - кнопка для подключения к хранилищу. Показывает диалог или страницу со вводом параметров (сервис, URL, логин и прочее, для сервисов выводятся иконки и имена из API) и кнопками OK/Cancel, а также списком для загрузки ранее использованных параметров (до 20 штук). Кнопка OK сохраняет введенные параметры в историю на диске, вместе с заголовком на основе параметров (API), так что в следующий раз их можно не вводить. Если подключение неудачное, то диалог остается открытым.</li><li>Каждое подключенное хранилище - вкладка (название = имя сервиса + заголовок на основе параметров).</li><li>На вкладке: кнопки, текущий путь (pwd) в виде текста, список/таблица файлов (заполняется кнопками вывода списка файлов) и текстовое поле (заполняется кнопкой чтения файла, используется кнопкой записи файла). В списке файлов может быть особая запись Parent folder и всегда есть запись This folder; папки выводятся перед файлами, в конец имени добавляется "/", файлы и папки сортируются по алфавиту, для каждой записи выводятся доступные свойства, записи можно выделять (всегда выделена ровно одна, если список не пустой).</li></ul>Кнопки на вкладке:<br><br><ul><li>отключение (закрывает вкладку)</li><li>вывод списка файлов в выделенной папке (если выделена не папка, то в This folder; при успешном выполнении текущий путь меняется на новую подпапку, выделяет первую запись в списке)</li><li>вывод рекурсивного списка выделенной папки (аналогично, но не меняет текущий путь, имена записей равны относительному пути: <strong>SomeDir/SubDir</strong>/ и <strong>SomeDir/File</strong><strong>.txt</strong>)</li><li>переход в родительскую папку (если текущий путь не равен корню, т.е. есть Parent folder; очищает список и изменяет текущий путь)</li><li>чтение выделенного файла (если файл не выделен, то ничего не делает; заполняет текстовое поле первыми 100к байт; UTF-8, LF)</li><li>записать в выделенный файл (если выделена папка, то запрашивает уникальное имя; UTF-8, LF)</li><li>переименовать выделенный файл/папку (запрашивает уникальное имя; не работает для This/Parent folder)</li><li>удалить выделенный файл/папку (запрашивает подтверждение, не работает для This/Parent folder)</li><li>создать подпапку в выделенной папке (если выделена не папка, то в This folder; запрашивает уникальное имя)</li></ul>При выборе решений для работы с сервисами обращать внимание на лицензию (GPL не подходит) и размер (чем меньше кода - тем лучше).<br><br>К SFTP могу предоставить тестовый доступ, в остальных сервисах вам нужно регистрироваться самостоятельно.<br><br>При сдаче работы от вас нужно короткое демонстрационное видео по каждому сервису (на экране видно эмулятор и браузер с облачным хранилищем, в эмуляторе демонстрируете работу с хранилищем, в браузере видно результат).<br><br>Можем договориться на почасовую или поэтапную оплату.<br><br><em>voronnate yandex ru </em>