Browse Source

Move the media DB to a new module

merge-requests/509/head
Nicolas Pomepuy 6 years ago
parent
commit
8ee47a0ef5
  1. 1
      mediadb/.gitignore
  2. 70
      mediadb/build.gradle
  3. 0
      mediadb/consumer-rules.pro
  4. 21
      mediadb/proguard-rules.pro
  5. 48
      mediadb/src/androidTest/java/org/videolan/vlc/mediadb/ExampleInstrumentedTest.kt
  6. 26
      mediadb/src/main/AndroidManifest.xml
  7. 5
      mediadb/src/main/java/org/videolan/vlc/mediadb/BrowserFavDao.kt
  8. 67
      mediadb/src/main/java/org/videolan/vlc/mediadb/Converters.kt
  9. 2
      mediadb/src/main/java/org/videolan/vlc/mediadb/CustomDirectoryDao.kt
  10. 8
      mediadb/src/main/java/org/videolan/vlc/mediadb/ExternalSubDao.kt
  11. 36
      mediadb/src/main/java/org/videolan/vlc/mediadb/MediaDatabase.kt
  12. 10
      mediadb/src/main/java/org/videolan/vlc/mediadb/Migrations.kt
  13. 2
      mediadb/src/main/java/org/videolan/vlc/mediadb/SlaveDao.kt
  14. 63
      mediadb/src/main/java/org/videolan/vlc/mediadb/models/BrowserFav.kt
  15. 2
      mediadb/src/main/java/org/videolan/vlc/mediadb/models/CustomDirectory.kt
  16. 2
      mediadb/src/main/java/org/videolan/vlc/mediadb/models/ExternalSub.kt
  17. 2
      mediadb/src/main/java/org/videolan/vlc/mediadb/models/Slave.kt
  18. 27
      mediadb/src/main/res/values/strings.xml
  19. 48
      mediadb/src/test/java/org/videolan/vlc/mediadb/ExampleUnitTest.kt
  20. 17
      resources/build.gradle
  21. 25
      resources/src/main/java/org/videolan/resources/AndroidDevices.kt
  22. 3
      resources/src/main/java/org/videolan/resources/Constants.kt
  23. 6
      resources/src/main/java/org/videolan/resources/Strings.kt
  24. 2
      settings.gradle
  25. 46
      tools/src/main/java/org/videolan/tools/Workers.kt
  26. 14
      vlc-android/androidTest/org/videolan/vlc/database/MigrationTest.kt
  27. 1
      vlc-android/build.gradle
  28. 2
      vlc-android/res/layout/playlist_item.xml
  29. 2
      vlc-android/src/org/videolan/vlc/DebugLogService.kt
  30. 5
      vlc-android/src/org/videolan/vlc/ExternalMonitor.kt
  31. 2
      vlc-android/src/org/videolan/vlc/FileProvider.kt
  32. 15
      vlc-android/src/org/videolan/vlc/MediaParsingService.kt
  33. 2
      vlc-android/src/org/videolan/vlc/MediaSessionCallback.kt
  34. 1
      vlc-android/src/org/videolan/vlc/PlaybackService.kt
  35. 5
      vlc-android/src/org/videolan/vlc/RecommendationsService.kt
  36. 2
      vlc-android/src/org/videolan/vlc/RendererDelegate.kt
  37. 1
      vlc-android/src/org/videolan/vlc/StartActivity.kt
  38. 2
      vlc-android/src/org/videolan/vlc/StoragesMonitor.kt
  39. 2
      vlc-android/src/org/videolan/vlc/TvReceiver.kt
  40. 2
      vlc-android/src/org/videolan/vlc/VLCApplication.kt
  41. 2
      vlc-android/src/org/videolan/vlc/gui/ContentActivity.kt
  42. 1
      vlc-android/src/org/videolan/vlc/gui/InfoActivity.kt
  43. 5
      vlc-android/src/org/videolan/vlc/gui/MainActivity.kt
  44. 1
      vlc-android/src/org/videolan/vlc/gui/PlaylistActivity.kt
  45. 2
      vlc-android/src/org/videolan/vlc/gui/SecondaryActivity.kt
  46. 6
      vlc-android/src/org/videolan/vlc/gui/SendCrashActivity.kt
  47. 1
      vlc-android/src/org/videolan/vlc/gui/audio/BaseAudioBrowser.kt
  48. 2
      vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserAdapter.kt
  49. 4
      vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt
  50. 6
      vlc-android/src/org/videolan/vlc/gui/browser/FileBrowserFragment.kt
  51. 4
      vlc-android/src/org/videolan/vlc/gui/browser/FilePickerFragment.kt
  52. 4
      vlc-android/src/org/videolan/vlc/gui/browser/MediaBrowserFragment.kt
  53. 2
      vlc-android/src/org/videolan/vlc/gui/browser/PathAdapter.kt
  54. 2
      vlc-android/src/org/videolan/vlc/gui/dialogs/ContextSheet.kt
  55. 2
      vlc-android/src/org/videolan/vlc/gui/dialogs/NetworkServerDialog.kt
  56. 2
      vlc-android/src/org/videolan/vlc/gui/dialogs/PlaybackSpeedDialog.kt
  57. 3
      vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitleDownloadFragment.kt
  58. 5
      vlc-android/src/org/videolan/vlc/gui/dialogs/VlcLoginDialog.kt
  59. 4
      vlc-android/src/org/videolan/vlc/gui/helpers/AudioUtil.kt
  60. 4
      vlc-android/src/org/videolan/vlc/gui/helpers/BitmapCache.kt
  61. 2
      vlc-android/src/org/videolan/vlc/gui/helpers/ImageLoader.kt
  62. 8
      vlc-android/src/org/videolan/vlc/gui/helpers/MedialibraryUtils.kt
  63. 1
      vlc-android/src/org/videolan/vlc/gui/helpers/NotificationHelper.kt
  64. 2
      vlc-android/src/org/videolan/vlc/gui/helpers/PlayerOptionsDelegate.kt
  65. 4
      vlc-android/src/org/videolan/vlc/gui/helpers/UiTools.kt
  66. 4
      vlc-android/src/org/videolan/vlc/gui/helpers/hf/StoragePermissionsDelegate.kt
  67. 7
      vlc-android/src/org/videolan/vlc/gui/helpers/hf/WriteExternalDelegate.kt
  68. 5
      vlc-android/src/org/videolan/vlc/gui/onboarding/OnboardingActivity.kt
  69. 2
      vlc-android/src/org/videolan/vlc/gui/onboarding/OnboardingThemeFragment.kt
  70. 5
      vlc-android/src/org/videolan/vlc/gui/onboarding/OnboardingViewModel.kt
  71. 2
      vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesAdvanced.kt
  72. 2
      vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesAudio.kt
  73. 3
      vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesUi.kt
  74. 2
      vlc-android/src/org/videolan/vlc/gui/tv/MainTvFragment.kt
  75. 2
      vlc-android/src/org/videolan/vlc/gui/tv/audioplayer/AudioPlayerActivity.kt
  76. 2
      vlc-android/src/org/videolan/vlc/gui/tv/preferences/PreferencesAdvanced.kt
  77. 1
      vlc-android/src/org/videolan/vlc/gui/tv/preferences/PreferencesFragment.kt
  78. 3
      vlc-android/src/org/videolan/vlc/gui/tv/preferences/PreferencesUi.kt
  79. 2
      vlc-android/src/org/videolan/vlc/gui/tv/preferences/PreferencesVideo.kt
  80. 3
      vlc-android/src/org/videolan/vlc/gui/video/MediaInfoAdapter.kt
  81. 7
      vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt
  82. 4
      vlc-android/src/org/videolan/vlc/gui/video/VideoTouchDelegate.kt
  83. 2
      vlc-android/src/org/videolan/vlc/gui/video/benchmark/BenchActivity.kt
  84. 1
      vlc-android/src/org/videolan/vlc/media/MediaUtils.kt
  85. 6
      vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt
  86. 1
      vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt
  87. 6
      vlc-android/src/org/videolan/vlc/providers/FileBrowserProvider.kt
  88. 2
      vlc-android/src/org/videolan/vlc/providers/StorageProvider.kt
  89. 11
      vlc-android/src/org/videolan/vlc/repository/BrowserFavRepository.kt
  90. 11
      vlc-android/src/org/videolan/vlc/repository/DirectoryRepository.kt
  91. 8
      vlc-android/src/org/videolan/vlc/repository/ExternalSubRepository.kt
  92. 6
      vlc-android/src/org/videolan/vlc/repository/SlaveRepository.kt
  93. 4
      vlc-android/src/org/videolan/vlc/util/Browserutils.kt
  94. 2
      vlc-android/src/org/videolan/vlc/util/FileUtils.kt
  95. 1
      vlc-android/src/org/videolan/vlc/util/Kextensions.kt
  96. 1
      vlc-android/src/org/videolan/vlc/util/TvChannels.kt
  97. 3
      vlc-android/src/org/videolan/vlc/util/Util.kt
  98. 1
      vlc-android/src/org/videolan/vlc/util/VLCAudioFocusHelper.kt
  99. 22
      vlc-android/src/org/videolan/vlc/util/Workers.kt
  100. 6
      vlc-android/src/org/videolan/vlc/viewmodels/tv/MainTvModel.kt

1
mediadb/.gitignore

@ -0,0 +1 @@
/build

70
mediadb/build.gradle

