{"id":20753654,"url":"https://github.com/dev-labs-bg/fullscreen-video-view","last_synced_at":"2025-10-03T17:06:20.231Z","repository":{"id":46205778,"uuid":"109274332","full_name":"dev-labs-bg/fullscreen-video-view","owner":"dev-labs-bg","description":null,"archived":false,"fork":false,"pushed_at":"2021-11-07T06:08:11.000Z","size":12980,"stargazers_count":99,"open_issues_count":12,"forks_count":32,"subscribers_count":11,"default_branch":"master","last_synced_at":"2025-06-21T16:02:03.136Z","etag":null,"topics":["android","fullscreen","ui","videoview"],"latest_commit_sha":null,"homepage":"https://notes.devlabs.bg/fullscreenvideoview-videoview-gone-fullscreen-daa5fd8181d8","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dev-labs-bg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-11-02T14:19:12.000Z","updated_at":"2025-02-14T14:51:04.000Z","dependencies_parsed_at":"2022-07-23T10:34:28.389Z","dependency_job_id":null,"html_url":"https://github.com/dev-labs-bg/fullscreen-video-view","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/dev-labs-bg/fullscreen-video-view","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev-labs-bg%2Ffullscreen-video-view","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev-labs-bg%2Ffullscreen-video-view/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev-labs-bg%2Ffullscreen-video-view/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev-labs-bg%2Ffullscreen-video-view/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dev-labs-bg","download_url":"https://codeload.github.com/dev-labs-bg/fullscreen-video-view/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev-labs-bg%2Ffullscreen-video-view/sbom","scorecard":{"id":336559,"data":{"date":"2025-08-11","repo":{"name":"github.com/dev-labs-bg/fullscreen-video-view","commit":"a027b450b65cf81438165b938b2068f4fbcac046"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/2 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 29 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T04:52:38.101Z","repository_id":46205778,"created_at":"2025-08-18T04:52:38.101Z","updated_at":"2025-08-18T04:52:38.101Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278196448,"owners_count":25946326,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-03T02:00:06.070Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","fullscreen","ui","videoview"],"created_at":"2024-11-17T09:14:25.279Z","updated_at":"2025-10-03T17:06:20.189Z","avatar_url":"https://github.com/dev-labs-bg.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"![logo](https://raw.githubusercontent.com/dev-labs-bg/fullscreen-video-view/master/logo.png)\n===\n[![Download](https://img.shields.io/maven-central/v/bg.devlabs/fullscreen-video-view?label=download)](https://repo1.maven.org/maven2/bg/devlabs/fullscreen-video-view/)\n[![Build Status](https://travis-ci.org/dev-labs-bg/fullscreen-video-view.svg?branch=master)](https://travis-ci.org/dev-labs-bg/fullscreen-video-view)\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/5d2c2572dd7b4a2fb5eeabd6c2e18fbc)](https://www.codacy.com/app/slavipetrov/fullscreen-video-view?utm_source=github.com\u0026amp;utm_medium=referral\u0026amp;utm_content=dev-labs-bg/fullscreen-video-view\u0026amp;utm_campaign=Badge_Grade)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n\nFullscreenVideoView is a custom VideoView Android library which makes loading, setting up and going fullscreen for video views easy.\n\n\u003cimg src=\"https://github.com/dev-labs-bg/fullscreen-video-view/blob/master/preview.gif\" width=\"250\" height=\"445\"\u003e\n\nDownload\n===\n```gradle\ndependencies {\n    ...\n    implementation 'bg.devlabs:fullscreen-video-view:1.2.0'\n}\n```\n\nHow to use FullscreenVideoView?\n===\nDeclare the FullscreenVideoView in the XML layout file\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n\u003cLinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\u003e\n\n    \u003cbg.devlabs.fullscreenvideoview.FullscreenVideoView\n        android:id=\"@+id/fullscreenVideoView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" /\u003e\n\u003c/LinearLayout\u003e\n```\n\nThe Activity where the FullscreenVideoView is declared should handle configuration changes, which imposes this change in the AndroidManifest.xml file\n```xml\n\u003cactivity\n    android:name=\"your_activity_name\"\n    android:configChanges=\"orientation|screenSize\" /\u003e\n```\n\n### Network security configuration on Android API 23 or later\n\nOn devices with Android API 23 or later a network security configuration should be set up to allow the cleartext traffic.\n\n- Add the XML tag `android:usesCleartextTraffic=\"true\"` in the application tag in `AndroidManifest.xml`.\n- Add a `network_security_config.xml` file in the `res/xml` directory and add the domains that you want to use in your application. To use this network configuration it must be added in the application tag in `AndroidManifest.xml` (`android:networkSecurityConfig=\"@xml/network_security_config`).\n\n### Basic video loading (from URL or from a file)\n```kotlin\n// Loading from URL\noverride fun onCreate(savedInstanceState: Bundle?) {\n\t...\n\tval fullscreenVideoView = findViewById(R.id.fullscreenVideoView)\n\tval videoUrl = \"https://clips.vorwaerts-gmbh.de/VfE_html5.mp4\"\n\tfullscreenVideoView.videoUrl(videoUrl)\n}\n\n// Loading from file\noverride fun onCreate(savedInstanceState: Bundle?) {\n\t...\n\tval fullscreenVideoView = findViewById(R.id.fullscreenVideoView)\n\tval videoFile = new File(\"file_path\")\n\tfullscreenVideoView.videoFile(videoFile)\n}\n```\n\n### Change controls drawable resources\n\nJava or Kotlin\n```kotlin\nfullscreenVideoView.videoUrl(videoUrl)\n        .playDrawable(R.drawable.ic_play)\n        .pauseDrawable(R.drawable.ic_pause)\n        .fastForwardDrawable(R.drawable.ic_fast_forward)\n        .rewindDrawable(R.drawable.ic_rewind)\n        .enterFullscreenDrawable(R.drawable.ic_fullscreen)\n        .exitFullscreenDrawable(R.drawable.ic_fullscreen_exit)\n```\n\nXML\n```xml\n\u003cbg.devlabs.fullscreenvideoview.FullscreenVideoView\n        android:id=\"@+id/fullscreenVideoView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:play_drawable=\"@drawable/ic_play\"\n        app:pause_drawable=\"@drawable/ic_pause\"\n        app:ffwd_drawable=\"@drawable/ic_fast_forward\"\n        app:rew_drawable=\"@drawable/ic_rewind\"\n        app:enter_fullscreen_drawable=\"@drawable/ic_fullscreen\"\n        app:exit_fullscreen_drawable=\"@drawable/ic_fullscreen_exit\"/\u003e\n```\n\n### Enable/disable controls\n\n```kotlin\nfullscreenVideoView.videoUrl(videoUrl)\n        .disablePause()\n        .addSeekBackwardButton()\n        .addSeekForwardButton()\n```\n\n### Enable video auto-start\n\n```kotlin\nfullscreenVideoView.videoUrl(videoUrl)\n        .enableAutoStart()\n```\n\n### Customize fast-forward and/or rewind seconds\n\n```kotlin\nfullscreenVideoView.videoUrl(videoUrl)\n        .fastForwardSeconds(5)\n        .rewindSeconds(5)\n```\n\n### Change the playback speed (only for API 23 and above)\n\nThere are 7 playback speed values which are added by default, but they can be changed with custom ones when `playbackSpeedOptions` is used.\n```kotlin\nval playbackOptions = PlaybackSpeedOptions().addSpeeds(0.25f, 0.5f, 0.75f, 1f)\n\nfullscreenVideoView.videoUrl(videoUrl)\n        .addPlaybackSpeedButton()\n        .playbackSpeedOptions(playbackOptions)\n```\n\n### Add thumbnail\n\nThis feature supports loading only drawables from the Android project.\n```kotlin\nval thumbnailResId = R.drawable.video_thumbnail\n\nfullscreenVideoView.videoUrl(videoUrl)\n\t.thumbnail(thumbnailResId)\n```\n### Play/Pause video programmatically\n\nIf you want to play/pause the video programmatically you can use the `play()/pause()` method.\n```kotlin\nfullscreenVideoView.play()\n// OR\nfullscreenVideoView.pause()\n```\n\n### Hide progress views\n\nHiding the progress views can be implemented initially from calling the Builder function or later by calling the view method.\n\n```kotlin\n// Hide initially from the Builder\nfullscreenVideoView.videoUrl(videoUrl)\n        .hideProgress()\n\n// OR\n\n// Hide by calling the view method\nfullscreenVideoView.hideProgress()\n```\n\n### Hide fullscreen button\n\nHiding the fullscreen button can be implemented initially from calling the Builder function or later by calling the view method.\n\n```kotlin\n// Hide initially from the Builder\nfullscreenVideoView.videoUrl(videoUrl)\n        .hideFullscreenButton()\n\n// OR\n\n// Hide by calling the view method\nfullscreenVideoView.hideFullscreenButton()\n```\n\n### Listen for errors\n\nListening for errors can be implemented initially from calling the Builder function or later by calling the view method.\n\n```kotlin\n// Add initially from the Builder\nfullscreenVideoView.videoUrl(videoUrl)\n        .addOnErrorListener(object : OnErrorListener {\n                override fun onError(exception: FullscreenVideoViewException?) {\n                        // Handle error\n                }        \n        })\n        \n// OR\n\n// Add by calling the view method\nfullscreenVideoView.addOnErrorListener(object : OnErrorListener {\n        override fun onError(exception: FullscreenVideoViewException?) {\n                // Handle error\n        }    \n})\n```\n\n### Listen for Media Controller events\n\nTo listen for Media Controller events you should use the Builder function `mediaControllerListener`. You can either pass the `MediaControllerListener` interface or `MediaControllerListenerAdapter` if don't need to use all of the methods of the interface.\n\n```kotlin\n// Using the MediaControllerListener interface\nfullscreenVideoView.videoUrl(videoUrl)\n\t.mediaControllerListener(object : MediaControllerListener {\n\t\t    override fun onPlayClicked() {\n                        // Do something when the play button is clicked\n                    }\n\n                    override fun onPauseClicked() {\n                        // Do something when the pause button is clicked\n                    }\n\n                    override fun onRewindClicked() {\n                        // Do something when the rewind button is clicked\n                    }\n\n                    override fun onFastForwardClicked() {\n                        // Do something when the fast forward button is clicked\n                    }\n\n                    override fun onFullscreenClicked() {\n                        // Do something when the fullscreen button is clicked\n                    }\n\n                    override fun onSeekBarProgressChanged(progressMs: Long) {\n                        // Do something when the progress SeekBar is changed by click or a drag event\n                    }\n\t})\n\t\n// Using the MediaControllerListenerAdapter interface with only onPlayClicked and onPauseClicked methods\nfullscreenVideoView.videoUrl(videoUrl)\n\t.mediaControllerListener(object : MediaControllerListenerAdapter() {\n\t\t    override fun onPlayClicked() {\n\t\t\t// Do something when the play button is clicked\n                    }\n\n                    override fun onPauseClicked() {\n\t\t\t// Do something when the pause button is clicked\n                    }\n\t})\n```\n\n### Seek to position\n\nSeek to a selected position by calling the `seekTo` method and passing the time in milliseconds to it.\n\n```\nfullscreenVideoView.videoUrl(videoUrl)\n\t.seekTo(5000)\n```\n\n### Change the video URL at runtime\n\nChange the video URL by calling `changeUrl` method of `FullscreenVideoView` and passing the new URL.\n\n```\nfullscreenVideoView.changeUrl(videoUrl)\n```\n\n### Listen for video completion\n\nListen for video completion event by calling the `addOnVideoCompletedListener` and passing an instance of `OnVideoCompletedListener`.\n\n```\nfullscreenVideoView.addOnVideoCompletedListener {\n    // Do something when the video is completed\n}\n```\n\nCompatibility\n===\n- Minimum Android SDK: API level 19\n- Compile Android SDK: API level 29\n\nKnown issues\n===\nThere is a memory leak in Android 7 (API levels 24 and 25), which is known and [listed](https://github.com/square/leakcanary/issues/721)\nin the LeakCanary repository issues.\n\nLicense\n===\n\n```\nCopyright 2017 Dev Labs\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdev-labs-bg%2Ffullscreen-video-view","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdev-labs-bg%2Ffullscreen-video-view","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdev-labs-bg%2Ffullscreen-video-view/lists"}