mirror of
https://github.com/NiciDieNase/chaosflix
synced 2025-02-17 05:28:24 +00:00
add menu for offline-items and add ability to actually play downloaded items
This commit is contained in:
parent
12467fbba5
commit
ef0d61f437
13 changed files with 117 additions and 32 deletions
|
@ -4,5 +4,5 @@ import android.view.View
|
|||
import de.nicidienase.chaosflix.common.entities.recording.persistence.PersistentEvent
|
||||
|
||||
interface OnEventSelectedListener {
|
||||
fun onEventSelected(event: PersistentEvent, v: View);
|
||||
fun onEventSelected(event: PersistentEvent);
|
||||
}
|
|
@ -143,7 +143,8 @@ class BrowseActivity : AppCompatActivity(),
|
|||
}
|
||||
|
||||
private fun showDownloadsFragment() {
|
||||
showFragment(DownloadsListFragment(), "downloads")
|
||||
val fragment = DownloadsListFragment.getInstance(numColumns)
|
||||
showFragment(fragment, "downloads")
|
||||
}
|
||||
|
||||
private fun showAboutPage() {
|
||||
|
@ -182,7 +183,7 @@ class BrowseActivity : AppCompatActivity(),
|
|||
ft.commit()
|
||||
}
|
||||
|
||||
override fun onEventSelected(event: PersistentEvent, v: View) {
|
||||
override fun onEventSelected(event: PersistentEvent) {
|
||||
EventDetailsActivity.launch(this, event.eventId)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,6 +57,6 @@ open class EventRecyclerViewAdapter(val listener: OnEventSelectedListener) :
|
|||
ViewCompat.setTransitionName(holder.mIcon,
|
||||
resources.getString(R.string.thumbnail) + event.eventId)
|
||||
|
||||
holder.mView.setOnClickListener({ v: View -> listener.onEventSelected(items[position], v) })
|
||||
holder.mView.setOnClickListener({ v: View -> listener.onEventSelected(items[position]) })
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,15 +4,15 @@ import android.arch.lifecycle.Observer
|
|||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.support.v7.widget.GridLayoutManager
|
||||
import android.support.v7.widget.LinearLayoutManager
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import de.nicidienase.chaosflix.R
|
||||
import de.nicidienase.chaosflix.common.entities.download.OfflineEvent
|
||||
import de.nicidienase.chaosflix.common.entities.streaming.LiveConference
|
||||
import de.nicidienase.chaosflix.common.entities.streaming.Stream
|
||||
import de.nicidienase.chaosflix.databinding.FragmentDownloadsBinding
|
||||
import de.nicidienase.chaosflix.touch.OnEventSelectedListener
|
||||
import de.nicidienase.chaosflix.touch.browse.BrowseFragment
|
||||
|
||||
class DownloadsListFragment : BrowseFragment() {
|
||||
|
@ -23,6 +23,12 @@ class DownloadsListFragment : BrowseFragment() {
|
|||
private val handler = Handler()
|
||||
|
||||
private val UPDATE_DELAY = 700L
|
||||
private var columnCount = 1;
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
columnCount = arguments?.getInt(ARG_COLUMN_COUNT) ?: 1
|
||||
}
|
||||
|
||||
override fun onAttach(context: Context?) {
|
||||
super.onAttach(context)
|
||||
|
@ -39,9 +45,13 @@ class DownloadsListFragment : BrowseFragment() {
|
|||
overlay = binding.incOverlay?.loadingOverlay
|
||||
viewModel.getOfflineEvents().observe(this, Observer { events: List<OfflineEvent>? ->
|
||||
events?.let {
|
||||
binding.list.layoutManager = LinearLayoutManager(context)
|
||||
if (columnCount <= 1) {
|
||||
binding.list.layoutManager = LinearLayoutManager(context)
|
||||
} else {
|
||||
binding.list.layoutManager = GridLayoutManager(context, columnCount)
|
||||
}
|
||||
binding.list.adapter =
|
||||
OfflineEventAdapter(events, viewModel)
|
||||
OfflineEventAdapter(events, viewModel, listener)
|
||||
setLoadingOverlayVisibility(false)
|
||||
}
|
||||
})
|
||||
|
@ -71,7 +81,18 @@ class DownloadsListFragment : BrowseFragment() {
|
|||
setLoadingOverlayVisibility(false)
|
||||
}
|
||||
|
||||
interface InteractionListener {
|
||||
fun onStreamSelected(conference: LiveConference, stream: Stream)
|
||||
companion object {
|
||||
private val ARG_COLUMN_COUNT = "column_count"
|
||||
|
||||
fun getInstance(columnCount: Int = 1): DownloadsListFragment{
|
||||
val fragment = DownloadsListFragment()
|
||||
val args = Bundle()
|
||||
args.putInt(ARG_COLUMN_COUNT, columnCount)
|
||||
fragment.arguments = args
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
|
||||
interface InteractionListener: OnEventSelectedListener {
|
||||
}
|
||||
}
|
|
@ -1,9 +1,10 @@
|
|||
package de.nicidienase.chaosflix.touch.browse.download
|
||||
|
||||
import android.app.DownloadManager
|
||||
import android.arch.lifecycle.MutableLiveData
|
||||
import android.arch.lifecycle.Observer
|
||||
import android.databinding.DataBindingUtil
|
||||
import android.os.Environment
|
||||
import android.support.design.widget.Snackbar
|
||||
import android.support.v7.widget.PopupMenu
|
||||
import android.support.v7.widget.RecyclerView
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
|
@ -12,14 +13,16 @@ import com.squareup.picasso.Picasso
|
|||
import de.nicidienase.chaosflix.R
|
||||
import de.nicidienase.chaosflix.common.entities.download.OfflineEvent
|
||||
import de.nicidienase.chaosflix.databinding.ItemOfflineEventBinding
|
||||
import de.nicidienase.chaosflix.touch.OnEventSelectedListener
|
||||
import de.nicidienase.chaosflix.touch.browse.BrowseViewModel
|
||||
import de.nicidienase.chaosflix.touch.playback.PlayerActivity
|
||||
|
||||
class OfflineEventAdapter(var items: List<OfflineEvent>, val viewModel: BrowseViewModel) :
|
||||
class OfflineEventAdapter(var items: List<OfflineEvent>, val viewModel: BrowseViewModel, val listener: OnEventSelectedListener) :
|
||||
RecyclerView.Adapter<OfflineEventAdapter.ViewHolder>() {
|
||||
|
||||
override fun onBindViewHolder(holder: OfflineEventAdapter.ViewHolder, position: Int) {
|
||||
val item = items[position]
|
||||
viewModel.getEventById(item.eventId).observeForever(Observer {
|
||||
viewModel.getEventById(item.eventId).observeForever({
|
||||
item.event = it
|
||||
holder.binding.event = it
|
||||
Picasso.with(holder.thumbnail.context)
|
||||
|
@ -29,18 +32,47 @@ class OfflineEventAdapter(var items: List<OfflineEvent>, val viewModel: BrowseVi
|
|||
.centerInside()
|
||||
.into(holder.thumbnail)
|
||||
})
|
||||
// viewModel.getRecordingByid(item.recordingId)
|
||||
viewModel.getRecordingByid(item.recordingId).observeForever({
|
||||
item.recording = it
|
||||
}
|
||||
)
|
||||
|
||||
holder.binding.downloadStatus = viewModel.downloadStatus[item.downloadReference]
|
||||
|
||||
// if (status == DownloadManager.STATUS_RUNNING) {
|
||||
// holder.progressBar.max = downloadStatus?.totalBytes ?: 0
|
||||
// holder.progressBar.progress = downloadStatus?.currentBytes ?: 0
|
||||
// } else {
|
||||
// holder.progressBar.visibility = View.GONE
|
||||
holder.binding.card.setOnClickListener { view ->
|
||||
// item.event?.let {
|
||||
// listener.onEventSelected(it)
|
||||
// }
|
||||
}
|
||||
// }
|
||||
//
|
||||
// holder.binding.textViewOptions.setOnClickListener {
|
||||
// holder.binding.card.setOnClickListener {
|
||||
val menu = PopupMenu(holder.view.context, holder.binding.card)
|
||||
menu.inflate(R.menu.offline_menu)
|
||||
menu.setOnMenuItemClickListener { menuItem ->
|
||||
when (menuItem.itemId) {
|
||||
R.id.item_open -> {
|
||||
item.event?.let {
|
||||
listener.onEventSelected(it)
|
||||
}
|
||||
true
|
||||
}
|
||||
R.id.item_play -> {
|
||||
val directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)
|
||||
val uri = "${directory.toURI()}chaosflix/${item.localPath}"
|
||||
PlayerActivity.launch(view.context, item.event!!, uri)
|
||||
true
|
||||
}
|
||||
R.id.item_delete -> {
|
||||
Snackbar.make(view, "Coming soon", Snackbar.LENGTH_SHORT).show()
|
||||
true
|
||||
}
|
||||
else -> false
|
||||
}
|
||||
|
||||
}
|
||||
menu.show()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
|
@ -56,6 +88,4 @@ class OfflineEventAdapter(var items: List<OfflineEvent>, val viewModel: BrowseVi
|
|||
inner class ViewHolder(val binding: ItemOfflineEventBinding, val view: View) : RecyclerView.ViewHolder(view) {
|
||||
val thumbnail = binding.imageView
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -30,7 +30,7 @@ class EventsListActivity : AppCompatActivity(), OnEventSelectedListener {
|
|||
}
|
||||
}
|
||||
|
||||
override fun onEventSelected(event: PersistentEvent, v: View) {
|
||||
override fun onEventSelected(event: PersistentEvent) {
|
||||
EventDetailsActivity.launch(this, event.eventId)
|
||||
}
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ class EventDetailsActivity : AppCompatActivity(),
|
|||
EventDetailsFragment.OnEventDetailsFragmentInteractionListener,
|
||||
OnEventSelectedListener {
|
||||
|
||||
override fun onEventSelected(event: PersistentEvent, v: View) {
|
||||
override fun onEventSelected(event: PersistentEvent) {
|
||||
showFragmentForEvent(event.eventId, true)
|
||||
}
|
||||
|
||||
|
|
|
@ -171,7 +171,7 @@ public class ExoPlayerFragment extends Fragment implements PlayerEventListener.P
|
|||
|
||||
exoPlayer.setPlayWhenReady(playbackState);
|
||||
|
||||
exoPlayer.prepare(buildMediaSource(Uri.parse(item.getUrl()), ""));
|
||||
exoPlayer.prepare(buildMediaSource(Uri.parse(item.getUri()), ""));
|
||||
return exoPlayer;
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ package de.nicidienase.chaosflix.touch.playback
|
|||
import android.os.Parcel
|
||||
import android.os.Parcelable
|
||||
|
||||
data class PlaybackItem (val title: String, val subtitle: String, val eventId: Long, val url: String) : Parcelable {
|
||||
data class PlaybackItem (val title: String, val subtitle: String, val eventId: Long, val uri: String) : Parcelable {
|
||||
|
||||
constructor(parcel: Parcel) : this(
|
||||
parcel.readString(),
|
||||
|
@ -16,7 +16,7 @@ data class PlaybackItem (val title: String, val subtitle: String, val eventId: L
|
|||
parcel.writeString(title)
|
||||
parcel.writeString(subtitle)
|
||||
parcel.writeLong(eventId)
|
||||
parcel.writeString(url)
|
||||
parcel.writeString(uri)
|
||||
}
|
||||
|
||||
override fun describeContents(): Int {
|
||||
|
|
|
@ -20,12 +20,18 @@ class PlayerActivity : AppCompatActivity(), ExoPlayerFragment.OnMediaPlayerInter
|
|||
|
||||
val contentType = intent.getStringExtra(CONTENT_TYPE)
|
||||
if (contentType.equals(CONTENT_RECORDING)) {
|
||||
val event = intent.extras!!.getParcelable<PersistentEvent>(EVENT_KEY)
|
||||
val recording = intent.extras!!.getParcelable<PersistentRecording>(RECORDING_KEY)
|
||||
val event = intent.extras?.getParcelable<PersistentEvent>(EVENT_KEY)
|
||||
|
||||
val recording = intent.extras?.getParcelable<PersistentRecording>(RECORDING_KEY)
|
||||
val recordingUri = intent.extras?.getString(OFFLINE_URI)
|
||||
|
||||
if (savedInstanceState == null) {
|
||||
val ft = supportFragmentManager.beginTransaction()
|
||||
val playbackItem = PlaybackItem(event.title, event.subtitle ?: "", event.eventId, recording.recordingUrl)
|
||||
val playbackItem = PlaybackItem(
|
||||
event?.title ?: "",
|
||||
event?.subtitle ?: "",
|
||||
event?.eventId ?: 0,
|
||||
recordingUri ?: recording?.recordingUrl ?: "")
|
||||
val playerFragment = ExoPlayerFragment.newInstance(playbackItem)
|
||||
ft.replace(R.id.fragment_container, playerFragment)
|
||||
ft.commit()
|
||||
|
@ -54,6 +60,16 @@ class PlayerActivity : AppCompatActivity(), ExoPlayerFragment.OnMediaPlayerInter
|
|||
val ROOM = "room"
|
||||
val STREAM = "stream"
|
||||
|
||||
val OFFLINE_URI = "recording_uri"
|
||||
|
||||
fun launch(context: Context, event: PersistentEvent, uri: String) {
|
||||
val i = Intent(context, PlayerActivity::class.java)
|
||||
i.putExtra(CONTENT_TYPE, CONTENT_RECORDING)
|
||||
i.putExtra(PlayerActivity.EVENT_KEY, event)
|
||||
i.putExtra(PlayerActivity.OFFLINE_URI, uri)
|
||||
context.startActivity(i)
|
||||
}
|
||||
|
||||
fun launch(context: Context, event: PersistentEvent, recording: PersistentRecording) {
|
||||
val i = Intent(context, PlayerActivity::class.java)
|
||||
i.putExtra(CONTENT_TYPE, CONTENT_RECORDING)
|
||||
|
|
|
@ -3,11 +3,15 @@
|
|||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<data>
|
||||
|
||||
<import type="de.nicidienase.chaosflix.touch.browse.BrowseViewModel.DownloadStatus"/>
|
||||
|
||||
<import type="de.nicidienase.chaosflix.common.entities.recording.persistence.PersistentEvent"/>
|
||||
|
||||
<variable
|
||||
name="downloadStatus"
|
||||
type="DownloadStatus"/>
|
||||
|
||||
<variable
|
||||
name="event"
|
||||
type="PersistentEvent"/>
|
||||
|
|
12
touch/src/main/res/menu/offline_menu.xml
Normal file
12
touch/src/main/res/menu/offline_menu.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item
|
||||
android:id="@+id/item_open"
|
||||
android:title="Open"/>
|
||||
<item
|
||||
android:id="@+id/item_play"
|
||||
android:title="@string/play"/>
|
||||
<item
|
||||
android:id="@+id/item_delete"
|
||||
android:title="@string/delete"/>
|
||||
</menu>
|
|
@ -13,6 +13,7 @@
|
|||
<string name="bookmark">Bookmark</string>
|
||||
|
||||
<string name="play">Play</string>
|
||||
<string name="delete">Delete</string>
|
||||
<string name="titleimage">TitleImage</string>
|
||||
<string name="update_database">Update Database</string>
|
||||
<string name="search_events">Search Events</string>
|
||||
|
|
Loading…
Add table
Reference in a new issue