mirror of
https://github.com/libre-tube/LibreTube.git
synced 2025-04-29 16:30:31 +05:30
commit
26e876419d
@ -141,7 +141,7 @@ interface PipedApi {
|
|||||||
suspend fun importPlaylist(
|
suspend fun importPlaylist(
|
||||||
@Header("Authorization") token: String,
|
@Header("Authorization") token: String,
|
||||||
@Body playlistId: PlaylistId
|
@Body playlistId: PlaylistId
|
||||||
): Message
|
): PlaylistId
|
||||||
|
|
||||||
@GET("user/playlists")
|
@GET("user/playlists")
|
||||||
suspend fun playlists(@Header("Authorization") token: String): List<Playlists>
|
suspend fun playlists(@Header("Authorization") token: String): List<Playlists>
|
||||||
|
@ -0,0 +1,16 @@
|
|||||||
|
package com.github.libretube.extensions
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.Handler
|
||||||
|
import android.os.Looper
|
||||||
|
import android.widget.Toast
|
||||||
|
|
||||||
|
fun Context.toastFromMainThread(stringId: Int) {
|
||||||
|
Handler(Looper.getMainLooper()).post {
|
||||||
|
Toast.makeText(
|
||||||
|
this,
|
||||||
|
stringId,
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
package com.github.libretube.ui.adapters
|
package com.github.libretube.ui.adapters
|
||||||
|
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
|
import android.text.format.DateUtils
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
@ -27,15 +28,15 @@ class ChaptersAdapter(
|
|||||||
holder.binding.apply {
|
holder.binding.apply {
|
||||||
ImageHelper.loadImage(chapter.image, chapterImage)
|
ImageHelper.loadImage(chapter.image, chapterImage)
|
||||||
chapterTitle.text = chapter.title
|
chapterTitle.text = chapter.title
|
||||||
|
timeStamp.text = chapter.start?.let { DateUtils.formatElapsedTime(it) }
|
||||||
|
|
||||||
if (selectedPosition == position) {
|
val color = if (selectedPosition == position) {
|
||||||
// get the color for highlighted controls
|
ThemeHelper.getThemeColor(root.context, android.R.attr.colorControlHighlight)
|
||||||
val color =
|
|
||||||
ThemeHelper.getThemeColor(root.context, android.R.attr.colorControlHighlight)
|
|
||||||
chapterLL.setBackgroundColor(color)
|
|
||||||
} else {
|
} else {
|
||||||
chapterLL.setBackgroundColor(Color.TRANSPARENT)
|
Color.TRANSPARENT
|
||||||
}
|
}
|
||||||
|
chapterLL.setBackgroundColor(color)
|
||||||
|
|
||||||
root.setOnClickListener {
|
root.setOnClickListener {
|
||||||
updateSelectedPosition(position)
|
updateSelectedPosition(position)
|
||||||
val chapterStart = chapter.start!! * 1000 // s -> ms
|
val chapterStart = chapter.start!! * 1000 // s -> ms
|
||||||
|
@ -1,10 +1,7 @@
|
|||||||
package com.github.libretube.ui.dialogs
|
package com.github.libretube.ui.dialogs
|
||||||
|
|
||||||
import android.app.Dialog
|
import android.app.Dialog
|
||||||
import android.content.Context
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
|
||||||
import android.os.Looper
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.widget.ArrayAdapter
|
import android.widget.ArrayAdapter
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
@ -18,6 +15,7 @@ import com.github.libretube.api.obj.PlaylistId
|
|||||||
import com.github.libretube.constants.IntentData
|
import com.github.libretube.constants.IntentData
|
||||||
import com.github.libretube.databinding.DialogAddtoplaylistBinding
|
import com.github.libretube.databinding.DialogAddtoplaylistBinding
|
||||||
import com.github.libretube.extensions.TAG
|
import com.github.libretube.extensions.TAG
|
||||||
|
import com.github.libretube.extensions.toastFromMainThread
|
||||||
import com.github.libretube.models.PlaylistViewModel
|
import com.github.libretube.models.PlaylistViewModel
|
||||||
import com.github.libretube.util.PreferenceHelper
|
import com.github.libretube.util.PreferenceHelper
|
||||||
import com.github.libretube.util.ThemeHelper
|
import com.github.libretube.util.ThemeHelper
|
||||||
@ -104,30 +102,19 @@ class AddToPlaylistDialog : DialogFragment() {
|
|||||||
} catch (e: IOException) {
|
} catch (e: IOException) {
|
||||||
println(e)
|
println(e)
|
||||||
Log.e(TAG(), "IOException, you might not have internet connection")
|
Log.e(TAG(), "IOException, you might not have internet connection")
|
||||||
toastFromMainThread(appContext, R.string.unknown_error)
|
appContext.toastFromMainThread(R.string.unknown_error)
|
||||||
return@launch
|
return@launch
|
||||||
} catch (e: HttpException) {
|
} catch (e: HttpException) {
|
||||||
Log.e(TAG(), "HttpException, unexpected response")
|
Log.e(TAG(), "HttpException, unexpected response")
|
||||||
toastFromMainThread(appContext, R.string.server_error)
|
appContext.toastFromMainThread(R.string.server_error)
|
||||||
return@launch
|
return@launch
|
||||||
}
|
}
|
||||||
toastFromMainThread(
|
appContext.toastFromMainThread(
|
||||||
appContext,
|
|
||||||
if (response.message == "ok") R.string.added_to_playlist else R.string.fail
|
if (response.message == "ok") R.string.added_to_playlist else R.string.fail
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun toastFromMainThread(context: Context, stringId: Int) {
|
|
||||||
Handler(Looper.getMainLooper()).post {
|
|
||||||
Toast.makeText(
|
|
||||||
context,
|
|
||||||
stringId,
|
|
||||||
Toast.LENGTH_SHORT
|
|
||||||
).show()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun Fragment?.runOnUiThread(action: () -> Unit) {
|
private fun Fragment?.runOnUiThread(action: () -> Unit) {
|
||||||
this ?: return
|
this ?: return
|
||||||
if (!isAdded) return // Fragment not attached to an Activity
|
if (!isAdded) return // Fragment not attached to an Activity
|
||||||
|
@ -991,10 +991,7 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions {
|
|||||||
binding.chaptersRecView.adapter = ChaptersAdapter(chapters, exoPlayer)
|
binding.chaptersRecView.adapter = ChaptersAdapter(chapters, exoPlayer)
|
||||||
|
|
||||||
// enable the chapters dialog in the player
|
// enable the chapters dialog in the player
|
||||||
val titles = mutableListOf<String>()
|
val titles = chapters.map { "${it.title} (${it.start?.let { DateUtils.formatElapsedTime(it) }})" }
|
||||||
chapters.forEach {
|
|
||||||
titles += it.title!!
|
|
||||||
}
|
|
||||||
playerBinding.chapterLL.setOnClickListener {
|
playerBinding.chapterLL.setOnClickListener {
|
||||||
if (viewModel.isFullscreen.value!!) {
|
if (viewModel.isFullscreen.value!!) {
|
||||||
MaterialAlertDialogBuilder(requireContext())
|
MaterialAlertDialogBuilder(requireContext())
|
||||||
|
@ -2,15 +2,14 @@ package com.github.libretube.ui.sheets
|
|||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.InputType
|
import android.text.InputType
|
||||||
import android.util.Log
|
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import com.github.libretube.R
|
import com.github.libretube.R
|
||||||
import com.github.libretube.api.RetrofitInstance
|
import com.github.libretube.api.RetrofitInstance
|
||||||
import com.github.libretube.api.obj.PlaylistId
|
import com.github.libretube.api.obj.PlaylistId
|
||||||
import com.github.libretube.constants.ShareObjectType
|
import com.github.libretube.constants.ShareObjectType
|
||||||
import com.github.libretube.databinding.DialogTextPreferenceBinding
|
import com.github.libretube.databinding.DialogTextPreferenceBinding
|
||||||
import com.github.libretube.extensions.TAG
|
|
||||||
import com.github.libretube.extensions.toID
|
import com.github.libretube.extensions.toID
|
||||||
|
import com.github.libretube.extensions.toastFromMainThread
|
||||||
import com.github.libretube.obj.ShareData
|
import com.github.libretube.obj.ShareData
|
||||||
import com.github.libretube.ui.dialogs.ShareDialog
|
import com.github.libretube.ui.dialogs.ShareDialog
|
||||||
import com.github.libretube.util.BackgroundHelper
|
import com.github.libretube.util.BackgroundHelper
|
||||||
@ -114,6 +113,7 @@ class PlaylistOptionsBottomSheet(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun importPlaylist(token: String, playlistId: String) {
|
private fun importPlaylist(token: String, playlistId: String) {
|
||||||
|
val appContext = context?.applicationContext
|
||||||
CoroutineScope(Dispatchers.IO).launch {
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
val response = try {
|
val response = try {
|
||||||
RetrofitInstance.authApi.importPlaylist(
|
RetrofitInstance.authApi.importPlaylist(
|
||||||
@ -126,7 +126,7 @@ class PlaylistOptionsBottomSheet(
|
|||||||
} catch (e: HttpException) {
|
} catch (e: HttpException) {
|
||||||
return@launch
|
return@launch
|
||||||
}
|
}
|
||||||
Log.e(TAG(), response.toString())
|
appContext?.toastFromMainThread(if (response.playlistId != null) R.string.playlistCloned else R.string.server_error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,12 +15,40 @@
|
|||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:paddingHorizontal="5dp">
|
android:paddingHorizontal="5dp">
|
||||||
|
|
||||||
<com.google.android.material.imageview.ShapeableImageView
|
<FrameLayout
|
||||||
android:id="@+id/chapter_image"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="55dp"
|
android:layout_height="55dp">
|
||||||
android:src="@mipmap/ic_launcher"
|
|
||||||
app:shapeAppearanceOverlay="@style/roundedImageViewRounded" />
|
<com.google.android.material.imageview.ShapeableImageView
|
||||||
|
android:id="@+id/chapter_image"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:shapeAppearanceOverlay="@style/roundedImageViewRounded"
|
||||||
|
tools:src="@tools:sample/backgrounds/scenic" />
|
||||||
|
|
||||||
|
<androidx.cardview.widget.CardView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="bottom|end"
|
||||||
|
android:layout_marginEnd="5dp"
|
||||||
|
android:layout_marginBottom="5dp"
|
||||||
|
app:cardBackgroundColor="@color/duration_background_color"
|
||||||
|
app:cardCornerRadius="8dp"
|
||||||
|
app:cardElevation="0dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/timeStamp"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingHorizontal="2dp"
|
||||||
|
android:textColor="@color/duration_text_color"
|
||||||
|
android:textSize="10sp"
|
||||||
|
tools:ignore="SmallSp"
|
||||||
|
tools:text="05:36" />
|
||||||
|
|
||||||
|
</androidx.cardview.widget.CardView>
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/chapter_title"
|
android:id="@+id/chapter_title"
|
||||||
|
@ -355,6 +355,7 @@
|
|||||||
<string name="livestreams">Livestreams</string>
|
<string name="livestreams">Livestreams</string>
|
||||||
<string name="alternative_videos_layout">Alternative videos layout</string>
|
<string name="alternative_videos_layout">Alternative videos layout</string>
|
||||||
<string name="defaultIconLight">Default light</string>
|
<string name="defaultIconLight">Default light</string>
|
||||||
|
<string name="playlistCloned">Playlist cloned</string>
|
||||||
|
|
||||||
<!-- Notification channel strings -->
|
<!-- Notification channel strings -->
|
||||||
<string name="download_channel_name">Download Service</string>
|
<string name="download_channel_name">Download Service</string>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user