Browse Source

Remove redundancies

merge-requests/2314/head
Nicolas Pomepuy 1 year ago
parent
commit
31f1924ee6
  1. 8
      application/app/src/androidTest/java/org/videolan/vlc/UtilViewMatchers.kt
  2. 2
      application/donations/src/main/java/org/videolan/vlc/donations/util/SkuDetails.kt
  3. 4
      application/live-plot-graph/src/main/java/org/videolan/liveplotgraph/LegendView.kt
  4. 2
      application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessRouting.kt
  5. 2
      application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessServer.kt
  6. 10
      application/television/src/main/java/org/videolan/television/ui/GenericCardPresenter.kt
  7. 48
      application/television/src/main/java/org/videolan/television/ui/MediaScrapingTvshowDetailsFragment.kt
  8. 10
      application/television/src/main/java/org/videolan/television/ui/SearchFragment.kt
  9. 3
      application/television/src/main/java/org/videolan/television/ui/preferences/PreferencesActivity.kt
  10. 3
      application/television/src/main/java/org/videolan/television/ui/preferences/TvSettings.kt
  11. 3
      application/television/src/main/java/org/videolan/television/ui/views/ColorPickerItem.kt
  12. 5
      application/tools/src/main/java/org/videolan/tools/Settings.kt
  13. 4
      application/tools/src/main/java/org/videolan/tools/Strings.kt
  14. 6
      application/vlc-android/src/org/videolan/vlc/DebugLogService.kt
  15. 5
      application/vlc-android/src/org/videolan/vlc/PlaybackService.kt
  16. 12
      application/vlc-android/src/org/videolan/vlc/PreviewVideoInputService.kt
  17. 15
      application/vlc-android/src/org/videolan/vlc/RecommendationsService.kt
  18. 3
      application/vlc-android/src/org/videolan/vlc/gui/BaseActivity.kt
  19. 2
      application/vlc-android/src/org/videolan/vlc/gui/HeaderMediaListActivity.kt
  20. 6
      application/vlc-android/src/org/videolan/vlc/gui/MainActivity.kt
  21. 4
      application/vlc-android/src/org/videolan/vlc/gui/dialogs/AddToGroupDialog.kt
  22. 4
      application/vlc-android/src/org/videolan/vlc/gui/dialogs/SavePlaylistDialog.kt
  23. 4
      application/vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitlesAdapter.kt
  24. 1
      application/vlc-android/src/org/videolan/vlc/gui/helpers/Navigator.kt
  25. 3
      application/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesActivity.kt
  26. 2
      application/vlc-android/src/org/videolan/vlc/gui/preferences/widgets/PreferencesWidgets.kt
  27. 2
      application/vlc-android/src/org/videolan/vlc/gui/video/PopupManager.kt
  28. 8
      application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt
  29. 12
      application/vlc-android/src/org/videolan/vlc/gui/video/benchmark/BenchActivity.kt
  30. 2
      application/vlc-android/src/org/videolan/vlc/gui/video/benchmark/StartActivityOnCrash.kt
  31. 3
      application/vlc-android/src/org/videolan/vlc/gui/view/CoverMediaSwitcher.kt
  32. 19
      application/vlc-android/src/org/videolan/vlc/gui/view/EmptyLoadingStateView.kt
  33. 3
      application/vlc-android/src/org/videolan/vlc/gui/view/EqualizerBar.kt
  34. 11
      application/vlc-android/src/org/videolan/vlc/gui/view/FastScroller.kt
  35. 3
      application/vlc-android/src/org/videolan/vlc/gui/view/FlingViewGroup.kt
  36. 6
      application/vlc-android/src/org/videolan/vlc/gui/view/HackyDrawerLayout.kt
  37. 4
      application/vlc-android/src/org/videolan/vlc/gui/view/HeaderMediaSwitcher.kt
  38. 4
      application/vlc-android/src/org/videolan/vlc/gui/view/SwipeRefreshLayout.kt
  39. 3
      application/vlc-android/src/org/videolan/vlc/gui/view/SwipeToUnlockView.kt
  40. 2
      application/vlc-android/src/org/videolan/vlc/gui/view/VLCDividerItemDecoration.kt
  41. 2
      application/vlc-android/src/org/videolan/vlc/gui/view/VerticalSeekBar.kt
  42. 13
      application/vlc-android/src/org/videolan/vlc/gui/view/VerticalSeekBarContainer.kt
  43. 2
      application/vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt
  44. 2
      application/vlc-android/src/org/videolan/vlc/providers/medialibrary/MedialibraryProvider.kt
  45. 4
      application/vlc-android/src/org/videolan/vlc/repository/SlaveRepository.kt
  46. 2
      application/vlc-android/src/org/videolan/vlc/util/FileUtils.kt
  47. 2
      application/vlc-android/src/org/videolan/vlc/util/Kextensions.kt
  48. 2
      application/vlc-android/src/org/videolan/vlc/util/Permissions.kt
  49. 19
      application/vlc-android/src/org/videolan/vlc/util/TvChannels.kt
  50. 10
      application/vlc-android/src/org/videolan/vlc/viewmodels/BookmarkModel.kt
  51. 11
      application/vlc-android/test/org/videolan/vlc/repository/DirectoryRepositoryTest.kt
  52. 7
      application/vlc-android/test/org/videolan/vlc/repository/ExternalSubRepositoryTest.kt
  53. 4
      application/vlc-android/test/org/videolan/vlc/repository/SlaveRepositoryTest.kt

8
application/app/src/androidTest/java/org/videolan/vlc/UtilViewMatchers.kt

@ -149,13 +149,7 @@ class TabsMatcher internal constructor(var position: Int) : ViewAction {
override fun getDescription(): String = "Click on tab"
override fun perform(uiController: UiController?, view: View) {
if (view is TabLayout) {
val tabLayout: TabLayout = view as TabLayout
val tab: TabLayout.Tab? = tabLayout.getTabAt(position)
if (tab != null) {
tab.select()
}
}
(view as? TabLayout)?.getTabAt(position)?.select()
}
}

2
application/donations/src/main/java/org/videolan/vlc/donations/util/SkuDetails.kt

