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 (149)
Showing
with 465 additions and 54 deletions
Changes between 3.6.4 Beta 3 and 3.6.4 Beta 4:
------------------
* New default playback setting
* New feedback section in the about screen
* Resume playback and player behavior fixes
* Remove the reporter from the app launcher
* Add a quick play setting to play files without parsing
* Remote access: fix some mini player layout
* Remote access: always show the volume bar
* Remote access: fix the streams playback
* Fix some subtitles download issues
* Android auto behavior improvements
* Fix the equalizer navigation with DPAD
* Crash and behavior fixes
Changes between 3.6.4 Beta 2 and 3.6.4 Beta 3:
------------------
* New bookmark navigation
* Fix the resume behavior
* TV audio player improvements
* Crash and behavior fixes
Changes between 3.6.4 Beta 1 and 3.6.4 Beta 2:
------------------
* Fix a permission issue
......
......@@ -143,7 +143,8 @@ Issues without relevant information will be ignored, we cannot help in this case
## Support
- For usage support, use the in-app feedback option in the `About` screen
- Android mailing list: android@videolan.org
- bugtracker: https://code.videolan.org/videolan/vlc-android/issues
- IRC: *#videolan* channel on [freenode](http://freenode.net/)
- VideoLAN forum: https://forum.videolan.org/
- IRC: *#videolan* channel on [libera](https://libera.chat/)
- VideoLAN forum: https://forum.videolan.org/viewforum.php?f=35
......@@ -70,6 +70,9 @@ android {
beforeVariants(selector().withBuildType("vlcBundle")) { variantBuilder ->
variantBuilder.minSdk = 30
}
beforeVariants(selector().withBuildType("vlcBundleAmazon")) { variantBuilder ->
variantBuilder.minSdk = 17
}
}
buildTypes {
......@@ -88,6 +91,10 @@ android {
initWith release
matchingFallbacks = ['release']
}
vlcBundleAmazon {
initWith release
matchingFallbacks = ['release']
}
debug {
applicationIdSuffix ".debug"
jniDebuggable true
......
......@@ -6,11 +6,12 @@ import androidx.test.espresso.intent.rule.IntentsTestRule
import androidx.test.filters.SdkSuppress
import org.junit.Rule
import org.junit.Test
import org.videolan.tools.KEY_AOUT
import org.videolan.tools.KEY_PLAYBACK_SPEED_PERSIST
import org.videolan.tools.RESUME_PLAYBACK
import org.videolan.vlc.PreferenceMatchers.withKey
import org.videolan.vlc.R
import org.videolan.vlc.onPreferenceRow
import org.videolan.tools.KEY_PLAYBACK_SPEED_PERSIST
import org.videolan.tools.RESUME_PLAYBACK
class PreferencesAudioUITest: BasePreferenceUITest() {
@get:Rule
......@@ -31,12 +32,6 @@ class PreferencesAudioUITest: BasePreferenceUITest() {
checkToggleWorks(key, settings)
}
@Test
fun checkSavePlaybackSpeedSetting() {
val key = KEY_PLAYBACK_SPEED_PERSIST
checkToggleWorks(key, settings)
}
@Test
fun checkPersistentAudioPlaybackSetting() {
val key = "audio_task_removed"
......@@ -77,7 +72,7 @@ class PreferencesAudioUITest: BasePreferenceUITest() {
@Test
fun checkAudioOutputModeSetting() {
// TODO: Fails due to android bug in scrolling
val key = "aout"
val key = KEY_AOUT
checkModeChanged(key, "0", "0", MAP_AOUT)
checkModeChanged(key, "1", "0", MAP_AOUT)
......
......@@ -6,11 +6,15 @@ import androidx.test.espresso.intent.rule.IntentsTestRule
import androidx.test.filters.SdkSuppress
import org.junit.Rule
import org.junit.Test
import org.videolan.tools.*
import org.videolan.tools.ENABLE_BRIGHTNESS_GESTURE
import org.videolan.tools.ENABLE_DOUBLE_TAP_SEEK
import org.videolan.tools.ENABLE_SEEK_BUTTONS
import org.videolan.tools.ENABLE_VOLUME_GESTURE
import org.videolan.tools.POPUP_FORCE_LEGACY
import org.videolan.tools.POPUP_KEEPSCREEN
import org.videolan.vlc.PreferenceMatchers.withKey
import org.videolan.vlc.R
import org.videolan.vlc.onPreferenceRow
import org.videolan.vlc.util.*
class PreferencesVideoUITest: BasePreferenceUITest() {
@get:Rule
......@@ -25,24 +29,12 @@ class PreferencesVideoUITest: BasePreferenceUITest() {
.perform(click())
}
@Test
fun checkPersistentBrightnessSetting() {
val key = SAVE_BRIGHTNESS
checkToggleWorks(key, settings, default = false)
}
@Test
fun checkAudioIndividualDelaySetting() {
val key = "save_individual_audio_delay"
checkToggleWorks(key, settings, default = false)
}
@Test
fun checkPersistentSpeedSetting() {
val key = KEY_PLAYBACK_SPEED_PERSIST
checkToggleWorks(key, settings, default = false)
}
@Test
fun checkVideoTitleOnTransitionSetting() {
val key = "video_transition_show"
......
......@@ -26,7 +26,6 @@ import android.app.Application.ActivityLifecycleCallbacks
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import kotlinx.coroutines.DEBUG_PROPERTY_NAME
......@@ -50,10 +49,10 @@ import org.videolan.resources.util.startRemoteAccess
import org.videolan.tools.AppScope
import org.videolan.tools.KEY_ENABLE_REMOTE_ACCESS
import org.videolan.tools.KEY_INCOGNITO
import org.videolan.tools.KEY_PERSISTENT_INCOGNITO
import org.videolan.tools.Settings
import org.videolan.tools.putSingle
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.gui.SendCrashActivity
import org.videolan.vlc.gui.helpers.NotificationHelper
import org.videolan.vlc.util.DialogDelegate
import org.videolan.vlc.util.NetworkConnectionManager
......@@ -82,8 +81,8 @@ class AppSetupDelegate : AppDelegate,
FactoryManager.registerFactory(ILibVLCFactory.factoryId, LibVLCFactory())
System.setProperty(DEBUG_PROPERTY_NAME, DEBUG_PROPERTY_VALUE_ON)
val settings = Settings.getInstance(this)
if (BuildConfig.DEBUG) {
Settings.getInstance(this)
if (Settings.showTvUi) {
// Register movipedia to resume tv shows/movies
setupContentResolvers()
......@@ -92,15 +91,16 @@ class AppSetupDelegate : AppDelegate,
setupIndexers()
}
}
//App restarted, leave the incognito mode
Settings.getInstance (this).putSingle(KEY_INCOGNITO, false)
if (!settings.getBoolean(KEY_PERSISTENT_INCOGNITO, true))
settings.putSingle(KEY_INCOGNITO, false)
AppContextProvider.setLocale(Settings.getInstance(this).getString("set_locale", ""))
AppContextProvider.setLocale(settings.getString("set_locale", ""))
//Initiate Kotlinx Dispatchers in a thread to prevent ANR
backgroundInit()
if (Settings.getInstance(this).getBoolean(KEY_ENABLE_REMOTE_ACCESS, false))
if (settings.getBoolean(KEY_ENABLE_REMOTE_ACCESS, false))
startRemoteAccess()
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
......@@ -127,8 +127,6 @@ class AppSetupDelegate : AppDelegate,
if (!VLCInstance.testCompatibleCPU(AppContextProvider.appContext)) return@innerLaunch
Dialog.setCallbacks(VLCInstance.getInstance(this@backgroundInit), DialogDelegate)
}
packageManager.setComponentEnabledSetting(ComponentName(this@backgroundInit, SendCrashActivity::class.java),
if (BuildConfig.BETA) PackageManager.COMPONENT_ENABLED_STATE_ENABLED else PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)
if (!AndroidDevices.isAndroidTv) sendBroadcast(Intent(MiniPlayerAppWidgetProvider.ACTION_WIDGET_INIT).apply {
component = ComponentName(appContextProvider.appContext, MiniPlayerAppWidgetProvider::class.java)
})
......
......@@ -118,6 +118,16 @@ import org.videolan.vlc.providers.BrowserProvider
import org.videolan.vlc.providers.FileBrowserProvider
import org.videolan.vlc.providers.StorageProvider
import org.videolan.vlc.providers.medialibrary.sanitizeGroups
import org.videolan.vlc.remoteaccessserver.RemoteAccessServer.Companion.getServerFiles
import org.videolan.vlc.remoteaccessserver.RemoteAccessServer.PlayerStatus
import org.videolan.vlc.remoteaccessserver.RemoteAccessSession.verifyLogin
import org.videolan.vlc.remoteaccessserver.utils.MediaZipUtils
import org.videolan.vlc.remoteaccessserver.utils.serveAudios
import org.videolan.vlc.remoteaccessserver.utils.servePlaylists
import org.videolan.vlc.remoteaccessserver.utils.serveSearch
import org.videolan.vlc.remoteaccessserver.utils.serveVideos
import org.videolan.vlc.remoteaccessserver.websockets.RemoteAccessWebSockets
import org.videolan.vlc.remoteaccessserver.websockets.WSIncomingMessage
import org.videolan.vlc.util.FileUtils
import org.videolan.vlc.util.Permissions
import org.videolan.vlc.util.RemoteAccessUtils
......@@ -132,16 +142,6 @@ import org.videolan.vlc.util.slugify
import org.videolan.vlc.util.toByteArray
import org.videolan.vlc.viewmodels.browser.FavoritesProvider
import org.videolan.vlc.viewmodels.browser.PathOperationDelegate
import org.videolan.vlc.remoteaccessserver.RemoteAccessServer.Companion.getServerFiles
import org.videolan.vlc.remoteaccessserver.RemoteAccessServer.PlayerStatus
import org.videolan.vlc.remoteaccessserver.RemoteAccessSession.verifyLogin
import org.videolan.vlc.remoteaccessserver.utils.MediaZipUtils
import org.videolan.vlc.remoteaccessserver.utils.serveAudios
import org.videolan.vlc.remoteaccessserver.utils.servePlaylists
import org.videolan.vlc.remoteaccessserver.utils.serveSearch
import org.videolan.vlc.remoteaccessserver.utils.serveVideos
import org.videolan.vlc.remoteaccessserver.websockets.RemoteAccessWebSockets
import org.videolan.vlc.remoteaccessserver.websockets.WSIncomingMessage
import java.io.BufferedWriter
import java.io.File
import java.io.FileNotFoundException
......@@ -370,9 +370,11 @@ fun Route.setupRouting(appContext: Context, scope: CoroutineScope) {
bw.write("Storage ALL access: ${Permissions.hasAllAccess(appContext)}\r\n")
bw.write("Notifications: ${Permissions.canSendNotifications(appContext)}\r\n")
bw.write("PiP Allowed: ${Permissions.isPiPAllowed(appContext)}\r\n")
bw.write("____________________________\r\n")
try {
bw.write("Changed settings:\r\n${PreferenceParser.getChangedPrefsString(appContext)}\r\n")
bw.write("____________________________\r\n")
bw.write("Changed settings:\r\n")
bw.write("____________________________\r\n")
bw.write("${PreferenceParser.getChangedPrefsString(appContext)}\r\n")
} catch (e: Exception) {
bw.write("Cannot retrieve changed settings\r\n")
bw.write(Log.getStackTraceString(e))
......@@ -850,7 +852,7 @@ fun Route.setupRouting(appContext: Context, scope: CoroutineScope) {
}
val list = ArrayList<RemoteAccessServer.PlayQueueItem>(stream.size)
stream.forEachIndexed { index, mediaLibraryItem ->
list.add(RemoteAccessServer.PlayQueueItem(3000L + index, mediaLibraryItem.title, " ", 0, mediaLibraryItem.artworkMrl
list.add(RemoteAccessServer.PlayQueueItem(mediaLibraryItem.id, mediaLibraryItem.title, " ", 0, mediaLibraryItem.artworkMrl
?: "", false, "", (mediaLibraryItem as MediaWrapper).uri.toString(), true, favorite = mediaLibraryItem.isFavorite))
}
call.respondJson(convertToJson(list))
......@@ -950,7 +952,10 @@ fun Route.setupRouting(appContext: Context, scope: CoroutineScope) {
val medias = appContext.getFromMl {
if (path?.isNotBlank() == true) {
arrayOf(MLServiceLocator.getAbstractMediaWrapper(Uri.parse(path)))
if (id.toLong() > 0)
arrayOf(getMedia(id.toLong()))
else
arrayOf(MLServiceLocator.getAbstractMediaWrapper(Uri.parse(path)))
} else when (type) {
"album" -> getAlbum(id.toLong()).tracks
"artist" -> getArtist(id.toLong()).tracks
......@@ -969,7 +974,7 @@ fun Route.setupRouting(appContext: Context, scope: CoroutineScope) {
}
if (medias.isEmpty()) call.respond(HttpStatusCode.NotFound)
else {
if (medias.size == 1 && medias[0].id == RemoteAccessServer.getInstance(appContext).service?.currentMediaWrapper?.id) {
if (medias.size == 1 && medias[0].id == RemoteAccessServer.getInstance(appContext).service?.currentMediaWrapper?.id && medias[0].uri == RemoteAccessServer.getInstance(appContext).service?.currentMediaWrapper?.uri) {
call.respond(HttpStatusCode.OK)
return@get
}
......
......@@ -59,7 +59,6 @@ import io.ktor.server.plugins.cachingheaders.CachingHeaders
import io.ktor.server.plugins.callloging.CallLogging
import io.ktor.server.plugins.compression.Compression
import io.ktor.server.plugins.compression.matchContentType
import io.ktor.server.plugins.compression.minimumSize
import io.ktor.server.plugins.cors.routing.CORS
import io.ktor.server.plugins.origin
import io.ktor.server.plugins.partialcontent.PartialContent
......@@ -152,6 +151,7 @@ class RemoteAccessServer(private val context: Context) : PlaybackService.Callbac
var service: PlaybackService? = null
private val networkSharesResult = ArrayList<MediaLibraryItem>()
private val networkDiscoveryRunning = AtomicBoolean(false)
private var lastPlayedLocation = ""
private val _serverStatus = MutableLiveData(ServerStatus.NOT_INIT)
......@@ -709,6 +709,14 @@ class RemoteAccessServer(private val context: Context) : PlaybackService.Callbac
* @param event the event sent
*/
override fun onMediaPlayerEvent(event: MediaPlayer.Event) {
service?.currentMediaLocation?.let {
if (it.isNotEmpty() && lastPlayedLocation != service?.currentMediaLocation) {
lastPlayedLocation = it
}
}
if (event.type == MediaPlayer.Event.EncounteredError) {
AppScope.launch { RemoteAccessWebSockets.sendToAll(GenericError(context.getString(R.string.invalid_location, lastPlayedLocation))) }
}
if (event.type != MediaPlayer.Event.TimeChanged) return
if (System.currentTimeMillis() - lastNowPlayingSendTime < NOW_PLAYING_TIMEOUT) return
lastNowPlayingSendTime = System.currentTimeMillis()
......@@ -913,6 +921,7 @@ class RemoteAccessServer(private val context: Context) : PlaybackService.Callbac
data class MLRefreshNeeded(val refreshNeeded: Boolean = true) : WSMessage(WSMessageType.ML_REFRESH_NEEDED)
data class BrowserDescription(val path: String, val description: String) : WSMessage(WSMessageType.BROWSER_DESCRIPTION)
data class PlaybackControlForbidden(val forbidden: Boolean = true): WSMessage(WSMessageType.PLAYBACK_CONTROL_FORBIDDEN)
data class GenericError(val text: String): WSMessage(WSMessageType.ERROR)
data class NetworkShares(val shares: List<PlayQueueItem>): WSMessage(WSMessageType.NETWORK_SHARES)
data class SearchResults(val albums: List<PlayQueueItem>, val artists: List<PlayQueueItem>, val genres: List<PlayQueueItem>, val playlists: List<PlayQueueItem>, val videos: List<PlayQueueItem>, val tracks: List<PlayQueueItem>)
data class BreadcrumbItem(val title: String, val path: String)
......@@ -961,6 +970,8 @@ class RemoteAccessServer(private val context: Context) : PlaybackService.Callbac
BROWSER_DESCRIPTION,
@Json(name = "playback-control-forbidden")
PLAYBACK_CONTROL_FORBIDDEN,
@Json(name = "error")
ERROR,
@Json(name = "network-shares")
NETWORK_SHARES
}
......
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
- *************************************************************************
- ic_now_playing_paused.svg
- **************************************************************************
- 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.
- ***************************************************************************
-
-
-->
<svg id="vector" width="24" height="24" viewBox="0 0 6 6" version="1.1" sodipodi:docname="ic_now_playing_paused.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg">
<defs
id="defs11" />
<sodipodi:namedview
id="namedview9"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="36.375"
inkscape:cx="12"
inkscape:cy="12"
inkscape:window-width="2560"
inkscape:window-height="1376"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="vector" />
<path
fill="?attr/player_icon_color"
d="M 1.148,5.25 H 2.207 V 6 H 1.148 Z"
stroke-width="0.561243"
id="path_0" />
<path
fill="?attr/player_icon_color"
d="M 2.471,5.25 H 3.529 V 6 H 2.471 Z"
stroke-width="0.420927"
id="path_1" />
<path
fill="?attr/player_icon_color"
d="M 3.794,5.25 H 4.852 V 6 H 3.794 Z"
stroke-width="0.59521"
id="path_2" />
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="36"
height="36"
viewBox="0 0 36 36"
version="1.1"
id="svg1"
inkscape:version="1.4 (1:1.4+202410161351+e7c3feb100)"
sodipodi:docname="ic_player_bookmark_next_2.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="7.9687501"
inkscape:cx="-18.823529"
inkscape:cy="22.149019"
inkscape:window-width="1920"
inkscape:window-height="1003"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:pageshadow="2">
<inkscape:grid
id="grid1"
units="px"
originx="0"
originy="0"
spacingx="1"
spacingy="1"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="4"
enabled="true"
visible="true" />
</sodipodi:namedview>
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
id="path36"
style="fill:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round"
d="m 15,8 c -1.09275,0 -2,0.9072896 -2,2 v 1 c -3e-5,0.55229 0.4477,1 1,1 0.55225,0 0.99997,-0.44771 1,-1 v -1 h 11 v 14.957031 l -6,-2.158203 -5,2.158203 V 19 c -5e-5,-0.55229 -0.44775,-1 -1,-1 -0.5523,0 -1.00005,0.44771 -1,1 v 7 2 L 20,24.976562 28,28 V 10 C 28,8.9072296 27.09275,8 26,8 Z m -1,6 c -3.535086,0.0023 -6.6522513,2.333765 -7.6601562,5.714844 a 1,1 0 0 0 0.671875,1.24414 1,1 0 0 0 1.2441406,-0.673828 C 9.013666,17.743047 11.341511,16.002581 14,16 c 2.063097,5.4e-4 3.949441,1.054671 5.041016,2.751953 l -1.394532,1.394531 C 17.331734,20.461474 17.5547,20.99981 18,21 h 4 c 0.27615,-3e-5 0.49995,-0.22387 0.5,-0.5 v -4 c 0,-0.20221 -0.121794,-0.385471 -0.308594,-0.462891 -0.18685,-0.0774 -0.401912,-0.03363 -0.544922,0.109375 L 20.480469,17.3125 C 18.996776,15.2616 16.597597,14.000681 14,14 Z" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="36"
height="36"
viewBox="0 0 36 36"
version="1.1"
id="svg1"
inkscape:version="1.4 (1:1.4+202410161351+e7c3feb100)"
sodipodi:docname="ic_player_bookmark_previous_2.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="15.9375"
inkscape:cx="14.556863"
inkscape:cy="14.4"
inkscape:window-width="1920"
inkscape:window-height="1003"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:pageshadow="2">
<inkscape:grid
id="grid1"
units="px"
originx="0"
originy="0"
spacingx="1"
spacingy="1"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="4"
enabled="true"
visible="true" />
</sodipodi:namedview>
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
id="path36"
style="fill:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round"
d="m 21,8 c 1.09275,0 2,0.9072896 2,2 v 1 c 3e-5,0.55229 -0.4477,1 -1,1 -0.55225,0 -0.99997,-0.44771 -1,-1 V 10 H 10 v 14.957031 l 6,-2.158203 5,2.158203 V 19 c 5e-5,-0.55229 0.44775,-1 1,-1 0.5523,0 1.00005,0.44771 1,1 v 7 2 L 16,24.976562 8,28 V 10 C 8,8.9072296 8.90725,8 10,8 Z m 1,6 c 3.535086,0.0023 6.652251,2.333765 7.660156,5.714844 a 1,1 0 0 1 -0.671875,1.24414 1,1 0 0 1 -1.24414,-0.673828 C 26.986334,17.743047 24.658489,16.002581 22,16 c -2.063097,5.4e-4 -3.949441,1.054671 -5.041016,2.751953 l 1.394532,1.394531 C 18.668266,20.461474 18.4453,20.99981 18,21 h -4 c -0.27615,-3e-5 -0.49995,-0.22387 -0.5,-0.5 v -4 c 0,-0.20221 0.121794,-0.385471 0.308594,-0.462891 0.18685,-0.0774 0.401912,-0.03363 0.544922,0.109375 L 15.519531,17.3125 C 17.003224,15.2616 19.402403,14.000681 22,14 Z" />
</g>
</svg>
......@@ -167,6 +167,7 @@ const val ID_SPONSOR = 16L
const val ID_PIN_LOCK = 17L
const val ID_REMOTE_ACCESS = 18L
const val CATEGORY_NOW_PLAYING = 20L
const val CATEGORY_NOW_PLAYING_PAUSED = 28L
const val CATEGORY_ARTISTS = 21L
const val CATEGORY_ALBUMS = 22L
const val CATEGORY_GENRES = 23L
......@@ -174,6 +175,7 @@ const val CATEGORY_SONGS = 24L
const val CATEGORY_VIDEOS = 25L
const val CATEGORY_PLAYLISTS = 27L
const val CATEGORY_NOW_PLAYING_PIP = 26L
const val CATEGORY_NOW_PLAYING_PIP_PAUSED = 29L
const val CATEGORY = "category"
const val DRAWABLE = "drawable"
......@@ -219,6 +221,7 @@ const val TYPE_LOCAL_FAV = 1
//Crash reporting
const val CRASH_ML_CTX = "crash_ml_ctx"
const val CRASH_ML_MSG = "crash_ml_msg"
const val CRASH_HAPPENED = "crash_happened"
fun String.buildPkgString() = "${BuildConfig.APP_ID}.$this"
......
......@@ -22,6 +22,7 @@ package org.videolan.resources
import android.content.Context
import android.content.SharedPreferences
import android.graphics.Color
import android.media.AudioManager
import android.os.Build
import android.util.Log
......@@ -34,13 +35,14 @@ import org.videolan.libvlc.interfaces.IMedia
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.libvlc.util.VLCUtil
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.tools.KEY_AOUT
import org.videolan.tools.Preferences
import org.videolan.tools.Settings
import org.videolan.tools.putSingle
import org.videolan.vlc.VlcMigrationHelper
import org.videolan.vlc.isVLC4
import java.io.File
import java.util.*
import java.util.Collections
object VLCOptions {
private const val TAG = "VLC/VLCConfig"
......@@ -87,7 +89,25 @@ object VLCOptions {
val freetypeRelFontsize = pref.getString("subtitles_size", "16")
val freetypeBold = pref.getBoolean("subtitles_bold", false)
val freetypeColor = Integer.decode(String.format("0x%06X", (0xFFFFFF and pref.getInt("subtitles_color", 16777215))))
val freetypeColor = try {
Integer.decode(String.format("0x%06X", (0xFFFFFF and pref.getInt("subtitles_color", 16777215))))
} catch (e: ClassCastException) {
Log.w(TAG, "Forced migration of subtitles color")
//Migration failed somehow. Migrating here
var color = 16777215
pref.getString("subtitles_color", "16777215")?.let {oldSetting ->
try {
val oldColor = oldSetting.toInt()
val newColor = Color.argb(255, Color.red(oldColor), Color.green(oldColor), Color.blue(oldColor))
pref.putSingle("subtitles_color", newColor)
color = newColor
} catch (e: Exception) {
pref.edit().remove("subtitles_color").apply()
}
}
color
}
val freetypeColorOpacity = pref.getInt("subtitles_color_opacity", 255)
val freetypeBackgroundColor = Integer.decode(String.format("0x%06X", (0xFFFFFF and pref.getInt("subtitles_background_color", 16777215))))
......@@ -202,7 +222,7 @@ object VLCOptions {
fun getAout(pref: SharedPreferences): String? {
var aout = -1
try {
aout = Integer.parseInt(pref.getString("aout", "-1")!!)
aout = Integer.parseInt(pref.getString(KEY_AOUT, "-1")!!)
} catch (ignored: NumberFormatException) {
}
......
......@@ -27,8 +27,17 @@ import android.text.format.DateFormat
import android.util.Log
import org.videolan.resources.AppContextProvider
import org.videolan.tools.CloseableUtils
import org.videolan.tools.KEY_LAST_SESSION_CRASHED
import org.videolan.tools.Logcat
import java.io.*
import org.videolan.tools.Settings
import org.videolan.tools.putSingle
import java.io.BufferedWriter
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.io.IOException
import java.io.OutputStreamWriter
import java.io.PrintWriter
import java.io.StringWriter
import java.lang.Thread.UncaughtExceptionHandler
private const val TAG = "VLC/VlcCrashHandler"
......@@ -70,6 +79,7 @@ class VLCCrashHandler : UncaughtExceptionHandler {
val stacktrace = result.toString()
printWriter.close()
Log.e(TAG, stacktrace)
Settings.getInstance(AppContextProvider.appContext).putSingle(KEY_LAST_SESSION_CRASHED, true)
// Save the log on SD card if available
if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
......
......@@ -26,5 +26,6 @@
<item android:state_selected="true" android:color="?attr/colorPrimary" />
<item android:state_pressed="true" android:color="?attr/colorPrimary" />
<item android:state_focused="true" android:color="?attr/colorPrimary" />
<item android:state_enabled="false" android:color="?attr/font_disabled" />
<item android:color="?attr/colorControlNormal" />
</selector>
\ No newline at end of file
<!--
~ *************************************************************************
~ ic_next_chapter.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.
~ ***************************************************************************
~
~
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
tools:fillColor="@color/white"
android:fillColor="?attr/player_icon_color"
android:pathData="M14.71,6.71c-0.39,-0.39 -1.02,-0.39 -1.41,0L8.71,11.3c-0.39,0.39 -0.39,1.02 0,1.41l4.59,4.59c0.39,0.39 1.02,0.39 1.41,0 0.39,-0.39 0.39,-1.02 0,-1.41L10.83,12l3.88,-3.88c0.39,-0.39 0.38,-1.03 0,-1.41z" />
</vector>
<!--
~ *************************************************************************
~ ic_player_bookmark_next.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.
~ ***************************************************************************
~
~
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="m21,8c1.093,0 2,0.907 2,2v1c0,0.552 -0.448,1 -1,1 -0.552,0 -1,-0.448 -1,-1L21,10L10,10v14.957l6,-2.158 5,2.158L21,19c0,-0.552 0.448,-1 1,-1 0.552,0 1,0.448 1,1v7,2L16,24.977 8,28L8,10C8,8.907 8.907,8 10,8ZM22,14c3.535,0.002 6.652,2.334 7.66,5.715a1,1 0,0 1,-0.672 1.244,1 1,0 0,1 -1.244,-0.674C26.986,17.743 24.658,16.003 22,16c-2.063,0.001 -3.949,1.055 -5.041,2.752l1.395,1.395C18.668,20.461 18.445,21 18,21h-4c-0.276,-0 -0.5,-0.224 -0.5,-0.5v-4c0,-0.202 0.122,-0.385 0.309,-0.463 0.187,-0.077 0.402,-0.034 0.545,0.109L15.52,17.313C17.003,15.262 19.402,14.001 22,14Z"
android:strokeLineJoin="round"
android:strokeWidth="1"
android:fillColor="?attr/player_icon_color"
android:strokeLineCap="round"/>
</vector>
<!--
~ *************************************************************************
~ ic_player_bookmark_previous.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.
~ ***************************************************************************
~
~
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="m15,8c-1.093,0 -2,0.907 -2,2v1c-0,0.552 0.448,1 1,1 0.552,0 1,-0.448 1,-1v-1h11v14.957l-6,-2.158 -5,2.158L15,19c-0,-0.552 -0.448,-1 -1,-1 -0.552,0 -1,0.448 -1,1v7,2L20,24.977 28,28L28,10C28,8.907 27.093,8 26,8ZM14,14c-3.535,0.002 -6.652,2.334 -7.66,5.715a1,1 0,0 0,0.672 1.244,1 1,0 0,0 1.244,-0.674C9.014,17.743 11.342,16.003 14,16c2.063,0.001 3.949,1.055 5.041,2.752l-1.395,1.395C17.332,20.461 17.555,21 18,21h4c0.276,-0 0.5,-0.224 0.5,-0.5v-4c0,-0.202 -0.122,-0.385 -0.309,-0.463 -0.187,-0.077 -0.402,-0.034 -0.545,0.109L20.48,17.313C18.997,15.262 16.598,14.001 14,14Z"
android:strokeLineJoin="round"
android:strokeWidth="1"
android:fillColor="?attr/player_icon_color"
android:strokeLineCap="round"/>
</vector>
<!--
~ *************************************************************************
~ ic_previous_chapter.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.
~ ***************************************************************************
~
~
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
tools:fillColor="@color/white"
android:fillColor="?attr/player_icon_color"
android:pathData="M9.29,6.71c-0.39,0.39 -0.39,1.02 0,1.41L13.17,12l-3.88,3.88c-0.39,0.39 -0.39,1.02 0,1.41 0.39,0.39 1.02,0.39 1.41,0l4.59,-4.59c0.39,-0.39 0.39,-1.02 0,-1.41L10.7,6.7c-0.38,-0.38 -1.02,-0.38 -1.41,0.01z" />
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="48"
android:viewportHeight="48">
<path
android:pathData="M26,4A4,4 0,0 0,22 8L22,15L26,15L26,8L42,8L42,18C42,22.42 38.42,26 34,26C32.1,26 30.38,25.299 29,24.199L29,28.9C30.52,29.6 32.22,30 34,30C40.62,30 46,24.62 46,18L46,8A4,4 0,0 0,42 4L26,4zM28,12L28,13A2,2 0,0 0,30 15A2,2 0,0 0,32 13L32,12L28,12zM36,12L36,13A2,2 0,0 0,38 15A2,2 0,0 0,40 13L40,12L36,12zM6,18A4,4 0,0 0,2 22L2,32C2,38.62 7.38,44 14,44C20.62,44 26,38.62 26,32L26,22A4,4 0,0 0,22 18L6,18zM33.98,18C31.92,18 30.161,18.94 29.381,20.26C29.001,20.94 29.5,21.76 30.26,21.76L37.699,21.76C38.459,21.76 38.96,20.939 38.58,20.279C37.8,18.939 36.04,18 33.98,18zM6,22L22,22L22,32C22,36.42 18.42,40 14,40C9.58,40 6,36.42 6,32L6,22zM10,26A2,2 0,0 0,8 28L8,29L12,29L12,28A2,2 0,0 0,10 26zM18,26A2,2 0,0 0,16 28L16,29L20,29L20,28A2,2 0,0 0,18 26zM10.279,32C9.519,32 9.02,32.82 9.4,33.5C10.18,34.84 11.94,35.779 14,35.779C16.06,35.779 17.84,34.84 18.6,33.5C18.98,32.82 18.481,32 17.721,32L10.279,32z"
android:strokeWidth="1"
android:fillColor="#88ffffff"/>
</vector>