diff --git a/app/src/main/java/com/futo/platformplayer/UISlideOverlays.kt b/app/src/main/java/com/futo/platformplayer/UISlideOverlays.kt index 791aef3f..ff0fb916 100644 --- a/app/src/main/java/com/futo/platformplayer/UISlideOverlays.kt +++ b/app/src/main/java/com/futo/platformplayer/UISlideOverlays.kt @@ -5,6 +5,8 @@ import android.graphics.Color import android.util.TypedValue import android.view.View import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.ImageButton import android.widget.LinearLayout import android.widget.TextView import com.futo.platformplayer.api.http.ManagedHttpClient @@ -369,6 +371,33 @@ class UISlideOverlays { return overlay; } + fun showCreatePlaylistOverlay(container: ViewGroup, onCreate: (String) -> Unit): SlideUpMenuOverlay { + val nameInput = SlideUpMenuTextInput(container.context, container.context.getString(R.string.name)); + val addPlaylistOverlay = SlideUpMenuOverlay(container.context, container, container.context.getString(R.string.create_new_playlist), container.context.getString(R.string.ok), false, nameInput); + + addPlaylistOverlay.onOK.subscribe { + val text = nameInput.text; + if (text.isBlank()) { + return@subscribe; + } + + addPlaylistOverlay.hide(); + nameInput.deactivate(); + nameInput.clear(); + onCreate(text) + }; + + addPlaylistOverlay.onCancel.subscribe { + nameInput.deactivate(); + nameInput.clear(); + }; + + addPlaylistOverlay.show(); + nameInput.activate(); + + return addPlaylistOverlay + } + fun showVideoOptionsOverlay(video: IPlatformVideo, container: ViewGroup, vararg actions: SlideUpMenuItem): SlideUpMenuOverlay { val items = arrayListOf(); val lastUpdated = StatePlaylists.instance.getLastUpdatedPlaylist(); @@ -407,6 +436,13 @@ class UISlideOverlays { )); val playlistItems = arrayListOf(); + playlistItems.add(SlideUpMenuItem(container.context, R.drawable.ic_playlist_add, container.context.getString(R.string.new_playlist), container.context.getString(R.string.add_to_new_playlist), "add_to_new_playlist", { + showCreatePlaylistOverlay(container) { + val playlist = Playlist(it, arrayListOf(SerializedPlatformVideo.fromVideo(video))); + StatePlaylists.instance.createOrUpdatePlaylist(playlist); + }; + }, false)) + for (playlist in allPlaylists) { playlistItems.add(SlideUpMenuItem(container.context, R.drawable.ic_playlist_add, "${container.context.getString(R.string.add_to)} " + playlist.name + "", "${playlist.videos.size} " + container.context.getString(R.string.videos), "", { diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/PlaylistsFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/PlaylistsFragment.kt index e0d7c68b..b1179940 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/PlaylistsFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/PlaylistsFragment.kt @@ -17,6 +17,7 @@ import androidx.recyclerview.widget.RecyclerView import com.futo.platformplayer.states.StatePlayer import com.futo.platformplayer.states.StatePlaylists import com.futo.platformplayer.R +import com.futo.platformplayer.UISlideOverlays import com.futo.platformplayer.api.media.models.video.IPlatformVideo import com.futo.platformplayer.assume import com.futo.platformplayer.fragment.mainactivity.topbar.NavigationTopBarFragment @@ -54,6 +55,14 @@ class PlaylistsFragment : MainFragment() { _view?.onShown(parameter, isBack); } + override fun onBackPressed(): Boolean { + if (_view?.onBackPressed() == true) { + return true; + } + + return super.onBackPressed() + } + @SuppressLint("ViewConstructor") class PlaylistsView : LinearLayout { private val _fragment: PlaylistsFragment; @@ -64,6 +73,7 @@ class PlaylistsFragment : MainFragment() { private var _adapterWatchLater: VideoListHorizontalAdapter; private var _adapterPlaylist: PlaylistsAdapter; private var _layoutWatchlist: ConstraintLayout; + private var _slideUpOverlay: SlideUpMenuOverlay? = null; constructor(fragment: PlaylistsFragment, inflater: LayoutInflater) : super(inflater.context) { _fragment = fragment; @@ -92,41 +102,24 @@ class PlaylistsFragment : MainFragment() { recyclerPlaylists.adapter = _adapterPlaylist; recyclerPlaylists.layoutManager = LinearLayoutManager(context); - val nameInput = SlideUpMenuTextInput(context, context.getString(R.string.name)); - val addPlaylistOverlay = SlideUpMenuOverlay(context, findViewById(R.id.overlay_create_playlist), context.getString(R.string.create_new_playlist), context.getString(R.string.ok), false, nameInput); + + + val buttonCreatePlaylist = findViewById(R.id.button_create_playlist); + buttonCreatePlaylist.setOnClickListener { + _slideUpOverlay = UISlideOverlays.showCreatePlaylistOverlay(findViewById(R.id.overlay_create_playlist)) { + val playlist = Playlist(it, arrayListOf()); + playlists.add(0, playlist); + StatePlaylists.instance.createOrUpdatePlaylist(playlist); + + _adapterPlaylist.notifyItemInserted(0); + }; + }; _adapterPlaylist.onClick.subscribe { p -> _fragment.navigate(p); }; _adapterPlaylist.onPlay.subscribe { p -> StatePlayer.instance.setPlaylist(p, 0, true); }; - addPlaylistOverlay.onOK.subscribe { - val text = nameInput.text; - if (text.isBlank()) { - return@subscribe; - } - - val playlist = Playlist(text, arrayListOf()); - playlists.add(0, playlist); - StatePlaylists.instance.createOrUpdatePlaylist(playlist); - - _adapterPlaylist.notifyItemInserted(0); - addPlaylistOverlay.hide(); - nameInput.deactivate(); - nameInput.clear(); - }; - - addPlaylistOverlay.onCancel.subscribe { - nameInput.deactivate(); - nameInput.clear(); - }; - - val buttonCreatePlaylist = findViewById(R.id.button_create_playlist); - buttonCreatePlaylist.setOnClickListener { - addPlaylistOverlay.show(); - nameInput.activate(); - }; - _appBar = findViewById(R.id.app_bar); _layoutWatchlist = findViewById(R.id.layout_watchlist); @@ -142,12 +135,28 @@ class PlaylistsFragment : MainFragment() { fun onShown(parameter: Any?, isBack: Boolean) { playlists.clear() - playlists.addAll(StatePlaylists.instance.getPlaylists().sortedByDescending { maxOf(it.datePlayed, it.dateUpdate, it.dateCreation) }); + playlists.addAll( + StatePlaylists.instance.getPlaylists() + .sortedByDescending { maxOf(it.datePlayed, it.dateUpdate, it.dateCreation) }); _adapterPlaylist.notifyDataSetChanged(); updateWatchLater(); } + fun onBackPressed(): Boolean { + val slideUpOverlay = _slideUpOverlay; + if (slideUpOverlay != null) { + if (slideUpOverlay.isVisible) { + slideUpOverlay.hide(); + return true; + } + + return false; + } + + return false; + } + private fun updateWatchLater() { val watchList = StatePlaylists.instance.getWatchLater(); if (watchList.isNotEmpty()) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0acaf866..38e17479 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -657,6 +657,8 @@ Stopped after {requestCount} to avoid rate limit, click load more to load more. This creator has not setup any monetization features " + Tax" + New playlist + Add to new playlist Recommendations Subscriptions