Browse Source

HD classification according to media resolution

merge-requests/116/head
Geoffrey Métais 7 years ago
parent
commit
6f2e56b507
  1. 1
      vlc-android/res/drawable/black_gradient.xml
  2. 24
      vlc-android/res/layout/video_grid_card.xml
  3. 2
      vlc-android/res/layout/video_list_card.xml
  4. 27
      vlc-android/src/org/videolan/vlc/gui/video/VideoListAdapter.kt
  5. 10
      vlc-android/src/org/videolan/vlc/util/Kextensions.kt
  6. 2
      vlc-android/test/org/videolan/vlc/repository/BrowserFavRepositoryTest.kt
  7. 2
      vlc-android/test/org/videolan/vlc/repository/DirectoryRepositoryTest.kt
  8. 6
      vlc-android/test/org/videolan/vlc/repository/ExternalSubRepositoryTest.kt
  9. 4
      vlc-android/test/org/videolan/vlc/repository/SlaveRepositoryTest.kt
  10. 80
      vlc-android/test/org/videolan/vlc/util/StringsTest.kt
  11. 25
      vlc-android/test/org/videolan/vlc/util/UtilTests.kt

1
vlc-android/res/drawable/black_gradient.xml

@ -5,6 +5,7 @@
android:angle="90"
android:endColor="@android:color/transparent"
android:centerColor="@android:color/transparent"
android:centerY="0.8"
android:startColor="@color/blacktransparent" />
<corners android:radius="0dp" />
</shape>

24
vlc-android/res/layout/video_grid_card.xml

@ -21,6 +21,10 @@
name="time"
type="String" />
<variable
name="resolution"
type="String" />
<variable
name="showFilename"
type="androidx.databinding.ObservableBoolean" />
@ -101,17 +105,31 @@
android:layout_marginBottom="1dp"
style="@style/VLC.TextViewTitle"
android:textColor="@color/grey50"
android:layout_marginLeft="@dimen/very_small_margin"
android:layout_marginStart="@dimen/half_default_margin"
android:text="@{showFilename ? media.fileName : media.title}"
tools:targetApi="jelly_bean" />
<TextView
android:id="@+id/ml_item_resolution"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
vlc:layout_constraintBottom_toTopOf="@+id/ml_item_progress"
vlc:layout_constraintEnd_toEndOf="@+id/item_more"
vlc:layout_constraintStart_toStartOf="@+id/item_more"
style="@style/VLC.TextViewDescription"
android:textColor="@color/grey50"
android:paddingStart="2dp"
android:paddingEnd="2dp"
android:layout_margin="4dp"
android:text="@{resolution}"
android:visibility="@{resolution == null ? View.GONE : View.VISIBLE, default=gone}"/>
<TextView
android:id="@+id/ml_item_time"
android:layout_width="0dp"
android:layout_height="wrap_content"
vlc:layout_constraintBottom_toTopOf="@+id/ml_item_progress"
vlc:layout_constraintEnd_toStartOf="@+id/item_more"
vlc:layout_constraintEnd_toStartOf="@+id/ml_item_resolution"
vlc:layout_constraintStart_toStartOf="@+id/ml_item_title"
android:layout_marginBottom="2dp"
android:ellipsize="end"
@ -124,7 +142,7 @@
android:id="@+id/item_more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
vlc:layout_constraintBottom_toTopOf="@+id/ml_item_progress"
vlc:layout_constraintBottom_toTopOf="@+id/ml_item_resolution"
vlc:layout_constraintEnd_toEndOf="parent"
android:layout_margin="4dp"
android:clickable="true"

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

@ -64,6 +64,8 @@
android:layout_width="128dp"
android:layout_height="80dp"
vlc:layout_constraintStart_toStartOf="parent"
vlc:layout_constraintTop_toTopOf="parent"
vlc:layout_constraintBottom_toBottomOf="parent"
vlc:media="@{media}"
android:scaleType="centerCrop"
android:src="@{cover}" />

27
vlc-android/src/org/videolan/vlc/gui/video/VideoListAdapter.kt

