Browse Source

TV: Now Playing card

4.0-glrenderer
Geoffrey Métais 8 years ago
parent
commit
7217bf49d3
  1. 24
      medialibrary/src/org/videolan/medialibrary/Tools.java
  2. 11
      medialibrary/src/org/videolan/medialibrary/media/DummyItem.java
  3. 2
      medialibrary/src/org/videolan/medialibrary/media/MediaLibraryItem.java
  4. 6
      vlc-android/src/org/videolan/vlc/PlaybackService.java
  5. 2
      vlc-android/src/org/videolan/vlc/gui/tv/CardPresenter.java
  6. 23
      vlc-android/src/org/videolan/vlc/gui/tv/MainTvFragment.kt
  7. 57
      vlc-android/src/org/videolan/vlc/gui/tv/NowPlayingDelegate.kt
  8. 2
      vlc-android/src/org/videolan/vlc/gui/tv/TvUtil.kt

24
medialibrary/src/org/videolan/medialibrary/Tools.java

@ -74,21 +74,19 @@ public class Tools {
final String progress = mw.getLength() == 0L ? null : mw.getTime() == 0L ? Tools.millisToString(mw.getLength()) : getProgressText(mw);
final String resolution = getResolution(mw);
boolean hasprogress = !TextUtils.isEmpty(progress), hasResolution = !TextUtils.isEmpty(resolution);
if (hasprogress && hasResolution)
item.setDescription(resolution+" - "+progress);
else if (hasprogress)
item.setDescription(progress);
else
item.setDescription(resolution);
final StringBuilder sb = new StringBuilder();
if (hasprogress && hasResolution) sb.append(resolution).append(" - ").append(progress);
else if (hasprogress) sb.append(progress);
else sb.append(resolution);
item.setDescription(sb.toString());
} else if (mw.getType() == MediaWrapper.TYPE_AUDIO) {
String artist = mw.getReferenceArtist(), album = mw.getAlbum();
final String artist = mw.getReferenceArtist(), album = mw.getAlbum();
final StringBuilder sb = new StringBuilder();
boolean hasArtist = !TextUtils.isEmpty(artist), hasAlbum = !TextUtils.isEmpty(album);
if (hasArtist && hasAlbum)
item.setDescription(album+" - "+artist);
else if (hasArtist)
item.setDescription(artist);
else
item.setDescription(album);
if (hasArtist && hasAlbum) sb.append(album).append(" - ").append(artist);
else if (hasArtist) sb.append(artist);
else sb.append(album);
item.setDescription(sb.toString());
}
}
}

11
medialibrary/src/org/videolan/medialibrary/media/DummyItem.java