@ -0,0 +1,70 @@
/*
* ************************************************************************
* build.gradle
* *************************************************************************
* Copyright © 2020 VLC authors and VideoLAN
* Author: Nicolas POMEPUY
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
* **************************************************************************
*
*
*/
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
minSdkVersion 17
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles 'consumer-rules.pro'
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
//Room
implementation "androidx.room:room-runtime:$rootProject.ext.roomVersion"
kapt "androidx.room:room-compiler:$rootProject.ext.roomVersion"
implementation project(':tools')
implementation project(':resources')
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$rootProject.ext.kotlinx_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$rootProject.ext.kotlinx_version"
}

0
mediadb/consumer-rules.pro

21
mediadb/proguard-rules.pro

@ -0,0 +1,21 @@
# 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

48
mediadb/src/androidTest/java/org/videolan/vlc/mediadb/ExampleInstrumentedTest.kt

@ -0,0 +1,48 @@
/*
* ************************************************************************
* ExampleInstrumentedTest.kt
* *************************************************************************
* Copyright © 2020 VLC authors and VideoLAN
* Author: Nicolas POMEPUY
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
* **************************************************************************
*
*
*/
package org.videolan.vlc.mediadb
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("org.videolan.vlc.mediadb.test", appContext.packageName)
}
}

26
mediadb/src/main/AndroidManifest.xml

@ -0,0 +1,26 @@
<!--
~ *************************************************************************
~ AndroidManifest.xml
~ **************************************************************************
~ Copyright © 2020 VLC authors and VideoLAN
~ Author: Nicolas POMEPUY
~ This program is free software; you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation; either version 2 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program; if not, write to the Free Software
~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
~ ***************************************************************************
~
~
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.videolan.vlc.mediadb" />

5
vlc-android/src/org/videolan/vlc/database/BrowserFavDao.kt → mediadb/src/main/java/org/videolan/vlc/mediadb/BrowserFavDao.kt

@ -20,14 +20,13 @@
package org.videolan.vlc.database
import android.net.Uri
import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import android.net.Uri
import org.videolan.vlc.database.models.BrowserFav
import org.videolan.vlc.mediadb.models.BrowserFav
@Dao
interface BrowserFavDao {

67
mediadb/src/main/java/org/videolan/vlc/mediadb/Converters.kt

@ -0,0 +1,67 @@
/*
* ************************************************************************
* Converters.kt
* *************************************************************************
* Copyright © 2020 VLC authors and VideoLAN
* Author: Nicolas POMEPUY
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
* **************************************************************************
*
*
*/
/*******************************************************************************
* Converters.kt
* ****************************************************************************
* Copyright © 2018 VLC authors and VideoLAN
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
******************************************************************************/
package org.videolan.vlc.mediadb
import android.net.Uri
import androidx.room.TypeConverter
import java.util.*
class Converters {
@TypeConverter
fun uriToString(uri: Uri): String = uri.toString()
@TypeConverter
fun stringToUri(value: String): Uri = Uri.parse(value)
@TypeConverter
fun fromTimestamp(value: Long?): Date? {
return value?.let { Date(it) }
}
@TypeConverter
fun dateToTimestamp(date: Date?): Long? {
return date?.time?.toLong()
}
}

2
vlc-android/src/org/videolan/vlc/database/CustomDirectoryDao.kt → mediadb/src/main/java/org/videolan/vlc/mediadb/CustomDirectoryDao.kt

@ -1,7 +1,7 @@
package org.videolan.vlc.database
import androidx.room.*
import org.videolan.vlc.database.models.CustomDirectory
import org.videolan.vlc.mediadb.models.CustomDirectory
@Dao
interface CustomDirectoryDao {

8
vlc-android/src/org/videolan/vlc/database/ExternalSubDao.kt → mediadb/src/main/java/org/videolan/vlc/mediadb/ExternalSubDao.kt

@ -21,9 +21,11 @@
package org.videolan.vlc.database
import androidx.lifecycle.LiveData
import androidx.room.*
import org.videolan.vlc.database.models.ExternalSub
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import org.videolan.vlc.mediadb.models.ExternalSub
@Dao
interface ExternalSubDao {

36
vlc-android/src/org/videolan/vlc/database/MediaDatabase.kt → mediadb/src/main/java/org/videolan/vlc/mediadb/MediaDatabase.kt

@ -1,3 +1,27 @@
/*
* ************************************************************************
* MediaDatabase.kt
* *************************************************************************
* Copyright © 2020 VLC authors and VideoLAN
* Author: Nicolas POMEPUY
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
* **************************************************************************
*
*
*/
/*******************************************************************************
* MediaDatabase.kt
* ****************************************************************************
@ -26,13 +50,13 @@ import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import androidx.sqlite.db.SupportSQLiteDatabase
import org.videolan.moviepedia.database.Converters
import org.videolan.resources.AndroidDevices
import org.videolan.tools.SingletonHolder
import org.videolan.vlc.database.models.BrowserFav
import org.videolan.vlc.database.models.CustomDirectory
import org.videolan.vlc.database.models.ExternalSub
import org.videolan.vlc.database.models.Slave
import org.videolan.vlc.util.AndroidDevices
import org.videolan.vlc.mediadb.Converters
import org.videolan.vlc.mediadb.models.BrowserFav
import org.videolan.vlc.mediadb.models.CustomDirectory
import org.videolan.vlc.mediadb.models.ExternalSub
import org.videolan.vlc.mediadb.models.Slave
private const val DB_NAME = "vlc_database"

10
vlc-android/src/org/videolan/vlc/database/Migrations.kt → mediadb/src/main/java/org/videolan/vlc/mediadb/Migrations.kt

@ -26,10 +26,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import org.videolan.resources.AndroidDevices
import org.videolan.resources.TYPE_LOCAL_FAV
import org.videolan.resources.VLCCommonApplication
import org.videolan.tools.Settings
import org.videolan.vlc.repository.BrowserFavRepository
import org.videolan.vlc.util.AndroidDevices
private const val DIR_TABLE_NAME = "directories_table"
private const val MEDIA_TABLE_NAME = "media_table"
@ -203,11 +203,13 @@ val migration_28_29 = object:Migration(28, 29) {
}
fun populateDB(context: Context) = GlobalScope.launch(Dispatchers.IO) {
val favRepo = BrowserFavRepository.getInstance(context)
val uris = listOf(AndroidDevices.MediaFolders.EXTERNAL_PUBLIC_MOVIES_DIRECTORY_URI,
AndroidDevices.MediaFolders.EXTERNAL_PUBLIC_MUSIC_DIRECTORY_URI,
AndroidDevices.MediaFolders.EXTERNAL_PUBLIC_PODCAST_DIRECTORY_URI,
AndroidDevices.MediaFolders.EXTERNAL_PUBLIC_DOWNLOAD_DIRECTORY_URI,
AndroidDevices.MediaFolders.WHATSAPP_VIDEOS_FILE_URI)
for (uri in uris) favRepo.addLocalFavItem(uri, uri.lastPathSegment ?: "")
val browserFavDao = MediaDatabase.getInstance(context).browserFavDao()
for (uri in uris) browserFavDao.insert(org.videolan.vlc.mediadb.models.BrowserFav(uri, TYPE_LOCAL_FAV, uri.lastPathSegment
?: "", null))
}

2
vlc-android/src/org/videolan/vlc/database/SlaveDao.kt → mediadb/src/main/java/org/videolan/vlc/mediadb/SlaveDao.kt

@ -24,7 +24,7 @@ import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import org.videolan.vlc.database.models.Slave
import org.videolan.vlc.mediadb.models.Slave
@Dao
interface SlaveDao {

63
mediadb/src/main/java/org/videolan/vlc/mediadb/models/BrowserFav.kt

@ -0,0 +1,63 @@
/*
* ************************************************************************
* BrowserFav.kt
* *************************************************************************
* Copyright © 2020 VLC authors and VideoLAN
* Author: Nicolas POMEPUY
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
* **************************************************************************
*
*
*/
/*******************************************************************************
* BrowserFav.kt
* ****************************************************************************
* Copyright © 2018 VLC authors and VideoLAN
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
******************************************************************************/
package org.videolan.vlc.mediadb.models
import android.net.Uri
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "fav_table")
data class BrowserFav(
@PrimaryKey
@ColumnInfo(name = "uri")
val uri: Uri,
@ColumnInfo(name = "type")
val type: Int,
@ColumnInfo(name = "title")
val title: String,
@ColumnInfo(name = "icon_url")
val iconUrl: String?
)

2
vlc-android/src/org/videolan/vlc/database/models/CustomDirectory.kt → mediadb/src/main/java/org/videolan/vlc/mediadb/models/CustomDirectory.kt

@ -1,4 +1,4 @@
package org.videolan.vlc.database.models
package org.videolan.vlc.mediadb.models
import androidx.room.Entity
import androidx.room.PrimaryKey

2
vlc-android/src/org/videolan/vlc/database/models/ExternalSub.kt → mediadb/src/main/java/org/videolan/vlc/mediadb/models/ExternalSub.kt

@ -18,7 +18,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
******************************************************************************/
package org.videolan.vlc.database.models
package org.videolan.vlc.mediadb.models
import androidx.room.Entity

2
vlc-android/src/org/videolan/vlc/database/models/Slave.kt → mediadb/src/main/java/org/videolan/vlc/mediadb/models/Slave.kt

@ -18,7 +18,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
******************************************************************************/
package org.videolan.vlc.database.models
package org.videolan.vlc.mediadb.models
import androidx.room.ColumnInfo
import androidx.room.Entity

27
mediadb/src/main/res/values/strings.xml

@ -0,0 +1,27 @@
<!--
~ *************************************************************************
~ strings.xml
~ **************************************************************************
~ Copyright © 2020 VLC authors and VideoLAN
~ Author: Nicolas POMEPUY
~ This program is free software; you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation; either version 2 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program; if not, write to the Free Software
~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
~ ***************************************************************************
~
~
-->
<resources>
<string name="app_name">mediadb</string>
</resources>

48
vlc-android/src/org/videolan/vlc/database/models/BrowserFav.kt → mediadb/src/test/java/org/videolan/vlc/mediadb/ExampleUnitTest.kt

@ -1,8 +1,9 @@
/*******************************************************************************
* BrowserFav.kt
* ****************************************************************************
* Copyright © 2018 VLC authors and VideoLAN
*
/*
* ************************************************************************
* ExampleUnitTest.kt
* *************************************************************************
* Copyright © 2020 VLC authors and VideoLAN
* Author: Nicolas POMEPUY
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@ -16,24 +17,25 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
******************************************************************************/
* **************************************************************************
*
*
*/
package org.videolan.vlc.database.models
package org.videolan.vlc.mediadb
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import android.net.Uri
import org.junit.Test
@Entity(tableName = "fav_table")
data class BrowserFav (
@PrimaryKey
@ColumnInfo(name = "uri")
val uri: Uri,
@ColumnInfo(name = "type")
val type: Int,
@ColumnInfo(name = "title")
val title: String,
@ColumnInfo(name = "icon_url")
val iconUrl: String?
)
import org.junit.Assert.*
/**
* Example local unit test, which will execute on the development machine (host).
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}

17
resources/build.gradle

@ -22,12 +22,29 @@ android {
debug {
buildConfigField "String", "APP_ID", "\"${rootProject.ext.appId}.debug\""
}
dev {
initWith debug
matchingFallbacks = ['debug']
}
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.multidex:multidex:2.0.1'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$rootProject.ext.kotlinx_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$rootProject.ext.kotlinx_version"
devImplementation project(':libvlc')
devImplementation project(':medialibrary')
debugImplementation "org.videolan.android:libvlc-all:$rootProject.ext.libvlcVersion"
debugImplementation "org.videolan.android:medialibrary-all:$rootProject.ext.medialibraryVersion"
api project(':tools')
}
repositories {
mavenCentral()

25
vlc-android/src/org/videolan/vlc/util/AndroidDevices.kt → resources/src/main/java/org/videolan/resources/AndroidDevices.kt

@ -18,7 +18,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*/
package org.videolan.vlc.util
package org.videolan.resources
import android.annotation.TargetApi
import android.content.Context
@ -34,11 +34,7 @@ import android.view.MotionEvent
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.resources.VLCCommonApplication
import java.io.BufferedReader
import java.io.File
import java.io.FileReader
import java.io.IOException
import java.io.*
import java.util.*
@ObsoleteCoroutinesApi
@ -92,7 +88,7 @@ object AndroidDevices {
continue
}
if (startsWith(deviceWL, device) && (typeWL.contains(type) || startsWith(mountWL, mountpoint))) {
val position = containsName(list, FileUtils.getFileNameFromPath(mountpoint))
val position = containsName(list, mountpoint.getFileNameFromPath())
if (position > -1) list.removeAt(position)
list.add(mountpoint)
}
@ -100,7 +96,7 @@ object AndroidDevices {
}
} catch (ignored: IOException) {
} finally {
Util.close(bufReader)
close(bufReader)
}
list.remove(EXTERNAL_PUBLIC_DIRECTORY)
return list
@ -121,7 +117,7 @@ object AndroidDevices {
devicesWithoutNavBar.add("HTC One S")
devicesWithoutNavBar.add("HTC One X")
devicesWithoutNavBar.add("HTC One XL")
hasNavBar = !devicesWithoutNavBar.contains(android.os.Build.MODEL)
hasNavBar = !devicesWithoutNavBar.contains(Build.MODEL)
val ctx = VLCCommonApplication.appContext
val pm = ctx.packageManager
hasTsp = pm == null || pm.hasSystemFeature("android.hardware.touchscreen")
@ -216,4 +212,15 @@ object AndroidDevices {
}
}
fun close(closeable: Closeable?): Boolean {
if (closeable != null)
try {
closeable.close()
return true
} catch (e: IOException) {
}
return false
}
}

