diff --git a/app/src/main/java/com/futo/platformplayer/UISlideOverlays.kt b/app/src/main/java/com/futo/platformplayer/UISlideOverlays.kt index 671dcb6549e1c202961507ac8be3b03333ae180e..f846cd9710a1d8c38aa16e237f05bbfb67b2524d 100644 --- a/app/src/main/java/com/futo/platformplayer/UISlideOverlays.kt +++ b/app/src/main/java/com/futo/platformplayer/UISlideOverlays.kt @@ -739,7 +739,7 @@ class UISlideOverlays { } - fun showMoreButtonOverlay(container: ViewGroup, buttonGroup: RoundButtonGroup, ignoreTags: List<Any> = listOf(), onPinnedbuttons: ((List<RoundButton>)->Unit)? = null): SlideUpMenuOverlay { + fun showMoreButtonOverlay(container: ViewGroup, buttonGroup: RoundButtonGroup, ignoreTags: List<Any> = listOf(), invokeParents: Boolean = true, onPinnedbuttons: ((List<RoundButton>)->Unit)? = null): SlideUpMenuOverlay { val visible = buttonGroup.getVisibleButtons().filter { !ignoreTags.contains(it.tagRef) }; val hidden = buttonGroup.getInvisibleButtons().filter { !ignoreTags.contains(it.tagRef) }; @@ -747,7 +747,7 @@ class UISlideOverlays { hidden .map { btn -> SlideUpMenuItem(container.context, btn.iconResource, btn.text.text.toString(), "", "", { btn.handler?.invoke(btn); - }, true) as View }.toTypedArray(), + }, invokeParents) as View }.toTypedArray(), arrayOf(SlideUpMenuItem(container.context, R.drawable.ic_pin, container.context.getString(R.string.change_pins), container.context.getString(R.string.decide_which_buttons_should_be_pinned), "", { showOrderOverlay(container, container.context.getString(R.string.select_your_pins_in_order), (visible + hidden).map { Pair(it.text.text.toString(), it.tagRef!!) }) { val selected = it diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/SubscriptionsFeedFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/SubscriptionsFeedFragment.kt index b466c5acc9071a66d5c525ce91207a6d766c1528..fe0f292d49ab9e14c85f12bd804e8b5acc22b809 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/SubscriptionsFeedFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/SubscriptionsFeedFragment.kt @@ -17,6 +17,7 @@ import com.futo.platformplayer.api.media.platforms.js.JSClient import com.futo.platformplayer.api.media.structures.IPager import com.futo.platformplayer.constructs.TaskHandler import com.futo.platformplayer.engine.exceptions.PluginException +import com.futo.platformplayer.engine.exceptions.ScriptCaptchaRequiredException import com.futo.platformplayer.exceptions.ChannelException import com.futo.platformplayer.exceptions.RateLimitException import com.futo.platformplayer.logging.Logger diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt index 076ceae94e1758bb404afbbe49f8a5ab9312f148..c6af94e5f8f91fcee0faaa8e829ce01431a97f0f 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt @@ -437,11 +437,11 @@ class VideoDetailView : ConstraintLayout { var buttonMore: RoundButton? = null; buttonMore = RoundButton(context, R.drawable.ic_menu, context.getString(R.string.more), TAG_MORE) { - _slideUpOverlay = UISlideOverlays.showMoreButtonOverlay(_overlayContainer, _buttonPins, listOf(TAG_MORE)) {selected -> + _slideUpOverlay = UISlideOverlays.showMoreButtonOverlay(_overlayContainer, _buttonPins, listOf(TAG_MORE), false) {selected -> _buttonPins.setButtons(*(selected + listOf(buttonMore!!)).toTypedArray()); _buttonPinStore.set(*selected.filter { it.tagRef is String }.map{ it.tagRef as String }.toTypedArray()) _buttonPinStore.save(); - } + }; }; _buttonMore = buttonMore; updateMoreButtons(); @@ -769,6 +769,7 @@ class VideoDetailView : ConstraintLayout { Logger.e(TAG, "Failed to reopen live chat", ex); } } + _slideUpOverlay?.hide(); } else null, RoundButton(context, R.drawable.ic_screen_share, context.getString(R.string.background), TAG_BACKGROUND) { if(!allowBackground) { @@ -781,6 +782,7 @@ class VideoDetailView : ConstraintLayout { allowBackground = false; it.text.text = resources.getString(R.string.background); } + _slideUpOverlay?.hide(); }, RoundButton(context, R.drawable.ic_download, context.getString(R.string.download), TAG_DOWNLOAD) { video?.let { @@ -793,11 +795,13 @@ class VideoDetailView : ConstraintLayout { preventPictureInPicture = true; shareVideo(); }; + _slideUpOverlay?.hide(); }, RoundButton(context, R.drawable.ic_screen_share, context.getString(R.string.overlay), TAG_OVERLAY) { this.startPictureInPicture(); fragment.forcePictureInPicture(); //PiPActivity.startPiP(context); + _slideUpOverlay?.hide(); }, RoundButton(context, R.drawable.ic_export, context.getString(R.string.page), TAG_OPEN) { video?.let { @@ -805,9 +809,11 @@ class VideoDetailView : ConstraintLayout { fragment.navigate<BrowserFragment>(url); fragment.minimizeVideoDetail(); }; + _slideUpOverlay?.hide(); }, RoundButton(context, R.drawable.ic_refresh, context.getString(R.string.reload), "Reload") { reloadVideo(); + _slideUpOverlay?.hide(); }).filterNotNull(); if(!_buttonPinStore.getAllValues().any()) _buttonPins.setButtons(*(buttons + listOf(_buttonMore)).toTypedArray()); diff --git a/app/src/main/java/com/futo/platformplayer/views/subscriptions/SubscriptionBar.kt b/app/src/main/java/com/futo/platformplayer/views/subscriptions/SubscriptionBar.kt index a456cba007270128deff160e86b602fb55160ea9..1fd859b6157e789f45f09052f2707a17b0e72a1e 100644 --- a/app/src/main/java/com/futo/platformplayer/views/subscriptions/SubscriptionBar.kt +++ b/app/src/main/java/com/futo/platformplayer/views/subscriptions/SubscriptionBar.kt @@ -2,12 +2,14 @@ package com.futo.platformplayer.views.subscriptions import android.content.Context import android.util.AttributeSet +import android.view.View import android.widget.LinearLayout import androidx.lifecycle.findViewTreeLifecycleOwner import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView import com.futo.platformplayer.R import com.futo.platformplayer.Settings +import com.futo.platformplayer.UIDialogs import com.futo.platformplayer.api.media.models.channels.SerializedChannel import com.futo.platformplayer.constructs.Event1 import com.futo.platformplayer.models.Subscription @@ -24,7 +26,8 @@ import kotlinx.coroutines.launch class SubscriptionBar : LinearLayout { private var _adapterView: AnyAdapterView<Subscription, SubscriptionBarViewHolder>? = null; - private var _subGroups: AnyAdapterView<SubscriptionGroup, SubscriptionGroupBarViewHolder> + private var _subGroups: AnyAdapterView<SubscriptionGroup, SubscriptionGroupBarViewHolder>; + private var _subGroupsExplore: SubscriptionExploreButton; private val _tagsContainer: LinearLayout; private val _groups: ArrayList<SubscriptionGroup>; @@ -64,7 +67,25 @@ class SubscriptionBar : LinearLayout { onHoldGroup.emit(g); } } + _subGroupsExplore = findViewById(R.id.subgroup_explore); _tagsContainer = findViewById(R.id.container_tags); + + _subGroupsExplore.onClick.subscribe { + UIDialogs.showDialog(context, R.drawable.ic_subscriptions, "Subscription Groups", + "Subscription groups are an easy way to navigate your subscriptions.\n\nDefine your own subsets, and in the near future share them with others.", null, 0, + UIDialogs.Action("Hide Bar", { + Settings.instance.subscriptions.showSubscriptionGroups = false; + Settings.instance.save(); + reloadGroups(); + + UIDialogs.showDialogOk(context, R.drawable.ic_quiz, "Subscription groups can be re-enabled in settings") + }), + UIDialogs.Action("Create", { + onToggleGroup.emit(SubscriptionGroup.Add()); //Shortcut.. + }, UIDialogs.ActionStyle.PRIMARY)) + }; + + updateExplore(); } private fun groupClicked(g: SubscriptionGroup) { @@ -100,6 +121,8 @@ class SubscriptionBar : LinearLayout { _groups.clear(); _groups.addAll(results); _subGroups.notifyContentChanged(); + + updateExplore(); } private fun getGroups(): List<SubscriptionGroup> { return if(Settings.instance.subscriptions.showSubscriptionGroups) @@ -110,6 +133,18 @@ class SubscriptionBar : LinearLayout { else listOf(); } + fun updateExplore() { + val show = Settings.instance.subscriptions.showSubscriptionGroups && + _groups.all { it is SubscriptionGroup.Add }; + if(show) { + _subGroupsExplore.visibility = View.VISIBLE; + _subGroups.view.visibility = View.GONE; + } + else { + _subGroupsExplore.visibility = View.GONE; + _subGroups.view.visibility = View.VISIBLE; + } + } fun setToggles(vararg buttons: Toggle) { _tagsContainer.removeAllViews(); diff --git a/app/src/main/java/com/futo/platformplayer/views/subscriptions/SubscriptionExploreButton.kt b/app/src/main/java/com/futo/platformplayer/views/subscriptions/SubscriptionExploreButton.kt new file mode 100644 index 0000000000000000000000000000000000000000..8478250ede58e35d56e7c28fb3361a1c44a8cd72 --- /dev/null +++ b/app/src/main/java/com/futo/platformplayer/views/subscriptions/SubscriptionExploreButton.kt @@ -0,0 +1,45 @@ +package com.futo.platformplayer.views.subscriptions + +import android.content.Context +import android.graphics.drawable.Animatable +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import com.futo.platformplayer.* +import com.futo.platformplayer.api.media.models.channels.IPlatformChannel +import com.futo.platformplayer.constructs.Event0 +import com.futo.platformplayer.constructs.Event1 +import com.futo.platformplayer.constructs.TaskHandler +import com.futo.platformplayer.models.Subscription +import com.futo.platformplayer.states.StateApp +import com.futo.platformplayer.states.StatePlatform +import com.futo.platformplayer.states.StateSubscriptions +import com.google.android.material.imageview.ShapeableImageView +import com.google.android.material.shape.CornerFamily +import com.google.android.material.shape.ShapeAppearanceModel + +class SubscriptionExploreButton : ConstraintLayout { + val onClick = Event0(); + + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { + inflate(context, R.layout.view_subscription_group_bar_explore, this); + + val dp10 = 10.dp(resources); + findViewById<ShapeableImageView>(R.id.image) + .apply { + adjustViewBounds = true + scaleType = ImageView.ScaleType.CENTER_CROP; + shapeAppearanceModel = ShapeAppearanceModel.builder().setAllCorners(CornerFamily.ROUNDED, dp10.toFloat()).build() + } + + findViewById<ConstraintLayout>(R.id.root).setOnClickListener { + onClick.emit(); + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/background_button_explore.xml b/app/src/main/res/drawable/background_button_explore.xml new file mode 100644 index 0000000000000000000000000000000000000000..857401f10a76feb2c65092a6db7367e784779de8 --- /dev/null +++ b/app/src/main/res/drawable/background_button_explore.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <corners + android:radius="10dp" + android:topRightRadius="10dp" + android:bottomRightRadius="10dp" + android:bottomLeftRadius="10dp" /> + <stroke + android:width="1dp" + android:color="#6F6F6F" /> +</shape> \ No newline at end of file diff --git a/app/src/main/res/drawable/background_button_explore_inner.xml b/app/src/main/res/drawable/background_button_explore_inner.xml new file mode 100644 index 0000000000000000000000000000000000000000..e41a4df8b23c3c1078ca5b3d4cfd7c8a55112783 --- /dev/null +++ b/app/src/main/res/drawable/background_button_explore_inner.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <corners + android:radius="10dp" + android:topRightRadius="10dp" + android:bottomRightRadius="10dp" + android:bottomLeftRadius="10dp" /> + <stroke + android:width="1dp" + android:color="#6F6F6F" /> + <solid android:color="#99000000" /> +</shape> \ No newline at end of file diff --git a/app/src/main/res/drawable/sub_group_demo.png b/app/src/main/res/drawable/sub_group_demo.png new file mode 100644 index 0000000000000000000000000000000000000000..92f7f438b95ee7500c72e8719288378e8e436b2d Binary files /dev/null and b/app/src/main/res/drawable/sub_group_demo.png differ diff --git a/app/src/main/res/layout/dialog_multi_button.xml b/app/src/main/res/layout/dialog_multi_button.xml index 87365f8c096657585a377d751db7191652d039aa..786a7cce538c4f2771b2543ff28d0627fbe7114c 100644 --- a/app/src/main/res/layout/dialog_multi_button.xml +++ b/app/src/main/res/layout/dialog_multi_button.xml @@ -27,7 +27,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/failed_to_retrieve_data_are_you_connected" - android:textSize="14dp" + android:textSize="15dp" android:textColor="@color/white" android:fontFamily="@font/inter_regular" android:textAlignment="center" @@ -43,7 +43,7 @@ android:textAlignment="center" android:layout_marginStart="30dp" android:layout_marginEnd="30dp" - android:textSize="9dp" + android:textSize="11dp" android:layout_height="wrap_content" /> <TextView android:id="@+id/dialog_text_code" diff --git a/app/src/main/res/layout/view_subscription_bar.xml b/app/src/main/res/layout/view_subscription_bar.xml index 5a11c82aa176bc69c2656713087fb00d89a74f30..2f0eece55a616a4cf6929d514274c870e5c85341 100644 --- a/app/src/main/res/layout/view_subscription_bar.xml +++ b/app/src/main/res/layout/view_subscription_bar.xml @@ -28,4 +28,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" /> + <com.futo.platformplayer.views.subscriptions.SubscriptionExploreButton + android:id="@+id/subgroup_explore" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" /> + </LinearLayout> diff --git a/app/src/main/res/layout/view_subscription_group_bar_explore.xml b/app/src/main/res/layout/view_subscription_group_bar_explore.xml new file mode 100644 index 0000000000000000000000000000000000000000..ca368be90644d046d0aaf22850cbdc1e2fc82596 --- /dev/null +++ b/app/src/main/res/layout/view_subscription_group_bar_explore.xml @@ -0,0 +1,36 @@ +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="54dp" + android:orientation="vertical" + android:gravity="center_horizontal" + android:padding="1dp" + android:clickable="true" + android:id="@+id/root"> + <com.google.android.material.imageview.ShapeableImageView + android:id="@+id/image" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:scaleType="centerCrop" + android:src="@drawable/sub_group_demo" /> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@drawable/background_button_explore_inner" + android:gravity="center"> + <TextView + android:id="@+id/text_sub_group" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="5dp" + android:layout_marginRight="5dp" + android:maxLines="2" + android:ellipsize="end" + android:fontFamily="@font/inter_medium" + android:textSize="13dp" + android:textAlignment="center" + android:text="Explore Subscription Groups" /> + </LinearLayout> + +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 156586942a85da656fabe83a064ea32e048cc0c7..efff3f0d2d7cdd20dab5156d03efb7063bc74311 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -569,7 +569,7 @@ <string name="playlist_copied_as_local_playlist">Playlist copied as local playlist</string> <string name="are_you_sure_you_want_to_delete_the_downloaded_videos">Are you sure you want to delete the downloaded videos?</string> <string name="create_new_playlist">Create new playlist</string> - <string name="create_new_subgroup">Create new subscription group</string> + <string name="create_new_subgroup">Create new group</string> <string name="expected_media_content_found">Expected media content, found</string> <string name="failed_to_load_post">Failed to load post.</string> <string name="replies">replies</string>