@ -50,10 +50,7 @@ import org.videolan.vlc.gui.helpers.SelectorViewHolder
import org.videolan.vlc.gui.helpers.UiTools
import org.videolan.vlc.gui.helpers.loadImage
import org.videolan.vlc.interfaces.IEventsHandler
import org.videolan.vlc.util.UPDATE_SEEN
import org.videolan.vlc.util.UPDATE_SELECTION
import org.videolan.vlc.util.UPDATE_THUMB
import org.videolan.vlc.util.UPDATE_TIME
import org.videolan.vlc.util.*
private const val TAG = "VLC/VideoListAdapter"
@ -141,36 +138,34 @@ class VideoListAdapter internal constructor(
fun clear() {}
private fun fillView(holder: ViewHolder, media: MediaWrapper) {
val text: String
val resolution: String
val text: String?
val resolution = generateResolutionClass(media.width, media.height)
var max = 0
var progress = 0
var seen = 0L
if (media.type == MediaWrapper.TYPE_GROUP) {
text = media.description
text = if (media.type == MediaWrapper.TYPE_GROUP) {
media.description
} else {
seen = if (mIsSeenMediaMarkerVisible) media.seen else 0L
/* Time / Duration */
resolution = Tools.getResolution(media)
if (media.length > 0) {
val lastTime = media.displayTime
if (lastTime > 0) {
max = (media.length / 1000).toInt()
progress = (lastTime / 1000).toInt()
}
if (TextUtils.isEmpty(resolution))
text = Tools.millisToText(media.length)
else
text = Tools.millisToString(media.length, true, false) + " | " + resolution
} else
text = resolution
seen = if (mIsSeenMediaMarkerVisible) media.seen else 0L
if (isListMode && resolution !== null) {
"${Tools.millisToText(media.length)} | $resolution"
} else Tools.millisToText(media.length)
} else null
}
holder.binding.setVariable(BR.time, text)
holder.binding.setVariable(BR.max, max)
holder.binding.setVariable(BR.progress, progress)
holder.binding.setVariable(BR.seen, seen)
if (!isListMode) holder.binding.setVariable(BR.resolution, resolution)
}
fun setGridCardWidth(gridCardWidth: Int) {

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

@ -210,3 +210,13 @@ fun Context.getPendingIntent(iPlay: Intent): PendingIntent {
return if (AndroidUtil.isOOrLater) PendingIntent.getForegroundService(applicationContext, 0, iPlay, PendingIntent.FLAG_UPDATE_CURRENT)
else PendingIntent.getService(applicationContext, 0, iPlay, PendingIntent.FLAG_UPDATE_CURRENT)
}
fun generateResolutionClass(width: Int, height: Int) : String? = if (width <= 0 || height <= 0) {
null
} else when {
width >= 7680 -> "8K"
width >= 3840 -> "4K"
width >= 1920 -> "1080p"
width >= 1280 -> "720p"
else -> "SD"
}

2
vlc-android/test/org/videolan/vlc/repository/BrowserFavRepositoryTest.kt

@ -23,7 +23,7 @@ package org.videolan.vlc.repository
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.lifecycle.MutableLiveData
import android.net.Uri
import kotlinx.coroutines.experimental.runBlocking
import kotlinx.coroutines.runBlocking
import org.hamcrest.CoreMatchers.`is`
import org.hamcrest.CoreMatchers.hasItem
import org.junit.Assert.assertThat

2
vlc-android/test/org/videolan/vlc/repository/DirectoryRepositoryTest.kt

@ -1,7 +1,7 @@
package org.videolan.vlc.repository
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import kotlinx.coroutines.experimental.runBlocking
import kotlinx.coroutines.runBlocking
import org.hamcrest.CoreMatchers.`is`
import org.junit.Assert.*
import org.junit.Before

6
vlc-android/test/org/videolan/vlc/repository/ExternalSubRepositoryTest.kt

@ -20,16 +20,17 @@
package org.videolan.vlc.repository
import android.net.Uri
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.lifecycle.MutableLiveData
import android.net.Uri
import kotlinx.coroutines.experimental.runBlocking
import kotlinx.coroutines.runBlocking
import org.hamcrest.CoreMatchers.`is`
import org.hamcrest.CoreMatchers.hasItem
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.*
@ -39,7 +40,6 @@ import org.powermock.modules.junit4.PowerMockRunner
import org.videolan.vlc.database.ExternalSubDao
import org.videolan.vlc.database.MediaDatabase
import org.videolan.vlc.database.models.ExternalSub
import org.junit.rules.TemporaryFolder
import org.videolan.vlc.util.*

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

@ -20,9 +20,9 @@
package org.videolan.vlc.repository
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import android.net.Uri
import kotlinx.coroutines.experimental.runBlocking
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import kotlinx.coroutines.runBlocking
import org.hamcrest.CoreMatchers.`is`
import org.hamcrest.MatcherAssert.assertThat
import org.junit.Before

80
vlc-android/test/org/videolan/vlc/util/StringsTest.kt

@ -10,45 +10,45 @@ class StringsTest {
@Test
fun stripTrailingSlash() {
var s = Strings.stripTrailingSlash("foo/")
var s = stripTrailingSlash("foo/")
assertEquals(s, "foo")
s = Strings.stripTrailingSlash("bar")
s = stripTrailingSlash("bar")
assertEquals(s, "bar")
}
@Test
fun isStringStartsWithOneOfArrayItems_returnTrue() {
val array = arrayOf("java", "kotlin", "python")
var bool = Strings.startsWith(array, "${array[0]}Foo")
var bool = startsWith(array, "${array[0]}Foo")
assertTrue(bool)
bool = Strings.startsWith(array, "${array[1]}Foo")
bool = startsWith(array, "${array[1]}Foo")
assertTrue(bool)
bool = Strings.startsWith(array, "${array[2]}Foo")
bool = startsWith(array, "${array[2]}Foo")
assertTrue(bool)
bool = Strings.startsWith(array, "${array[2]}")
bool = startsWith(array, "${array[2]}")
assertTrue(bool)
}
@Test
fun isStringStartsWithOneOfArrayItems_returnFalse() {
val array = arrayOf("java", "kotlin", "python")
var bool = Strings.startsWith(array, "Foo${array[0]}")
var bool = startsWith(array, "Foo${array[0]}")
assertFalse(bool)
bool = Strings.startsWith(array, "foo${array[1]}")
bool = startsWith(array, "foo${array[1]}")
assertFalse(bool)
bool = Strings.startsWith(array, "foo${array[2]}")
bool = startsWith(array, "foo${array[2]}")
assertFalse(bool)
bool = Strings.startsWith(array, "")
bool = startsWith(array, "")
assertFalse(bool)
bool = Strings.startsWith(array, "Ruby")
bool = startsWith(array, "Ruby")
assertFalse(bool)
}
@ -56,16 +56,16 @@ class StringsTest {
@Test
fun indexOfListItemEndsWithString_returnIndex() {
val list = listOf("fooJava", "fooKotlin", "fooPython", "barPython")
var indx = Strings.containsName(list, "Java")
var indx = containsName(list, "Java")
assertEquals(indx, 0)
indx = Strings.containsName(list, "Kotlin")
indx = containsName(list, "Kotlin")
assertEquals(indx, 1)
indx = Strings.containsName(list, "Python")
indx = containsName(list, "Python")
assertEquals(indx, 3)
indx = Strings.containsName(list, "fooPython")
indx = containsName(list, "fooPython")
assertEquals(indx, 2)
}
@ -73,90 +73,90 @@ class StringsTest {
@Test
fun indexOfListItemEndsWithString_returnMinusOne() {
val list = listOf("fooJava", "fooKotlin", "fooPython")
var indx = Strings.containsName(list, "Jav")
var indx = containsName(list, "Jav")
assertEquals(indx, -1)
indx = Strings.containsName(list, "javaBar")
indx = containsName(list, "javaBar")
assertEquals(indx, -1)
indx = Strings.containsName(list, "KotlinBar")
indx = containsName(list, "KotlinBar")
assertEquals(indx, -1)
indx = Strings.containsName(list, "PythonBar")
indx = containsName(list, "PythonBar")
assertEquals(indx, -1)
indx = Strings.containsName(list, "fooPythonBar")
indx = containsName(list, "fooPythonBar")
assertEquals(indx, -1)
}
@Test
fun removeFileProtocole() {
var s = Strings.removeFileProtocole("file://foopath")
var s = "file://foopath".removeFileProtocole()
assertEquals(s, "foopath")
s = Strings.removeFileProtocole("barpath")
s = "barpath".removeFileProtocole()
assertEquals(s, "barpath")
}
@Test
fun readableFileSize() {
var s = Strings.readableFileSize(10)
var s = 10L.readableFileSize()
assertEquals(s, "10 B")
s = Strings.readableFileSize(1026)
s = 1026L.readableFileSize()
assertEquals(s, "1 KiB")
s = Strings.readableFileSize(10026)
s = 10026L.readableFileSize()
assertEquals(s, "9.8 KiB")
s = Strings.readableFileSize(100026)
s = 100026L.readableFileSize()
assertEquals(s, "97.7 KiB")
s = Strings.readableFileSize(1000026)
s = 1000026L.readableFileSize()
assertEquals(s, "976.6 KiB")
s = Strings.readableFileSize(10000026)
s = 10000026L.readableFileSize()
assertEquals(s, "9.5 MiB")
s = Strings.readableFileSize(1000000026)
s = 1000000026L.readableFileSize()
assertEquals(s, "953.7 MiB")
s = Strings.readableFileSize(10000000026)
s = 10000000026L.readableFileSize()
assertEquals(s, "9.3 GiB")
s = Strings.readableFileSize(100000000026)
s = 100000000026L.readableFileSize()
assertEquals(s, "93.1 GiB")
}
@Test
fun readableSize() {
var s = Strings.readableSize(10)
var s = 10L.readableSize()
assertEquals(s, "10 B")
s = Strings.readableSize(1026)
s = 1026L.readableSize()
assertEquals(s, "1 KB")
s = Strings.readableSize(10026)
s = 10026L.readableSize()
assertEquals(s, "10 KB")
s = Strings.readableSize(100026)
s = 100026L.readableSize()
assertEquals(s, "100 KB")
s = Strings.readableSize(1000026)
s = 1000026L.readableSize()
assertEquals(s, "1 MB")
s = Strings.readableSize(10000026)
s = 10000026L.readableSize()
assertEquals(s, "10 MB")
s = Strings.readableSize(1000000026)
s = 1000000026L.readableSize()
assertEquals(s, "1 GB")
s = Strings.readableSize(10000000026)
s = 10000000026L.readableSize()
assertEquals(s, "10 GB")
s = Strings.readableSize(100000000026)
s = 100000000026L.readableSize()
assertEquals(s, "100 GB")
}

25
vlc-android/test/org/videolan/vlc/util/UtilTests.kt

@ -0,0 +1,25 @@
package org.videolan.vlc.util
import org.junit.Assert
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
@RunWith(JUnit4::class)
class ExtensionsTests {
@Test
fun getResolutionClass() {
Assert.assertEquals("720p", generateResolutionClass(1280, 536))
Assert.assertEquals("720p", generateResolutionClass(1280, 720))
Assert.assertEquals("SD", generateResolutionClass(848, 480))
Assert.assertEquals("4K", generateResolutionClass(3840, 2160))
Assert.assertEquals("SD", generateResolutionClass(640, 352))
Assert.assertEquals("1080p", generateResolutionClass(1920, 1080))
Assert.assertEquals("SD", generateResolutionClass(480, 272))
Assert.assertEquals("SD", generateResolutionClass(720, 576))
Assert.assertEquals("1080p", generateResolutionClass(2048, 1024))
Assert.assertEquals("SD", generateResolutionClass(712, 480))
Assert.assertEquals("SD", generateResolutionClass(716, 480))
}
}
Loading…
Cancel
Save