add menu for offline-items and add ability to actually play downloaded items

This commit is contained in:
Felix 2017-12-01 00:30:50 +01:00
parent 12467fbba5
commit ef0d61f437
13 changed files with 117 additions and 32 deletions

View file

@ -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);
}

View file

@ -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)
}
}

View file

@ -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]) })
}
}

View file

@ -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 {
}
}

View file

@ -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
}
}

View file

@ -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)
}

View file

@ -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)
}

View file

@ -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;
}

View file

@ -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 {

View file

@ -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)

View file

@ -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"/>

View 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>

View file

@ -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>