3
resources/src/main/java/org/videolan/resources/Constants.kt

@ -189,6 +189,5 @@ const val TYPE_LOCAL_FAV = 1
const val CRASH_ML_CTX = "crash_ml_ctx"
const val CRASH_ML_MSG = "crash_ml_msg"
private fun String.buildPkgString() = "${BuildConfig.APP_ID}.$this"
fun String.buildPkgString() = "${BuildConfig.APP_ID}.$this"

6
vlc-android/src/org/videolan/vlc/util/Strings.kt → resources/src/main/java/org/videolan/resources/Strings.kt

@ -19,9 +19,9 @@
*/
@file:JvmName("Strings")
package org.videolan.vlc.util
import org.videolan.vlc.BuildConfig
package org.videolan.resources
import java.text.DecimalFormat
private const val TAG = "VLC/UiTools/Strings"
@ -62,4 +62,4 @@ fun String.removeFileProtocole(): String {
this
}
fun String.buildPkgString() = "${BuildConfig.APPLICATION_ID}.$this"
fun String.getFileNameFromPath() = substringBeforeLast('/')

2
settings.gradle

@ -1,3 +1,3 @@
include ':libvlc', ':api', ':medialibrary', ':tools', ':resources'
include ':libvlc', ':api', ':medialibrary', ':tools', ':resources', ':mediadb'
include ':vlc-android'
include ':moviepedia'

46
tools/src/main/java/org/videolan/tools/Workers.kt

@ -0,0 +1,46 @@
/*
* ************************************************************************
* Workers.kt
* *************************************************************************
* Copyright © 2020 VLC authors and VideoLAN
* Author: Nicolas POMEPUY
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
* **************************************************************************
*
*
*/
package org.videolan.tools
import android.os.Looper
import kotlinx.coroutines.*
fun runBackground(runnable: Runnable) {
if (Looper.myLooper() != Looper.getMainLooper()) runnable.run()
else AppScope.launch(Dispatchers.Default) { runnable.run() }
}
fun runOnMainThread(runnable: Runnable) {
AppScope.launch { runnable.run() }
}
fun runIO(runnable: Runnable) {
AppScope.launch(Dispatchers.IO) { runnable.run() }
}
object AppScope : CoroutineScope {
@ExperimentalCoroutinesApi
override val coroutineContext = Dispatchers.Main.immediate + SupervisorJob()
}

14
vlc-android/androidTest/org/videolan/vlc/database/MigrationTest.kt

@ -37,9 +37,9 @@ import org.junit.runner.RunWith
import org.videolan.libvlc.interfaces.IMedia
import org.videolan.vlc.VLCApplication
import org.videolan.vlc.database.helpers.*
import org.videolan.vlc.database.models.BrowserFav
import org.videolan.vlc.database.models.ExternalSub
import org.videolan.vlc.database.models.Slave
import org.videolan.vlc.mediadb.models.BrowserFav
import org.videolan.vlc.mediadb.models.ExternalSub
import org.videolan.vlc.mediadb.models.Slave
import org.videolan.tools.Settings
import org.videolan.resources.TYPE_NETWORK_FAV
import org.videolan.vlc.util.TestUtil
@ -84,9 +84,9 @@ class MigrationTest {
val migratedDb = getMigratedRoomDatabase(migration_26_27, migration_27_28, migration_28_29)
val slave: Slave = migratedDb.slaveDao().get(slaveMedia1Path)[0]
val exSub: List<ExternalSub> = getValue(migratedDb.externalSubDao().get(exSubMedia1Name))
val fav: BrowserFav = migratedDb.browserFavDao().get(favUri)[0]
val slave: org.videolan.vlc.mediadb.models.Slave = migratedDb.slaveDao().get(slaveMedia1Path)[0]
val exSub: List<org.videolan.vlc.mediadb.models.ExternalSub> = getValue(migratedDb.externalSubDao().get(exSubMedia1Name))
val fav: org.videolan.vlc.mediadb.models.BrowserFav = migratedDb.browserFavDao().get(favUri)[0]
assertEquals(slave.mediaPath, slaveMedia1Path)
assertEquals(slave.type, IMedia.Slave.Type.Subtitle)
@ -126,7 +126,7 @@ class MigrationTest {
.build()
// close the database and release any stream resources when the test finishes
migrationTestHelper.closeWhenFinished(database);
migrationTestHelper.closeWhenFinished(database)
return database
}
}

1
vlc-android/build.gradle

