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
  • mzych/vlc-android
  • amarradi/vlc-android
330 results
Show changes
Commits on Source (52)
Showing
with 303 additions and 85 deletions
...@@ -9,4 +9,13 @@ minimum_perc = 50 ...@@ -9,4 +9,13 @@ minimum_perc = 50
resource_name = android resource_name = android
replace_edited_strings = false replace_edited_strings = false
keep_translations = 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 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
\ No newline at end of file
[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.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: Changes between 3.6.0 Beta 6 and 3.6.0:
------------------ ------------------
* Improve the orientation user experience in the video player * Improve the orientation user experience in the video player
......
...@@ -162,12 +162,9 @@ android { ...@@ -162,12 +162,9 @@ android {
dependencies { dependencies {
implementation project(':application:vlc-android') implementation project(':application:vlc-android')
implementation project(':application:television') implementation project(':application:television')
devImplementation project(':application:webserver') implementation project(':application:remote-access-server')
debugImplementation project(':application:webserver')
releaseImplementation "org.videolan.android:remote-access:$rootProject.ext.remoteAccessVersion"
vlcBundleImplementation "org.videolan.android:remote-access:$rootProject.ext.remoteAccessVersion"
testImplementation project(':application:television') testImplementation project(':application:television')
testImplementation project(':application:webserver') testImplementation project(':application:remote-access-server')
androidTestImplementation "androidx.test.espresso:espresso-contrib:$rootProject.espressoVersion" androidTestImplementation "androidx.test.espresso:espresso-contrib:$rootProject.espressoVersion"
androidTestImplementation "androidx.test.espresso:espresso-core:$rootProject.espressoVersion" androidTestImplementation "androidx.test.espresso:espresso-core:$rootProject.espressoVersion"
......
...@@ -26,26 +26,36 @@ package org.videolan.vlc ...@@ -26,26 +26,36 @@ package org.videolan.vlc
import android.content.Intent import android.content.Intent
import android.content.pm.ActivityInfo import android.content.pm.ActivityInfo
import android.net.Uri
import android.os.SystemClock import android.os.SystemClock
import android.util.Log 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.onView
import androidx.test.espresso.Espresso.pressBack import androidx.test.espresso.Espresso.pressBack
import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.contrib.RecyclerViewActions
import androidx.test.espresso.matcher.ViewMatchers.* import androidx.test.espresso.matcher.ViewMatchers.*
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.ActivityTestRule import androidx.test.rule.ActivityTestRule
import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.UiDevice
import androidx.viewpager.widget.ViewPager
import org.hamcrest.core.AllOf import org.hamcrest.core.AllOf
import org.junit.ClassRule import org.junit.ClassRule
import org.junit.Rule import org.junit.Rule
import org.junit.Test 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.resources.EXTRA_TARGET
import org.videolan.tools.Settings import org.videolan.tools.Settings
import org.videolan.vlc.gui.MainActivity import org.videolan.vlc.gui.MainActivity
import org.videolan.vlc.gui.helpers.UiTools.isTablet 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.pressHome
import org.videolan.vlc.util.DpadHelper.pressPip import org.videolan.vlc.util.DpadHelper.pressPip
import org.videolan.vlc.util.DpadHelper.pressStop import org.videolan.vlc.util.DpadHelper.pressStop
import org.videolan.vlc.util.DummyMediaWrapperProvider
import org.videolan.vlc.util.ScreenshotUtil import org.videolan.vlc.util.ScreenshotUtil
import org.videolan.vlc.util.UiUtils.waitId import org.videolan.vlc.util.UiUtils.waitId
import org.videolan.vlc.util.UiUtils.waitUntilLoaded import org.videolan.vlc.util.UiUtils.waitUntilLoaded
...@@ -69,23 +79,38 @@ class PhoneScreenhotsInstrumentedTest : BaseUITest() { ...@@ -69,23 +79,38 @@ class PhoneScreenhotsInstrumentedTest : BaseUITest() {
fun testTakeScreenshot() { fun testTakeScreenshot() {
onView(isRoot()).perform(waitId(R.id.audio_list, 5000)) onView(isRoot()).perform(waitId(R.id.audio_list, 5000))
//Audio //Audio
// ScreenshotUtil.takeScreenshot("01_trash") waitUntilLoaded { activity.findViewById(R.id.audio_list) }
onView(withId(R.id.sliding_tabs)).perform(TabsMatcher(0)) onView(withId(R.id.sliding_tabs)).perform(TabsMatcher(0))
waitUntilLoaded { activity.findViewById(R.id.audio_list) } 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) SystemClock.sleep(500)
ScreenshotUtil.takeScreenshot(3, "audio_list") ScreenshotUtil.takeScreenshot(2, "audio_list")
onView(withId(R.id.sliding_tabs)).perform(TabsMatcher(2)) onView(withId(R.id.sliding_tabs)).perform(TabsMatcher(2))
SystemClock.sleep(500) waitUntilLoaded { activity.findViewById<ViewPager>(R.id.pager).get(2).findViewById(R.id.audio_list) }
waitUntilLoaded { activity.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(withId(R.id.ml_menu_last_playlist)).perform(click())
onView(isRoot()).perform(waitId(R.id.audio_media_switcher, 5000)) onView(isRoot()).perform(waitId(R.id.audio_media_switcher, 5000))
onView(withId(R.id.audio_media_switcher)).perform(click()) activity.slideUpOrDownAudioPlayer()
SystemClock.sleep(300) SystemClock.sleep(1500)
ScreenshotUtil.takeScreenshot(6,"audio_player_playlist") waitUntilLoaded { activity.findViewById(R.id.songs_list) }
SystemClock.sleep(1500)
ScreenshotUtil.takeScreenshot(4,"audio_player_playlist")
onView(withId(R.id.playlist_switch)).perform(click()) 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.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 //close audio player
onView(withId(R.id.header)).perform(click()) onView(withId(R.id.header)).perform(click())
pressStop() pressStop()
...@@ -97,6 +122,7 @@ class PhoneScreenhotsInstrumentedTest : BaseUITest() { ...@@ -97,6 +122,7 @@ class PhoneScreenhotsInstrumentedTest : BaseUITest() {
.perform(click()) .perform(click())
Log.d("Espresso", "0") Log.d("Espresso", "0")
waitUntilLoaded { activity.findViewById(R.id.video_grid) } waitUntilLoaded { activity.findViewById(R.id.video_grid) }
SystemClock.sleep(1500)
Log.d("Espresso", "1") Log.d("Espresso", "1")
ScreenshotUtil.takeScreenshot(1, "video_list") ScreenshotUtil.takeScreenshot(1, "video_list")
...@@ -106,34 +132,23 @@ class PhoneScreenhotsInstrumentedTest : BaseUITest() { ...@@ -106,34 +132,23 @@ class PhoneScreenhotsInstrumentedTest : BaseUITest() {
onView(rvMatcher.atPosition(2)).perform(click()) onView(rvMatcher.atPosition(2)).perform(click())
Log.d("Espresso", "3") Log.d("Espresso", "3")
rotateLandscape()
onView(isRoot()).perform(orientationLandscape()) onView(isRoot()).perform(orientationLandscape())
onView(isRoot()).perform(waitId(R.id.player_root, 5000)) onView(isRoot()).perform(waitId(R.id.player_root, 5000))
SystemClock.sleep(1500) SystemClock.sleep(1500)
onView(withId(R.id.player_root)).perform(click()) onView(withId(R.id.player_root)).perform(click())
SystemClock.sleep(500) SystemClock.sleep(500)
ScreenshotUtil.takeScreenshot(2, "video_player") ScreenshotUtil.takeScreenshot(6, "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()
onView(withId(R.id.player_overlay_adv_function)).perform(ForceClickAction())
onView(withRecyclerView(R.id.options_list).atPositionOnView(6, R.id.option_title)).perform(click())
pressHome()
pressPip()
ScreenshotUtil.takeScreenshot(8,"pip")
} }
@Test @Test
fun testTakeScreenshotBrowser() { fun testTakeScreenshotBrowser() {
onView(AllOf.allOf(withId(R.id.nav_directories), withEffectiveVisibility(Visibility.VISIBLE))) onView(AllOf.allOf(withId(R.id.nav_directories), withEffectiveVisibility(Visibility.VISIBLE)))
.perform(click()) .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() private fun rotateLandscape() = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).setOrientationLeft()
...@@ -150,11 +165,31 @@ class PhoneScreenhotsInstrumentedTest : BaseUITest() { ...@@ -150,11 +165,31 @@ class PhoneScreenhotsInstrumentedTest : BaseUITest() {
Settings.getInstance(context).edit().putBoolean("auto_rescan", false).putBoolean("audio_resume_card", false).commit() Settings.getInstance(context).edit().putBoolean("auto_rescan", false).putBoolean("audio_resume_card", false).commit()
val intent = Intent().apply { val intent = Intent().apply {
putExtra(EXTRA_TARGET, R.id.nav_audio) 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) activityTestRule.launchActivity(intent)
activity = activityTestRule.activity activity = activityTestRule.activity
if (activity.isTablet()) {
activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
}
} }
} }
...@@ -73,12 +73,12 @@ object TestUtil { ...@@ -73,12 +73,12 @@ object TestUtil {
mediaPath: String, mediaPath: String,
subLanguageID: String, subLanguageID: String,
movieReleaseName: String): org.videolan.vlc.mediadb.models.ExternalSub { movieReleaseName: String): org.videolan.vlc.mediadb.models.ExternalSub {
return org.videolan.vlc.mediadb.models.ExternalSub(idSubtitle, subtitlePath, mediaPath, subLanguageID, movieReleaseName) return org.videolan.vlc.mediadb.models.ExternalSub(idSubtitle, subtitlePath, mediaPath, subLanguageID, movieReleaseName, false)
} }
fun createExternalSubsForMedia(mediaPath: String, mediaName: String, count: Int): List<org.videolan.vlc.mediadb.models.ExternalSub> { fun createExternalSubsForMedia(mediaPath: String, mediaName: String, count: Int): List<org.videolan.vlc.mediadb.models.ExternalSub> {
return (0 until count).map { return (0 until count).map {
org.videolan.vlc.mediadb.models.ExternalSub(it.toString(), "${fakeSubUri}$mediaName$it", mediaPath, "en", mediaName) org.videolan.vlc.mediadb.models.ExternalSub(it.toString(), "${fakeSubUri}$mediaName$it", mediaPath, "en", mediaName, false)
} }
} }
...@@ -108,6 +108,6 @@ object TestUtil { ...@@ -108,6 +108,6 @@ object TestUtil {
mediaUri: Uri, mediaUri: Uri,
subLanguageID: String, subLanguageID: String,
movieReleaseName: String, movieReleaseName: String,
zipDownloadLink: String): SubtitleItem = SubtitleItem(idSubtitle, mediaUri, subLanguageID, movieReleaseName, State.Downloading, zipDownloadLink) zipDownloadLink: String): SubtitleItem = SubtitleItem(idSubtitle, -1L, mediaUri, subLanguageID, movieReleaseName, State.Downloading, zipDownloadLink, false, 0F, 0L, "")
} }
/*
* ************************************************************************
* build.gradle
* *************************************************************************
* Copyright © 2025 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.
* **************************************************************************
*
*
*/
plugins {
id 'com.android.library'
id 'org.jetbrains.kotlin.android'
id 'com.vanniktech.maven.publish'
}
ext {
library_version = "$rootProject.ext.remoteAccessVersion"
}
android {
namespace 'org.videolan.vlc.remoteaccessclient'
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
compileSdk rootProject.ext.compileSdkVersion
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
resValue "string", "build_remote_access_revision", remoteAccessRevision()
resValue "string", "remote_access_version", remoteAccessVersion()
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
task webCopy(type: Copy) {
from 'remoteaccess/dist'
into 'assets/dist'
}
sourceSets.main {
assets.srcDirs = ['assets']
}
sourceSets.main {
assets.srcDirs = ['assets']
}
// Make per-variant version code
libraryVariants.all { variant ->
//Custom APK name
variant.outputs.each { output ->
if (output.outputFileName != null && output.outputFileName.endsWith('.aar')) {
output.outputFileName = "vlc-android-remote-access-${library_version}.aar"
}
}
}
}
preBuild.dependsOn(webCopy)
def remoteAccessVersion() {
def code = new ByteArrayOutputStream()
try {
if (file("remoteaccess/package.json").exists()) {
exec {
commandLine = ['bash', '-c', 'grep -m1 "version" remoteaccess/package.json']
standardOutput = code
}
return code.toString().split("\"")[3]
}
} catch (Exception e) {
}
return "unknown"
}
def remoteAccessRevision() {
try {
def hash = new ByteArrayOutputStream()
exec {
commandLine = ['bash', '-c', 'git -C remoteaccess rev-parse --short HEAD']
standardOutput = hash
}
return hash.toString()
} catch (Exception e) {
}
return "unknown"
}
dependencies {
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
}
apply from: '../../buildsystem/publish.gradle'
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# ************************************************************************* # *************************************************************************
# gradle.properties # gradle.properties
# ************************************************************************** # **************************************************************************
# Copyright © 2024 VLC authors and VideoLAN # Copyright © 2025 VLC authors and VideoLAN
# Author: Nicolas POMEPUY # Author: Nicolas POMEPUY
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
...@@ -28,4 +28,4 @@ POM_ARTIFACT_ID=remote-access ...@@ -28,4 +28,4 @@ POM_ARTIFACT_ID=remote-access
POM_NAME=VLC-Android-RemoteAccess POM_NAME=VLC-Android-RemoteAccess
POM_DESCRIPTION=Android port of VLC's Remote Access POM_DESCRIPTION=Android port of VLC's Remote Access
POM_INCEPTION_YEAR=2021 POM_INCEPTION_YEAR=2024
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!--
~ *************************************************************************
~ AndroidManifest.xml
~ **************************************************************************
~ Copyright © 2025 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:android="http://schemas.android.com/apk/res/android">
</manifest>
\ No newline at end of file
/build
\ No newline at end of file
plugins { plugins {
id 'com.android.library' id 'com.android.library'
id 'org.jetbrains.kotlin.android' id 'org.jetbrains.kotlin.android'
id 'com.vanniktech.maven.publish'
} }
ext {
library_version = "$rootProject.ext.remoteAccessVersion"
}
android { android {
namespace 'org.videolan.vlc.webserver' namespace 'org.videolan.vlc.remoteaccessserver'
dataBinding { dataBinding {
enabled = true enabled = true
...@@ -41,11 +37,6 @@ android { ...@@ -41,11 +37,6 @@ android {
} }
} }
task webCopy(type: Copy) {
from '../../remoteaccess/dist'
into 'assets/dist'
}
sourceSets.main { sourceSets.main {
assets.srcDirs = ['assets'] assets.srcDirs = ['assets']
} }
...@@ -66,21 +57,14 @@ android { ...@@ -66,21 +57,14 @@ android {
buildConfig true buildConfig true
} }
// Make per-variant version code
libraryVariants.all { variant ->
//Custom APK name
variant.outputs.each { output ->
if (output.outputFileName != null && output.outputFileName.endsWith('.aar')) {
output.outputFileName = "vlc-android-remote-access-${library_version}.aar"
}
}
}
} }
preBuild.dependsOn(webCopy)
dependencies { dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
devImplementation project(':application:remote-access-client')
debugImplementation project(':application:remote-access-client')
releaseImplementation "org.videolan.android:remote-access:$rootProject.ext.remoteAccessVersion"
vlcBundleImplementation "org.videolan.android:remote-access:$rootProject.ext.remoteAccessVersion"
implementation project(':application:vlc-android') implementation project(':application:vlc-android')
implementation "io.ktor:ktor:$rootProject.ext.ktorVersion" implementation "io.ktor:ktor:$rootProject.ext.ktorVersion"
implementation "io.ktor:ktor-server-netty:$rootProject.ext.ktorVersion" implementation "io.ktor:ktor-server-netty:$rootProject.ext.ktorVersion"
...@@ -98,6 +82,4 @@ dependencies { ...@@ -98,6 +82,4 @@ dependencies {
testImplementation 'junit:junit:4.13.2' testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
} }
\ No newline at end of file
apply from: '../../buildsystem/publish.gradle'
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
\ No newline at end of file
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
* *
*/ */
package org.videolan.vlc.webserver package org.videolan.vlc.remoteaccessserver
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
...@@ -43,6 +43,6 @@ class ExampleInstrumentedTest { ...@@ -43,6 +43,6 @@ class ExampleInstrumentedTest {
fun useAppContext() { fun useAppContext() {
// Context of the app under test. // Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("org.videolan.vlc.webserver.test", appContext.packageName) assertEquals("org.videolan.vlc.remoteaccessserver.test", appContext.packageName)
} }
} }
\ No newline at end of file
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* ************************************************************************ * ************************************************************************
* RemoteAccessOTP.kt * RemoteAccessOTP.kt
* ************************************************************************* * *************************************************************************
* Copyright © 2023 VLC authors and VideoLAN * Copyright © 2025 VLC authors and VideoLAN
* Author: Nicolas POMEPUY * Author: Nicolas POMEPUY
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
...@@ -22,14 +22,14 @@ ...@@ -22,14 +22,14 @@
* *
*/ */
package org.videolan.vlc.webserver package org.videolan.vlc.remoteaccessserver
import android.content.Context import android.content.Context
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
import org.videolan.vlc.gui.helpers.NotificationHelper import org.videolan.vlc.gui.helpers.NotificationHelper
import org.videolan.vlc.gui.helpers.REMOTE_ACCESS_CODE_ID import org.videolan.vlc.gui.helpers.REMOTE_ACCESS_CODE_ID
import org.videolan.vlc.webserver.ssl.SecretGenerator import org.videolan.vlc.remoteaccessserver.ssl.SecretGenerator
import org.videolan.vlc.webserver.utils.CypherUtils import org.videolan.vlc.remoteaccessserver.utils.CypherUtils
import java.security.SecureRandom import java.security.SecureRandom
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* ************************************************************************ * ************************************************************************
* RemoteAccessRouting.kt * RemoteAccessRouting.kt
* ************************************************************************* * *************************************************************************
* Copyright © 2023 VLC authors and VideoLAN * Copyright © 2025 VLC authors and VideoLAN
* Author: Nicolas POMEPUY * Author: Nicolas POMEPUY
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
* *
*/ */
package org.videolan.vlc.webserver package org.videolan.vlc.remoteaccessserver
import android.content.Context import android.content.Context
import android.content.res.Resources import android.content.res.Resources
...@@ -131,16 +131,16 @@ import org.videolan.vlc.util.slugify ...@@ -131,16 +131,16 @@ import org.videolan.vlc.util.slugify
import org.videolan.vlc.util.toByteArray import org.videolan.vlc.util.toByteArray
import org.videolan.vlc.viewmodels.browser.FavoritesProvider import org.videolan.vlc.viewmodels.browser.FavoritesProvider
import org.videolan.vlc.viewmodels.browser.PathOperationDelegate import org.videolan.vlc.viewmodels.browser.PathOperationDelegate
import org.videolan.vlc.webserver.RemoteAccessServer.Companion.getServerFiles import org.videolan.vlc.remoteaccessserver.RemoteAccessServer.Companion.getServerFiles
import org.videolan.vlc.webserver.RemoteAccessServer.PlayerStatus import org.videolan.vlc.remoteaccessserver.RemoteAccessServer.PlayerStatus
import org.videolan.vlc.webserver.RemoteAccessSession.verifyLogin import org.videolan.vlc.remoteaccessserver.RemoteAccessSession.verifyLogin
import org.videolan.vlc.webserver.utils.MediaZipUtils import org.videolan.vlc.remoteaccessserver.utils.MediaZipUtils
import org.videolan.vlc.webserver.utils.serveAudios import org.videolan.vlc.remoteaccessserver.utils.serveAudios
import org.videolan.vlc.webserver.utils.servePlaylists import org.videolan.vlc.remoteaccessserver.utils.servePlaylists
import org.videolan.vlc.webserver.utils.serveSearch import org.videolan.vlc.remoteaccessserver.utils.serveSearch
import org.videolan.vlc.webserver.utils.serveVideos import org.videolan.vlc.remoteaccessserver.utils.serveVideos
import org.videolan.vlc.webserver.websockets.RemoteAccessWebSockets import org.videolan.vlc.remoteaccessserver.websockets.RemoteAccessWebSockets
import org.videolan.vlc.webserver.websockets.WSIncomingMessage import org.videolan.vlc.remoteaccessserver.websockets.WSIncomingMessage
import java.io.BufferedWriter import java.io.BufferedWriter
import java.io.File import java.io.File
import java.io.FileNotFoundException import java.io.FileNotFoundException
...@@ -758,6 +758,10 @@ fun Route.setupRouting(appContext: Context, scope: CoroutineScope) { ...@@ -758,6 +758,10 @@ fun Route.setupRouting(appContext: Context, scope: CoroutineScope) {
call.respond(HttpStatusCode.Forbidden) call.respond(HttpStatusCode.Forbidden)
return@get return@get
} }
if (!Permissions.canReadStorage(appContext)) {
call.respond(HttpStatusCode.Forbidden)
return@get
}
//Get content synchronously //Get content synchronously
val dataset = LiveDataset<MediaLibraryItem>() val dataset = LiveDataset<MediaLibraryItem>()
val provider = withContext(Dispatchers.Main) { val provider = withContext(Dispatchers.Main) {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* ************************************************************************ * ************************************************************************
* RemoteAccessServer.kt * RemoteAccessServer.kt
* ************************************************************************* * *************************************************************************
* Copyright © 2023 VLC authors and VideoLAN * Copyright © 2025 VLC authors and VideoLAN
* Author: Nicolas POMEPUY * Author: Nicolas POMEPUY
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
* *
*/ */
package org.videolan.vlc.webserver package org.videolan.vlc.remoteaccessserver
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
...@@ -112,9 +112,9 @@ import org.videolan.vlc.viewmodels.CallBackDelegate ...@@ -112,9 +112,9 @@ import org.videolan.vlc.viewmodels.CallBackDelegate
import org.videolan.vlc.viewmodels.ICallBackHandler import org.videolan.vlc.viewmodels.ICallBackHandler
import org.videolan.vlc.viewmodels.browser.IPathOperationDelegate import org.videolan.vlc.viewmodels.browser.IPathOperationDelegate
import org.videolan.vlc.viewmodels.browser.PathOperationDelegate import org.videolan.vlc.viewmodels.browser.PathOperationDelegate
import org.videolan.vlc.webserver.ssl.SecretGenerator import org.videolan.vlc.remoteaccessserver.ssl.SecretGenerator
import org.videolan.vlc.webserver.websockets.RemoteAccessWebSockets import org.videolan.vlc.remoteaccessserver.websockets.RemoteAccessWebSockets
import org.videolan.vlc.webserver.websockets.RemoteAccessWebSockets.setupWebSockets import org.videolan.vlc.remoteaccessserver.websockets.RemoteAccessWebSockets.setupWebSockets
import java.io.File import java.io.File
import java.math.BigInteger import java.math.BigInteger
import java.net.InetAddress import java.net.InetAddress
......