diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a876523a..05675554 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,6 +51,7 @@ android:name=".activities.MainActivity" android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout" android:exported="true" + android:screenOrientation="sensorPortrait" android:theme="@style/Theme.FutoVideo.NoActionBar" android:launchMode="singleTask" android:resizeableActivity="true" @@ -152,21 +153,27 @@ @@ -180,34 +187,44 @@ - + \ No newline at end of file diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/bottombar/MenuBottomBarFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/bottombar/MenuBottomBarFragment.kt index 8d8dfe66..8855a89e 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/bottombar/MenuBottomBarFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/bottombar/MenuBottomBarFragment.kt @@ -7,7 +7,6 @@ import android.annotation.SuppressLint import android.app.Activity import android.content.Context import android.content.Intent -import android.content.res.Configuration import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -57,12 +56,6 @@ class MenuBottomBarFragment : MainActivityFragment() { return _view?.onBackPressed() ?: false; } - override fun onConfigurationChanged(newConfig: Configuration) { - super.onConfigurationChanged(newConfig) - - _view?.updateAllButtonVisibility() - } - @SuppressLint("ViewConstructor") class MenuBottomBarView : LinearLayout { private val _fragment: MenuBottomBarFragment; @@ -258,19 +251,9 @@ class MenuBottomBarFragment : MainActivityFragment() { button.updateActive(_fragment); } - override fun onConfigurationChanged(newConfig: Configuration?) { - super.onConfigurationChanged(newConfig) - - updateAllButtonVisibility() - } - fun updateAllButtonVisibility() { - if(_moreVisible) { - setMoreVisible(false); - } - val defs = currentButtonDefinitions?.toMutableList() ?: return - val metrics = resources.displayMetrics; + val metrics = StateApp.instance.displayMetrics ?: resources.displayMetrics; _buttonsVisible = floor(metrics.widthPixels.toDouble() / 65.dp(resources).toDouble()).roundToInt(); if (_buttonsVisible >= defs.size) { updateBottomMenuButtons(defs.toMutableList(), false); diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/ContentFeedView.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/ContentFeedView.kt index 7da2aca9..1a4537f6 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/ContentFeedView.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/ContentFeedView.kt @@ -4,10 +4,8 @@ import android.content.Context import android.util.Log import android.view.LayoutInflater import android.widget.LinearLayout -import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.futo.platformplayer.R import com.futo.platformplayer.Settings import com.futo.platformplayer.UIDialogs @@ -47,7 +45,7 @@ abstract class ContentFeedView : FeedView, StaggeredGridLayoutManager, IPager, IPlatformContent, IPlatformContent, InsertedViewHolder>? = null) : super(fragment, inflater, cachedRecyclerData) { + constructor(fragment: TFragment, inflater: LayoutInflater, cachedRecyclerData: RecyclerData, LinearLayoutManager, IPager, IPlatformContent, IPlatformContent, InsertedViewHolder>? = null) : super(fragment, inflater, cachedRecyclerData) { } @@ -55,34 +53,18 @@ abstract class ContentFeedView : FeedView - ): InsertedViewAdapterWithLoader { + override fun createAdapter(recyclerResults: RecyclerView, context: Context, dataset: ArrayList): InsertedViewAdapterWithLoader { val player = StatePlayer.instance.getThumbnailPlayerOrCreate(context); player.modifyState("ThumbnailPlayer", { state -> state.muted = true }); _exoPlayer = player; val v = LinearLayout(context).apply { - layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.WRAP_CONTENT - ); + layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); orientation = LinearLayout.VERTICAL; }; headerView = v; - return PreviewContentListAdapter( - context, - feedStyle, - dataset, - player, - _previewsEnabled, - arrayListOf(v), - arrayListOf(), - shouldShowTimeBar - ).apply { + return PreviewContentListAdapter(context, feedStyle, dataset, player, _previewsEnabled, arrayListOf(v), arrayListOf(), shouldShowTimeBar).apply { attachAdapterEvents(this); } } @@ -178,13 +160,10 @@ abstract class ContentFeedView : FeedView, StaggeredGridLayoutManager, IPager, IPlatformContent, IPlatformContent, InsertedViewHolder>) { + override fun onRestoreCachedData(cachedData: RecyclerData, LinearLayoutManager, IPager, IPlatformContent, IPlatformContent, InsertedViewHolder>) { super.onRestoreCachedData(cachedData) val v = LinearLayout(context).apply { - layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.WRAP_CONTENT - ); + layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); orientation = LinearLayout.VERTICAL; }; headerView = v; @@ -192,16 +171,10 @@ abstract class ContentFeedView : FeedView= resources.getDimension(R.dimen.landscape_threshold)) 2 else 1, - StaggeredGridLayoutManager.VERTICAL - ); - return glmResults; + override fun createLayoutManager(recyclerResults: RecyclerView, context: Context): LinearLayoutManager { + val llmResults = LinearLayoutManager(context); + llmResults.orientation = LinearLayoutManager.VERTICAL; + return llmResults; } override fun onScrollStateChanged(newState: Int) { @@ -247,8 +220,8 @@ abstract class ContentFeedView : FeedView : FeedView : L private var _activeTags: List? = null; private var _nextPageHandler: TaskHandler>; - val recyclerData: RecyclerData, StaggeredGridLayoutManager, TPager, TResult, TConverted, InsertedViewHolder>; + val recyclerData: RecyclerData, LinearLayoutManager, TPager, TResult, TConverted, InsertedViewHolder>; val fragment: TFragment; private val _scrollListener: RecyclerView.OnScrollListener; private var _automaticNextPageCounter = 0; - constructor(fragment: TFragment, inflater: LayoutInflater, cachedRecyclerData: RecyclerData, StaggeredGridLayoutManager, TPager, TResult, TConverted, InsertedViewHolder>? = null) : super(inflater.context) { + constructor(fragment: TFragment, inflater: LayoutInflater, cachedRecyclerData: RecyclerData, LinearLayoutManager, TPager, TResult, TConverted, InsertedViewHolder>? = null) : super(inflater.context) { this.fragment = fragment; inflater.inflate(R.layout.fragment_feed, this); @@ -161,7 +158,7 @@ abstract class FeedView : L super.onScrolled(recyclerView, dx, dy); val visibleItemCount = _recyclerResults.childCount; - val firstVisibleItem = recyclerData.layoutManager.findFirstVisibleItemPositions(IntArray(recyclerData.layoutManager.spanCount))[0] + val firstVisibleItem = recyclerData.layoutManager.findFirstVisibleItemPosition(); //Logger.i(TAG, "onScrolled loadNextPage visibleItemCount=$visibleItemCount firstVisibleItem=$visibleItemCount") if (!_loading && firstVisibleItem + visibleItemCount + visibleThreshold >= recyclerData.results.size && firstVisibleItem > 0) { @@ -177,7 +174,7 @@ abstract class FeedView : L private fun ensureEnoughContentVisible(filteredResults: List) { val canScroll = if (recyclerData.results.isEmpty()) false else { val layoutManager = recyclerData.layoutManager - val firstVisibleItemPosition = layoutManager.findFirstVisibleItemPositions(IntArray(recyclerData.layoutManager.spanCount))[0] + val firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition() if (firstVisibleItemPosition != RecyclerView.NO_POSITION) { val firstVisibleView = layoutManager.findViewByPosition(firstVisibleItemPosition) @@ -229,23 +226,7 @@ abstract class FeedView : L } } - private fun updateSpanCount(){ - if (resources.configuration.screenWidthDp >= resources.getDimension(R.dimen.landscape_threshold) && recyclerData.layoutManager.spanCount != 2){ - recyclerData.layoutManager.spanCount = 2 - } else if (resources.configuration.screenWidthDp < resources.getDimension(R.dimen.landscape_threshold) && recyclerData.layoutManager.spanCount != 1){ - recyclerData.layoutManager.spanCount = 1 - } - } - - override fun onConfigurationChanged(newConfig: Configuration?) { - super.onConfigurationChanged(newConfig) - - updateSpanCount() - } - fun onResume() { - updateSpanCount() - //Reload the pager if the plugin was killed val pager = recyclerData.pager; if((pager is MultiPager<*> && pager.findPager { it is JSPager<*> && !it.isAvailable } != null) || @@ -296,8 +277,8 @@ abstract class FeedView : L } } protected abstract fun createAdapter(recyclerResults: RecyclerView, context: Context, dataset: ArrayList): InsertedViewAdapterWithLoader; - protected abstract fun createLayoutManager(recyclerResults: RecyclerView, context: Context): StaggeredGridLayoutManager; - protected open fun onRestoreCachedData(cachedData: RecyclerData, StaggeredGridLayoutManager, TPager, TResult, TConverted, InsertedViewHolder>) {} + protected abstract fun createLayoutManager(recyclerResults: RecyclerView, context: Context): LinearLayoutManager; + protected open fun onRestoreCachedData(cachedData: RecyclerData, LinearLayoutManager, TPager, TResult, TConverted, InsertedViewHolder>) {} protected fun setProgress(fin: Int, total: Int) { val progress = (fin.toFloat() / total); diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/HomeFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/HomeFragment.kt index a09d1b46..d0994783 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/HomeFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/HomeFragment.kt @@ -6,9 +6,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.lifecycle.lifecycleScope -import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.futo.platformplayer.* import com.futo.platformplayer.activities.MainActivity import com.futo.platformplayer.api.media.models.contents.IPlatformContent @@ -46,7 +44,7 @@ class HomeFragment : MainFragment() { override val hasBottomBar: Boolean get() = true; private var _view: HomeView? = null; - private var _cachedRecyclerData: FeedView.RecyclerData, StaggeredGridLayoutManager, IPager, IPlatformContent, IPlatformContent, InsertedViewHolder>? = null; + private var _cachedRecyclerData: FeedView.RecyclerData, LinearLayoutManager, IPager, IPlatformContent, IPlatformContent, InsertedViewHolder>? = null; override fun onShownWithView(parameter: Any?, isBack: Boolean) { super.onShownWithView(parameter, isBack); @@ -100,7 +98,7 @@ class HomeFragment : MainFragment() { private val _taskGetPager: TaskHandler>; override val shouldShowTimeBar: Boolean get() = Settings.instance.home.progressBar - constructor(fragment: HomeFragment, inflater: LayoutInflater, cachedRecyclerData: RecyclerData, StaggeredGridLayoutManager, IPager, IPlatformContent, IPlatformContent, InsertedViewHolder>? = null) : super(fragment, inflater, cachedRecyclerData) { + constructor(fragment: HomeFragment, inflater: LayoutInflater, cachedRecyclerData: RecyclerData, LinearLayoutManager, IPager, IPlatformContent, IPlatformContent, InsertedViewHolder>? = null) : super(fragment, inflater, cachedRecyclerData) { _announcementsView = AnnouncementView(context, null).apply { headerView.addView(this); }; 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 40782c4a..03d9a626 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 @@ -7,9 +7,7 @@ import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.lifecycle.lifecycleScope -import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.futo.platformplayer.* import com.futo.platformplayer.activities.MainActivity import com.futo.platformplayer.api.media.IPlatformClient @@ -59,7 +57,7 @@ class SubscriptionsFeedFragment : MainFragment() { private var _view: SubscriptionsFeedView? = null; private var _group: SubscriptionGroup? = null; - private var _cachedRecyclerData: FeedView.RecyclerData, StaggeredGridLayoutManager, IPager, IPlatformContent, IPlatformContent, InsertedViewHolder>? = null; + private var _cachedRecyclerData: FeedView.RecyclerData, LinearLayoutManager, IPager, IPlatformContent, IPlatformContent, InsertedViewHolder>? = null; override fun onShownWithView(parameter: Any?, isBack: Boolean) { super.onShownWithView(parameter, isBack); @@ -112,7 +110,7 @@ class SubscriptionsFeedFragment : MainFragment() { var subGroup: SubscriptionGroup? = null; - constructor(fragment: SubscriptionsFeedFragment, inflater: LayoutInflater, cachedRecyclerData: RecyclerData, StaggeredGridLayoutManager, IPager, IPlatformContent, IPlatformContent, InsertedViewHolder>? = null) : super(fragment, inflater, cachedRecyclerData) { + constructor(fragment: SubscriptionsFeedFragment, inflater: LayoutInflater, cachedRecyclerData: RecyclerData, LinearLayoutManager, IPager, IPlatformContent, IPlatformContent, InsertedViewHolder>? = null) : super(fragment, inflater, cachedRecyclerData) { Logger.i(TAG, "SubscriptionsFeedFragment constructor()"); StateSubscriptions.instance.global.onUpdateProgress.subscribe(this) { progress, total -> }; @@ -397,7 +395,7 @@ class SubscriptionsFeedFragment : MainFragment() { _taskGetPager.run(withRefetch); } - override fun onRestoreCachedData(cachedData: RecyclerData, StaggeredGridLayoutManager, IPager, IPlatformContent, IPlatformContent, InsertedViewHolder>) { + override fun onRestoreCachedData(cachedData: RecyclerData, LinearLayoutManager, IPager, IPlatformContent, IPlatformContent, InsertedViewHolder>) { super.onRestoreCachedData(cachedData); setEmptyPager(cachedData.results.isEmpty()); } diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/TutorialFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/TutorialFragment.kt index 8e223e53..5139c0f8 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/TutorialFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/TutorialFragment.kt @@ -6,7 +6,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.LinearLayout -import android.widget.ScrollView import android.widget.TextView import com.futo.platformplayer.* import com.futo.platformplayer.api.media.IPlatformClient @@ -59,15 +58,7 @@ class TutorialFragment : MainFragment() { } @SuppressLint("ViewConstructor") - class TutorialView(fragment: TutorialFragment, inflater: LayoutInflater) : - ScrollView(inflater.context) { - init { - addView(TutorialContainer(fragment, inflater)) - } - } - - @SuppressLint("ViewConstructor") - class TutorialContainer : LinearLayout { + class TutorialView : LinearLayout { val fragment: TutorialFragment constructor(fragment: TutorialFragment, inflater: LayoutInflater) : super(inflater.context) { diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailFragment.kt index 00cf2471..cbefca3b 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailFragment.kt @@ -29,7 +29,6 @@ import com.futo.platformplayer.models.PlatformVideoWithTime import com.futo.platformplayer.models.UrlVideoWithTime import com.futo.platformplayer.states.StatePlayer import com.futo.platformplayer.views.containers.SingleViewTouchableMotionLayout -import kotlin.math.min class VideoDetailFragment : MainFragment { @@ -97,18 +96,17 @@ class VideoDetailFragment : MainFragment { val currentOrientation = _currentOrientation val isFs = isFullscreen - if (StatePlayer.instance.rotationLock && isMaximized) { - activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LOCKED - } else if (isFullscreen && !isFullScreenPortraitAllowed) { - activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE + if (isFs && isMaximized) { + if (isFullScreenPortraitAllowed) { + activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR + } else { + activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE + } } else { - activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED + activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT } - Log.i( - TAG, - "updateOrientation (isFs = ${isFs}, currentOrientation = ${currentOrientation}, isMaximized = ${isMaximized}, isFullScreenPortraitAllowed = ${isFullScreenPortraitAllowed}) resulted in requested orientation ${activity?.requestedOrientation}" - ); + Log.i(TAG, "updateOrientation (isFs = ${isFs}, currentOrientation = ${currentOrientation}, isMaximized = ${isMaximized}, isFullScreenPortraitAllowed = ${isFullScreenPortraitAllowed}) resulted in requested orientation ${activity?.requestedOrientation}"); } override fun onShownWithView(parameter: Any?, isBack: Boolean) { @@ -286,23 +284,15 @@ class VideoDetailFragment : MainFragment { _orientationListener = SimpleOrientationListener(requireActivity(), lifecycleScope) _orientationListener.onOrientationChanged.subscribe { _currentOrientation = it - Logger.i( - TAG, - "Current orientation changed (_currentOrientation = ${_currentOrientation})" - ) + Logger.i(TAG, "Current orientation changed (_currentOrientation = ${_currentOrientation})") - val isSmallWindow = min( - resources.configuration.screenWidthDp, - resources.configuration.screenHeightDp - ) < resources.getDimension(R.dimen.landscape_threshold) - - if (Settings.instance.playback.isAutoRotate() && isSmallWindow) { - if (!isFullscreen && (it == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE || it == ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE || it == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT)) { + if (Settings.instance.playback.isAutoRotate()) { + if (!isFullscreen && (it == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE || it == ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE)) { _viewDetail?.setFullscreen(true) return@subscribe } - if (isFullscreen && !Settings.instance.playback.fullscreenPortrait && (it == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)) { + if (isFullscreen && !Settings.instance.playback.fullscreenPortrait && (it == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT || it == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT)) { _viewDetail?.setFullscreen(false) return@subscribe } diff --git a/app/src/main/res/values/dimensions.xml b/app/src/main/res/values/dimensions.xml index 320998e2..d3c299e7 100644 --- a/app/src/main/res/values/dimensions.xml +++ b/app/src/main/res/values/dimensions.xml @@ -2,5 +2,4 @@ 200dp - 300dp - + \ No newline at end of file diff --git a/app/src/unstable/AndroidManifest.xml b/app/src/unstable/AndroidManifest.xml index 1304222e..a30bb7af 100644 --- a/app/src/unstable/AndroidManifest.xml +++ b/app/src/unstable/AndroidManifest.xml @@ -7,8 +7,7 @@ - +