Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc-android
  • thresh/vlc-android
  • Dekans/vlc-android
  • robUx4/vlc-android
  • tguillem/vlc-android
  • Corbax/vlc-android
  • judeosby/vlc-android
  • chouquette/vlc-android
  • washingtonmurphy93/vlc-android
  • wipawanbeadklang540/vlc-android
  • xcorail/vlc-android
  • Aza/vlc-android
  • Skantes/vlc-android
  • filipjares/vlc-android
  • kazemihabib/vlc-android
  • amq10x/vlc-android
  • qadrian370/vlc-android
  • shivanshs9/vlc-android
  • vitaliyg2/vlc-android
  • orgads/vlc-android
  • rom1v/vlc-android
  • evidence/vlc-android
  • lk888/vlc-android
  • Klaus81/vlc-android
  • EwoutH/vlc-android
  • XilasZ/vlc-android
  • pawelpablo1975/vlc-android
  • uae2ae/vlc-android
  • Garf/vlc-android
  • abetatsunori7/vlc-android
  • ePirat/vlc-android
  • magsoft/vlc-android
  • quink/vlc-android
  • Ektos974/vlc-android
  • CymGen30/vlc-android
  • b1ue/vlc-android
  • alessiavalenti8/vlc-android
  • bars27101982/vlc-android
  • billybanda18/vlc-android
  • dklvip/vlc-android
  • sherylynn/vlc-android
  • ramcoach5/vlc-android
  • takise/vlc-android
  • peibolovedie/vlc-android
  • AMHeijboer/vlc-android
  • dahburj/vlc-android
  • gobennyb/vlc-android
  • masripmasrip824/vlc-android
  • bubu/vlc-android
  • tmk907/vlc-android
  • gorbahaaa/vlc-android
  • govind3321/vlc-android
  • jamieboyer42818/vlc-android
  • mrtakilapop/vlc-android
  • kazikarter90/vlc-android
  • chunyie771/vlc-android
  • nop404/vlc-android
  • hcalzazperz/vlc-android
  • zagwojtek69/vlc-android
  • nikonnick24/vlc-android
  • gmohiuddin215/vlc-android
  • stheinthan31/vlc-android
  • rogelioloreto29/vlc-android
  • philippestcyr5/vlc-android
  • Happyheather20/vlc-android
  • jimbobmcgee/vlc-android
  • mohwie/vlc-android
  • HeartBeat1608/vlc-android
  • jahan/vlc-android
  • Kevo1987/vlc-android
  • rrangel3584/vlc-android
  • xfridrich/vlc-android
  • devswami23/vlc-android
  • Isira-Seneviratne/vlc-android
  • PartyPhone22/vlc-android
  • kmajeshkrishnan/vlc-android
  • ramirotorresjr/vlc-android
  • aaronsalas469/vlc-android
  • arnan.np31/vlc-android
  • hkosacki/vlc-android
  • mg0691872/vlc-android
  • louregni/vlc-android
  • ritmapp/vlc-android
  • diegofn/vlc-android
  • s-ayush2903/vlc-android
  • chrisbohn1984/vlc-android
  • alexandre-janniaux/vlc-android
  • optimumpr/vlc-android
  • chirag-jn/vlc-android
  • e9ab98e991ab/vlc-android
  • suvDev/vlc-android
  • killthelord/vlc-android
  • Phoenix/vlc-android
  • soriyallc/vlc-android
  • tda1009/vlc-android
  • rhstone/vlc-android
  • ltnokiago/vlc-android
  • elbrujo1987/vlc-android
  • m1s4k1/vlc-android
  • mdc/vlc-android
  • arnaudj/vlc-android
  • abhinavmarwaha/vlc-android
  • dali546/vlc-android
  • Jeffset/vlc-android
  • megan30/vlc-android
  • lizhengdao/vlc-android
  • YajTPG/vlc-android
  • halcyon/vlc-android
  • ilya.yanok/vlc-android
  • jeramydhallmon/vlc-android
  • tijoemecano77/vlc-android
  • cjcj125125/vlc-android
  • dejan2609/vlc-android
  • JATIN2111999/vlc-android
  • imrohitkumar/vlc-android
  • sagudev/vlc-android
  • ILoveLin/vlc-android
  • tfighiera/vlc-android
  • snehil101/vlc-android
  • MKornelsen/vlc-android
  • m/vlc-android
  • core1024/vlc-android
  • vadimdolgachev/vlc-android
  • Kk77539/vlc-android
  • linzj/vlc-android
  • dantalian-pv/vlc-android
  • admkhalid/vlc-android
  • yaron/vlc-android
  • kn21091974/vlc-android
  • mylove1302/vlc-android
  • roblav96/vlc-android
  • alabiaga/vlc-android
  • kmnaveen101/vlc-android
  • nikiforoff1407/vlc-android
  • Android-Jester/vlc-android
  • frieda.rtwski/vlc-android
  • glaciers7506/vlc-android
  • rahul-gill/vlc-android
  • gaoxugang/vlc-android
  • Rishavgupta12345/vlc-android
  • dinho991556460/vlc-android
  • lighterowl/vlc-android
  • mary-kate/vlc-android
  • adnank20216/vlc-android
  • anthonylgutierrez79/vlc-android
  • Heliottw/vlc-android
  • mu1zix.ft3/vlc-android
  • yvesmaltais1212/vlc-android
  • ereme/vlc-android
  • jhonypalomino829/vlc-android
  • mx1up/vlc-android
  • sjwaddy/vlc-android
  • MohitMandalia/vlc-android
  • temaershov/vlc-android
  • js6pak/vlc-android
  • mishikallu/vlc-android
  • irfanmumtaz008/vlc-android
  • smurfohrachie/vlc-android
  • Goooler/vlc-android
  • eldo203050/vlc-android
  • dejesuszeus99/vlc-android
  • mfkl/vlc-android
  • Samfun75/vlc-android
  • markg85/vlc-android-ipfs
  • doktamelek911/vlc-android
  • wikwity/vlc-android
  • aangelmaker/vlc-android
  • krawczykradek119/vlc-android
  • ylz18180813163/vlc-android
  • galaxy9sx3/vlc-android
  • huajie2020/vlc-android
  • XuanTung95/vlc-android
  • kl/vlc-android
  • melihyolcu83/vlc-android
  • rt1shnik/vlc-android
  • jerryboy307/vlc-android
  • ikeuzochukwu6/vlc-android
  • patrikgolis/vlc-android
  • Ismavv/vlc-android
  • clementosumo/vlc-android
  • joshlamp66/vlc-android
  • nkmoyonyathiericyounge/vlc-android
  • DanTm99/vlc-android
  • Jeffrow41/vlc-android
  • fromphfr/vlc-android
  • 16project/vlc-android
  • Tomas8874/vlc-android
  • fixxxer87/vlc-android
  • sanjay/vlc-android
  • franciscojrp/vlc-android
  • cashellauswaus23/vlc-android
  • hengwu0/vlc-android
  • naythu2020rain/vlc-android
  • TongtengInhole/vlc-android
  • pupdoggy666/vlc-android
  • jcj921013/vlc-android
  • Gc6026/vlc-android
  • crijojc/vlc-android
  • mdrewight/vlc-android
  • davidhaywood0782/vlc-android
  • jbschtt/vlc-android
  • macfarlandcamel/vlc-android
  • syazairi/vlc-android
  • Commander01/vlc-android
  • baileyterry014/vlc-android
  • rodrickfranklin38/vlc-android
  • diego1245hernb/vlc-android
  • anton.canada/vlc-android
  • egazaekb/vlc-android
  • Marissa111113/vlc-android
  • jeinerbruno2/vlc-android
  • wehnie13/vlc-android
  • ozill87/vlc-android
  • legionfso/vlc-android
  • anazahirajoel/vlc-android
  • naomirojas1227/vlc-android
  • xbao/vlc-android
  • antoni.kozubek/vlc-android
  • pajela8482/vlc-android
  • karlfandango55/vlc-android
  • ruanbester07/vlc-android
  • chigita73/vlc-android
  • giu.pat6/vlc-android
  • Aura/vlc-android
  • marcwabo/vlc-android
  • contact.adgrafix/vlc-android
  • exlaverdad/vlc-android
  • simon.marquis88/vlc-android
  • youngkinsamantha421/vlc-android
  • edgard1161/vlc-android
  • agzx77/vlc-android
  • ha7204993/vlc-android
  • alghazwani.jar.6090/vlc-android
  • zrowton1206/vlc-android
  • darek1979513/vlc-android
  • matthiaskett18198/vlc-android
  • kubadyr77/vlc-android
  • romanstudeny1982/vlc-android
  • kumar107375/vlc-android
  • schong0525/vlc-android
  • Kt/vlc-android
  • jovelyn.esconde125/vlc-android
  • corriemacbarnard/vlc-android
  • apisbg91/vlc-android
  • yyusea/vlc-android
  • protechq88/vlc-android
  • rmangaraman/vlc-android
  • soutomikel/vlc-android
  • goregladaleksej5/vlc-android
  • tao/vlc-android
  • aruiz595/vlc-android
  • horvathpeter1202/vlc-android
  • litteh82/vlc-android
  • kerriochoa96/vlc-android
  • skshemul2022/vlc-android
  • popy/vlc-android
  • mizadpanahdev/vlc-android
  • pinarim2035/vlc-android
  • davidgooch1127/vlc-android
  • NyanCatTW1/vlc-android
  • Pendynurcahyo/vlc-android
  • fcartegnie/vlc-android
  • xiaoxiao921/vlc-android
  • rjtoell/vlc-android
  • devanshu6445/vlc-android
  • DopeDo69/vlc-android
  • quimsical/vlc-android
  • nickita.koltsoff/vlc-android
  • zeestander8617/vlc-android
  • alexsonarin06/vlc-android
  • minh189999h/vlc-android
  • JonnycatMeow/vlc-android
  • pup.ragnarok.1984/vlc-android2
  • jlcalderon13/vlc-android
  • franciszekk51214/vlc-android
  • yinsheng996/vlc-android
  • KenN3RD/vlc-android
  • leogps/vlc-android
  • alicuteo0407/vlc-android
  • MessirVoland/vlc-android
  • brett2uk/vlc-android
  • thomas.hermes/vlc-android
  • dgyudin/vlc-android
  • anuoshemohammad/vlc-android
  • r7truong/vlc-android
  • aaa1115910/vlc-android
  • arunkennedy78/vlc-android
  • nicholaszarra0069/vlc-android
  • georgipetrovdochev/vlc-android
  • Nikhil-z/vlc-android
  • misb1033/vlc-android
  • ktcoooot1/vlc-android
  • manmuc5/vlc-android
  • ahwhatisinttaken/vlc-android
  • m.nozka90/vlc-android
  • kabeermuhammad124319/vlc-android
  • ANGELONCE/vlc-android
  • manstabuk/vlc-android
  • yajcoca/vlc-android
  • dreamscell83/vlc-android
  • oldsssteveo/vlc-android
  • c0ff330k/vlc-android
  • ZhangXinmin528/vlc-android
  • lacsimarnald09/vlc-android
  • boykaisaac758/vlc-android
  • ooseidesmond/vlc-android
  • andresbott/vlc-android
  • yolandawanttoplay/vlc-android
  • lapaz17/vlc-android
  • sillyearl0138/vlc-android
  • NF-Repo/vlc-android
  • aaasg4001/vlc-android
  • mongia.puneet/vlc-android
  • slablaykon/vlc-android
  • Shabgardtanha1111/vlc-android
  • Benjamin_Loison/vlc-android
  • ashishami2002/vlc-android
  • Niram7777/vlc-android
  • Yashraj254/vlc-android
  • Choucroute_melba/vlc-android
  • Soete/vlc-android
  • MangalK/vlc-android
  • mohak2003/vlc-android
  • advait-0/vlc-android
  • McLP/vlc-android
  • fhuber/vlc-android