@ -28,7 +28,7 @@ class SkuDetails(private val mItemType: String, private val mJson: String) {
val title: String
val description: String
constructor(jsonSkuDetails: String) : this(IabHelper.ITEM_TYPE_INAPP, jsonSkuDetails) {}
constructor(jsonSkuDetails: String) : this(IabHelper.ITEM_TYPE_INAPP, jsonSkuDetails)
override fun toString(): String {
return "SkuDetails:$mJson"

4
application/live-plot-graph/src/main/java/org/videolan/liveplotgraph/LegendView.kt

@ -26,10 +26,8 @@ package org.videolan.liveplotgraph
import android.app.Activity
import android.content.Context
import android.os.Build
import android.util.AttributeSet
import android.util.Log
import android.view.ViewGroup
import android.widget.GridLayout
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
@ -79,7 +77,7 @@ class LegendView : ConstraintLayout, PlotViewDataChangeListener {
}
} ?: Log.w("LegendView", "Cannot find the plot view with id $plotViewId")
}
layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT
layoutParams.height = LayoutParams.WRAP_CONTENT
}
override fun onDataChanged(data: List<Pair<LineGraph, String>>) {

2
application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessRouting.kt

@ -157,7 +157,7 @@ import java.util.Locale
*/
fun Route.setupRouting(appContext: Context, scope: CoroutineScope) {
val settings = Settings.getInstance(appContext)
staticFiles("", File(RemoteAccessServer.getServerFiles(appContext)))
staticFiles("", File(getServerFiles(appContext)))
//the client is requesting a new code.
// if the formparameters "challenge" is sent. Remove the corresponding code
post("/code") {

2
application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessServer.kt

@ -234,7 +234,7 @@ class RemoteAccessServer(private val context: Context) : PlaybackService.Callbac
* Start the server. Refresh the authentication settings before
* Also start monitoring the network shares for the web browser
*/
suspend fun start() {
fun start() {
Settings.getInstance(context).putSingle(
KEY_REMOTE_ACCESS_LAST_STATE_STOPPED, false)
clearFileDownloads()

10
application/television/src/main/java/org/videolan/television/ui/GenericCardPresenter.kt

@ -14,20 +14,20 @@ import org.videolan.vlc.gui.helpers.getBitmapFromDrawable
class GenericCardPresenter @JvmOverloads constructor(context: Context, cardThemeResId: Int = R.style.VLCGenericCardView) : Presenter() {
val context: ContextThemeWrapper = ContextThemeWrapper(context, cardThemeResId)
val padding = context.resources.getDimension(org.videolan.vlc.R.dimen.tv_card_padding).toInt()
val padding = context.resources.getDimension(R.dimen.tv_card_padding).toInt()
override fun onCreateViewHolder(parent: ViewGroup): Presenter.ViewHolder {
override fun onCreateViewHolder(parent: ViewGroup): ViewHolder {
Log.d(TAG, "onCreateViewHolder")
val cardView = ImageCardView(context)
cardView.isFocusable = true
cardView.isFocusableInTouchMode = true
return Presenter.ViewHolder(cardView)
return ViewHolder(cardView)
}
override fun onBindViewHolder(viewHolder: Presenter.ViewHolder, item: Any) {
override fun onBindViewHolder(viewHolder: ViewHolder, item: Any) {
if (item is GenericCardItem) {
val cardView = viewHolder.view as ImageCardView
val bgColor = ContextCompat.getColor(context, item.color)
@ -44,7 +44,7 @@ class GenericCardPresenter @JvmOverloads constructor(context: Context, cardTheme
}
}
override fun onUnbindViewHolder(viewHolder: Presenter.ViewHolder) {
override fun onUnbindViewHolder(viewHolder: ViewHolder) {
Log.d(TAG, "onUnbindViewHolder")
val cardView = viewHolder.view as ImageCardView
// Remove references to images so that the garbage collector can free up memory

48
application/television/src/main/java/org/videolan/television/ui/MediaScrapingTvshowDetailsFragment.kt

@ -50,11 +50,31 @@ import android.os.Bundle
import androidx.core.content.ContextCompat
import androidx.leanback.app.BackgroundManager
import androidx.leanback.app.DetailsSupportFragment
import androidx.leanback.widget.*
import androidx.leanback.widget.Action
import androidx.leanback.widget.ArrayObjectAdapter
import androidx.leanback.widget.ClassPresenterSelector
import androidx.leanback.widget.DetailsOverviewRow
import androidx.leanback.widget.DiffCallback
import androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter
import androidx.leanback.widget.HeaderItem
import androidx.leanback.widget.ListRow
import androidx.leanback.widget.ListRowPresenter
import androidx.leanback.widget.OnActionClickedListener
import androidx.leanback.widget.OnItemViewClickedListener
import androidx.leanback.widget.Presenter
import androidx.leanback.widget.Row
import androidx.leanback.widget.RowPresenter
import androidx.leanback.widget.SparseArrayObjectAdapter
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.*
import org.videolan.moviepedia.database.models.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
import org.videolan.moviepedia.database.models.MediaImage
import org.videolan.moviepedia.database.models.MediaImageType
import org.videolan.moviepedia.database.models.MediaMetadataWithImages
import org.videolan.moviepedia.database.models.Person
import org.videolan.moviepedia.database.models.tvEpisodeSubtitle
import org.videolan.moviepedia.viewmodel.MediaMetadataFull
import org.videolan.moviepedia.viewmodel.MediaMetadataModel
import org.videolan.resources.util.getFromMl
@ -72,7 +92,7 @@ class MediaScrapingTvshowDetailsFragment : DetailsSupportFragment(), CoroutineSc
private lateinit var actionsAdapter: SparseArrayObjectAdapter
private lateinit var showId: String
private lateinit var detailsDescriptionPresenter: org.videolan.television.ui.TvShowDescriptionPresenter
private lateinit var detailsDescriptionPresenter: TvShowDescriptionPresenter
private lateinit var backgroundManager: BackgroundManager
private lateinit var rowsAdapter: ArrayObjectAdapter
private lateinit var browserFavRepository: BrowserFavRepository
@ -99,11 +119,11 @@ class MediaScrapingTvshowDetailsFragment : DetailsSupportFragment(), CoroutineSc
backgroundManager = BackgroundManager.getInstance(requireActivity())
backgroundManager.isAutoReleaseOnStop = false
browserFavRepository = BrowserFavRepository.getInstance(requireContext())
detailsDescriptionPresenter = org.videolan.television.ui.TvShowDescriptionPresenter()
arrayObjectAdapterPosters = ArrayObjectAdapter(org.videolan.television.ui.MediaImageCardPresenter(requireActivity(), MediaImageType.POSTER))
detailsDescriptionPresenter = TvShowDescriptionPresenter()
arrayObjectAdapterPosters = ArrayObjectAdapter(MediaImageCardPresenter(requireActivity(), MediaImageType.POSTER))
val extras = requireActivity().intent.extras ?: savedInstanceState ?: return
showId = extras.getString(org.videolan.television.ui.TV_SHOW_ID) ?: return
showId = extras.getString(TV_SHOW_ID) ?: return
viewModel = ViewModelProvider(this, MediaMetadataModel.Factory(requireActivity(), showId = showId)).get(showId, MediaMetadataModel::class.java)
@ -125,7 +145,7 @@ class MediaScrapingTvshowDetailsFragment : DetailsSupportFragment(), CoroutineSc
}
override fun onSaveInstanceState(outState: Bundle) {
outState.putString(org.videolan.television.ui.TV_SHOW_ID, showId)
outState.putString(TV_SHOW_ID, showId)
super.onSaveInstanceState(outState)
}
@ -139,7 +159,7 @@ class MediaScrapingTvshowDetailsFragment : DetailsSupportFragment(), CoroutineSc
val media = item.media
?: item.metadata.mlId?.let { requireActivity().getFromMl { getMedia(it) } }
media?.let {
org.videolan.television.ui.TvUtil.showMediaDetail(requireActivity(), it)
TvUtil.showMediaDetail(requireActivity(), it)
}
}
}
@ -229,7 +249,7 @@ class MediaScrapingTvshowDetailsFragment : DetailsSupportFragment(), CoroutineSc
}
if (metadata.images.any { it.imageType == MediaImageType.BACKDROP }) {
val arrayObjectAdapterBackdrops = ArrayObjectAdapter(org.videolan.television.ui.MediaImageCardPresenter(requireActivity(), MediaImageType.BACKDROP))
val arrayObjectAdapterBackdrops = ArrayObjectAdapter(MediaImageCardPresenter(requireActivity(), MediaImageType.BACKDROP))
arrayObjectAdapterBackdrops.setItems(metadata.images.filter { it.imageType == MediaImageType.BACKDROP }, imageDiffCallback)
val headerBackdrops = HeaderItem(tvShow.metadata?.metadata?.moviepediaId?.toLong(36)
?: 0, getString(R.string.backdrops))
@ -242,7 +262,7 @@ class MediaScrapingTvshowDetailsFragment : DetailsSupportFragment(), CoroutineSc
override fun areContentsTheSame(oldItem: Row, newItem: Row): Boolean {
if (oldItem is DetailsOverviewRow && newItem is DetailsOverviewRow) {
return oldItem.item as org.videolan.television.ui.MediaItemDetails == newItem.item as org.videolan.television.ui.MediaItemDetails
return oldItem.item as MediaItemDetails == newItem.item as MediaItemDetails
}
return true
}
@ -257,7 +277,7 @@ class MediaScrapingTvshowDetailsFragment : DetailsSupportFragment(), CoroutineSc
// Attach your media item details presenter to the row presenter:
val rowPresenter = FullWidthDetailsOverviewRowPresenter(detailsDescriptionPresenter)
val videoPresenter = org.videolan.television.ui.VideoDetailsPresenter(requireActivity(), requireActivity().getScreenWidth())
val videoPresenter = VideoDetailsPresenter(requireActivity(), requireActivity().getScreenWidth())
val activity = requireActivity()
detailsOverview = DetailsOverviewRow(tvShow)
@ -268,12 +288,12 @@ class MediaScrapingTvshowDetailsFragment : DetailsSupportFragment(), CoroutineSc
MediaUtils.openList(activity, viewModel.provider.getResumeMedias(viewModel.updateLiveData.value?.seasons), 0)
}
ID_START_OVER -> {
org.videolan.television.ui.TvUtil.playMedia(activity, viewModel.provider.getAllMedias(viewModel.updateLiveData.value?.seasons))
TvUtil.playMedia(activity, viewModel.provider.getAllMedias(viewModel.updateLiveData.value?.seasons))
}
}
}
selector.addClassPresenter(DetailsOverviewRow::class.java, rowPresenter)
selector.addClassPresenter(org.videolan.television.ui.VideoDetailsOverviewRow::class.java, videoPresenter)
selector.addClassPresenter(VideoDetailsOverviewRow::class.java, videoPresenter)
selector.addClassPresenter(ListRow::class.java,
ListRowPresenter())
rowsAdapter = ArrayObjectAdapter(selector)

10
application/television/src/main/java/org/videolan/television/ui/SearchFragment.kt

@ -27,7 +27,11 @@ import android.content.Intent
import android.os.Build
import android.os.Bundle
import androidx.leanback.app.SearchSupportFragment
import androidx.leanback.widget.*
import androidx.leanback.widget.ArrayObjectAdapter
import androidx.leanback.widget.HeaderItem
import androidx.leanback.widget.ListRow
import androidx.leanback.widget.ListRowPresenter
import androidx.leanback.widget.OnItemViewClickedListener
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch
import org.videolan.medialibrary.interfaces.media.MediaWrapper
@ -81,7 +85,7 @@ class SearchFragment : SearchSupportFragment(), SearchSupportFragment.SearchResu
updateEmtyView(empty)
if (searchAggregate == null || empty) return@launch
val mediaEmpty = empty || (searchAggregate.tracks.isNullOrEmpty() && searchAggregate.videos.isNullOrEmpty())
val cp = org.videolan.television.ui.CardPresenter(requireActivity())
val cp = CardPresenter(requireActivity())
val videoAdapter = ArrayObjectAdapter(cp)
if (!mediaEmpty) searchAggregate.videos?.let { videoAdapter.addAll(0, listOf(*it)) }
// val episodesAdapter = ArrayObjectAdapter(cp)
@ -113,7 +117,7 @@ class SearchFragment : SearchSupportFragment(), SearchSupportFragment.SearchResu
}
private fun updateEmtyView(empty: Boolean) {
(activity as? org.videolan.television.ui.SearchActivity)?.updateEmptyView(empty)
(activity as? SearchActivity)?.updateEmptyView(empty)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

3
application/television/src/main/java/org/videolan/television/ui/preferences/PreferencesActivity.kt

@ -24,7 +24,6 @@
package org.videolan.television.ui.preferences
import android.annotation.TargetApi
import android.app.Activity
import android.content.Intent
import android.os.Build
import android.os.Bundle
@ -60,7 +59,7 @@ class PreferencesActivity : BaseTvActivity() {
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (resultCode != Activity.RESULT_OK) {
if (resultCode != RESULT_OK) {
finish()
}
super.onActivityResult(requestCode, resultCode, data)

3
application/television/src/main/java/org/videolan/television/ui/preferences/TvSettings.kt

@ -1,6 +1,5 @@
package org.videolan.television.ui.preferences
import androidx.leanback.preference.LeanbackPreferenceFragment
import androidx.leanback.preference.LeanbackSettingsFragment
import androidx.preference.Preference
import androidx.preference.PreferenceDialogFragment
@ -17,7 +16,7 @@ class TvSettings : LeanbackSettingsFragment() {
override fun onPreferenceStartScreen(caller: PreferenceFragment, pref: PreferenceScreen) = false
override fun onPreferenceStartFragment(caller: PreferenceFragment, pref: Preference): Boolean {
val f = LeanbackPreferenceFragment.instantiate(activity, pref.fragment, pref.extras)
val f = instantiate(activity, pref.fragment, pref.extras)
f.setTargetFragment(caller, 0)
if (f is PreferenceFragment || f is PreferenceDialogFragment) startPreferenceFragment(f)
else startImmersiveFragment(f)

3
application/television/src/main/java/org/videolan/television/ui/views/ColorPickerItem.kt

@ -29,7 +29,6 @@ import android.graphics.Canvas
import android.graphics.Paint
import android.util.AttributeSet
import android.view.Gravity
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.ImageView
import androidx.core.content.ContextCompat
@ -56,7 +55,7 @@ class ColorPickerItem @JvmOverloads constructor(
field = value
if (value) addView(ImageView(context).apply {
setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_check))
val lp = LayoutParams(LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
val lp = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
lp.gravity = Gravity.CENTER
layoutParams = lp
setPadding(2.dp, 2.dp,2.dp, 2.dp)

5
application/tools/src/main/java/org/videolan/tools/Settings.kt

@ -4,13 +4,12 @@ import android.app.Activity
import android.content.Context
import android.content.SharedPreferences
import android.os.Build
import android.telephony.TelephonyManager
import androidx.core.content.edit
import androidx.core.content.getSystemService
import androidx.lifecycle.MutableLiveData
import androidx.preference.PreferenceManager
import org.videolan.tools.Settings.audioControlsChangeListener
import org.videolan.tools.Settings.init
import org.videolan.tools.Settings.initPostMigration
import java.io.File
object Settings : SingletonHolder<SharedPreferences, Context>({ init(it.applicationContext) }) {
@ -79,7 +78,7 @@ object Settings : SingletonHolder<SharedPreferences, Context>({ init(it.applicat
fastplaySpeed = prefs.getInt(FASTPLAY_SPEED, 20) / 10f
}
fun Context.isPinCodeSet() = Settings.getInstance(this).getString(KEY_SAFE_MODE_PIN, "")?.isNotBlank() == true
fun Context.isPinCodeSet() = getInstance(this).getString(KEY_SAFE_MODE_PIN, "")?.isNotBlank() == true
/**

4
application/tools/src/main/java/org/videolan/tools/Strings.kt

@ -48,7 +48,7 @@ package org.videolan.tools
import android.annotation.SuppressLint
import java.text.DecimalFormat
import java.util.*
import java.util.Locale
import kotlin.math.log10
import kotlin.math.pow
@ -66,7 +66,7 @@ fun containsName(list: List<String>, text: String) = list.indexOfLast { it.endsW
/**
* Get the formatted current playback speed in the form of 1.00x
*/
fun Float.formatRateString() = String.format(java.util.Locale.US, "%.2fx", this)
fun Float.formatRateString() = String.format(Locale.US, "%.2fx", this)
fun Long.readableSize(): String {
val size: Long = this

6
application/vlc-android/src/org/videolan/vlc/DebugLogService.kt

@ -35,12 +35,10 @@ import android.os.Looper
import android.os.RemoteCallbackList
import android.os.RemoteException
import android.text.format.DateFormat
import android.util.Log
import androidx.core.app.NotificationCompat
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.resources.AndroidDevices
import org.videolan.resources.AppContextProvider
import org.videolan.resources.VLCOptions
import org.videolan.resources.util.launchForeground
import org.videolan.resources.util.startForegroundCompat
import org.videolan.resources.util.stopForegroundCompat
@ -50,8 +48,6 @@ import org.videolan.tools.getContextWithLocale
import org.videolan.vlc.gui.DebugLogActivity
import org.videolan.vlc.gui.helpers.FeedbackUtil
import org.videolan.vlc.gui.helpers.NotificationHelper
import org.videolan.vlc.gui.preferences.search.PreferenceParser
import org.videolan.vlc.util.Permissions
import java.io.BufferedWriter
import java.io.FileNotFoundException
import java.io.FileOutputStream
@ -305,7 +301,7 @@ class DebugLogService : Service(), Logcat.Callback, Runnable {
}
init {
mBound = mContext.bindService(Intent(mContext, DebugLogService::class.java), mServiceConnection, Context.BIND_AUTO_CREATE)
mBound = mContext.bindService(Intent(mContext, DebugLogService::class.java), mServiceConnection, BIND_AUTO_CREATE)
}
fun start(): Boolean {

5
application/vlc-android/src/org/videolan/vlc/PlaybackService.kt

@ -25,7 +25,6 @@ import android.app.Notification
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.SearchManager
import android.app.Service
import android.app.UiModeManager
import android.appwidget.AppWidgetManager
import android.content.BroadcastReceiver
@ -909,7 +908,7 @@ class PlaybackService : MediaBrowserServiceCompat(), LifecycleOwner, CoroutineSc
}
}
}
return Service.START_NOT_STICKY
return START_NOT_STICKY
}
override fun onTaskRemoved(rootIntent: Intent) {
@ -2081,7 +2080,7 @@ class PlaybackService : MediaBrowserServiceCompat(), LifecycleOwner, CoroutineSc
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
carConnection.type.value?.let { it > CarConnection.CONNECTION_TYPE_NOT_CONNECTED } ?: false
} else {
(getSystemService(Context.UI_MODE_SERVICE) as UiModeManager).currentModeType == Configuration.UI_MODE_TYPE_CAR
(getSystemService(UI_MODE_SERVICE) as UiModeManager).currentModeType == Configuration.UI_MODE_TYPE_CAR
}
}
}

12
application/vlc-android/src/org/videolan/vlc/PreviewVideoInputService.kt

@ -10,16 +10,20 @@ import android.net.Uri
import android.os.Build
import android.util.Log
import android.view.Surface
import kotlinx.coroutines.*
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
import org.videolan.libvlc.FactoryManager
import org.videolan.libvlc.MediaPlayer
import org.videolan.libvlc.interfaces.IMediaFactory
import org.videolan.resources.AppContextProvider
import org.videolan.resources.VLCInstance
import org.videolan.resources.util.getFromMl
import org.videolan.tools.getContextWithLocale
import org.videolan.vlc.media.MediaPlayerEventListener
import org.videolan.vlc.media.PlayerController
import org.videolan.resources.VLCInstance
import org.videolan.vlc.util.random
import java.io.IOException
@ -30,7 +34,7 @@ class PreviewVideoInputService : TvInputService(), CoroutineScope by MainScope()
internal val factory = FactoryManager.getFactory(IMediaFactory.factoryId) as IMediaFactory
override fun onCreateSession(inputId: String): TvInputService.Session? {
override fun onCreateSession(inputId: String): Session? {
return PreviewSession(this)
}
@ -43,7 +47,7 @@ class PreviewVideoInputService : TvInputService(), CoroutineScope by MainScope()
}
private inner class PreviewSession(context: Context
) : TvInputService.Session(context), MediaPlayerEventListener {
) : Session(context), MediaPlayerEventListener {
val player by lazy(LazyThreadSafetyMode.NONE) { PlayerController(applicationContext) }

15
application/vlc-android/src/org/videolan/vlc/RecommendationsService.kt

@ -31,10 +31,19 @@ import android.os.Build
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat
import kotlinx.coroutines.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.resources.*
import org.videolan.resources.AppContextProvider
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.tools.getContextWithLocale
import org.videolan.vlc.gui.helpers.BitmapUtil
import org.videolan.vlc.gui.video.VideoPlayerActivity
@ -58,7 +67,7 @@ class RecommendationsService : IntentService("RecommendationService"), Coroutine
override fun onCreate() {
super.onCreate()
mNotificationManager = getAppSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
mNotificationManager = getAppSystemService(NOTIFICATION_SERVICE) as NotificationManager
}
override fun onHandleIntent(intent: Intent?) {

3
application/vlc-android/src/org/videolan/vlc/gui/BaseActivity.kt

@ -1,6 +1,5 @@
package org.videolan.vlc.gui
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
@ -69,7 +68,7 @@ abstract class BaseActivity : AppCompatActivity() {
abstract fun getSnackAnchorView(overAudioPlayer:Boolean = false): View?
private var baseContextWrappingDelegate: AppCompatDelegate? = null
private var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
if (result.resultCode == RESULT_OK) {
FileUtils.getUri(result.data?.data)?.let { MediaUtils.openMediaNoUi(this, it) }
}
}

2
application/vlc-android/src/org/videolan/vlc/gui/HeaderMediaListActivity.kt

@ -635,7 +635,7 @@ open class HeaderMediaListActivity : AudioPlayerContainerActivity(), IEventsHand
MediaUtils.playTracks(this, viewModel.tracksProvider, 0)
}
private suspend fun removeFromPlaylist(list: List<MediaWrapper>, indexes: List<Int>) {
private fun removeFromPlaylist(list: List<MediaWrapper>, indexes: List<Int>) {
if (!showPinIfNeeded()) {
val itemsRemoved = HashMap<Int, Long>()
val playlist = viewModel.playlist as? Playlist

6
application/vlc-android/src/org/videolan/vlc/gui/MainActivity.kt

@ -21,7 +21,6 @@
package org.videolan.vlc.gui
import android.annotation.SuppressLint
import android.app.Activity
import android.app.AlertDialog
import android.content.Intent
import android.content.pm.PackageManager
@ -101,9 +100,6 @@ class MainActivity : ContentActivity(),
{
private lateinit var backPressedCallback: OnBackPressedCallback
var refreshing: Boolean = false
set(value) {
field = value
}
private lateinit var mediaLibrary: Medialibrary
private var scanNeeded = false
private lateinit var toolbarIcon: ImageView
@ -358,7 +354,7 @@ class MainActivity : ContentActivity(),
if (fragment is AudioBrowserFragment) fragment.viewModel.refresh()
}
}
} else if (requestCode == ACTIVITY_RESULT_OPEN && resultCode == Activity.RESULT_OK) {
} else if (requestCode == ACTIVITY_RESULT_OPEN && resultCode == RESULT_OK) {
MediaUtils.openUri(this, data!!.data)
} else if (requestCode == ACTIVITY_RESULT_SECONDARY) {
if (resultCode == RESULT_RESCAN) {

4
application/vlc-android/src/org/videolan/vlc/gui/dialogs/AddToGroupDialog.kt

@ -75,8 +75,8 @@ class AddToGroupDialog : VLCBottomSheetDialogFragment(), SimpleAdapter.ClickHand
override fun initialFocusedView(): View = binding.list
init {
AddToGroupDialog.registerCreator { CoroutineContextProvider() }
coroutineContextProvider = AddToGroupDialog.get(0)
registerCreator { CoroutineContextProvider() }
coroutineContextProvider = get(0)
}
override fun onCreate(savedInstanceState: Bundle?) {

4
application/vlc-android/src/org/videolan/vlc/gui/dialogs/SavePlaylistDialog.kt

@ -110,8 +110,8 @@ class SavePlaylistDialog : VLCBottomSheetDialogFragment(), View.OnClickListener,
override fun initialFocusedView(): View = binding.dialogPlaylistName.editText ?: binding.dialogPlaylistName
init {
SavePlaylistDialog.registerCreator { CoroutineContextProvider() }
coroutineContextProvider = SavePlaylistDialog.get(0)
registerCreator { CoroutineContextProvider() }
coroutineContextProvider = get(0)
}
override fun onCreate(savedInstanceState: Bundle?) {

4
application/vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitlesAdapter.kt

@ -7,12 +7,12 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.SendChannel
import org.videolan.vlc.R
import org.videolan.vlc.databinding.SubtitleDownloadItemBinding
import java.util.*
import java.util.Locale
internal class SubtitlesAdapter(private val eventActor: SendChannel<SubtitleEvent>) : RecyclerView.Adapter<SubtitlesAdapter.ViewHolder>() {
private var dataset: List<SubtitleItem>? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SubtitlesAdapter.ViewHolder {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(parent.context)
val binding = SubtitleDownloadItemBinding.inflate(inflater, parent, false )
return ViewHolder(binding)

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

@ -67,7 +67,6 @@ class Navigator : NavigationBarView.OnItemSelectedListener, DefaultLifecycleObse
private val defaultFragmentId = R.id.nav_video
override var currentFragmentId: Int = 0
private var currentFragment: Fragment? = null
private set
private lateinit var activity: MainActivity
private lateinit var settings: SharedPreferences
override lateinit var navigationView: List<NavigationBarView>

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

@ -20,7 +20,6 @@
package org.videolan.vlc.gui.preferences
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.view.Menu
@ -58,7 +57,7 @@ class PreferencesActivity : BaseActivity() {
private var mAppBarLayout: AppBarLayout? = null
override val displayTitle = true
private var pinCodeResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode != Activity.RESULT_OK) {
if (result.resultCode != RESULT_OK) {
finish()
}
}

2
application/vlc-android/src/org/videolan/vlc/gui/preferences/widgets/PreferencesWidgets.kt

@ -175,7 +175,7 @@ class PreferencesWidgets : BasePreferenceFragment(), SharedPreferences.OnSharedP
model.widget.value?.type = newValue
model.widget.value?.let {
val size = WidgetSizeUtil.getWidgetsSize(requireActivity(), it.widgetId)
val minimalSize = WidgetUtils.getMinimalWidgetSize(WidgetUtils.getWidgetType(it))
val minimalSize = WidgetUtils.getMinimalWidgetSize(getWidgetType(it))
if (size.first < minimalSize.first || size.second < minimalSize.second) {
UiTools.snackerConfirm(requireActivity(), getString(R.string.widget_type_error)) { }
}

2
application/vlc-android/src/org/videolan/vlc/gui/video/PopupManager.kt

@ -61,7 +61,7 @@ import org.videolan.vlc.util.getPendingIntent
import kotlin.math.absoluteValue
import kotlin.math.floor
class PopupManager constructor(private val service: PlaybackService) : PlaybackService.Callback, GestureDetector.OnDoubleTapListener, View.OnClickListener, GestureDetector.OnGestureListener, IVLCVout.OnNewVideoLayoutListener, IVLCVout.Callback {
class PopupManager(private val service: PlaybackService) : PlaybackService.Callback, GestureDetector.OnDoubleTapListener, View.OnClickListener, GestureDetector.OnGestureListener, IVLCVout.OnNewVideoLayoutListener, IVLCVout.Callback {
private var rootView: PopupLayout? = null
private lateinit var expandButton: ImageView

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

@ -1218,7 +1218,7 @@ open class VideoPlayerActivity : AppCompatActivity(), PlaybackService.Callback,
}
private fun exitOK() {
exit(Activity.RESULT_OK)
exit(RESULT_OK)
}
override fun onTrackballEvent(event: MotionEvent): Boolean {
@ -2577,9 +2577,9 @@ open class VideoPlayerActivity : AppCompatActivity(), PlaybackService.Callback,
private const val EXTRA_DURATION = "extra_duration"
private const val EXTRA_URI = "extra_uri"
const val FROM_EXTERNAL = "from_external"
private const val RESULT_CONNECTION_FAILED = Activity.RESULT_FIRST_USER + 1
private const val RESULT_PLAYBACK_ERROR = Activity.RESULT_FIRST_USER + 2
private const val RESULT_VIDEO_TRACK_LOST = Activity.RESULT_FIRST_USER + 3
private const val RESULT_CONNECTION_FAILED = RESULT_FIRST_USER + 1
private const val RESULT_PLAYBACK_ERROR = RESULT_FIRST_USER + 2
private const val RESULT_VIDEO_TRACK_LOST = RESULT_FIRST_USER + 3
internal const val DEFAULT_FOV = 80f
private const val KEY_TIME = "saved_time"
private const val KEY_LIST = "saved_list"

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

@ -21,7 +21,6 @@
package org.videolan.vlc.gui.video.benchmark
import android.annotation.TargetApi
import android.app.Activity
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
@ -35,7 +34,6 @@ import android.support.v4.media.session.PlaybackStateCompat
import android.util.Log
import android.view.View
import androidx.core.content.FileProvider
import androidx.core.content.edit
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@ -51,7 +49,11 @@ import org.videolan.vlc.R
import org.videolan.vlc.gui.helpers.restartMediaPlayer
import org.videolan.vlc.gui.video.PlayerOrientationMode
import org.videolan.vlc.media.PlaylistManager
import java.io.*
import java.io.BufferedReader
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.io.InputStreamReader
import java.text.SimpleDateFormat
import java.util.Date
@ -460,7 +462,7 @@ class BenchActivity : ShallowVideoPlayer() {
* @param resultCode VideoPlayerActivity's resultCode
*/
override fun exit(resultCode: Int) {
if (resultCode != Activity.RESULT_OK) {
if (resultCode != RESULT_OK) {
hasVLCFailed = true
}
super.exit(resultCode)
@ -596,7 +598,7 @@ class BenchActivity : ShallowVideoPlayer() {
sendIntent.putExtra("number_of_dropped_frames", stats?.lostPictures ?: 100)
sendIntent.putExtra("displayed_frames", stats?.displayedPictures )
sendIntent.putExtra("late_frames", lateFrameCounter)
setResult(Activity.RESULT_OK, sendIntent)
setResult(RESULT_OK, sendIntent)
sendIntent.putExtra("speed", speed)
sendIntent.putExtra("dav1d_version", getString(R.string.dav1d_version))
super.finish()

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

@ -25,7 +25,7 @@ import android.content.Context
import android.content.SharedPreferences
import androidx.core.content.edit
class StartActivityOnCrash internal constructor(private val context: Activity) : Thread.UncaughtExceptionHandler {
class StartActivityOnCrash internal constructor(context: Activity) : Thread.UncaughtExceptionHandler {
private val preferences: SharedPreferences = context.getSharedPreferences(SHARED_PREFERENCE, Context.MODE_WORLD_READABLE)

3
application/vlc-android/src/org/videolan/vlc/gui/view/CoverMediaSwitcher.kt

@ -24,7 +24,6 @@ import android.content.Context
import android.graphics.Bitmap
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.core.content.ContextCompat
@ -72,7 +71,7 @@ class CoverMediaSwitcher(context: Context, attrs: AttributeSet) : AudioMediaSwit
coverView.setImageDrawable(ContextCompat.getDrawable(v.context, R.drawable.ic_no_thumbnail_song))
}
trackInfoView?.visibility = if (Settings.showAudioTrackInfo) View.VISIBLE else View.GONE
trackInfoView?.visibility = if (Settings.showAudioTrackInfo) VISIBLE else GONE
titleView.setOnClickListener { onTextClicked() }
artistView.setOnClickListener { onTextClicked() }

19
application/vlc-android/src/org/videolan/vlc/gui/view/EmptyLoadingStateView.kt

@ -33,7 +33,6 @@ import android.os.Build
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.widget.Button
import android.widget.FrameLayout
import android.widget.ImageView
@ -80,16 +79,16 @@ class EmptyLoadingStateView : FrameLayout {
set(value) {
compactMode = value in arrayOf(EmptyLoadingState.EMPTY_SEARCH, EmptyLoadingState.EMPTY, EmptyLoadingState.EMPTY_FAVORITES)
applyCompactMode()
loadingFlipper.visibility = if (value == EmptyLoadingState.LOADING) View.VISIBLE else View.GONE
loadingTitle.visibility = if (value == EmptyLoadingState.LOADING) View.VISIBLE else View.GONE
emptyTextView.visibility = if (value in arrayOf(EmptyLoadingState.EMPTY, EmptyLoadingState.EMPTY_SEARCH, EmptyLoadingState.EMPTY_FAVORITES)) View.VISIBLE else View.GONE
emptyImageView.visibility = if (value in arrayOf(EmptyLoadingState.EMPTY,EmptyLoadingState.MISSING_PERMISSION,EmptyLoadingState.MISSING_VIDEO_PERMISSION, EmptyLoadingState.MISSING_AUDIO_PERMISSION, EmptyLoadingState.EMPTY_SEARCH, EmptyLoadingState.EMPTY_FAVORITES)) View.VISIBLE else View.GONE
loadingFlipper.visibility = if (value == EmptyLoadingState.LOADING) VISIBLE else GONE
loadingTitle.visibility = if (value == EmptyLoadingState.LOADING) VISIBLE else GONE
emptyTextView.visibility = if (value in arrayOf(EmptyLoadingState.EMPTY, EmptyLoadingState.EMPTY_SEARCH, EmptyLoadingState.EMPTY_FAVORITES)) VISIBLE else GONE
emptyImageView.visibility = if (value in arrayOf(EmptyLoadingState.EMPTY,EmptyLoadingState.MISSING_PERMISSION,EmptyLoadingState.MISSING_VIDEO_PERMISSION, EmptyLoadingState.MISSING_AUDIO_PERMISSION, EmptyLoadingState.EMPTY_SEARCH, EmptyLoadingState.EMPTY_FAVORITES)) VISIBLE else GONE
emptyImageView.setImageBitmap(context.getBitmapFromDrawable(if (value == EmptyLoadingState.EMPTY_FAVORITES) R.drawable.ic_fav_empty else if (value in arrayOf(EmptyLoadingState.EMPTY, EmptyLoadingState.EMPTY_SEARCH, EmptyLoadingState.EMPTY_FAVORITES)) R.drawable.ic_empty else R.drawable.ic_empty_warning))
permissionTitle.visibility = if (value in arrayOf(EmptyLoadingState.MISSING_PERMISSION, EmptyLoadingState.MISSING_VIDEO_PERMISSION, EmptyLoadingState.MISSING_AUDIO_PERMISSION)) View.VISIBLE else View.GONE
permissionTextView.visibility = if (value in arrayOf(EmptyLoadingState.MISSING_PERMISSION, EmptyLoadingState.MISSING_VIDEO_PERMISSION, EmptyLoadingState.MISSING_AUDIO_PERMISSION)) View.VISIBLE else View.GONE
grantPermissionButton.visibility = if (value in arrayOf(EmptyLoadingState.MISSING_PERMISSION, EmptyLoadingState.MISSING_VIDEO_PERMISSION, EmptyLoadingState.MISSING_AUDIO_PERMISSION)) View.VISIBLE else View.GONE
pickFileButton.visibility = if (value in arrayOf(EmptyLoadingState.MISSING_PERMISSION, EmptyLoadingState.MISSING_VIDEO_PERMISSION, EmptyLoadingState.MISSING_AUDIO_PERMISSION) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) View.VISIBLE else View.GONE
noMediaButton.visibility = if (showNoMedia && value == EmptyLoadingState.EMPTY) View.VISIBLE else if (value == EmptyLoadingState.EMPTY_FAVORITES) View.INVISIBLE else View.GONE
permissionTitle.visibility = if (value in arrayOf(EmptyLoadingState.MISSING_PERMISSION, EmptyLoadingState.MISSING_VIDEO_PERMISSION, EmptyLoadingState.MISSING_AUDIO_PERMISSION)) VISIBLE else GONE
permissionTextView.visibility = if (value in arrayOf(EmptyLoadingState.MISSING_PERMISSION, EmptyLoadingState.MISSING_VIDEO_PERMISSION, EmptyLoadingState.MISSING_AUDIO_PERMISSION)) VISIBLE else GONE
grantPermissionButton.visibility = if (value in arrayOf(EmptyLoadingState.MISSING_PERMISSION, EmptyLoadingState.MISSING_VIDEO_PERMISSION, EmptyLoadingState.MISSING_AUDIO_PERMISSION)) VISIBLE else GONE
pickFileButton.visibility = if (value in arrayOf(EmptyLoadingState.MISSING_PERMISSION, EmptyLoadingState.MISSING_VIDEO_PERMISSION, EmptyLoadingState.MISSING_AUDIO_PERMISSION) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) VISIBLE else GONE
noMediaButton.visibility = if (showNoMedia && value == EmptyLoadingState.EMPTY) VISIBLE else if (value == EmptyLoadingState.EMPTY_FAVORITES) INVISIBLE else GONE
permissionTextView.text = when (state) {
EmptyLoadingState.MISSING_VIDEO_PERMISSION -> context.getString(R.string.permission_video)
EmptyLoadingState.MISSING_AUDIO_PERMISSION -> context.getString(R.string.permission_audio)

3
application/vlc-android/src/org/videolan/vlc/gui/view/EqualizerBar.kt

@ -25,7 +25,6 @@ import android.content.Context
import android.os.Build
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.LinearLayout
import android.widget.TextView
import androidx.annotation.IdRes
@ -71,7 +70,7 @@ class EqualizerBar : LinearLayout {
verticalSlider = findViewById(R.id.equalizer_seek)
//Force LTR to fix VerticalSeekBar background problem with RTL layout
verticalSlider.layoutDirection = View.LAYOUT_DIRECTION_LTR
verticalSlider.layoutDirection = LAYOUT_DIRECTION_LTR
verticalSlider.valueTo = (2 * RANGE).toFloat()
verticalSlider.value = RANGE.toFloat()
verticalSlider.addOnChangeListener(seekListener)

11
application/vlc-android/src/org/videolan/vlc/gui/view/FastScroller.kt

@ -38,8 +38,6 @@ import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.text.TextUtilsCompat
import androidx.core.view.ViewCompat
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.Observer
import androidx.lifecycle.findViewTreeLifecycleOwner
@ -60,7 +58,6 @@ import org.videolan.vlc.util.LifecycleAwareScheduler
import org.videolan.vlc.util.LocaleUtil
import org.videolan.vlc.util.SchedulerCallback
import org.videolan.vlc.util.scope
import java.util.Locale
import java.util.concurrent.atomic.AtomicBoolean
import kotlin.math.max
import kotlin.math.min
@ -161,7 +158,7 @@ class FastScroller : LinearLayout, Observer<HeadersIndex>, SchedulerCallback, Ap
bubble.pivotX = bubble.width.toFloat()
bubble.pivotY = bubble.height.toFloat()
scrollListener.onScrolled(recyclerView, 0, 0)
bubble.visibility = View.VISIBLE
bubble.visibility = VISIBLE
val growerX = ObjectAnimator.ofFloat(bubble, SCALE_X, 0f, 1f).setDuration(HANDLE_ANIMATION_DURATION.toLong())
val growerY = ObjectAnimator.ofFloat(bubble, SCALE_Y, 0f, 1f).setDuration(HANDLE_ANIMATION_DURATION.toLong())
val alpha = ObjectAnimator.ofFloat(bubble, ALPHA, 0f, 1f).setDuration(HANDLE_ANIMATION_DURATION.toLong())
@ -185,14 +182,14 @@ class FastScroller : LinearLayout, Observer<HeadersIndex>, SchedulerCallback, Ap
currentAnimator?.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) {
super.onAnimationEnd(animation)
bubble.visibility = View.GONE
bubble.visibility = GONE
currentAnimator = null
scheduler.scheduleAction(HIDE_SCROLLER, SCROLLER_HIDE_DELAY.toLong())
}
override fun onAnimationCancel(animation: Animator) {
super.onAnimationCancel(animation)
bubble.visibility = View.INVISIBLE
bubble.visibility = INVISIBLE
currentAnimator = null
scheduler.scheduleAction(HIDE_SCROLLER, SCROLLER_HIDE_DELAY.toLong())
}
@ -248,7 +245,7 @@ class FastScroller : LinearLayout, Observer<HeadersIndex>, SchedulerCallback, Ap
currentAnimator?.cancel()
scheduler.cancelAction(HIDE_SCROLLER)
scheduler.cancelAction(HIDE_HANDLE)
if (showBubble && bubble.visibility == View.GONE)
if (showBubble && bubble.visibility == GONE)
showBubble()
setRecyclerViewPosition(event.y)
return true

3
application/vlc-android/src/org/videolan/vlc/gui/view/FlingViewGroup.kt

@ -24,7 +24,6 @@ import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.VelocityTracker
import android.view.View
import android.view.ViewConfiguration
import android.view.ViewGroup
import android.widget.Scroller
@ -64,7 +63,7 @@ abstract class FlingViewGroup(context: Context, attrs: AttributeSet) : ViewGroup
for (i in 0 until childCount) {
val child = getChildAt(i)
if (child.visibility != View.GONE) {
if (child.visibility != GONE) {
val childWidth = child.measuredWidth
child.layout(childLeft, 0, childLeft + childWidth, child.measuredHeight)
childLeft += childWidth

6
application/vlc-android/src/org/videolan/vlc/gui/view/HackyDrawerLayout.kt

@ -32,11 +32,11 @@ import androidx.drawerlayout.widget.DrawerLayout
*/
class HackyDrawerLayout : DrawerLayout {
constructor(context: Context) : super(context) {}
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {}
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle)
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
return try {

4
application/vlc-android/src/org/videolan/vlc/gui/view/HeaderMediaSwitcher.kt

@ -47,7 +47,7 @@ class HeaderMediaSwitcher(context: Context, attrs: AttributeSet) : AudioMediaSwi
val artistView = v.findViewById<View>(R.id.artist) as TextView
if (cover != null) {
coverView.visibility = View.VISIBLE
coverView.visibility = VISIBLE
coverView.setImageBitmap(cover)
}
@ -56,7 +56,7 @@ class HeaderMediaSwitcher(context: Context, attrs: AttributeSet) : AudioMediaSwi
val hasArtist = !artist.isNullOrEmpty()
artistView.text = artist
artistView.isSelected = hasArtist
artistView.visibility = if (hasArtist) View.VISIBLE else View.GONE
artistView.visibility = if (hasArtist) VISIBLE else GONE
addView(v)
}

4
application/vlc-android/src/org/videolan/vlc/gui/view/SwipeRefreshLayout.kt

@ -27,9 +27,9 @@ import android.util.AttributeSet
import android.view.MotionEvent
class SwipeRefreshLayout : androidx.swiperefreshlayout.widget.SwipeRefreshLayout {
constructor(context: Context) : super(context) {}
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
override fun onTouchEvent(ev: MotionEvent): Boolean {
return try {

3
application/vlc-android/src/org/videolan/vlc/gui/view/SwipeToUnlockView.kt

@ -35,7 +35,6 @@ import android.util.LayoutDirection
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.animation.AccelerateInterpolator
import android.widget.ImageView
import android.widget.TextView
@ -90,7 +89,7 @@ class SwipeToUnlockView : ConstraintLayout {
}
override fun setVisibility(visibility: Int) {
if (visibility == View.VISIBLE) {
if (visibility == VISIBLE) {
unlocking = false
if (extremum != 0) playStep(extremum)
requestFocus()

2
application/vlc-android/src/org/videolan/vlc/gui/view/VLCDividerItemDecoration.kt

@ -8,7 +8,7 @@ import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.RecyclerView
import kotlin.math.roundToInt
open class VLCDividerItemDecoration(private val context: Context, private val orientation: Int, private val dividerDrawable: Drawable) : DividerItemDecoration(context, orientation) {
open class VLCDividerItemDecoration(context: Context, private val orientation: Int, private val dividerDrawable: Drawable) : DividerItemDecoration(context, orientation) {
private val bounds = Rect()

2
application/vlc-android/src/org/videolan/vlc/gui/view/VerticalSeekBar.kt

@ -31,7 +31,7 @@ import android.view.MotionEvent
import com.google.android.material.slider.Slider
class VerticalSeekBar : Slider {
private var listener: Slider.OnSliderTouchListener? = null
private var listener: OnSliderTouchListener? = null
var fromUser = false
constructor(context: Context) : super(context) {

13
application/vlc-android/src/org/videolan/vlc/gui/view/VerticalSeekBarContainer.kt

@ -2,9 +2,8 @@ package org.videolan.vlc.gui.view
import android.content.Context
import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.core.view.isNotEmpty
import com.google.android.material.slider.Slider
import kotlin.math.max
@ -12,7 +11,7 @@ class VerticalSeekBarContainer @JvmOverloads constructor(context: Context, attrs
private val childSlider: Slider?
get() {
val child = if (childCount > 0) getChildAt(0) else null
val child = if (isNotEmpty()) getChildAt(0) else null
return if (child is Slider) child else null
}
@ -49,8 +48,8 @@ class VerticalSeekBarContainer @JvmOverloads constructor(context: Context, attrs
slider.measure(innerContentHeightMeasureSpec, innerContentWidthMeasureSpec)
val measuredWidth = View.resolveSizeAndState(seekBarWidth + hPadding, widthMeasureSpec, 0)
val measuredHeight = View.resolveSizeAndState(seekBarHeight + vPadding, heightMeasureSpec, 0)
val measuredWidth = resolveSizeAndState(seekBarWidth + hPadding, widthMeasureSpec, 0)
val measuredHeight = resolveSizeAndState(seekBarHeight + vPadding, heightMeasureSpec, 0)
setMeasuredDimension(measuredWidth, measuredHeight)
} else {
@ -61,7 +60,7 @@ class VerticalSeekBarContainer @JvmOverloads constructor(context: Context, attrs
private fun applyViewRotation(w: Int, h: Int) {
val slider = childSlider
layoutDirection = View.LAYOUT_DIRECTION_LTR
layoutDirection = LAYOUT_DIRECTION_LTR
if (slider != null) {
val seekBarMeasuredWidth = slider.measuredWidth
@ -72,7 +71,7 @@ class VerticalSeekBarContainer @JvmOverloads constructor(context: Context, attrs
val lp = slider.layoutParams
lp.width = max(0, h - vPadding)
lp.height = ViewGroup.LayoutParams.WRAP_CONTENT
lp.height = LayoutParams.WRAP_CONTENT
slider.layoutParams = lp

2
application/vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt

@ -246,7 +246,7 @@ abstract class BrowserProvider(val context: Context, val dataset: LiveDataset<Me
}
@OptIn(ExperimentalCoroutinesApi::class)
private suspend fun filesFlow(url: String? = this.url, interact : Boolean = true) = channelFlow<IMedia> {
private fun filesFlow(url: String? = this.url, interact : Boolean = true) = channelFlow<IMedia> {
val listener = object : EventListener {
override fun onMediaAdded(index: Int, media: IMedia) {
if (!isClosedForSend) trySend(media.apply { retain() })

2
application/vlc-android/src/org/videolan/vlc/providers/medialibrary/MedialibraryProvider.kt

@ -88,7 +88,7 @@ abstract class MedialibraryProvider<T : MediaLibraryItem>(val context: Context,
* @param pageSizeLambda lambda for the case count in 1..MEDIALIBRARY_PAGE_SIZE
* @param loadLambda lambda to load list to service
*/
suspend fun loadPagedList(context: Context, pageSizeLambda: (service: PlaybackService) -> List<MediaWrapper>,
fun loadPagedList(context: Context, pageSizeLambda: (service: PlaybackService) -> List<MediaWrapper>,
loadLambda: (list: List<MediaWrapper>, service: PlaybackService) -> Unit) {
MediaUtils.SuspendDialogCallback(context) { service ->
val list = withContext(Dispatchers.IO) {

4
application/vlc-android/src/org/videolan/vlc/repository/SlaveRepository.kt

@ -40,7 +40,7 @@ class SlaveRepository(private val slaveDao:SlaveDao) : IOScopedObject() {
fun saveSlave(mediaPath: String, type: Int, priority: Int, uriString: String): Job {
return launch {
slaveDao.insert(org.videolan.vlc.mediadb.models.Slave(mediaPath, type, priority, uriString))
slaveDao.insert(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<org.videolan.vlc.mediadb.models.Slave>()
emptyList<Slave>()
}
val mediaSlaves = slaves.map {
var uri = it.uri

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

@ -625,7 +625,7 @@ fun Uri?.isSoundFont():Boolean {
fun Uri?.isSettingsOrEq():Boolean {
this?.lastPathSegment?.lowercase()?.let { lastPathSegment ->
if (BuildConfig.DEBUG) Log.d("FilePicker", "Uri: $this -> ${lastPathSegment}")
if (BuildConfig.DEBUG) Log.d("FilePicker", "Uri: $this -> $lastPathSegment")
if (lastPathSegment.lowercase().endsWith(".json")) return true
}
return false

2
application/vlc-android/src/org/videolan/vlc/util/Kextensions.kt

@ -159,7 +159,7 @@ fun FragmentActivity.share(medias: List<MediaWrapper>) = lifecycleScope.launch {
} else Snackbar.make(findViewById(android.R.id.content), R.string.invalid_file, Snackbar.LENGTH_LONG).show()
}
fun MediaWrapper?.isMedia() = this != null && (type == MediaWrapper.TYPE_AUDIO || type == MediaWrapper.TYPE_VIDEO)
fun MediaWrapper?.isMedia() = this != null && (type == MediaWrapper.TYPE_AUDIO || type == TYPE_VIDEO)
fun MediaWrapper?.isBrowserMedia() = this != null && (isMedia() || type == MediaWrapper.TYPE_DIR || type == MediaWrapper.TYPE_PLAYLIST)
fun MediaWrapper.trackNumberText() = if (trackNumber > 0) "$trackNumber." else ""

2
application/vlc-android/src/org/videolan/vlc/util/Permissions.kt

@ -399,7 +399,7 @@ object Permissions {
if ("file" != uri.scheme) return false
if (uri.path!!.startsWith(AndroidDevices.EXTERNAL_PUBLIC_DIRECTORY)) {
//Check write permission starting Oreo
if (AndroidUtil.isOOrLater && !Permissions.canWriteStorage()) {
if (AndroidUtil.isOOrLater && !canWriteStorage()) {
askWriteStoragePermission(activity, false, callback)
return false
}

19
application/vlc-android/src/org/videolan/vlc/util/TvChannels.kt

@ -32,7 +32,11 @@ import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.tvprovider.media.tv.TvContractCompat
import androidx.tvprovider.media.tv.WatchNextProgram
import kotlinx.coroutines.*
import kotlinx.coroutines.CoroutineStart
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.videolan.medialibrary.EventTools
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.resources.util.getFromMl
@ -42,7 +46,16 @@ import org.videolan.vlc.BuildConfig
import org.videolan.vlc.PreviewVideoInputService
import org.videolan.vlc.R
import org.videolan.vlc.getFileUri
import videolan.org.commontools.*
import videolan.org.commontools.KEY_TV_CHANNEL_ID
import videolan.org.commontools.ProgramDesc
import videolan.org.commontools.WATCH_NEXT_MAP_PROJECTION
import videolan.org.commontools.buildProgram
import videolan.org.commontools.buildWatchNextProgram
import videolan.org.commontools.createOrUpdateChannel
import videolan.org.commontools.deleteWatchNext
import videolan.org.commontools.existingPrograms
import videolan.org.commontools.indexOfId
import videolan.org.commontools.updateWatchNext
private const val TAG = "VLC/TvChannels"
private const val MAX_RECOMMENDATIONS = 3
@ -105,7 +118,7 @@ suspend fun insertWatchNext(context: Context, mw: MediaWrapper) {
if (watchNextProgramUri == null || watchNextProgramUri == Uri.EMPTY) Log.e(TAG, "Insert watch next program failed")
}
suspend fun updateNextProgramAfterThumbnailGeneration(lifecycleOwner: LifecycleOwner, context: Context, mw: MediaWrapper) {
fun updateNextProgramAfterThumbnailGeneration(lifecycleOwner: LifecycleOwner, context: Context, mw: MediaWrapper) {
EventTools.getInstance().lastThumb.observe(lifecycleOwner) { media ->
lifecycleOwner.lifecycleScope.launch(Dispatchers.IO) {
var cursor: Cursor? = null

10
application/vlc-android/src/org/videolan/vlc/viewmodels/BookmarkModel.kt

@ -26,11 +26,15 @@ package org.videolan.vlc.viewmodels
import android.content.Context
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.*
import kotlinx.coroutines.*
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onCompletion
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.videolan.libvlc.MediaPlayer
import org.videolan.libvlc.interfaces.IMedia
import org.videolan.medialibrary.Tools
@ -119,7 +123,7 @@ class BookmarkModel : ViewModel(), PlaybackService.Callback {
}
}
suspend fun rename(bookmark: Bookmark, name: String) : List<Bookmark> {
fun rename(bookmark: Bookmark, name: String) : List<Bookmark> {
var bookmarks: List<Bookmark> = listOf()
service?.currentMediaWrapper?.let {
viewModelScope.launch {

11
application/vlc-android/test/org/videolan/vlc/repository/DirectoryRepositoryTest.kt

@ -15,7 +15,6 @@ import org.videolan.vlc.database.MediaDatabase
import org.videolan.vlc.mediadb.models.CustomDirectory
import org.videolan.vlc.util.TestUtil
import org.videolan.vlc.util.argumentCaptor
import org.videolan.vlc.util.mock
import org.videolan.vlc.util.uninitialized
@RunWith(PowerMockRunner::class)
@ -40,7 +39,7 @@ class DirectoryRepositoryTest {
directoryRepository.addCustomDirectory(it.path).join()
}
val inserted = argumentCaptor<org.videolan.vlc.mediadb.models.CustomDirectory>()
val inserted = argumentCaptor<CustomDirectory>()
verify(customDirectoryDao, times(2)).insert(inserted.capture() ?: uninitialized())
assertThat(inserted.allValues.size, `is`(2))
assertThat(inserted.allValues[0], `is`(fakeCustomDirectories[0]))
@ -61,7 +60,7 @@ class DirectoryRepositoryTest {
directoryRepository.addCustomDirectory(it.path).join()
}
val inserted = argumentCaptor<org.videolan.vlc.mediadb.models.CustomDirectory>()
val inserted = argumentCaptor<CustomDirectory>()
verify(customDirectoryDao, times(2)).insert(inserted.capture() ?: uninitialized())
assertThat(inserted.allValues.size, `is`(2))
assertThat(inserted.allValues[0], `is`(fakeCustomDirectories[0]))
@ -69,7 +68,7 @@ class DirectoryRepositoryTest {
directoryRepository.deleteCustomDirectory(fakeCustomDirectories[0].path).join()
val deleted = argumentCaptor<org.videolan.vlc.mediadb.models.CustomDirectory>()
val deleted = argumentCaptor<CustomDirectory>()
verify(customDirectoryDao).delete(deleted.capture() ?: uninitialized())
assertThat(deleted.value, `is`(fakeCustomDirectories[0]))
}
@ -81,7 +80,7 @@ class DirectoryRepositoryTest {
directoryRepository.addCustomDirectory(it.path).join()
}
val inserted = argumentCaptor<org.videolan.vlc.mediadb.models.CustomDirectory>()
val inserted = argumentCaptor<CustomDirectory>()
verify(customDirectoryDao).insert(inserted.capture() ?: uninitialized())
assertThat(inserted.allValues.size, `is`(1))
assertThat(inserted.allValues[0], `is`(fakeCustomDirectories[0]))
@ -99,7 +98,7 @@ class DirectoryRepositoryTest {
directoryRepository.addCustomDirectory(it.path).join()
}
val inserted = argumentCaptor<org.videolan.vlc.mediadb.models.CustomDirectory>()
val inserted = argumentCaptor<CustomDirectory>()
verify(customDirectoryDao).insert(inserted.capture() ?: uninitialized())
assertThat(inserted.allValues.size, `is`(1))
assertThat(inserted.allValues[0], `is`(fakeCustomDirectories[0]))

7
application/vlc-android/test/org/videolan/vlc/repository/ExternalSubRepositoryTest.kt

@ -25,15 +25,14 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.core.net.toUri
import androidx.lifecycle.MutableLiveData
import kotlinx.coroutines.runBlocking
import org.hamcrest.CoreMatchers.`is`
import org.hamcrest.CoreMatchers.hasItem
import org.hamcrest.CoreMatchers.`is`
import org.hamcrest.MatcherAssert.assertThat
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TemporaryFolder
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers
import org.mockito.Mockito.*
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PrepareForTest
@ -98,7 +97,7 @@ class ExternalSubRepositoryTest {
`when`(externalSubDao.get(bar)).thenReturn(fakeBarLiveDataSubtitles)
val fooSubtitles = getValue(externalSubRepository.getDownloadedSubtitles(foo.toUri()))
verify(externalSubDao, times(2)).get(ArgumentMatchers.anyString())
verify(externalSubDao, times(2)).get(anyString())
assertThat(fooSubtitles.size, `is`(0))
}
@ -140,7 +139,7 @@ class ExternalSubRepositoryTest {
val fooSubtitles = getValue(externalSubRepository.getDownloadedSubtitles(foo.toUri()))
val barSubtitles = getValue(externalSubRepository.getDownloadedSubtitles(bar.toUri()))
verify(externalSubDao, times(2)).get(ArgumentMatchers.anyString())
verify(externalSubDao, times(2)).get(anyString())
assertThat(fooSubtitles.size, `is`(2))
assertThat(barSubtitles.size, `is`(2))

4
application/vlc-android/test/org/videolan/vlc/repository/SlaveRepositoryTest.kt

@ -30,8 +30,8 @@ import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.anyString
import org.mockito.Mockito.`when`
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when`
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
@ -64,7 +64,7 @@ class SlaveRepositoryTest {
val fakeSlave = TestUtil.createSubtitleSlavesForMedia("foo.mkv", 1)[0]
slaveRepository.saveSlave(fakeSlave.mediaPath, fakeSlave.type, fakeSlave.priority, fakeSlave.uri)
val inserted = argumentCaptor<org.videolan.vlc.mediadb.models.Slave>()
val inserted = argumentCaptor<Slave>()
verify(slaveDao).insert(inserted.capture() ?: uninitialized())
assertThat(inserted.value, `is`(fakeSlave))

Loading…
Cancel
Save