@ -252,6 +252,7 @@ dependencies {
implementation project(':api')
implementation project(':tools')
implementation project(':resources')
implementation project(':mediadb')
// AppCompat
implementation "androidx.activity:activity-ktx:$rootProject.ext.androidxActivityVersion"

2
vlc-android/res/layout/playlist_item.xml

@ -9,7 +9,7 @@
<import type="android.text.TextUtils"/>
<import type="org.videolan.vlc.util.Strings"/>
<import type="org.videolan.resources.Strings" />
<variable
name="holder"

2
vlc-android/src/org/videolan/vlc/DebugLogService.kt

@ -34,7 +34,7 @@ import androidx.core.content.ContextCompat
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.vlc.gui.DebugLogActivity
import org.videolan.vlc.gui.helpers.NotificationHelper
import org.videolan.vlc.util.AndroidDevices
import org.videolan.resources.AndroidDevices
import org.videolan.vlc.util.Logcat
import org.videolan.vlc.util.Util
import org.videolan.vlc.util.getContextWithLocale

5
vlc-android/src/org/videolan/vlc/ExternalMonitor.kt

@ -46,9 +46,8 @@ import org.videolan.libvlc.util.AndroidUtil
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.resources.ACTION_CHECK_STORAGES
import org.videolan.resources.VLCCommonApplication
import org.videolan.tools.KEY_MEDIALIBRARY_SCAN
import org.videolan.tools.ML_SCAN_ON
import org.videolan.tools.Settings
import org.videolan.resources.removeFileProtocole
import org.videolan.tools.*
import org.videolan.vlc.gui.helpers.UiTools
import org.videolan.vlc.gui.helpers.hf.OtgAccess
import org.videolan.vlc.util.*

2
vlc-android/src/org/videolan/vlc/FileProvider.kt

@ -5,7 +5,7 @@ import android.content.ContentValues
import android.database.Cursor
import android.net.Uri
import android.os.ParcelFileDescriptor
import org.videolan.vlc.util.AndroidDevices
import org.videolan.resources.AndroidDevices
import java.io.File
import java.io.FileNotFoundException

15
vlc-android/src/org/videolan/vlc/MediaParsingService.kt

@ -44,20 +44,17 @@ import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.actor
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.medialibrary.MLServiceLocator
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.medialibrary.interfaces.DevicesDiscoveryCb
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.medialibrary.stubs.StubMedialibrary
import org.videolan.vlc.gui.SendCrashActivity
import org.videolan.vlc.gui.helpers.NotificationHelper
import org.videolan.moviepedia.MoviepediaIndexer
import org.videolan.resources.*
import org.videolan.tools.KEY_MEDIALIBRARY_SCAN
import org.videolan.tools.ML_SCAN_OFF
import org.videolan.tools.ML_SCAN_ON
import org.videolan.tools.Settings
import org.videolan.tools.*
import org.videolan.vlc.gui.SendCrashActivity
import org.videolan.vlc.gui.helpers.NotificationHelper
import org.videolan.vlc.repository.DirectoryRepository
import org.videolan.vlc.util.*
import org.videolan.vlc.util.Util.readAsset
import org.videolan.vlc.util.FileUtils
import java.io.File
private const val TAG = "VLC/MediaParsingService"
@ -268,7 +265,7 @@ class MediaParsingService : LifecycleService(), DevicesDiscoveryCb, LifecycleOwn
private fun startScan(shouldInit: Boolean, upgrade: Boolean) {
scanActivated = true
if (MLServiceLocator.getLocatorMode() == MLServiceLocator.LocatorMode.TESTS) {
(medialibrary as StubMedialibrary).loadJsonData(readAsset("basic_stub.json", ""))
(medialibrary as StubMedialibrary).loadJsonData(Util.readAsset("basic_stub.json", ""))
}
when {
shouldInit -> {

2
vlc-android/src/org/videolan/vlc/MediaSessionCallback.kt

@ -12,7 +12,7 @@ import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.resources.MEDIALIBRARY_PAGE_SIZE
import org.videolan.vlc.extensions.ExtensionsManager
import org.videolan.vlc.media.MediaSessionBrowser
import org.videolan.vlc.util.AndroidDevices
import org.videolan.resources.AndroidDevices
import org.videolan.vlc.util.VoiceSearchParams
import org.videolan.vlc.util.awaitMedialibraryStarted
import org.videolan.vlc.util.getFromMl

1
vlc-android/src/org/videolan/vlc/PlaybackService.kt

@ -57,6 +57,7 @@ import org.videolan.libvlc.util.AndroidUtil
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.resources.*
import org.videolan.resources.AndroidDevices
import org.videolan.tools.Settings
import org.videolan.tools.safeOffer
import org.videolan.vlc.gui.helpers.AudioUtil

5
vlc-android/src/org/videolan/vlc/RecommendationsService.kt

@ -34,10 +34,7 @@ import androidx.core.content.ContextCompat
import kotlinx.coroutines.*
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.resources.PLAY_EXTRA_FROM_START
import org.videolan.resources.PLAY_EXTRA_ITEM_LOCATION
import org.videolan.resources.PLAY_EXTRA_ITEM_TITLE
import org.videolan.resources.PLAY_FROM_VIDEOGRID
import org.videolan.resources.*
import org.videolan.vlc.gui.helpers.BitmapUtil
import org.videolan.vlc.gui.video.VideoPlayerActivity
import org.videolan.vlc.util.*

2
vlc-android/src/org/videolan/vlc/RendererDelegate.kt

@ -24,7 +24,7 @@ import org.videolan.libvlc.RendererDiscoverer
import org.videolan.libvlc.RendererItem
import org.videolan.resources.VLCCommonApplication
import org.videolan.tools.retry
import org.videolan.vlc.util.AppScope
import org.videolan.tools.AppScope
import org.videolan.vlc.util.LiveDataset
import org.videolan.vlc.util.VLCInstance
import org.videolan.vlc.util.isAppStarted

1
vlc-android/src/org/videolan/vlc/StartActivity.kt

@ -41,6 +41,7 @@ import kotlinx.coroutines.launch
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.medialibrary.MLServiceLocator
import org.videolan.resources.*
import org.videolan.resources.AndroidDevices
import org.videolan.tools.BETA_WELCOME
import org.videolan.tools.Settings
import org.videolan.tools.awaitAppIsForegroung

2
vlc-android/src/org/videolan/vlc/StoragesMonitor.kt

@ -11,8 +11,8 @@ import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.actor
import kotlinx.coroutines.delay
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.tools.AppScope
import org.videolan.vlc.gui.DialogActivity
import org.videolan.vlc.util.AppScope
import org.videolan.vlc.util.getFromMl
import org.videolan.vlc.util.isAppStarted
import org.videolan.vlc.util.scanAllowed

2
vlc-android/src/org/videolan/vlc/TvReceiver.kt

@ -30,7 +30,7 @@ import android.media.tv.TvContract
import android.os.Build
import android.util.Log
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.vlc.util.AndroidDevices
import org.videolan.resources.AndroidDevices
import org.videolan.vlc.util.launchChannelUpdate
import org.videolan.vlc.util.setChannel

2
vlc-android/src/org/videolan/vlc/VLCApplication.kt

@ -48,7 +48,7 @@ import org.videolan.vlc.gui.SendCrashActivity
import org.videolan.vlc.gui.helpers.AudioUtil
import org.videolan.vlc.gui.helpers.BitmapCache
import org.videolan.vlc.gui.helpers.NotificationHelper
import org.videolan.vlc.util.AppScope
import org.videolan.tools.AppScope
import org.videolan.vlc.util.DialogDelegate
import org.videolan.vlc.util.SettingsMigration
import org.videolan.vlc.util.VLCInstance

2
vlc-android/src/org/videolan/vlc/gui/ContentActivity.kt

@ -42,7 +42,7 @@ import org.videolan.vlc.gui.browser.ExtensionBrowser
import org.videolan.vlc.gui.dialogs.RenderersDialog
import org.videolan.vlc.gui.helpers.UiTools
import org.videolan.vlc.interfaces.Filterable
import org.videolan.vlc.util.AndroidDevices
import org.videolan.resources.AndroidDevices
import org.videolan.tools.Settings
import org.videolan.vlc.util.Util

1
vlc-android/src/org/videolan/vlc/gui/InfoActivity.kt

@ -32,6 +32,7 @@ import org.videolan.medialibrary.interfaces.media.Artist
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.resources.TAG_ITEM
import org.videolan.resources.readableFileSize
import org.videolan.vlc.R
import org.videolan.vlc.databinding.InfoActivityBinding
import org.videolan.vlc.gui.browser.PathAdapter

5
vlc-android/src/org/videolan/vlc/gui/MainActivity.kt

@ -37,10 +37,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.resources.ACTIVITY_RESULT_OPEN
import org.videolan.resources.ACTIVITY_RESULT_PREFERENCES
import org.videolan.resources.ACTIVITY_RESULT_SECONDARY
import org.videolan.resources.EXTRA_TARGET
import org.videolan.resources.*
import org.videolan.tools.*
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.R

1
vlc-android/src/org/videolan/vlc/gui/PlaylistActivity.kt

@ -51,6 +51,7 @@ import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.interfaces.media.Playlist
import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.resources.*
import org.videolan.resources.AndroidDevices
import org.videolan.tools.isStarted
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.R

2
vlc-android/src/org/videolan/vlc/gui/SecondaryActivity.kt

@ -36,6 +36,7 @@ import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.resources.KEY_FOLDER
import org.videolan.resources.KEY_GROUP
import org.videolan.resources.AndroidDevices
import org.videolan.tools.RESULT_RESCAN
import org.videolan.tools.RESULT_RESTART
import org.videolan.vlc.R
@ -46,7 +47,6 @@ import org.videolan.vlc.gui.helpers.UiTools
import org.videolan.vlc.gui.tv.TvUtil
import org.videolan.vlc.gui.video.VideoGridFragment
import org.videolan.vlc.reloadLibrary
import org.videolan.vlc.util.*
@ExperimentalCoroutinesApi
@ObsoleteCoroutinesApi

6
vlc-android/src/org/videolan/vlc/gui/SendCrashActivity.kt

@ -45,13 +45,15 @@ import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.resources.CRASH_ML_CTX
import org.videolan.resources.CRASH_ML_MSG
import org.videolan.resources.VLCCommonApplication
import org.videolan.resources.readableFileSize
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.DebugLogService
import org.videolan.vlc.R
import org.videolan.vlc.VLCApplication
import org.videolan.vlc.databinding.SendCrashActivityBinding
import org.videolan.vlc.gui.helpers.hf.StoragePermissionsDelegate.Companion.getStoragePermission
import org.videolan.vlc.util.*
import org.videolan.vlc.util.AppUtils
import org.videolan.vlc.util.FileUtils
import org.videolan.vlc.util.Permissions
import java.io.File
import java.lang.Runnable

1
vlc-android/src/org/videolan/vlc/gui/audio/BaseAudioBrowser.kt

@ -41,6 +41,7 @@ import kotlinx.coroutines.*
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.resources.*
import org.videolan.resources.AndroidDevices
import org.videolan.tools.MultiSelectHelper
import org.videolan.tools.isStarted
import org.videolan.vlc.BuildConfig

2
vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserAdapter.kt

@ -51,7 +51,7 @@ import org.videolan.vlc.gui.DiffUtilAdapter
import org.videolan.vlc.gui.helpers.MarqueeViewHolder
import org.videolan.vlc.gui.helpers.SelectorViewHolder
import org.videolan.vlc.gui.helpers.enableMarqueeEffect
import org.videolan.vlc.util.AndroidDevices
import org.videolan.resources.AndroidDevices
import org.videolan.tools.Settings
import org.videolan.resources.UPDATE_SELECTION
import java.util.*

4
vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt

@ -68,7 +68,9 @@ import org.videolan.vlc.interfaces.IRefreshable
import org.videolan.vlc.media.MediaUtils
import org.videolan.vlc.media.PlaylistManager
import org.videolan.vlc.repository.BrowserFavRepository
import org.videolan.vlc.util.*
import org.videolan.vlc.util.Util
import org.videolan.vlc.util.WeakHandler
import org.videolan.vlc.util.isSchemeSupported
import org.videolan.vlc.viewmodels.browser.BrowserModel
import java.util.*

6
vlc-android/src/org/videolan/vlc/gui/browser/FileBrowserFragment.kt

@ -40,14 +40,14 @@ import kotlinx.coroutines.withContext
import org.videolan.medialibrary.MLServiceLocator
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.resources.AndroidDevices
import org.videolan.resources.CTX_FAV_ADD
import org.videolan.resources.removeFileProtocole
import org.videolan.vlc.ExternalMonitor
import org.videolan.vlc.R
import org.videolan.vlc.gui.helpers.MedialibraryUtils
import org.videolan.vlc.gui.helpers.hf.OtgAccess
import org.videolan.vlc.util.AndroidDevices
import org.videolan.resources.CTX_FAV_ADD
import org.videolan.vlc.util.FileUtils
import org.videolan.vlc.util.removeFileProtocole
import org.videolan.vlc.viewmodels.browser.BrowserModel
import org.videolan.vlc.viewmodels.browser.TYPE_FILE

4
vlc-android/src/org/videolan/vlc/gui/browser/FilePickerFragment.kt

@ -36,11 +36,11 @@ import kotlinx.coroutines.runBlocking
import org.videolan.medialibrary.MLServiceLocator
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.resources.AndroidDevices
import org.videolan.resources.removeFileProtocole
import org.videolan.vlc.R
import org.videolan.vlc.repository.DirectoryRepository
import org.videolan.vlc.util.AndroidDevices
import org.videolan.vlc.util.FileUtils
import org.videolan.vlc.util.removeFileProtocole
import org.videolan.vlc.viewmodels.browser.BrowserModel
import org.videolan.vlc.viewmodels.browser.TYPE_PICKER

4
vlc-android/src/org/videolan/vlc/gui/browser/MediaBrowserFragment.kt

@ -56,9 +56,9 @@ import org.videolan.vlc.gui.helpers.hf.StoragePermissionsDelegate.Companion.getW
import org.videolan.vlc.gui.view.SwipeRefreshLayout
import org.videolan.vlc.interfaces.Filterable
import org.videolan.vlc.media.MediaUtils
import org.videolan.vlc.util.AndroidDevices
import org.videolan.vlc.util.FileUtils
import org.videolan.resources.AndroidDevices
import org.videolan.resources.TAG_ITEM
import org.videolan.vlc.util.FileUtils
import org.videolan.vlc.util.Util
import org.videolan.vlc.viewmodels.MedialibraryViewModel
import org.videolan.vlc.viewmodels.SortableModel

2
vlc-android/src/org/videolan/vlc/gui/browser/PathAdapter.kt

@ -11,7 +11,7 @@ import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.R
import org.videolan.vlc.util.AndroidDevices
import org.videolan.resources.AndroidDevices
import org.videolan.vlc.viewmodels.browser.IPathOperationDelegate
import org.videolan.vlc.viewmodels.browser.PathOperationDelegate

2
vlc-android/src/org/videolan/vlc/gui/dialogs/ContextSheet.kt

@ -31,10 +31,10 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_EXPANDED
import org.videolan.resources.*
import org.videolan.resources.AndroidDevices
import org.videolan.tools.isStarted
import org.videolan.vlc.R
import org.videolan.vlc.databinding.ContextItemBinding
import org.videolan.vlc.util.*
const val CTX_TITLE_KEY = "CTX_TITLE_KEY"
const val CTX_POSITION_KEY = "CTX_POSITION_KEY"

2
vlc-android/src/org/videolan/vlc/gui/dialogs/NetworkServerDialog.kt

@ -21,7 +21,7 @@ import org.videolan.vlc.R
import org.videolan.vlc.gui.DialogActivity
import org.videolan.vlc.gui.MainActivity
import org.videolan.vlc.repository.BrowserFavRepository
import org.videolan.vlc.util.runIO
import org.videolan.tools.runIO
class NetworkServerDialog : DialogFragment(), AdapterView.OnItemSelectedListener, TextWatcher, View.OnClickListener {

2
vlc-android/src/org/videolan/vlc/gui/dialogs/PlaybackSpeedDialog.kt

@ -33,10 +33,10 @@ import androidx.core.content.ContextCompat
import androidx.lifecycle.Observer
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.videolan.resources.formatRateString
import org.videolan.vlc.PlaybackService
import org.videolan.vlc.R
import org.videolan.vlc.gui.helpers.OnRepeatListener
import org.videolan.vlc.util.formatRateString
@ObsoleteCoroutinesApi
@ExperimentalCoroutinesApi

3
vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitleDownloadFragment.kt

@ -12,11 +12,10 @@ import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import org.videolan.vlc.R
import org.videolan.vlc.VLCApplication
import org.videolan.vlc.databinding.SubtitleDownloadFragmentBinding
import org.videolan.vlc.gui.OnItemSelectListener
import org.videolan.vlc.gui.helpers.UiTools
import org.videolan.vlc.util.AndroidDevices
import org.videolan.resources.AndroidDevices
import org.videolan.tools.Settings
import org.videolan.vlc.viewmodels.SubtitlesModel

5
vlc-android/src/org/videolan/vlc/gui/dialogs/VlcLoginDialog.kt

@ -25,18 +25,15 @@
package org.videolan.vlc.gui.dialogs
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.content.SharedPreferences
import android.os.Bundle
import android.view.View
import android.widget.EditText
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import org.videolan.libvlc.Dialog
import org.videolan.vlc.R
import org.videolan.vlc.databinding.VlcLoginDialogBinding
import org.videolan.vlc.gui.helpers.UiTools
import org.videolan.vlc.util.AndroidDevices
import org.videolan.resources.AndroidDevices
import org.videolan.tools.LOGIN_STORE
import org.videolan.tools.Settings

4
vlc-android/src/org/videolan/vlc/gui/helpers/AudioUtil.kt

@ -38,9 +38,11 @@ import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.resources.VLCCommonApplication
import org.videolan.resources.AndroidDevices
import org.videolan.tools.runIO
import org.videolan.tools.runOnMainThread
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.R
import org.videolan.vlc.VLCApplication
import org.videolan.vlc.media.MediaUtils
import org.videolan.vlc.util.*
import java.io.*

4
vlc-android/src/org/videolan/vlc/gui/helpers/BitmapCache.kt

@ -20,15 +20,13 @@
package org.videolan.vlc.gui.helpers
import android.annotation.TargetApi
import android.content.res.Resources
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.os.Build
import android.util.Log
import androidx.collection.LruCache
import org.videolan.resources.readableSize
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.util.readableSize
object BitmapCache {
private val mMemCache: LruCache<String, Bitmap>

2
vlc-android/src/org/videolan/vlc/gui/helpers/ImageLoader.kt

@ -39,7 +39,7 @@ import org.videolan.vlc.databinding.AudioBrowserCardItemBinding
import org.videolan.vlc.databinding.MediaBrowserTvItemBinding
import org.videolan.vlc.databinding.PlaylistItemBinding
import org.videolan.vlc.gui.tv.TvUtil
import org.videolan.vlc.util.AppScope
import org.videolan.tools.AppScope
import org.videolan.vlc.util.HttpImageLoader
import org.videolan.vlc.util.ThumbnailsProvider
import org.videolan.vlc.util.ThumbnailsProvider.obtainBitmap

8
vlc-android/src/org/videolan/vlc/gui/helpers/MedialibraryUtils.kt

@ -6,13 +6,9 @@ import android.content.Intent
import android.net.Uri
import androidx.core.content.ContextCompat
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.resources.ACTION_DISCOVER
import org.videolan.resources.ACTION_DISCOVER_DEVICE
import org.videolan.resources.EXTRA_PATH
import org.videolan.resources.VLCCommonApplication
import org.videolan.resources.*
import org.videolan.tools.runIO
import org.videolan.vlc.MediaParsingService
import org.videolan.vlc.util.runIO
import org.videolan.vlc.util.stripTrailingSlash
object MedialibraryUtils {

1
vlc-android/src/org/videolan/vlc/gui/helpers/NotificationHelper.kt

@ -35,6 +35,7 @@ import androidx.core.app.NotificationCompat
import androidx.media.session.MediaButtonReceiver
import org.videolan.resources.ACTION_PAUSE_SCAN
import org.videolan.resources.ACTION_RESUME_SCAN
import org.videolan.resources.AndroidDevices
import org.videolan.vlc.R
import org.videolan.vlc.StartActivity
import org.videolan.vlc.util.*

2
vlc-android/src/org/videolan/vlc/gui/helpers/PlayerOptionsDelegate.kt

@ -25,6 +25,8 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.coroutines.*
import org.videolan.resources.*
import org.videolan.resources.AndroidDevices
import org.videolan.tools.AppScope
import org.videolan.tools.Settings
import org.videolan.vlc.PlaybackService
import org.videolan.vlc.R

4
vlc-android/src/org/videolan/vlc/gui/helpers/UiTools.kt

@ -77,13 +77,13 @@ import org.videolan.tools.isStarted
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.MediaParsingService
import org.videolan.vlc.R
import org.videolan.vlc.VLCApplication
import org.videolan.vlc.gui.BaseActivity
import org.videolan.vlc.gui.browser.MediaBrowserFragment
import org.videolan.vlc.gui.dialogs.SavePlaylistDialog
import org.videolan.vlc.media.MediaUtils
import org.videolan.vlc.providers.medialibrary.MedialibraryProvider
import org.videolan.vlc.util.*
import org.videolan.vlc.util.FileUtils
import org.videolan.vlc.util.LocalePair
import java.util.*
import kotlin.collections.ArrayList
import kotlin.collections.component1

4
vlc-android/src/org/videolan/vlc/gui/helpers/hf/StoragePermissionsDelegate.kt

@ -38,10 +38,12 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.resources.AndroidDevices
import org.videolan.resources.EXTRA_FIRST_RUN
import org.videolan.resources.EXTRA_UPGRADE
import org.videolan.vlc.startMedialibrary
import org.videolan.vlc.util.*
import org.videolan.vlc.util.FileUtils
import org.videolan.vlc.util.Permissions
import org.videolan.vlc.util.Permissions.canReadStorage
import videolan.org.commontools.LiveEvent

7
vlc-android/src/org/videolan/vlc/gui/helpers/hf/WriteExternalDelegate.kt

@ -14,12 +14,11 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import kotlinx.coroutines.launch
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.resources.AndroidDevices
import org.videolan.tools.AppScope
import org.videolan.tools.Settings
import org.videolan.vlc.R
import org.videolan.vlc.util.AndroidDevices
import org.videolan.vlc.util.AppScope
import org.videolan.vlc.util.FileUtils
import org.videolan.tools.Settings
class WriteExternalDelegate : BaseHeadlessFragment() {
private var storage : String? = null

5
vlc-android/src/org/videolan/vlc/gui/onboarding/OnboardingActivity.kt

@ -17,10 +17,7 @@ import kotlinx.android.synthetic.main.activity_onboarding.*
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import kotlinx.coroutines.launch
import org.videolan.resources.ACTIVITY_RESULT_PREFERENCES
import org.videolan.resources.EXTRA_FIRST_RUN
import org.videolan.resources.EXTRA_UPGRADE
import org.videolan.resources.PREF_FIRST_RUN
import org.videolan.resources.*
import org.videolan.tools.*
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.MediaParsingService

2
vlc-android/src/org/videolan/vlc/gui/onboarding/OnboardingThemeFragment.kt

@ -11,7 +11,7 @@ import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.main.onboarding_theme.*
import org.videolan.vlc.R
import org.videolan.vlc.util.AndroidDevices
import org.videolan.resources.AndroidDevices
class OnboardingThemeFragment : Fragment(), CompoundButton.OnCheckedChangeListener, View.OnClickListener {

5
vlc-android/src/org/videolan/vlc/gui/onboarding/OnboardingViewModel.kt

@ -5,10 +5,9 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProviders
import org.videolan.vlc.util.AndroidDevices
import org.videolan.resources.AndroidDevices
class OnboardingViewModel() : ViewModel() {
class OnboardingViewModel : ViewModel() {
var scanStorages = true
var customizeMediaFolders = false
var permissionGranted = false

2
vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesAdvanced.kt

@ -35,12 +35,12 @@ import androidx.preference.EditTextPreference
import androidx.preference.Preference
import kotlinx.coroutines.*
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.resources.AndroidDevices
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.R
import org.videolan.vlc.gui.DebugLogActivity
import org.videolan.vlc.gui.helpers.UiTools
import org.videolan.vlc.gui.helpers.hf.StoragePermissionsDelegate.Companion.getWritePermission
import org.videolan.vlc.util.AndroidDevices
import org.videolan.vlc.util.FileUtils
import org.videolan.vlc.util.VLCInstance
import java.io.File

2
vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesAudio.kt

@ -33,7 +33,7 @@ import org.videolan.libvlc.util.AndroidUtil
import org.videolan.libvlc.util.HWDecoderUtil
import org.videolan.vlc.R
import org.videolan.tools.AUDIO_DUCKING
import org.videolan.vlc.util.AndroidDevices
import org.videolan.resources.AndroidDevices
import org.videolan.tools.RESUME_PLAYBACK
import org.videolan.vlc.util.VLCInstance

3
vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesUi.kt

@ -35,11 +35,10 @@ import androidx.preference.TwoStatePreference
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.resources.AndroidDevices
import org.videolan.tools.*
import org.videolan.vlc.R
import org.videolan.vlc.gui.helpers.UiTools
import org.videolan.vlc.util.*
@ObsoleteCoroutinesApi
@ExperimentalCoroutinesApi

2
vlc-android/src/org/videolan/vlc/gui/tv/MainTvFragment.kt

@ -38,6 +38,7 @@ import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.media.DummyItem
import org.videolan.resources.*
import org.videolan.resources.AndroidDevices
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.R
import org.videolan.vlc.RecommendationsService
@ -46,7 +47,6 @@ import org.videolan.vlc.gui.tv.TvUtil.metadataDiffCallback
import org.videolan.vlc.gui.tv.audioplayer.AudioPlayerActivity
import org.videolan.vlc.gui.tv.browser.VerticalGridActivity
import org.videolan.vlc.reloadLibrary
import org.videolan.vlc.util.*
import org.videolan.vlc.viewmodels.tv.MainTvModel
import org.videolan.vlc.viewmodels.tv.MainTvModel.Companion.getMainTvModel

2
vlc-android/src/org/videolan/vlc/gui/tv/audioplayer/AudioPlayerActivity.kt

@ -48,7 +48,7 @@ import org.videolan.vlc.gui.helpers.MediaComparators
import org.videolan.vlc.gui.helpers.UiTools
import org.videolan.vlc.gui.tv.browser.BaseTvActivity
import org.videolan.vlc.media.MediaUtils
import org.videolan.vlc.util.AndroidDevices
import org.videolan.resources.AndroidDevices
import org.videolan.tools.Settings
import org.videolan.vlc.util.getScreenWidth
import org.videolan.vlc.viewmodels.PlayerState

2
vlc-android/src/org/videolan/vlc/gui/tv/preferences/PreferencesAdvanced.kt

@ -37,12 +37,12 @@ import androidx.preference.EditTextPreference
import androidx.preference.Preference
import kotlinx.coroutines.*
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.resources.AndroidDevices
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.R
import org.videolan.vlc.gui.DebugLogActivity
import org.videolan.vlc.gui.helpers.UiTools
import org.videolan.vlc.gui.helpers.hf.StoragePermissionsDelegate.Companion.getWritePermission
import org.videolan.vlc.util.AndroidDevices
import org.videolan.vlc.util.FileUtils
import org.videolan.vlc.util.VLCInstance
import java.io.File

1
vlc-android/src/org/videolan/vlc/gui/tv/preferences/PreferencesFragment.kt

@ -33,6 +33,7 @@ import androidx.preference.Preference
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.resources.AndroidDevices
import org.videolan.tools.KEY_VIDEO_APP_SWITCH
import org.videolan.tools.RESULT_RESTART
import org.videolan.tools.SCREEN_ORIENTATION

3
vlc-android/src/org/videolan/vlc/gui/tv/preferences/PreferencesUi.kt

@ -32,11 +32,10 @@ import androidx.preference.Preference
import androidx.preference.TwoStatePreference
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.videolan.resources.AndroidDevices
import org.videolan.tools.*
import org.videolan.vlc.R
import org.videolan.vlc.gui.helpers.UiTools
import org.videolan.vlc.util.*
@ExperimentalCoroutinesApi
@ObsoleteCoroutinesApi

2
vlc-android/src/org/videolan/vlc/gui/tv/preferences/PreferencesVideo.kt

@ -28,9 +28,9 @@ import android.os.Bundle
import androidx.preference.Preference
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.videolan.resources.AndroidDevices
import org.videolan.tools.*
import org.videolan.vlc.R
import org.videolan.vlc.util.*
@ExperimentalCoroutinesApi
@ObsoleteCoroutinesApi

3
vlc-android/src/org/videolan/vlc/gui/video/MediaInfoAdapter.kt

@ -27,10 +27,9 @@ import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import org.videolan.libvlc.Media
import org.videolan.libvlc.interfaces.IMedia
import org.videolan.resources.readableSize
import org.videolan.vlc.R
import org.videolan.vlc.util.readableSize
class MediaInfoAdapter : RecyclerView.Adapter<MediaInfoAdapter.ViewHolder>() {
private lateinit var inflater: LayoutInflater

7
vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt

@ -86,7 +86,6 @@ import org.videolan.tools.*
import org.videolan.vlc.*
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.R
import org.videolan.vlc.database.models.ExternalSub
import org.videolan.vlc.databinding.PlayerHudBinding
import org.videolan.vlc.databinding.PlayerHudRightBinding
import org.videolan.vlc.gui.MainActivity
@ -221,8 +220,8 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
protected var isBenchmark = false
private val addedExternalSubs = ArrayList<ExternalSub>()
private var downloadedSubtitleLiveData: LiveData<List<ExternalSub>>? = null
private val addedExternalSubs = ArrayList<org.videolan.vlc.mediadb.models.ExternalSub>()
private var downloadedSubtitleLiveData: LiveData<List<org.videolan.vlc.mediadb.models.ExternalSub>>? = null
private var previousMediaPath: String? = null
private val isInteractive: Boolean
@ -345,7 +344,7 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
private var enableSubs = true
private val downloadedSubtitleObserver = Observer<List<ExternalSub>> { externalSubs ->
private val downloadedSubtitleObserver = Observer<List<org.videolan.vlc.mediadb.models.ExternalSub>> { externalSubs ->
for (externalSub in externalSubs!!) {
if (!addedExternalSubs.contains(externalSub)) {
service?.addSubtitleTrack(externalSub.subtitlePath, currentSpuTrack == -2)

4
vlc-android/src/org/videolan/vlc/gui/video/VideoTouchDelegate.kt

@ -27,8 +27,8 @@ import org.videolan.medialibrary.Tools
import org.videolan.tools.setVisible
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.R
import org.videolan.vlc.util.AndroidDevices
import org.videolan.vlc.util.AndroidDevices.isTv
import org.videolan.resources.AndroidDevices
import org.videolan.resources.AndroidDevices.isTv
import kotlin.math.abs
import kotlin.math.pow
import kotlin.math.roundToInt

2
vlc-android/src/org/videolan/vlc/gui/video/benchmark/BenchActivity.kt

@ -47,7 +47,7 @@ import kotlinx.coroutines.ObsoleteCoroutinesApi
import kotlinx.coroutines.launch
import org.videolan.libvlc.MediaPlayer
import org.videolan.vlc.PlaybackService
import org.videolan.vlc.util.AppScope
import org.videolan.tools.AppScope
import org.videolan.tools.Settings
import org.videolan.vlc.util.VLCInstance
import java.io.*

1
vlc-android/src/org/videolan/vlc/media/MediaUtils.kt

@ -27,6 +27,7 @@ import org.videolan.medialibrary.interfaces.media.*
import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.resources.MEDIALIBRARY_PAGE_SIZE
import org.videolan.resources.VLCCommonApplication
import org.videolan.tools.AppScope
import org.videolan.vlc.PlaybackService
import org.videolan.vlc.R
import org.videolan.vlc.gui.DialogActivity

6
vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt

@ -21,15 +21,11 @@ import org.videolan.libvlc.util.AndroidUtil
import org.videolan.medialibrary.MLServiceLocator
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.resources.EXIT_PLAYER
import org.videolan.resources.PLAYLIST_TYPE_AUDIO
import org.videolan.resources.PLAY_FROM_SERVICE
import org.videolan.resources.VLCCommonApplication
import org.videolan.resources.*
import org.videolan.tools.*
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.PlaybackService
import org.videolan.vlc.R
import org.videolan.vlc.VLCApplication
import org.videolan.vlc.gui.video.VideoPlayerActivity
import org.videolan.vlc.util.*
import org.videolan.vlc.util.FileUtils

1
vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt

@ -40,6 +40,7 @@ import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.medialibrary.media.Storage
import org.videolan.tools.AppScope
import org.videolan.tools.Settings
import org.videolan.vlc.R
import org.videolan.vlc.util.*

6
vlc-android/src/org/videolan/vlc/providers/FileBrowserProvider.kt

@ -37,12 +37,11 @@ import org.videolan.medialibrary.media.DummyItem
import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.vlc.ExternalMonitor
import org.videolan.vlc.R
import org.videolan.vlc.database.models.BrowserFav
import org.videolan.vlc.gui.helpers.hf.StoragePermissionsDelegate
import org.videolan.vlc.gui.helpers.hf.getDocumentFiles
import org.videolan.vlc.repository.BrowserFavRepository
import org.videolan.vlc.repository.DirectoryRepository
import org.videolan.vlc.util.AndroidDevices
import org.videolan.resources.AndroidDevices
import org.videolan.vlc.util.FileUtils
import org.videolan.vlc.util.LiveDataset
import org.videolan.vlc.util.convertFavorites
@ -64,7 +63,8 @@ open class FileBrowserProvider(
private val showFavorites = url == null && !filePicker && this !is StorageProvider
private val favorites = if (url == null && !filePicker) BrowserFavRepository.getInstance(context).localFavorites else null
private val favoritesObserver by lazy { Observer<List<BrowserFav>> {
private val favoritesObserver by lazy {
Observer<List<org.videolan.vlc.mediadb.models.BrowserFav>> {
val favs = convertFavorites(it)
val data = dataset.value.toMutableList()
if (data.size > 1) {

2
vlc-android/src/org/videolan/vlc/providers/StorageProvider.kt

@ -28,7 +28,7 @@ import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.medialibrary.media.Storage
import org.videolan.vlc.R
import org.videolan.vlc.repository.DirectoryRepository
import org.videolan.vlc.util.AndroidDevices
import org.videolan.resources.AndroidDevices
import org.videolan.vlc.util.LiveDataset
import java.io.File
import java.util.*

11
vlc-android/src/org/videolan/vlc/repository/BrowserFavRepository.kt

@ -20,21 +20,20 @@
package org.videolan.vlc.repository
import androidx.lifecycle.MediatorLiveData
import android.content.Context
import android.net.Uri
import androidx.annotation.WorkerThread
import androidx.lifecycle.MediatorLiveData
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.resources.TYPE_LOCAL_FAV
import org.videolan.resources.TYPE_NETWORK_FAV
import org.videolan.tools.IOScopedObject
import org.videolan.tools.SingletonHolder
import org.videolan.vlc.ExternalMonitor
import org.videolan.vlc.database.BrowserFavDao
import org.videolan.vlc.database.MediaDatabase
import org.videolan.vlc.database.models.BrowserFav
import org.videolan.resources.TYPE_LOCAL_FAV
import org.videolan.resources.TYPE_NETWORK_FAV
import org.videolan.vlc.util.convertFavorites
import java.util.*
@ -48,11 +47,11 @@ class BrowserFavRepository(private val browserFavDao: BrowserFavDao) : IOScopedO
val localFavorites by lazy { browserFavDao.getAllLocalFavs() }
fun addNetworkFavItem(uri: Uri, title: String, iconUrl: String?) = launch {
browserFavDao.insert(BrowserFav(uri, TYPE_NETWORK_FAV, title, iconUrl))
browserFavDao.insert(org.videolan.vlc.mediadb.models.BrowserFav(uri, TYPE_NETWORK_FAV, title, iconUrl))
}
fun addLocalFavItem(uri: Uri, title: String, iconUrl: String? = null) = launch {
browserFavDao.insert(BrowserFav(uri, TYPE_LOCAL_FAV, title, iconUrl))
browserFavDao.insert(org.videolan.vlc.mediadb.models.BrowserFav(uri, TYPE_LOCAL_FAV, title, iconUrl))
}
val networkFavorites by lazy {

11
vlc-android/src/org/videolan/vlc/repository/DirectoryRepository.kt

@ -13,27 +13,26 @@ import org.videolan.tools.SingletonHolder
import org.videolan.vlc.R
import org.videolan.vlc.database.CustomDirectoryDao
import org.videolan.vlc.database.MediaDatabase
import org.videolan.vlc.database.models.CustomDirectory
import org.videolan.vlc.util.AndroidDevices
import org.videolan.vlc.util.AndroidDevices.EXTERNAL_PUBLIC_DIRECTORY
import org.videolan.resources.AndroidDevices
import org.videolan.resources.AndroidDevices.EXTERNAL_PUBLIC_DIRECTORY
import org.videolan.vlc.util.FileUtils
import java.io.File
class DirectoryRepository (private val customDirectoryDao: CustomDirectoryDao) : IOScopedObject() {
fun addCustomDirectory(path: String): Job = launch {
customDirectoryDao.insert(CustomDirectory(path))
customDirectoryDao.insert(org.videolan.vlc.mediadb.models.CustomDirectory(path))
}
suspend fun getCustomDirectories() = withContext(coroutineContext) {
try {
customDirectoryDao.getAll()
} catch (e: Exception) {
emptyList<CustomDirectory>()
emptyList<org.videolan.vlc.mediadb.models.CustomDirectory>()
}
}
fun deleteCustomDirectory(path: String) = launch { customDirectoryDao.delete(CustomDirectory(path)) }
fun deleteCustomDirectory(path: String) = launch { customDirectoryDao.delete(org.videolan.vlc.mediadb.models.CustomDirectory(path)) }
suspend fun customDirectoryExists(path: String) = withContext(coroutineContext) { customDirectoryDao.get(path).isNotEmpty() }

8
vlc-android/src/org/videolan/vlc/repository/ExternalSubRepository.kt

@ -31,7 +31,7 @@ import kotlinx.coroutines.launch
import org.videolan.tools.SingletonHolder
import org.videolan.vlc.database.ExternalSubDao
import org.videolan.vlc.database.MediaDatabase
import org.videolan.vlc.database.models.ExternalSub
import org.videolan.vlc.mediadb.models.ExternalSub
import org.videolan.vlc.gui.dialogs.State
import org.videolan.vlc.gui.dialogs.SubtitleItem
import org.videolan.vlc.util.CoroutineContextProvider
@ -46,13 +46,13 @@ class ExternalSubRepository(private val externalSubDao: ExternalSubDao, private
get() = _downloadingSubtitles as LiveData<Map<Long, SubtitleItem>>
fun saveDownloadedSubtitle(idSubtitle: String, subtitlePath: String, mediaPath: String, language: String, movieReleaseName: String): Job {
return GlobalScope.launch(coroutineContextProvider.IO) { externalSubDao.insert(ExternalSub(idSubtitle, subtitlePath, mediaPath, language, movieReleaseName)) }
return GlobalScope.launch(coroutineContextProvider.IO) { externalSubDao.insert(org.videolan.vlc.mediadb.models.ExternalSub(idSubtitle, subtitlePath, mediaPath, language, movieReleaseName)) }
}
fun getDownloadedSubtitles(mediaUri: Uri): LiveData<List<ExternalSub>> {
fun getDownloadedSubtitles(mediaUri: Uri): LiveData<List<org.videolan.vlc.mediadb.models.ExternalSub>> {
val externalSubs = externalSubDao.get(mediaUri.path!!)
return Transformations.map(externalSubs) { list ->
val existExternalSubs: MutableList<ExternalSub> = mutableListOf()
val existExternalSubs: MutableList<org.videolan.vlc.mediadb.models.ExternalSub> = mutableListOf()
list.forEach {
if (File(Uri.decode(it.subtitlePath)).exists())
existExternalSubs.add(it)

6
vlc-android/src/org/videolan/vlc/repository/SlaveRepository.kt

@ -33,14 +33,14 @@ import org.videolan.tools.IOScopedObject
import org.videolan.tools.SingletonHolder
import org.videolan.vlc.database.MediaDatabase
import org.videolan.vlc.database.SlaveDao
import org.videolan.vlc.database.models.Slave
import org.videolan.vlc.mediadb.models.Slave
class SlaveRepository(private val slaveDao:SlaveDao) : IOScopedObject() {
fun saveSlave(mediaPath: String, type: Int, priority: Int, uriString: String): Job {
return launch {
slaveDao.insert(Slave(mediaPath, type, priority, uriString))
slaveDao.insert(org.videolan.vlc.mediadb.models.Slave(mediaPath, type, priority, uriString))
}
}
@ -55,7 +55,7 @@ class SlaveRepository(private val slaveDao:SlaveDao) : IOScopedObject() {
val slaves = try {
slaveDao.get(mrl)
} catch (e: SQLiteException) {
emptyList<Slave>()
emptyList<org.videolan.vlc.mediadb.models.Slave>()
}
val mediaSlaves = slaves.map {
var uri = it.uri

4
vlc-android/src/org/videolan/vlc/util/Browserutils.kt

@ -24,7 +24,7 @@ import android.net.Uri
import org.videolan.medialibrary.MLServiceLocator
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.vlc.database.models.BrowserFav
import org.videolan.vlc.mediadb.models.BrowserFav
fun isSchemeSupported(scheme: String?) = when(scheme) {
@ -32,7 +32,7 @@ fun isSchemeSupported(scheme: String?) = when(scheme) {
else -> false
}
fun convertFavorites(browserFavs: List<BrowserFav>?) = browserFavs?.map { (uri, _, title, iconUrl) ->
fun convertFavorites(browserFavs: List<org.videolan.vlc.mediadb.models.BrowserFav>?) = browserFavs?.map { (uri, _, title, iconUrl) ->
MLServiceLocator.getAbstractMediaWrapper(uri).apply {
setDisplayTitle(Uri.decode(title))
type = MediaWrapper.TYPE_DIR

2
vlc-android/src/org/videolan/vlc/util/FileUtils.kt

@ -42,8 +42,10 @@ import kotlinx.coroutines.withContext
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.resources.AndroidDevices
import org.videolan.resources.VLCCommonApplication
import org.videolan.tools.Settings
import org.videolan.tools.runIO
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.R
import org.videolan.vlc.media.MediaUtils

1
vlc-android/src/org/videolan/vlc/util/Kextensions.kt

@ -33,6 +33,7 @@ import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.interfaces.media.MediaWrapper.TYPE_ALL
import org.videolan.medialibrary.interfaces.media.MediaWrapper.TYPE_VIDEO
import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.resources.AndroidDevices
import org.videolan.tools.*
import org.videolan.tools.Settings.showTvUi
import org.videolan.vlc.R

1
vlc-android/src/org/videolan/vlc/util/TvChannels.kt

@ -32,6 +32,7 @@ import androidx.tvprovider.media.tv.TvContractCompat
import androidx.tvprovider.media.tv.WatchNextProgram
import kotlinx.coroutines.*
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.tools.AppScope
import org.videolan.tools.Settings
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.PreviewVideoInputService

3
vlc-android/src/org/videolan/vlc/util/Util.kt

@ -31,7 +31,10 @@ import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.videolan.libvlc.Dialog
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.resources.AndroidDevices
import org.videolan.resources.VLCCommonApplication
import org.videolan.tools.runBackground
import org.videolan.tools.runOnMainThread
import org.videolan.vlc.R
import org.videolan.vlc.VLCApplication
import org.videolan.vlc.gui.helpers.hf.WriteExternalDelegate

1
vlc-android/src/org/videolan/vlc/util/VLCAudioFocusHelper.kt

@ -34,6 +34,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.tools.AUDIO_DUCKING
import org.videolan.resources.AndroidDevices
import org.videolan.tools.RESUME_PLAYBACK
import org.videolan.vlc.BuildConfig
import org.videolan.vlc.PlaybackService

22
vlc-android/src/org/videolan/vlc/util/Workers.kt

@ -1,22 +0,0 @@
package org.videolan.vlc.util
import android.os.Looper
import kotlinx.coroutines.*
fun runBackground(runnable: Runnable) {
if (Looper.myLooper() != Looper.getMainLooper()) runnable.run()
else AppScope.launch(Dispatchers.Default) { runnable.run() }
}
fun runOnMainThread(runnable: Runnable) {
AppScope.launch { runnable.run() }
}
fun runIO(runnable: Runnable) {
AppScope.launch(Dispatchers.IO) { runnable.run() }
}
object AppScope : CoroutineScope {
@ExperimentalCoroutinesApi
override val coroutineContext = Dispatchers.Main.immediate + SupervisorJob()
}

6
vlc-android/src/org/videolan/vlc/viewmodels/tv/MainTvModel.kt

@ -37,7 +37,6 @@ import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.vlc.ExternalMonitor
import org.videolan.vlc.PlaybackService
import org.videolan.vlc.R
import org.videolan.vlc.database.models.BrowserFav
import org.videolan.moviepedia.database.models.MediaMetadataWithImages
import org.videolan.vlc.gui.DialogActivity
import org.videolan.vlc.gui.tv.*
@ -50,6 +49,7 @@ import org.videolan.vlc.repository.BrowserFavRepository
import org.videolan.vlc.repository.DirectoryRepository
import org.videolan.moviepedia.repository.MediaMetadataRepository
import org.videolan.resources.*
import org.videolan.resources.AndroidDevices
import org.videolan.tools.PLAYBACK_HISTORY
import org.videolan.tools.Settings
import org.videolan.vlc.util.*
@ -72,7 +72,7 @@ class MainTvModel(app: Application) : AndroidViewModel(app), Medialibrary.OnMedi
var showHistory = false
private set
// LiveData
private val favorites: LiveData<List<BrowserFav>> = browserFavRepository.browserFavorites
private val favorites: LiveData<List<org.videolan.vlc.mediadb.models.BrowserFav>> = browserFavRepository.browserFavorites
val nowPlaying: LiveData<List<MediaLibraryItem>> = MutableLiveData()
val videos: LiveData<List<MediaLibraryItem>> = MutableLiveData()
val audioCategories: LiveData<List<MediaLibraryItem>> = MutableLiveData()
@ -92,7 +92,7 @@ class MainTvModel(app: Application) : AndroidViewModel(app), Medialibrary.OnMedi
for (action in channel) setHistory()
}
private val favObserver = Observer<List<BrowserFav>> { list ->
private val favObserver = Observer<List<org.videolan.vlc.mediadb.models.BrowserFav>> { list ->
updatedFavoritList = convertFavorites(list)
if (!updateActor.isClosedForSend) updateActor.offer(Unit)
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save