326 results
Show changes
Commits on Source (3911)
Showing
with 1165 additions and 102 deletions
# VLC
/libvlcjni
/vlc/
/toolchains/
application/app/src/main/assets/
......@@ -11,6 +13,10 @@ medialibrary/build
medialibrary/jni/obj
medialibrary/jni/libs
medialibrary/.libs
medialibrary/prefix
# Remote access
remoteaccess/**
# Android .so
/android-libs/**/*.so
......@@ -68,3 +74,4 @@ libvlc.pc
libvlc.pc.backup
libvlcpp.pc
lib/
/buildsystem/automation/certificates/
<!---
/!\ Read this first!/!\
This default template purpose is to be used to report a bug you found in VLC for Android.
To use a different template, select it from the "Description" drop-down above. If you're having trouble finding it, see https://code.videolan.org/videolan/vlc-android/-/wikis/Create-an-issue-and-use-a-template.
If you want to ask for a new feature, please use the "VLC for Android - Feature Request.md" template above.
If you're a libvlc java developer, please use the "libvlc - Bug" template.
If you just want to ask questions on how to use VLC for Android, please use our forum at https://forum.videolan.org/viewforum.php?f=35
Please note that any ticket not using a template may be closed without notice as it won't provide the necessary information.
-->
<!--- Provide a general summary of the issue in the Title above -->
## Description
<!--- Describe your bug in detail -->
#### Expected behavior
#### Actual behavior
#### Steps to reproduce
1.
2.
3.
#### Screenshot / video
<!--Add a screenshot or screencast when applicable-->
<!--To take a screenshot, see https://support.google.com/android/answer/9075928?hl=en-->
## Context
#### App version
<!--You can find it in the About screen of the app-->
#### Android version
#### Device model
#### App mode
<!--Remove the useless modes-->
**Smartphone**
**TV**
**Auto**
\ No newline at end of file
<!--- Provide a general summary of the issue in the Title above -->
## Description
<!--- Describe your bug in detail -->
#### Expected behavior
#### Actual behavior
#### Steps to reproduce
1.
2.
3.
#### Code you used
```Your code here```
#### Screenshot / video
<!--Add a screenshot or screencast when applicable-->
<!--To take a screenshot, see https://support.google.com/android/answer/9075928?hl=en-->
## Context
#### libvlc version
<!--You can find it in the About screen of the app-->
#### Android version
#### Device model
[main]
host = https://app.transifex.com
[o:yaron:p:vlc-trans:r:android]
file_filter = application/resources/src/main/res/values-<lang>/strings.xml
source_file = application/resources/src/main/res/values/strings.xml
type = ANDROID
minimum_perc = 50
resource_name = android
replace_edited_strings = false
keep_translations = false
lang_map = zh_CN: zh-rCN, zh_TW: zh-rTW, zgh: zgh-rMA, en_GB: en-rGB, es_MX: es-rMX, pt_BR: pt-rBR, pt_PT: pt
[o:yaron:p:vlc-trans:r:android_store]
file_filter = buildsystem/automation/framing/locale/<lang>.po
source_file = buildsystem/automation/framing/locale/en.po
type = PO
minimum_perc = 100
resource_name = android (Store screenshots)
replace_edited_strings = false
keep_translations = false
\ No newline at end of file
Changes between 3.6.1 and 3.6.2:
------------------
* Update the remote access dependency to fix a crash loop
* Fix a bug making the video played twice
Changes between 3.6.0 and 3.6.1:
------------------
* Behavior and crash fixes
Changes between 3.6.0 Beta 6 and 3.6.0:
------------------
* Improve the orientation user experience in the video player
* Behavior and crash fixes
Changes between 3.6.0 Beta 5 and 3.6.0 Beta 6:
------------------
* Fix the remote access not included in the app bundle
Changes between 3.6.0 Beta 4 and 3.6.0 Beta 5:
------------------
* Allow deleting files on TV
* Multiple remote access improvements
* Fix 360 videos
* Behavior and UI fixes
* Crash fixes
Changes between 3.6.0 Beta 3 and 3.6.0 Beta 4:
------------------
* Fix subtitles download
* Improve the permission management
* Allow renaming a playlist
* Fix some language issues
* Behavior and UI fixes
* Crash fixes
Changes between 3.6.0 Beta 2 and 3.6.0 Beta 3:
------------------
* Fix custom PiP
* UI fixes
* Crash fixes
Changes between 3.5.7 and 3.6.0 Beta 2:
------------------
* Remote access: take control of your VLC for Android from any device
* Favorite any media and filter your medialibrary content by favorite
* Video player: tap to fast play
* Warning for metered connections
* PiP improvements
* Audio player chapter navigation
* UI improvements
* Crash fixes
Changes between 3.5.6 and 3.5.7:
------------------
* Fix crash when downloading subtitles
Changes between 3.5.5 and 3.5.6:
------------------
* Fix crash on startup
Changes between 3.5.4 and 3.5.5:
------------------
* Target Android 34
* This release is empty. Its sole purpose is to unlock the Play Store releases
Changes between 3.5.4 Beta 2 and 3.5.4:
------------------
* Fix media controls not working after some time on Android 13
* Fix audio notification icon transparency
* Minor interface fixes
* Crash fixes
Changes between 3.5.4 Beta 1 and 3.5.4 Beta 2:
------------------
* Re-allow access to the media controls for third party apps
* Fix some Android Auto and Android TV behaviors
* Crash fixes
Changes between 3.5.3 and 3.5.4 Beta 1:
------------------
* Improve the video resolution text
* Fix opening from other apps
* Bluetooth fixes
Changes between 3.5.3 Beta 2 and 3.5.3:
------------------
* Fix permission check on Android 12
Changes between 3.5.3 Beta 1 and 3.5.3 Beta 2:
------------------
* Fix the video playlist mode on TV
* Minor graphical fixes and improvements
Changes between 3.5.2 and 3.5.3 Beta 1:
------------------
* More subtitle settings
* New notification permission
* Fix the sorting in the file browser
* Allow forcing shuffle for audio playbacks
* TV allow mixing folders and files
* Minor graphical fixes and improvements
* Crash fixes
Changes between 3.5.1 and 3.5.2:
------------------
* Fix UPnP/DLNA discovery
* Widget fixes and improvements
* Improve the history settings
* Improve the screenshot feature
* Minor graphical improvements
* Fix some playback issues
* Fix some thumbnail generation issues
* Crash fixes
Changes between 3.5.1 Beta 1 and 3.5.1:
------------------
* Fix UPnP/DLNA files listing
* Fix empty notification icons on Android 4
* Increase the video controls delay when hitting play
* Crash fixes
Changes between 3.5.0 and 3.5.1 Beta 1:
------------------
* Take a screenshot of your video
* Widgets improvements
* UPnP client fixes
* Playback fixes
* UI fixes
* Crash fixes
Changes between 3.5.0 RC 1 and 3.5.0:
------------------
* Improve the layout for foldable devices
* Fix some sorting issues
* Improve the PiP permission management
* UI fixes
* Android Auto improvements
* Some SMB fixes
* Crash fixes
Changes between 3.5.0 Beta 7 and 3.5.0 RC 1:
------------------
* Greatly improve the accessibility
* Improve the first app launch
* Improve the File browser
* Material You icon
* Some UI fixes
* Improve the video player performances
* Crash fixes
Changes between 3.5.0 Beta 6 and 3.5.0 Beta 7:
------------------
* Crash fixes
Changes between 3.5.0 Beta 5 and 3.5.0 Beta 6:
------------------
* New widgets. Now fully customizable!
* New album details screen
* Video player performance improvements
* Improve and fix media progress saving
* Minor UI fixes and improvements
* Crash fixes
Changes between 3.5.0 Beta 4 and 3.5.0 Beta 5:
------------------
* UI improvements
* Crash fixes
* Codebase cleanups
Changes between 3.5.0 Beta 3 and 3.5.0 Beta 4:
------------------
* Foldable devices support for the video player
* New option to add a media shortcut to the launcher
* Browse playlists on Android TV
* Allow picking files from SAF when no permission is granted
* New setting for replay gain
* Support for vgm files added
* History fixes for streams
* UI improvements
* Crash fixes
Changes between 3.5.0 Beta 2 and 3.5.0 Beta 3:
------------------
* Ui and media library fixes
Changes between 3.5.0 Beta 1 and 3.5.0 Beta 2:
------------------
* Playlist can now be searched
* Prevent losing progress on app crash
* Graphical fixes
* Crash fixes
Changes between 3.4.4 and 3.5.0 Beta 1:
------------------
* Network indexation is now stable
* New dedicated tablet UI
* New video controls settings screen allowing more customization
* Revamped about screen and audio list
* Small visual improvements in the audio player
* Improved video ratio and notch management
* Improved keyboard shortcuts support
* A lot of visual and behavior fixes
Changes between 3.4.3 and 3.4.4:
------------------
* Fix a crash on null medias
Changes between 3.4.3 Beta 6 and 3.4.3:
------------------
* Fix some rare crashes on the Sony Bravia devices
* Other crash fixes
Changes between 3.4.3 Beta 5 and 3.4.3 Beta 6:
------------------
* Fix the grid/list button state
* Crash fixes
Changes between 3.4.3 Beta 4 and 3.4.3 Beta 5:
------------------
* Fix the subtitles not working on some Android 12 devices
* Fix some graphical issues
* Crash fixes
Changes between 3.4.3 Beta 3 and 3.4.3 Beta 4:
------------------
* Remove donations
Changes between 3.4.3 Beta 2 and 3.4.3 Beta 3:
------------------
* Use the new file permission
* Crash fixes
Changes between 3.4.3 Beta 1 and 3.4.3 Beta 2:
------------------
* Translation update
* Crash fixes
Changes between 3.4.2 and 3.4.3 Beta 1:
------------------
* Crash fixes
Changes between 3.4.1 and 3.4.2:
------------------
* Fix loading of media when opening the app
* Crash fixes
Changes between 3.4.0 Beta 3 and 3.4.1:
------------------
* Playback fix for TV
Changes between 3.4.0 Beta 2 and 3.4.1 Beta 3:
------------------
* Playback fixes
* Crash fixes
Changes between 3.4.0 Beta 1 and 3.4.1 Beta 2:
------------------
* Crash fixes
Changes between 3.4.0 and 3.4.1 Beta 1:
------------------
* Android auto: better covers
* Android auto: +/- 10 seconds quick seek
* Crash fixes
Changes between 3.4.0 RC 2 and 3.4.0:
------------------
* UI fixes
Changes between 3.4.0 Beta 6 and 3.4.0 RC 1:
------------------
* Better media seeking
* Bug and crash fixes
Changes between 3.4.0 Beta 5 and 3.4.0 Beta 6:
------------------
* Allow seeing the tips again
* Bug and crash fixes
Changes between 3.4.0 Beta 4 and 3.4.0 Beta 5:
------------------
* Shuffle mode improved
* Bug and crash fixes
Changes between 3.4.0 Beta 3 and 3.4.0 Beta 4:
------------------
* Improve the audio player design
* Improve the player tips
* Bug and crash fixes
Changes between 3.4.0 Beta 2 and 3.4.0 Beta 3:
------------------
* Bug fixes
Changes between 3.4.0 Beta 1 and 3.4.0 Beta 2:
------------------
* New onboarding
* Allow using the app without the storage permission
* medialibrary and playback improvements
Changes between 3.3.4 and 3.4.0 Beta 1:
------------------
* Add bookmarks in your medias
* New audio player design
* New video list design
* Network and playback improvements
* A lot of bug fixes and improvements
Changes between 3.3.4 Beta 1 and 3.3.4:
------------------
* Allow sorting albums by artist
* Improve chromecast
* Fix Video track options focus
Changes between 3.3.3 and 3.3.4 Beta 1:
------------------
* Fix some RTL issues
* Improve playback resume
* Persist audio player time mode
* Crash fixes
Changes between 3.3.3 Beta 4 and 3.3.3:
------------------
* Fix scrolling issues
* Fix media not updated during a scan
* Fix the action button visibility
* Improve descriptions for Android Auto and streams
* Crash fixes
Changes between 3.3.3 Beta 3 and 3.3.3 Beta 4:
------------------
* Global audio delay for videos
* Addition of an option to browse the folder of a media
* TV : improve DPAD input in video player
* Improve descriptions for Android Auto and streams
* Fix default orientation for videos
* Allow favorites for UPNP servers
* A lot of UI fixes
* Crash fixes
Changes between 3.3.2 and 3.3.3 Beta 3:
------------------
* Remove a single media from history
* Android TV: fixes and improvements
* Fix audio thumbnails detection
* Fix DVD menu
* Update medialibrary
* Crash fixes
Changes between 3.3.2 Beta 4 and 3.3.2:
------------------
none
Changes between 3.3.2 Beta 3 and 3.3.2 Beta 4:
------------------
Application:
* SMB fixes
* Crash fixes
Changes between 3.3.2 Beta 2 and 3.3.2 Beta 3:
------------------
Application:
* Android Auto new navigation
* Samba network fixes
* Video group improvements
* Fix playlist items remove
* Crash fixes
Changes between 3.3.2 Beta 1 and 3.3.2 Beta 2:
------------------
Application:
* Video player: fix focus issue
* Video group improvements
* SMB fixes
* Android Auto improvements
* Fix picking subtitles for network videos
* Fix OTG
* Crash fixes
Changes between 3.3.1 and 3.3.2 Beta 1:
------------------
Application:
* Allow adding multiple videos to a new group
* SMB fixes
* Fix landscape video orientation
* Fix progression save
* Fix subtitles picking on SD cards
* Android Auto improvements and fixes
* Crash fixes
Changes between 3.3.1 Beta 2 and 3.3.1:
------------------
Application:
* Crash fixes
Changes between 3.3.1 Beta 1 and 3.3.1 Beta 2:
------------------
Application:
* Crash fixes
Changes between 3.3.0 and 3.3.1 Beta 1:
------------------
Application:
* Video: mark as played
* Audio: chapter selection for audio books
* TV: improve PiP behavior
* Video player: increase icons' size
* Thumbnails: fix quality issue
* Crash fixes
Changes between 3.3.0-RC4 and 3.3.0:
------------------
Application:
* Fix streaming issues
* Bug fixes
Changes between 3.3.0-RC3 and 3.3.0-RC4:
------------------
Application:
* Prevent unwanted notifications
* Fix some streams not playing
* Fix midi not considered as audio media
* Some UI fixes
Changes between 3.3.0-beta-07 and 3.3.0-RC1:
------------------
Application:
* Sponsorship added. You can now support VLC Android!
* New UI for subtitles download
* New UI for subtitles picker
Changes between 3.3.0-beta-06 and 3.3.0-beta-07:
------------------
Application:
* New Video Player UI
* UI fixes in the file browser
* Crash fixes
Changes between 3.3.0-beta-04 and 3.3.0-beta-05:
------------------
Application:
* Behavior improvements
* Crash fixes
Changes between 3.3.0-beta-01 and 3.3.0-beta-02:
------------------
......
# VLC for Android
This is the official **Android** port of [VLC](https://videolan.org/vlc/).
VLC on Android plays all the same files as the classical version of VLC, and features a media database
......@@ -19,6 +20,7 @@ for Audio and Video files and stream.
## Project Structure
Here are the current folders of vlc-android project:
- extension-api : Application extensions SDK (not released yet)
- application : Android application source code, organized by modules.
- buildsystem : Build scripts, CI and maven publication configuration
......@@ -44,10 +46,12 @@ And more.
![LibVLC stack](https://images.videolan.org/images/libvlc_stack.png)
You can use our LibVLC module to power your own Android media player.
Have a look at our [sample codes](https://code.videolan.org/videolan/libvlc-android-samples).
Download the `.aar` directly from [Maven](https://search.maven.org/artifact/org.videolan.android/libvlc-all) or build from source.
Have a look at our [sample codes](https://code.videolan.org/videolan/libvlc-android-samples).
## License
VLC for Android is licensed under [GPLv2 (or later)](COPYING). Android libraries make this, de facto, a GPLv3 application.
VLC engine *(LibVLC)* for Android is licensed under [LGPLv2](libvlc/COPYING.LIB).
......@@ -55,6 +59,7 @@ VLC engine *(LibVLC)* for Android is licensed under [LGPLv2](libvlc/COPYING.LIB)
## Build
Native libraries are published on bintray. So you can:
- Build the application and get libraries via gradle dependencies (JVM build only)
- Build the whole app (LibVLC + Medialibrary + Application)
- Build LibVLC only, and get an .aar package
......@@ -62,6 +67,7 @@ Native libraries are published on bintray. So you can:
### Build Application
VLC-Android build relies on gradle build modes :
- `Release` & `Debug` will get LibVLC and Medialibrary from Bintray, and build application source code only.
- `SignedRelease` also, but it will allow you to sign application apk with a local keystore.
- `Dev` will build build LibVLC, Medialibrary, and then build the application with these binaries. (via build scripts only)
......@@ -78,7 +84,7 @@ Check our [AndroidCompile wiki page](https://wiki.videolan.org/AndroidCompile/),
Here are the essential points:
On Debian/Ubuntu, install the required dependencies:
```
```bash
sudo apt install automake ant autopoint cmake build-essential libtool-bin \
patch pkg-config protobuf-compiler ragel subversion unzip git \
openjdk-8-jre openjdk-8-jdk flex python wget
......@@ -97,7 +103,6 @@ Then, you are ready to build!
`buildsystem/compile.sh -l -a <ABI>`
ABI can be `arm`, `arm64`, `x86`, `x86_64` or `all` for a multi-abis build
You can do a library release build with `-r` argument
......@@ -110,7 +115,8 @@ Build Medialibrary with `-ml` instead of `-l`
VLC is a libre and open source project, we welcome all contributions.
Just respect our [Code of Conduct](https://wiki.videolan.org/CoC/).
Just respect our [Code of Conduct](https://wiki.videolan.org/CoC/), and if you want do contribute to the UI or add a new feature, please open an issue first so there can be a discussion about it.
### Pull requests
......@@ -118,7 +124,7 @@ Pull requests must be proposed on our [gitlab server](https://code.videolan.org/
So you must create an account, fork vlc-android project, and propose your merge requests from it.
**Exept for translations**, see the section below.
**Except for translations**, see the section below.
### Translations
......@@ -133,7 +139,7 @@ Please look for existing issues and provide as much useful details as you can (e
A template is provided, please use it!
Issues without relevant informations will be ignored, we cannot help in this case.
Issues without relevant information will be ignored, we cannot help in this case.
## Support
......@@ -141,4 +147,3 @@ Issues without relevant informations will be ignored, we cannot help in this cas
- bugtracker: https://code.videolan.org/videolan/vlc-android/issues
- IRC: *#videolan* channel on [freenode](http://freenode.net/)
- VideoLAN forum: https://forum.videolan.org/
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
packagingOptions {
exclude 'META-INF/main.kotlin_module'
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
pickFirst 'lib/armeabi/libc++_shared.so'
pickFirst 'lib/arm64-v8a/libc++_shared.so'
pickFirst 'lib/x86/libc++_shared.so'
pickFirst 'lib/x86_64/libc++_shared.so'
}
task hrtfsCopy(type: Copy) {
from '../../vlc/share/hrtfs'
into 'src/main/assets/hrtfs'
}
task luaPlaylistCopy(type: Copy) {
from '../../vlc/share/lua/playlist'
into 'src/main/assets/lua/playlist'
exclude '**/*.txt'
android {
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
task luaMetaCopy(type: Copy) {
from '../../vlc/share/lua/meta'
into 'src/main/assets/lua/meta'
exclude '**/*.txt'
packagingOptions {
jniLibs {
pickFirsts += ['lib/armeabi-v7a/libc++_shared.so', 'lib/armeabi/libc++_shared.so', 'lib/arm64-v8a/libc++_shared.so', 'lib/x86/libc++_shared.so', 'lib/x86_64/libc++_shared.so']
}
resources {
excludes += ['META-INF/*']
}
}
dexOptions {
maxProcessCount 8
javaMaxHeapSize "4g"
preDexLibraries true
packaging {
resources.excludes.add("META-INF/versions/9/OSGI-INF/MANIFEST.MF")
}
dataBinding {
enabled = true
}
compileSdkVersion rootProject.ext.compileSdkVersion
flavorDimensions "abi"
lintOptions {
abortOnError false
disable 'MissingTranslation', 'ExtraTranslation'
}
defaultConfig {
applicationId rootProject.ext.appId
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
compileSdk rootProject.ext.compileSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
vectorDrawables.useSupportLibrary = true
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
tasks.whenTaskAdded { task ->
if (task.name.startsWith('merge')) {
task.dependsOn hrtfsCopy
task.dependsOn luaPlaylistCopy
task.dependsOn luaMetaCopy
}
}
testInstrumentationRunner "org.videolan.vlc.MultidexTestRunner"
// The following argument makes the Android Test Orchestrator run its
// "pm clear" command after each test invocation. This command ensures
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
}
signingConfigs {
......@@ -90,18 +66,28 @@ android {
}
}
}
androidComponents {
beforeVariants(selector().withBuildType("vlcBundle")) { variantBuilder ->
variantBuilder.minSdk = 30
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
kotlinOptions.freeCompilerArgs = ['-Xno-param-assertions']
defaultConfig.minSdkVersion rootProject.ext.minSdkVersion
}
signedRelease {
initWith release
signingConfig = signingConfigs.release
matchingFallbacks = ['release']
}
vlcBundle {
initWith release
matchingFallbacks = ['release']
}
debug {
applicationIdSuffix ".debug"
jniDebuggable true
......@@ -119,6 +105,12 @@ android {
manifest.srcFile 'flavors/release/AndroidManifest.xml'
}
bundle {
language {
enableSplit = false
}
}
splits {
abi {
def isReleaseBuild = false
......@@ -138,7 +130,12 @@ android {
}
}
def abiCodes = ['x86': 5, 'x86_64': 8, 'armeabi-v7a': 4, 'arm64-v8a': 7]
def abiCodes = ['armeabi-v7a': 5, 'arm64-v8a': 6, 'x86': 7, 'x86_64': 8]
lint {
abortOnError false
disable 'MissingTranslation', 'ExtraTranslation'
}
namespace 'org.videolan.mobile.app'
// make per-variant version code
applicationVariants.all { variant ->
//Custom APK name and versionCode
......@@ -146,9 +143,16 @@ android {
def outputAbi = output.getFilter(com.android.build.OutputFile.ABI)
def abiName = System.getenv('GRADLE_ABI')?.toLowerCase() ?: "all"
if (outputAbi != null) abiName = outputAbi
output.versionCodeOverride = 10000000 + defaultConfig.versionCode + abiCodes.get(abiName, 0)
def versionCode = abiCodes.get(abiName, 0)
if (variant.buildType.name == "vlcBundle") {
versionCode = 9
}
output.versionCodeOverride = 10000000 + defaultConfig.versionCode + versionCode
def outputName = "VLC-Android-"
outputName += variant.versionName + "-" + abiName + ".apk"
outputName += variant.versionName.replace(" ", "-")
if (variant.buildType.name == "debug") outputName += "-debug"
outputName += "-" + abiName + ".apk"
output.outputFileName = outputName
}
}
......@@ -158,4 +162,31 @@ android {
dependencies {
implementation project(':application:vlc-android')
implementation project(':application:television')
implementation project(':application:remote-access-server')
testImplementation project(':application:television')
testImplementation project(':application:remote-access-server')
androidTestImplementation "androidx.test.espresso:espresso-contrib:$rootProject.espressoVersion"
androidTestImplementation "androidx.test.espresso:espresso-core:$rootProject.espressoVersion"
androidTestImplementation "androidx.test.espresso:espresso-intents:$rootProject.espressoVersion"
testImplementation "junit:junit:$rootProject.ext.junitVersion"
androidTestImplementation "androidx.room:room-testing:$rootProject.ext.roomVersion"
testImplementation "androidx.arch.core:core-testing:$rootProject.ext.archVersion"
androidTestImplementation "androidx.arch.core:core-testing:$rootProject.ext.archVersion"
androidTestImplementation "androidx.test.ext:junit:$rootProject.ext.junitExtVersion"
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:$rootProject.ext.desugarLib"
androidTestUtil "androidx.test:orchestrator:$rootProject.ext.orchestrator"
testImplementation "androidx.test:core:$rootProject.ext.testCore"
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$rootProject.ext.kotlinx_version"
testImplementation "org.mockito:mockito-core:$rootProject.ext.mockito"
testImplementation "io.mockk:mockk:$rootProject.ext.mockk"
testImplementation "org.powermock:powermock-api-mockito2:$rootProject.ext.powerMock"
testImplementation "org.powermock:powermock-module-junit4:$rootProject.ext.powerMock"
testImplementation "com.jraska.livedata:testing-ktx:$rootProject.ext.livedataTest"
testImplementation "org.robolectric:robolectric:$rootProject.ext.robolectric"
androidTestImplementation "com.android.support:multidex:1.0.3"
androidTestImplementation "androidx.test.uiautomator:uiautomator:2.2.0"
androidTestImplementation "androidx.test:rules:$rootProject.ext.testCore"
androidTestImplementation 'com.jraska:falcon:2.2.0'
androidTestImplementation 'tools.fastlane:screengrab:2.1.0'
}
......@@ -24,13 +24,8 @@
~
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="org.videolan.mobile.app">
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.READ_LOGS" tools:node="remove" />
<!-- Extensions API permissions -->
<permission
android:name="org.videolan.vlc.permission.READ_EXTENSION_DATA"
android:protectionLevel="normal" />
......@@ -42,12 +37,6 @@
<uses-permission android:name="org.videolan.vlc.permission.READ_EXTENSION_DATA" />
<uses-permission android:name="org.videolan.vlc.permission.BIND_DATA_CONSUMER" />
<application>
<activity android:name="${applicationId}.gui.DebugLogActivity"
android:theme="@style/Theme.VLC"
android:launchMode="singleTop" />
<service android:name="${applicationId}.DebugLogService"
android:process=":logger" />
</application>
<application/>
</manifest>
<!--
~ *************************************************************************
~ AndroidManifest.xml
~ **************************************************************************
~ Copyright © 2020 VLC authors and VideoLAN
~ Author: Nicolas POMEPUY
~ This program is free software; you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation; either version 2 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program; if not, write to the Free Software
~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
~ ***************************************************************************
~
~
-->
<manifest xmlns:tools="http://schemas.android.com/tools">
<uses-sdk tools:overrideLibrary="android_libs.ub_uiautomator, tools.fastlane.screengrab" />
</manifest>
\ No newline at end of file
package org.videolan.mobile.app
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("org.videolan.mobile.app", appContext.packageName)
}
}
......@@ -10,7 +10,6 @@ import org.junit.runner.RunWith
import org.videolan.resources.util.startMedialibrary
import org.videolan.vlc.util.TestCoroutineContextProvider
@RunWith(AndroidJUnit4::class)
abstract class BaseUITest {
@Rule
......@@ -18,7 +17,6 @@ abstract class BaseUITest {
val storagePermissionGrant = GrantPermissionRule.grant(
"android.permission.READ_EXTERNAL_STORAGE")
val context: Context = ApplicationProvider.getApplicationContext()
@Before
......
/*
* ************************************************************************
* DemoModeEnabler.kt
* *************************************************************************
* Copyright © 2020 VLC authors and VideoLAN
* Author: Nicolas POMEPUY
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
* **************************************************************************
*
*
*/
package org.videolan.vlc
import android.os.ParcelFileDescriptor
import androidx.test.platform.app.InstrumentationRegistry
import java.io.BufferedReader
import java.io.InputStreamReader
class DemoModeEnabler {
fun enable() {
executeShellCommand("settings put global sysui_demo_allowed 1")
sendCommand("exit")
sendCommand("enter")
sendCommand("notifications", "visible" to "false")
sendCommand("network", "wifi" to "show", "level" to "4", "fully" to "true")
sendCommand("network", "mobile" to "show", "level" to "4", "datatype" to "4g")
sendCommand("battery", "level" to "100", "plugged" to "true")
sendCommand("clock", "hhmm" to "1000")
}
fun disable() {
sendCommand("exit")
}
private fun sendCommand(command: String, vararg extras: Pair<String, Any>) {
val exec = StringBuilder("am broadcast -a com.android.systemui.demo -e command $command")
for ((key, value) in extras) {
exec.append(" -e $key $value")
}
executeShellCommand(exec.toString())
}
private fun executeShellCommand(command: String) {
waitForCompletion(InstrumentationRegistry.getInstrumentation().uiAutomation.executeShellCommand(command))
}
private fun waitForCompletion(descriptor: ParcelFileDescriptor) {
val reader = BufferedReader(InputStreamReader(ParcelFileDescriptor.AutoCloseInputStream(descriptor)))
reader.use {
it.readText()
}
}
}
\ No newline at end of file
/*
* ************************************************************************
* DemoModeRule.kt
* *************************************************************************
* Copyright © 2020 VLC authors and VideoLAN
* Author: Nicolas POMEPUY
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
* **************************************************************************
*
*
*/
package org.videolan.vlc
import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement
class DemoModeRule : TestRule {
private val helper = DemoModeEnabler()
override fun apply(base: Statement, description: Description): Statement = DemoModeStatement(base)
private inner class DemoModeStatement(private val base: Statement) : Statement() {
override fun evaluate() {
helper.enable()
base.evaluate()
helper.disable()
}
}
}
\ No newline at end of file
/*
* ************************************************************************
* PhoneScreenhotsInstrumentedTest.kt
* *************************************************************************
* Copyright © 2020 VLC authors and VideoLAN
* Author: Nicolas POMEPUY
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
* **************************************************************************
*
*
*/
package org.videolan.vlc
import android.content.Intent
import android.content.pm.ActivityInfo
import android.net.Uri
import android.os.SystemClock
import android.util.Log
import androidx.core.view.get
import androidx.recyclerview.widget.RecyclerView
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.Espresso.pressBack
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.contrib.RecyclerViewActions
import androidx.test.espresso.matcher.ViewMatchers.*
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.ActivityTestRule
import androidx.test.uiautomator.UiDevice
import androidx.viewpager.widget.ViewPager
import org.hamcrest.core.AllOf
import org.junit.ClassRule
import org.junit.Rule
import org.junit.Test
import org.videolan.medialibrary.MLServiceLocator
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.resources.EXTRA_FOR_ESPRESSO
import org.videolan.resources.EXTRA_TARGET
import org.videolan.tools.Settings
import org.videolan.vlc.gui.MainActivity
import org.videolan.vlc.gui.helpers.UiTools.isTablet
import org.videolan.vlc.gui.view.TitleListView
import org.videolan.vlc.util.DpadHelper.pressHome
import org.videolan.vlc.util.DpadHelper.pressPip
import org.videolan.vlc.util.DpadHelper.pressStop
import org.videolan.vlc.util.DummyMediaWrapperProvider
import org.videolan.vlc.util.ScreenshotUtil
import org.videolan.vlc.util.UiUtils.waitId
import org.videolan.vlc.util.UiUtils.waitUntilLoaded
import tools.fastlane.screengrab.Screengrab
import tools.fastlane.screengrab.UiAutomatorScreenshotStrategy
import tools.fastlane.screengrab.locale.LocaleTestRule
//@RunWith(AndroidJUnit4::class)
class PhoneScreenhotsInstrumentedTest : BaseUITest() {
@Rule
@JvmField
val activityTestRule = ActivityTestRule(MainActivity::class.java, true, false)
@Rule
@JvmField
val demoModeRule = DemoModeRule()
lateinit var activity: MainActivity
@Test
fun testTakeScreenshot() {
onView(isRoot()).perform(waitId(R.id.audio_list, 5000))
//Audio
waitUntilLoaded { activity.findViewById(R.id.audio_list) }
onView(withId(R.id.sliding_tabs)).perform(TabsMatcher(0))
waitUntilLoaded { activity.findViewById(R.id.audio_list) }
SystemClock.sleep(1500)
waitUntilLoaded { activity.findViewById<ViewPager>(R.id.pager).get(0).findViewById(R.id.audio_list) }
SystemClock.sleep(500)
ScreenshotUtil.takeScreenshot(2, "audio_list")
onView(withId(R.id.sliding_tabs)).perform(TabsMatcher(2))
waitUntilLoaded { activity.findViewById<ViewPager>(R.id.pager).get(2).findViewById(R.id.audio_list) }
SystemClock.sleep(1500)
//We use the audio list as PiP background. The PiP img is static
ScreenshotUtil.takeScreenshot(7,"pip_video")
onView(withId(R.id.ml_menu_last_playlist)).perform(click())
onView(isRoot()).perform(waitId(R.id.audio_media_switcher, 5000))
activity.slideUpOrDownAudioPlayer()
SystemClock.sleep(1500)
waitUntilLoaded { activity.findViewById(R.id.songs_list) }
SystemClock.sleep(1500)
ScreenshotUtil.takeScreenshot(4,"audio_player_playlist")
onView(withId(R.id.playlist_switch)).perform(click())
ScreenshotUtil.takeScreenshot(3,"audio_player")
onView(withId(R.id.playlist_switch)).perform(click())
onView(withId(R.id.adv_function)).perform(click())
waitUntilLoaded { activity.findViewById(R.id.options_list) }
onView(withId(R.id.options_list))
.perform(RecyclerViewActions.actionOnItemAtPosition<RecyclerView.ViewHolder>(3, click()))
waitId(R.id.equalizer_bands, 5000)
ScreenshotUtil.takeScreenshot(9,"equalizer")
pressBack()
//close audio player
onView(withId(R.id.header)).perform(click())
pressStop()
}
@Test
fun testTakeScreenshotVideo() {
onView(AllOf.allOf(withId(R.id.nav_video), withEffectiveVisibility(Visibility.VISIBLE)))
.perform(click())
Log.d("Espresso", "0")
waitUntilLoaded { activity.findViewById(R.id.video_grid) }
SystemClock.sleep(1500)
Log.d("Espresso", "1")
ScreenshotUtil.takeScreenshot(1, "video_list")
val rvMatcher = withRecyclerView(R.id.video_grid)
Log.d("Espresso", "2")
onView(rvMatcher.atPosition(2)).perform(click())
Log.d("Espresso", "3")
onView(isRoot()).perform(orientationLandscape())
onView(isRoot()).perform(waitId(R.id.player_root, 5000))
SystemClock.sleep(1500)
onView(withId(R.id.player_root)).perform(click())
SystemClock.sleep(500)
ScreenshotUtil.takeScreenshot(6, "video_player")
}
@Test
fun testTakeScreenshotBrowser() {
onView(AllOf.allOf(withId(R.id.nav_directories), withEffectiveVisibility(Visibility.VISIBLE)))
.perform(click())
waitUntilLoaded { activity.findViewById<TitleListView>(R.id.network_browser_entry).findViewById(R.id.list) }
ScreenshotUtil.takeScreenshot(5,"browser")
}
private fun rotateLandscape() = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).setOrientationLeft()
private fun disableRotateLandscape() = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).setOrientationNatural()
companion object {
@ClassRule
@JvmField
val localeTestRule = LocaleTestRule()
}
override fun beforeTest() {
Screengrab.setDefaultScreenshotStrategy(UiAutomatorScreenshotStrategy())
Settings.getInstance(context).edit().putBoolean("auto_rescan", false).putBoolean("audio_resume_card", false).commit()
val intent = Intent().apply {
putExtra(EXTRA_TARGET, R.id.nav_audio)
putParcelableArrayListExtra(
EXTRA_FOR_ESPRESSO, arrayListOf(
MLServiceLocator.getAbstractMediaWrapper(
Uri.parse("upnp://test/mock"), 0L, 0F, 0L, MediaWrapper.TYPE_ALL,
null, "My NAS", -1, -1, "",
"", -1, "", "",
0, 0, "/storage/emulated/0/Download/upnp2.png",
0, 0, 0,
0, 0L, 0L,
0L
),
MLServiceLocator.getAbstractMediaWrapper(
Uri.parse("upnp://test/mock"), 0L, 0F, 0L, MediaWrapper.TYPE_ALL,
null, "My SMB server", -1, -1, "",
"", -1, "", "",
0, 0, "/storage/emulated/0/Download/upnp1.png",
0, 0, 0,
0, 0L, 0L,
0L
)
)
)
}
activityTestRule.launchActivity(intent)
activity = activityTestRule.activity
}
}
......@@ -107,7 +107,6 @@ object PreferenceMatchers {
} catch (ignored: Resources.NotFoundException) {
/* view could be from a context unaware of the resource id. */
}
}
return if (null != expectedText && preference.title != null) {
expectedText == preference.title.toString()
......
/*
* ************************************************************************
* TvScreenhotsInstrumentedTest.kt
* *************************************************************************
* Copyright © 2020 VLC authors and VideoLAN
* Author: Nicolas POMEPUY
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
* **************************************************************************
*
*
*/
package org.videolan.vlc
import android.app.Activity
import android.content.Intent
import android.os.SystemClock
import androidx.test.espresso.Espresso
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.matcher.ViewMatchers.*
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.ActivityTestRule
import androidx.test.runner.lifecycle.ActivityLifecycleMonitorRegistry
import androidx.test.runner.lifecycle.Stage
import androidx.test.uiautomator.Direction
import org.hamcrest.Matchers.allOf
import org.junit.ClassRule
import org.junit.Rule
import org.junit.Test
import org.videolan.resources.EXTRA_TARGET
import org.videolan.television.ui.MainTvActivity
import org.videolan.television.ui.audioplayer.AudioPlayerActivity
import org.videolan.television.ui.browser.VerticalGridActivity
import org.videolan.tools.Settings
import org.videolan.vlc.util.DpadHelper.pressBack
import org.videolan.vlc.util.DpadHelper.pressDPad
import org.videolan.vlc.util.DpadHelper.pressDPadCenter
import org.videolan.vlc.util.DpadHelper.pressHome
import org.videolan.vlc.util.DpadHelper.pressPip
import org.videolan.vlc.util.ScreenshotUtil
import org.videolan.vlc.util.UiUtils
import org.videolan.vlc.util.UiUtils.waitForActivity
import org.videolan.vlc.util.UiUtils.waitId
import tools.fastlane.screengrab.Screengrab
import tools.fastlane.screengrab.UiAutomatorScreenshotStrategy
import tools.fastlane.screengrab.locale.LocaleTestRule
//@RunWith(AndroidJUnit4::class)
class TvScreenhotsInstrumentedTest : BaseUITest() {
@Rule
@JvmField
val activityTestRule = ActivityTestRule(MainTvActivity::class.java, true, false)
@Rule
@JvmField
val demoModeRule = DemoModeRule()
lateinit var activity: MainTvActivity
companion object {
@ClassRule
@JvmField
val localeTestRule = LocaleTestRule()
}
override fun beforeTest() {
Screengrab.setDefaultScreenshotStrategy(UiAutomatorScreenshotStrategy())
Settings.getInstance(context).edit().putBoolean("auto_rescan", false).putBoolean("audio_resume_card", false).commit()
val intent = Intent().apply {
putExtra(EXTRA_TARGET, R.id.nav_audio)
}
activityTestRule.launchActivity(intent)
activity = activityTestRule.activity
}
fun getCurrentActivity(): Activity? {
var currentActivity: Activity? = null
InstrumentationRegistry.getInstrumentation().runOnMainSync { run { currentActivity = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED).elementAtOrNull(0) } }
return currentActivity
}
@Test
fun testTakeScreenshot() {
SystemClock.sleep(1500)
//Audio
ScreenshotUtil.takeScreenshot(1, "tv_home")
onView(allOf(withId(R.id.row_header), withText(activity.getString(R.string.audio)), withEffectiveVisibility(Visibility.VISIBLE))).perform(click())
pressDPad(Direction.RIGHT, 4)
pressDPadCenter()
waitForActivity(VerticalGridActivity::class.java)
getCurrentActivity()?.let { activity ->
UiUtils.waitUntilLoaded { activity.findViewById(org.videolan.television.R.id.list) }
} ?: throw IllegalStateException("Cannot find activity")
ScreenshotUtil.takeScreenshot(4,"tv_audio_list")
pressDPad(Direction.DOWN, 4)
pressDPadCenter()
waitForActivity(AudioPlayerActivity::class.java)
waitId(org.videolan.television.R.id.album_cover, 5000)
ScreenshotUtil.takeScreenshot(6,"tv_audio_player")
pressBack()
pressBack()
pressDPad(Direction.DOWN, 2)
pressDPadCenter()
waitForActivity(VerticalGridActivity::class.java)
getCurrentActivity()?.let { activity ->
UiUtils.waitUntilLoaded { activity.findViewById(org.videolan.television.R.id.list) }
}
ScreenshotUtil.takeScreenshot(5,"tv_files")
pressBack()
pressDPad(Direction.LEFT)
onView(allOf(withId(R.id.row_header), withText(activity.getString(R.string.video)), withEffectiveVisibility(Visibility.VISIBLE))).perform(click())
pressDPadCenter()
pressDPadCenter()
waitForActivity(VerticalGridActivity::class.java)
getCurrentActivity()?.let { activity ->
UiUtils.waitUntilLoaded { activity.findViewById(org.videolan.television.R.id.list) }
}
ScreenshotUtil.takeScreenshot(2,"tv_video_list")
pressDPad(Direction.DOWN, 1)
pressDPadCenter()
SystemClock.sleep(1500)
pressDPad(Direction.DOWN)
SystemClock.sleep(600)
ScreenshotUtil.takeScreenshot(3,"tv_video_player")
Espresso.pressBack()
pressPip()
pressHome()
pressPip()
SystemClock.sleep(1500)
ScreenshotUtil.takeScreenshot(7,"tv_pip")
}
}
......@@ -12,8 +12,6 @@ import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.contrib.RecyclerViewActions
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.hamcrest.Description
import org.hamcrest.Matcher
import org.hamcrest.TypeSafeMatcher
......@@ -49,8 +47,6 @@ fun withMediaItem(mediaItem: MediaLibraryItem?): DiffAdapterMatcher<MediaLibrary
}
}
@ExperimentalCoroutinesApi
@ObsoleteCoroutinesApi
fun <D, VH : RecyclerView.ViewHolder> findFirstPosition(adapter: DiffUtilAdapter<D, VH>, vararg matchers: DiffAdapterMatcher<D>): Int {
val iter = adapter.dataset.iterator().withIndex()
while (iter.hasNext()) {
......@@ -61,9 +57,7 @@ fun <D, VH : RecyclerView.ViewHolder> findFirstPosition(adapter: DiffUtilAdapter
return -1
}
@ExperimentalCoroutinesApi
@ObsoleteCoroutinesApi
fun <D, VH : RecyclerView.ViewHolder> findFirstPosition(adapter: PagedListAdapter<D, VH>, vararg matchers: DiffAdapterMatcher<D>): Int {
fun <D : Any, VH : RecyclerView.ViewHolder> findFirstPosition(adapter: PagedListAdapter<D, VH>, vararg matchers: DiffAdapterMatcher<D>): Int {
val iter = adapter.currentList!!.iterator().withIndex()
while (iter.hasNext()) {
val index = iter.next()
......@@ -85,7 +79,7 @@ fun findFirstPreferencePosition(@IdRes recyclerViewId: Int, vararg matchers: Mat
return -1 to count
}
fun onPreferenceRow(@IdRes recyclerViewId: Int, vararg matchers: Matcher<Preference>): ViewInteraction? = findFirstPreferencePosition(recyclerViewId, *matchers).let {(i, count) ->
fun onPreferenceRow(@IdRes recyclerViewId: Int, vararg matchers: Matcher<Preference>): ViewInteraction? = findFirstPreferencePosition(recyclerViewId, *matchers).let { (i, count) ->
if (i != -1) {
// FIXME: Fails to scroll to the bottom of recycler view
onView(withId(recyclerViewId))
......