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
  • sami-sweng/vlc-android
  • josiahcarlson/vlc-android
328 results
Show changes
Commits on Source (2554)
Showing
with 563 additions and 146 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
......
<!---
/!\ 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.4 Beta 1 and 3.6.4 Beta 2:
------------------
* Fix a permission issue
* Add a confirmation when overwriting playlists
Changes between 3.6.3 and 3.6.4 Beta 1:
------------------
* Improve the playback speed feature
* Subtitle download fixes
* Fix some permission issues
* Widget state improvement
* UI and crash fixes
Changes between 3.6.2 and 3.6.3:
------------------
* Fix SMB navigation
* Cast only audio setting
* Behavior and crash fixes
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
......
# 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 {
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
packagingOptions {
exclude 'META-INF/main.kotlin_module'
exclude 'META-INF/donations_debug.kotlin_module'
exclude 'META-INF/mediadb_debug.kotlin_module'
exclude 'META-INF/resources_debug.kotlin_module'
exclude 'META-INF/television_debug.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'
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
......@@ -82,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
......@@ -111,6 +105,12 @@ android {
manifest.srcFile 'flavors/release/AndroidManifest.xml'
}
bundle {
language {
enableSplit = false
}
}
splits {
abi {
def isReleaseBuild = false
......@@ -130,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
......@@ -138,7 +143,12 @@ 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.replace(" ", "-")
if (variant.buildType.name == "debug") outputName += "-debug"
......@@ -152,7 +162,9 @@ 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"
......@@ -161,7 +173,8 @@ dependencies {
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.supportTest"
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"
......@@ -173,7 +186,7 @@ dependencies {
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:1.3.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>
......@@ -22,9 +22,7 @@
~
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="org.videolan.mobile.app">
<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
......@@ -25,26 +25,37 @@
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.matcher.ViewMatchers.isRoot
import androidx.test.espresso.matcher.ViewMatchers.withId
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 kotlinx.coroutines.ObsoleteCoroutinesApi
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
......@@ -64,40 +75,54 @@ class PhoneScreenhotsInstrumentedTest : BaseUITest() {
lateinit var activity: MainActivity
@ObsoleteCoroutinesApi
@Test
fun testTakeScreenshot() {
onView(isRoot()).perform(waitId(R.id.audio_list, 5000))
//Audio
// ScreenshotUtil.takeScreenshot("01_trash")
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(3, "audio_list")
ScreenshotUtil.takeScreenshot(2, "audio_list")
onView(withId(R.id.sliding_tabs)).perform(TabsMatcher(2))
waitUntilLoaded { activity.findViewById(R.id.audio_list) }
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.header, 5000))
// ScreenshotUtil.takeScreenshot(7,"audio_player_collapsed")
onView(withId(R.id.header)).perform(click())
SystemClock.sleep(300)
ScreenshotUtil.takeScreenshot(6,"audio_player_playlist")
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(5,"audio_player")
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()
}
@ObsoleteCoroutinesApi
@Test
fun testTakeScreenshotVideo() {
onView(withId(R.id.nav_video))
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")
......@@ -107,34 +132,23 @@ class PhoneScreenhotsInstrumentedTest : BaseUITest() {
onView(rvMatcher.atPosition(2)).perform(click())
Log.d("Espresso", "3")
rotateLandscape()
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(2, "video_player")
onView(withId(R.id.player_overlay_adv_function)).perform(ForceClickAction())
SystemClock.sleep(500)
ScreenshotUtil.takeScreenshot(7,"video_player_advanced_options")
disableRotateLandscape()
SystemClock.sleep(500)
onView(withRecyclerView(R.id.options_list).atPositionOnView(4, R.id.option_title)).perform(click())
// ScreenshotUtil.takeScreenshot(9,"video_player_equalizer")
pressBack()
pressPip()
pressHome()
pressPip()
ScreenshotUtil.takeScreenshot(8,"pip")
ScreenshotUtil.takeScreenshot(6, "video_player")
}
@ObsoleteCoroutinesApi
@Test
fun testTakeScreenshotBrowser() {
onView(withId(R.id.nav_directories))
onView(AllOf.allOf(withId(R.id.nav_directories), withEffectiveVisibility(Visibility.VISIBLE)))
.perform(click())
ScreenshotUtil.takeScreenshot(4,"browser")
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()
......@@ -151,6 +165,29 @@ class PhoneScreenhotsInstrumentedTest : BaseUITest() {
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
......
......@@ -36,7 +36,6 @@ import androidx.test.rule.ActivityTestRule
import androidx.test.runner.lifecycle.ActivityLifecycleMonitorRegistry
import androidx.test.runner.lifecycle.Stage
import androidx.test.uiautomator.Direction
import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.hamcrest.Matchers.allOf
import org.junit.ClassRule
import org.junit.Rule
......@@ -93,7 +92,6 @@ class TvScreenhotsInstrumentedTest : BaseUITest() {
return currentActivity
}
@ObsoleteCoroutinesApi
@Test
fun testTakeScreenshot() {
SystemClock.sleep(1500)
......
......@@ -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()
......
......@@ -22,8 +22,6 @@ import androidx.test.espresso.ViewAction
import androidx.test.espresso.matcher.BoundedMatcher
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import com.google.android.material.tabs.TabLayout
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.hamcrest.BaseMatcher
import org.hamcrest.Description
import org.hamcrest.Matcher
......@@ -93,8 +91,6 @@ fun withBgColor(@ColorInt color: Int): Matcher<View> {
}
}
@ObsoleteCoroutinesApi
@ExperimentalCoroutinesApi
class MediaRecyclerViewMatcher<VH : SelectorViewHolder<out ViewDataBinding>>(@IdRes private val recyclerViewId: Int) {
var recyclerView: RecyclerView? = null
......
......@@ -58,7 +58,7 @@ class BrowserFavDaoTest: DbTest() {
/*===========================================================*/
val networkFavs = getValue(db.browserFavDao().getAllNetwrokFavs())
val networkFavs = getValue(db.browserFavDao().getAllNetworkFavs())
assertThat(networkFavs.size, equalTo(2))
assertThat(networkFavs, hasItem(fakeNetworkFavs[0]))
......
package org.videolan.vlc.gui
import android.content.Intent
import androidx.test.espresso.Espresso.*
import androidx.test.espresso.action.*
import androidx.test.espresso.action.ViewActions.*
import androidx.test.espresso.assertion.ViewAssertions.*
import androidx.test.espresso.contrib.DrawerActions.*
import androidx.test.espresso.matcher.RootMatchers.*
import androidx.test.espresso.matcher.ViewMatchers.*
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.CoordinatesProvider
import androidx.test.espresso.action.GeneralLocation
import androidx.test.espresso.action.GeneralSwipeAction
import androidx.test.espresso.action.Press
import androidx.test.espresso.action.Swipe
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.assertThat
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.rule.ActivityTestRule
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.hamcrest.Matchers.*
import org.hamcrest.Matchers.equalTo
import org.junit.Rule
import org.junit.Test
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.vlc.BaseUITest
import org.videolan.vlc.R
import org.videolan.vlc.*
import org.videolan.vlc.databinding.AudioBrowserItemBinding
import org.videolan.vlc.findFirstPosition
import org.videolan.vlc.gui.audio.AudioBrowserAdapter
import org.videolan.vlc.gui.audio.AudioBrowserFragment
import org.videolan.vlc.sizeOfAtLeast
import org.videolan.vlc.withMediaItem
import org.videolan.vlc.withRecyclerView
@ObsoleteCoroutinesApi
@ExperimentalCoroutinesApi
class PlaylistActivityUITest: BaseUITest() {
class HeaderMediaListActivityUITest: BaseUITest() {
@Rule
@JvmField
val activityTestRule = ActivityTestRule(PlaylistActivity::class.java, true, false)
val activityTestRule = ActivityTestRule(HeaderMediaListActivity::class.java, true, false)
lateinit var activity: PlaylistActivity
lateinit var activity: HeaderMediaListActivity
override fun beforeTest() {
// TODO: Hack because of IO Dispatcher used in MediaParsingService channel
Thread.sleep(3 * 1000)
val ml = Medialibrary.getInstance()
val pl = ml.createPlaylist("test", true)
pl.append(ml.getPagedVideos(Medialibrary.SORT_DEFAULT, false, true, 5, 0).map { it.id })
pl.append(ml.getPagedAudio(Medialibrary.SORT_DEFAULT, false, true, 5, 0).map { it.id })
val pl = ml.createPlaylist("test", true, false)
pl.append(ml.getPagedVideos(Medialibrary.SORT_DEFAULT, false, true, false, 5, 0).map { it.id })
pl.append(ml.getPagedAudio(Medialibrary.SORT_DEFAULT, false, true, false, 5, 0).map { it.id })
val intent = Intent().apply {
putExtra(AudioBrowserFragment.TAG_ITEM, pl)
......
......@@ -5,28 +5,39 @@ import android.widget.EditText
import androidx.test.espresso.Espresso
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu
import androidx.test.espresso.action.ViewActions.*
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.action.ViewActions.longClick
import androidx.test.espresso.action.ViewActions.typeTextIntoFocusedView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.contrib.DrawerActions.open
import androidx.test.espresso.matcher.RootMatchers.isPlatformPopup
import androidx.test.espresso.matcher.ViewMatchers.*
import androidx.test.espresso.matcher.ViewMatchers.assertThat
import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.rule.ActivityTestRule
import com.google.android.material.internal.NavigationMenuItemView
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.hamcrest.Matchers.*
import org.hamcrest.Matchers.allOf
import org.hamcrest.Matchers.anyOf
import org.hamcrest.Matchers.equalTo
import org.hamcrest.Matchers.instanceOf
import org.hamcrest.Matchers.notNullValue
import org.junit.After
import org.junit.Rule
import org.junit.Test
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.vlc.*
import org.videolan.vlc.gui.dialogs.SavePlaylistDialog
import org.videolan.tools.CoroutineContextProvider
import org.videolan.medialibrary.interfaces.media.Playlist
import org.videolan.resources.EXTRA_TARGET
import org.videolan.tools.CoroutineContextProvider
import org.videolan.vlc.BaseUITest
import org.videolan.vlc.R
import org.videolan.vlc.gui.dialogs.SavePlaylistDialog
import org.videolan.vlc.sizeOfAtLeast
import org.videolan.vlc.util.TestCoroutineContextProvider
import org.videolan.vlc.withCount
import org.videolan.vlc.withRecyclerView
@ObsoleteCoroutinesApi
@ExperimentalCoroutinesApi
class PlaylistFragmentUITest: BaseUITest() {
@Rule
@JvmField
......@@ -47,14 +58,14 @@ class PlaylistFragmentUITest: BaseUITest() {
@After
fun resetData() {
Medialibrary.getInstance().playlists.map { it.delete() }
Medialibrary.getInstance().getPlaylists(Playlist.Type.All, false).map { it.delete() }
}
private fun createDummyPlaylist() {
val ml = Medialibrary.getInstance()
val pl = ml.createPlaylist(DUMMY_PLAYLIST, true)
pl.append(ml.getPagedVideos(Medialibrary.SORT_DEFAULT, false, true, 5, 0).map { it.id })
pl.append(ml.getPagedAudio(Medialibrary.SORT_DEFAULT, false, true, 5, 0).map { it.id })
val pl = ml.createPlaylist(DUMMY_PLAYLIST, true, false)
pl.append(ml.getPagedVideos(Medialibrary.SORT_DEFAULT, false, true, false, 5, 0).map { it.id })
pl.append(ml.getPagedAudio(Medialibrary.SORT_DEFAULT, false, true, false, 5, 0).map { it.id })
}
@Test
......
......@@ -13,8 +13,6 @@ import androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition
import androidx.test.espresso.matcher.RootMatchers.isPlatformPopup
import androidx.test.espresso.matcher.ViewMatchers.*
import androidx.test.rule.ActivityTestRule
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.hamcrest.Matchers.*
import org.junit.Rule
import org.junit.Test
......@@ -27,8 +25,6 @@ import org.videolan.vlc.gui.DiffUtilAdapter
import org.videolan.vlc.gui.MainActivity
import org.videolan.vlc.gui.helpers.SelectorViewHolder
@ObsoleteCoroutinesApi
@ExperimentalCoroutinesApi
class FileBrowserFragmentUITest : BaseUITest() {
@Rule
@JvmField
......@@ -395,9 +391,9 @@ class FileBrowserFragmentUITest : BaseUITest() {
onView(withRecyclerView(R.id.network_list).atPosition(0)).perform(click())
onView(withId(R.id.ml_menu_save))
.check(matches(withActionIconDrawable(R.drawable.ic_menu_bookmark_outline_w)))
.check(matches(withActionIconDrawable(R.drawable.ic_fav_add)))
.perform(click())
.check(matches(withActionIconDrawable(R.drawable.ic_menu_bookmark_w)))
.check(matches(withActionIconDrawable(R.drawable.ic_fav_remove)))
onView(isRoot()).perform(pressBack())
onView(isRoot()).perform(pressBack())
......@@ -418,9 +414,9 @@ class FileBrowserFragmentUITest : BaseUITest() {
onView(withRecyclerView(R.id.network_list).atPosition(3)).perform(click())
onView(withId(R.id.ml_menu_save))
.check(matches(withActionIconDrawable(R.drawable.ic_menu_bookmark_w)))
.check(matches(withActionIconDrawable(R.drawable.ic_fav_remove)))
.perform(click())
.check(matches(withActionIconDrawable(R.drawable.ic_menu_bookmark_outline_w)))
.check(matches(withActionIconDrawable(R.drawable.ic_fav_add)))
onView(isRoot()).perform(pressBack())
......
......@@ -29,16 +29,12 @@ import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.rule.ActivityTestRule
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.hamcrest.Matchers.equalTo
import org.hamcrest.Matchers.greaterThan
import org.junit.Rule
import org.junit.Test
import org.videolan.vlc.R
@ObsoleteCoroutinesApi
@ExperimentalCoroutinesApi
class FilePickerFragmentUITest : org.videolan.vlc.BaseUITest() {
@Rule
@JvmField
......