Code Monkey home page Code Monkey logo

downloadvideotest's Introduction

DownloadVideoTest

Требуется разработать приложение, реализующее видеоплеер со следующим функциональными элементами:

  1. Видеоплеер
  2. Поле для ввода http ссылки на видеофайл.
  3. Кнопка "Play/Pause" для приостановки/продолжения воспроизведения.
  4. Кнопка "Download", при нажатии на которую начинается загрузка текущего видеофайла (с отображением прогресса загрузки). После удачной загрузки при старте воспроизведения той же самой ссылки должен открываться уже загруженный файл. Можно не загружать файлы в формате m3u8, достаточно отобразить ошибку.

Язык разработки: Kotlin/Java.

1. Видеоплеер

В качестве видео плеера был использован стандартный класс MediaPlayer из Android SDK, т.к. для простого воспроизведения видео он подходит. Для более сложных случаев, например воспроизведение различных форматов таких как HLS, DASH возможно использовать ExoPlayer. Также ExoPlayer позволяет гибче настраивать управление воспроизведением, но имеет более сложное API в использовании.

2. Поле для ввода http ссылки на видеофайл.

В поле ввода возможно вводить http/https ссылки. Другие протоколы не поддерживаются. Если во время воспроизведения ввести что-либо в поле ввода, то воспроизведение видео останавливается. Если попытаться воспроизвести видео по ссылке не http/https протокола будет показана ошибка.

3.Кнопка "Play/Pause" для приостановки/продолжения воспроизведения.

Логика работы кнопка "Play/Pause" была реализована следующим образом (как показаном на диаграмме): Screenshot 2

4.Кнопка "Download", при нажатии на которую начинается загрузка текущего видеофайла (с отображением прогресса загрузки). После удачной загрузки при старте воспроизведения той же самой ссылки должен открываться уже загруженный файл. Можно не загружать файлы в формате m3u8, достаточно отобразить ошибку.

Для загрузки видео файла был использован DownloadManager. Это отдельный системный сервис, который способен выполнять задачи загрузки файлов. Он может сохранять файлы только в публичные папки и не может в приватную папку приложения, т.к. у него нет прав записи туда. Для данной задачи такое ограничение было приемлимым.

Тестирование

Основная часть бизнес логики находится в классах из пакета download, но также и в MainViewModel. Как вьюмодель, так и остальные классы бизнес логики возможно покрыть тестами, замокав зависимости, передаваемые в конструктор.

Например, MainViewModel#onPlayPauseClicked(url: String) можно протестировать следующим образом:

  1. передаем моки зависимостей
    private val downloadHelper: DownloadHelper,
    private val downloadStorage: DownloadStorage,
    private val downloadErrorHandler: DownloadErrorHandler

в конструктор

  1. Добавляем подписчиков на videoUri livedata

  2. Указываем моку downloadStorage при вызове hasDownload(url) возвращать false

  3. Проверяем что подписчик на videoUri livedata получил верный uri, соответствующий url переданный в метод MainViewModel

  4. Проверяем что hasDownload(url) у downloadStorage был вызван и никакие другие методы вызваны не были.

Аналогичным образом можно протестировать и другие методы/случаи вьюмодели.

downloadvideotest's People

Contributors

lion4ik avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.