@ -8,6 +8,8 @@ import org.videolan.medialibrary.Medialibrary;
public class DummyItem extends MediaLibraryItem {
private String mArtWork = null;
public DummyItem(long id, String title, String description) {
super(id, title);
mDescription = description;
@ -27,6 +29,15 @@ public class DummyItem extends MediaLibraryItem {
return TYPE_DUMMY;
}
@Override
public String getArtworkMrl() {
return mArtWork;
}
public void setArtWork(String artWork) {
mArtWork = artWork;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
super.writeToParcel(parcel, i);

2
medialibrary/src/org/videolan/medialibrary/media/MediaLibraryItem.java

@ -107,8 +107,8 @@ public abstract class MediaLibraryItem implements Parcelable {
if (this == other) return true;
if (other == null) return false;
if (getItemType() != other.getItemType()) return false;
if (mId != 0) return mId == other.getId();
if (getItemType() == TYPE_DUMMY) return TextUtils.equals(getTitle(), other.getTitle());
if (mId != 0) return mId == other.getId();
if (getItemType() == TYPE_MEDIA)
return TextUtils.equals(((MediaWrapper)this).getLocation(), ((MediaWrapper)other).getLocation());
if (getItemType() == TYPE_STORAGE)

6
vlc-android/src/org/videolan/vlc/PlaybackService.java

@ -1844,12 +1844,10 @@ public class PlaybackService extends MediaBrowserServiceCompat{
private final ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder iBinder) {
if (!mBound)
return;
if (!mBound) return;
final PlaybackService service = PlaybackService.getService(iBinder);
if (service != null)
mCallback.onConnected(service);
if (service != null) mCallback.onConnected(service);
}
@Override

2
vlc-android/src/org/videolan/vlc/gui/tv/CardPresenter.java

@ -136,7 +136,7 @@ public class CardPresenter extends Presenter {
}
});
} else if (item instanceof MediaLibraryItem) {
MediaLibraryItem mediaLibraryItem = (MediaLibraryItem) item;
final MediaLibraryItem mediaLibraryItem = (MediaLibraryItem) item;
holder.mCardView.setTitleText(mediaLibraryItem.getTitle());
holder.mCardView.setContentText(mediaLibraryItem.getDescription());
holder.updateCardViewImage(mediaLibraryItem);

23
vlc-android/src/org/videolan/vlc/gui/tv/MainTvFragment.kt

@ -70,6 +70,7 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewSelectedListener, OnIt
private lateinit var browserAdapter: ArrayObjectAdapter
private lateinit var otherAdapter: ArrayObjectAdapter
private lateinit var settings: SharedPreferences
private lateinit var nowPlayingDelegate: NowPlayingDelegate
private var selectedItem: Any? = null
private var restart = false
@ -89,6 +90,7 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewSelectedListener, OnIt
}
brandColor = ContextCompat.getColor(requireContext(), R.color.orange800)
backgroundManager = BackgroundManager.getInstance(requireActivity()).apply { attach(requireActivity().window) }
nowPlayingDelegate = NowPlayingDelegate(this)
}
@ -103,10 +105,7 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewSelectedListener, OnIt
// Audio
categoriesAdapter = ArrayObjectAdapter(CardPresenter(ctx))
val musicHeader = HeaderItem(Constants.HEADER_CATEGORIES, getString(R.string.audio))
categoriesAdapter.add(DummyItem(Constants.CATEGORY_ARTISTS, getString(R.string.artists), ""))
categoriesAdapter.add(DummyItem(Constants.CATEGORY_ALBUMS, getString(R.string.albums), ""))
categoriesAdapter.add(DummyItem(Constants.CATEGORY_GENRES, getString(R.string.genres), ""))
categoriesAdapter.add(DummyItem(Constants.CATEGORY_SONGS, getString(R.string.songs), ""))
updateAudioCategories()
rowsAdapter.add(ListRow(musicHeader, categoriesAdapter))
//History
val showHistory = settings.getBoolean(PreferencesFragment.PLAYBACK_HISTORY, true)
@ -135,6 +134,17 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewSelectedListener, OnIt
onItemViewSelectedListener = this
}
fun updateAudioCategories(current: DummyItem? = null) {
val list = mutableListOf<MediaLibraryItem>(
DummyItem(Constants.CATEGORY_ARTISTS, getString(R.string.artists), ""),
DummyItem(Constants.CATEGORY_ALBUMS, getString(R.string.albums), ""),
DummyItem(Constants.CATEGORY_GENRES, getString(R.string.genres), ""),
DummyItem(Constants.CATEGORY_SONGS, getString(R.string.songs), "")
)
if (current !== null) list.add(0, current)
categoriesAdapter.setItems(list.toList(), diffCallback)
}
override fun onStart() {
super.onStart()
if (restart) {
@ -149,6 +159,11 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewSelectedListener, OnIt
if (AndroidDevices.isAndroidTv && !AndroidUtil.isOOrLater) requireActivity().startService(Intent(requireActivity(), RecommendationsService::class.java))
}
override fun onDestroy() {
super.onDestroy()
nowPlayingDelegate.onClear()
}
override fun onClick(v: View?) = requireActivity().startActivity(Intent(requireContext(), SearchActivity::class.java))
fun showDetails() : Boolean {

57
vlc-android/src/org/videolan/vlc/gui/tv/NowPlayingDelegate.kt

@ -0,0 +1,57 @@
package org.videolan.vlc.gui.tv
import android.arch.lifecycle.Observer
import org.videolan.libvlc.MediaPlayer
import org.videolan.medialibrary.media.DummyItem
import org.videolan.vlc.PlaybackService
import org.videolan.vlc.gui.PlaybackServiceActivity
import org.videolan.vlc.media.PlaylistManager
import org.videolan.vlc.util.Constants
import org.videolan.vlc.util.EmptyPBSCallback
class NowPlayingDelegate(private val fragment: MainTvFragment): PlaybackService.Client.Callback, PlaybackService.Callback by EmptyPBSCallback {
private var service: PlaybackService? = null
private val helper = PlaybackServiceActivity.Helper(fragment.requireActivity(), this)
private val observer = Observer<Boolean> {
when {
it != true -> {
helper.onStop()
updateCurrent()
}
service === null -> helper.onStart()
else -> updateCurrent()
}
}
init {
PlaylistManager.showAudioPlayer.observe(fragment, observer)
}
fun onClear() {
PlaylistManager.showAudioPlayer.removeObserver(observer)
}
override fun onMediaPlayerEvent(event: MediaPlayer.Event?) {
when (event?.type) {
MediaPlayer.Event.MediaChanged -> updateCurrent()
}
}
private fun updateCurrent() {
fragment.updateAudioCategories(service?.currentMediaWrapper?.let {
DummyItem(Constants.CATEGORY_NOW_PLAYING, it.title, it.artist).apply { setArtWork(service?.coverArt) }
})
}
override fun onConnected(service: PlaybackService?) {
this.service = service
updateCurrent()
service?.addCallback(this)
}
override fun onDisconnected() {
service?.removeCallback(this)
service = null
}
}

2
vlc-android/src/org/videolan/vlc/gui/tv/TvUtil.kt

@ -246,7 +246,7 @@ object TvUtil {
Constants.CATEGORY_ARTISTS -> R.drawable.ic_artist_big
Constants.CATEGORY_ALBUMS -> R.drawable.ic_album_big
Constants.CATEGORY_GENRES -> R.drawable.ic_genre_big
Constants.CATEGORY_SONGS -> R.drawable.ic_song_big
Constants.CATEGORY_SONGS, Constants.CATEGORY_NOW_PLAYING -> R.drawable.ic_song_big
else -> R.drawable.ic_browser_unknown_big_normal
}
}

Loading…
Cancel
Save