From b42fac341d3946737b2fe6511da57506cfe4dbdf Mon Sep 17 00:00:00 2001 From: Yuriy Liskov Date: Tue, 6 Oct 2020 20:18:46 +0300 Subject: [PATCH] refactor --- MediaServiceCore | 2 +- SharedModules | 2 +- .../playback/managers/PlayerUiManager.java | 87 ++++++++++++------- .../playback/managers/StateUpdater.java | 22 +++-- .../tv/ui/browse/BrowseFragment.java | 9 +- ...mHeaderItem.java => BrowseHeaderItem.java} | 8 +- .../tv/ui/browse/HeaderFragmentFactory.java | 4 +- .../LoginDialogFragment.java} | 6 +- .../tv/ui/browse/row/DynamicRowsFragment.java | 4 +- .../tv/ui/browse/row/HeaderRowsFragment.java | 6 ++ 10 files changed, 99 insertions(+), 51 deletions(-) rename smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/{CustomHeaderItem.java => BrowseHeaderItem.java} (63%) rename smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/{BrowseDialogFragment.java => dialog/LoginDialogFragment.java} (88%) diff --git a/MediaServiceCore b/MediaServiceCore index 86a29ff4a..9adf4cb3b 160000 --- a/MediaServiceCore +++ b/MediaServiceCore @@ -1 +1 @@ -Subproject commit 86a29ff4a53b9f3530b2e8dca7d98fbca2c3a31e +Subproject commit 9adf4cb3b57303ab02d635a7707f690bf71b9b22 diff --git a/SharedModules b/SharedModules index 60a63864d..a6d7876c8 160000 --- a/SharedModules +++ b/SharedModules @@ -1 +1 @@ -Subproject commit 60a63864d961a2b1ea2f5226d36a8875606ab05a +Subproject commit a6d7876c831179efb19d66c2f27bde1252727bd3 diff --git a/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/models/playback/managers/PlayerUiManager.java b/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/models/playback/managers/PlayerUiManager.java index 2aa13ba4c..b02bbffb6 100644 --- a/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/models/playback/managers/PlayerUiManager.java +++ b/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/models/playback/managers/PlayerUiManager.java @@ -5,7 +5,6 @@ import android.os.Handler; import android.os.Looper; import com.liskovsoft.mediaserviceinterfaces.MediaItemManager; import com.liskovsoft.mediaserviceinterfaces.MediaService; -import com.liskovsoft.mediaserviceinterfaces.data.MediaItem; import com.liskovsoft.mediaserviceinterfaces.data.MediaItemMetadata; import com.liskovsoft.sharedutils.helpers.KeyHelpers; import com.liskovsoft.sharedutils.helpers.MessageHelpers; @@ -23,17 +22,17 @@ import io.reactivex.Observable; import io.reactivex.schedulers.Schedulers; import java.util.List; -import java.util.concurrent.Callable; public class PlayerUiManager extends PlayerEventListenerHelper implements MetadataListener { private static final String TAG = PlayerUiManager.class.getSimpleName(); private final Handler mHandler; - private static final long UI_HIDE_TIMEOUT_MS = 2_000; + private static final long UI_AUTO_HIDE_TIMEOUT_MS = 2_000; + private static final long UI_AUTO_SHOW_TIMEOUT_MS = 3_000; private static final long SUGGESTIONS_RESET_TIMEOUT_MS = 500; private boolean mEngineReady; private boolean mDebugViewEnabled; private final Runnable mSuggestionsResetHandler = () -> mController.resetSuggestedPosition(); - private final Runnable mUiVisibilityHandler = () -> { + private final Runnable mUiAutoHideHandler = () -> { if (mController.isPlaying()) { if (!mController.isSuggestionsShown()) { // don't hide when suggestions is shown mController.showControls(false); @@ -44,11 +43,22 @@ public class PlayerUiManager extends PlayerEventListenerHelper implements Metada enableUiAutoHideTimeout(); } }; + private final Runnable mUiAutoShowHandler = () -> { + if (!mController.isPlaying()) { + mController.showControls(true); + } + }; public PlayerUiManager() { mHandler = new Handler(Looper.getMainLooper()); } + @Override + public void openVideo(Video item) { + // If video can't be loaded show at least some infos. + enableUiAutoShowTimeout(); + } + @Override public void onActivity(Activity activity) { super.onActivity(activity); @@ -118,8 +128,7 @@ public class PlayerUiManager extends PlayerEventListenerHelper implements Metada Log.d(TAG, "Engine released. Disabling all callbacks..."); mEngineReady = false; - disableUiAutoHideTimeout(); - disableSuggestionsResetTimeout(); + disposeTimeouts(); } @Override @@ -139,30 +148,6 @@ public class PlayerUiManager extends PlayerEventListenerHelper implements Metada mController.setSubscribeButtonState(metadata.isSubscribed()); } - public void disableUiAutoHideTimeout() { - Log.d(TAG, "Stopping hide ui timer..."); - mHandler.removeCallbacks(mUiVisibilityHandler); - } - - public void enableUiAutoHideTimeout() { - Log.d(TAG, "Starting hide ui timer..."); - if (mEngineReady) { - mHandler.postDelayed(mUiVisibilityHandler, UI_HIDE_TIMEOUT_MS); - } - } - - private void disableSuggestionsResetTimeout() { - Log.d(TAG, "Stopping reset position timer..."); - mHandler.removeCallbacks(mSuggestionsResetHandler); - } - - private void enableSuggestionsResetTimeout() { - Log.d(TAG, "Starting reset position timer..."); - if (mEngineReady) { - mHandler.postDelayed(mSuggestionsResetHandler, SUGGESTIONS_RESET_TIMEOUT_MS); - } - } - @Override public void onSubscribeClicked(boolean subscribed) { Video video = mController.getVideo(); @@ -237,4 +222,46 @@ public class PlayerUiManager extends PlayerEventListenerHelper implements Metada .subscribeOn(Schedulers.newThread()) .subscribe(); } + + public void disableUiAutoHideTimeout() { + Log.d(TAG, "Stopping auto hide ui timer..."); + mHandler.removeCallbacks(mUiAutoHideHandler); + } + + public void enableUiAutoHideTimeout() { + Log.d(TAG, "Starting auto hide ui timer..."); + if (mEngineReady) { + mHandler.postDelayed(mUiAutoHideHandler, UI_AUTO_HIDE_TIMEOUT_MS); + } + } + + private void disableSuggestionsResetTimeout() { + Log.d(TAG, "Stopping reset position timer..."); + mHandler.removeCallbacks(mSuggestionsResetHandler); + } + + private void enableSuggestionsResetTimeout() { + Log.d(TAG, "Starting reset position timer..."); + if (mEngineReady) { + mHandler.postDelayed(mSuggestionsResetHandler, SUGGESTIONS_RESET_TIMEOUT_MS); + } + } + + private void disableUiAutoShowTimeout() { + Log.d(TAG, "Stopping auto show ui timer..."); + mHandler.removeCallbacks(mUiAutoShowHandler); + } + + private void enableUiAutoShowTimeout() { + Log.d(TAG, "Starting auto show ui timer..."); + if (mEngineReady) { + mHandler.postDelayed(mUiAutoShowHandler, UI_AUTO_SHOW_TIMEOUT_MS); + } + } + + private void disposeTimeouts() { + disableUiAutoShowTimeout(); + disableUiAutoHideTimeout(); + disableSuggestionsResetTimeout(); + } } diff --git a/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/models/playback/managers/StateUpdater.java b/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/models/playback/managers/StateUpdater.java index d4022d940..7484d8830 100644 --- a/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/models/playback/managers/StateUpdater.java +++ b/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/models/playback/managers/StateUpdater.java @@ -18,7 +18,6 @@ import java.util.Map; public class StateUpdater extends PlayerEventListenerHelper { private boolean mIsPlaying; - private float mSpeed = -1; private int mRepeatMode = 0; private FormatItem mVideoFormat; private FormatItem mAudioFormat; @@ -31,14 +30,20 @@ public class StateUpdater extends PlayerEventListenerHelper { private static class State { public final long positionMs; private final long lengthMs; + public final float speed; public State(long positionMs) { this(positionMs, -1); } public State(long positionMs, long lengthMs) { + this(positionMs, lengthMs, 1.0f); + } + + public State(long positionMs, long lengthMs, float speed) { this.positionMs = positionMs; this.lengthMs = lengthMs; + this.speed = speed; } } @@ -114,7 +119,7 @@ public class StateUpdater extends PlayerEventListenerHelper { public void onVideoLoaded(Video item) { // on this state video length is not undefined restorePosition(item); - restoreSpeed(); + restoreSpeed(item); // Player thinks that subs not enabled if did it too early (e.g. on source change event). restoreSubtitleFormat(); } @@ -166,7 +171,7 @@ public class StateUpdater extends PlayerEventListenerHelper { Video video = mController.getVideo(); if (video != null) { - mStates.put(video.videoId, new State(mController.getPositionMs(), mController.getLengthMs())); + mStates.put(video.videoId, new State(mController.getPositionMs(), mController.getLengthMs(), mController.getSpeed())); } } @@ -212,9 +217,15 @@ public class StateUpdater extends PlayerEventListenerHelper { } } - private void restoreSpeed() { + private void restoreSpeed(Video item) { if (mController.getLengthMs() - mController.getPositionMs() > 30_000) { - mController.setSpeed(mSpeed); + State state = mStates.get(item.videoId); + + if (state != null) { + mController.setSpeed(state.speed); + } else { + mController.setSpeed(1.0f); // speed may be changed before, so do reset to default + } } else { mController.setSpeed(1.0f); // speed may be changed before, so do reset to default } @@ -252,7 +263,6 @@ public class StateUpdater extends PlayerEventListenerHelper { String.valueOf(speed), optionItem -> { mController.setSpeed(speed); - mSpeed = speed; }, mController.getSpeed() == speed)); } diff --git a/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/BrowseFragment.java b/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/BrowseFragment.java index f6ff75ad4..42e3abf73 100644 --- a/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/BrowseFragment.java +++ b/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/BrowseFragment.java @@ -24,6 +24,7 @@ import com.liskovsoft.smartyoutubetv2.common.app.presenters.BrowsePresenter; import com.liskovsoft.smartyoutubetv2.common.app.views.BrowseView; import com.liskovsoft.smartyoutubetv2.tv.R; import com.liskovsoft.smartyoutubetv2.tv.presenter.IconHeaderItemPresenter; +import com.liskovsoft.smartyoutubetv2.tv.ui.browse.dialog.LoginDialogFragment; import com.liskovsoft.smartyoutubetv2.tv.ui.search.SearchActivity; import java.util.HashMap; @@ -56,6 +57,8 @@ public class BrowseFragment extends BrowseSupportFragment implements BrowseView // Prepare the manager that maintains the same background image between activities. //prepareBackgroundManager(); setupEventListeners(); + + enableMainFragmentScaling(false); } @Override @@ -99,7 +102,7 @@ public class BrowseFragment extends BrowseSupportFragment implements BrowseView private int getHeaderResId(Object o) { if (o instanceof PageRow) { - return ((CustomHeaderItem) ((PageRow) o).getHeaderItem()).getResId(); + return ((BrowseHeaderItem) ((PageRow) o).getHeaderItem()).getResId(); } return -1; @@ -139,7 +142,7 @@ public class BrowseFragment extends BrowseSupportFragment implements BrowseView private void showErrorIfEmpty(ErrorFragmentData data) { if (mHeaderFragmentFactory.isEmpty()) { - replaceMainFragment(new BrowseDialogFragment(data)); + replaceMainFragment(new LoginDialogFragment(data)); } } @@ -178,7 +181,7 @@ public class BrowseFragment extends BrowseSupportFragment implements BrowseView } private void createHeader(Header header) { - HeaderItem headerItem = new CustomHeaderItem(header.getId(), header.getTitle(), header.getType(), header.getResId());; + HeaderItem headerItem = new BrowseHeaderItem(header.getId(), header.getTitle(), header.getType(), header.getResId());; PageRow pageRow = new PageRow(headerItem); mCategoryRowAdapter.add(pageRow); diff --git a/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/CustomHeaderItem.java b/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/BrowseHeaderItem.java similarity index 63% rename from smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/CustomHeaderItem.java rename to smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/BrowseHeaderItem.java index df62d864f..f923ecd0f 100644 --- a/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/CustomHeaderItem.java +++ b/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/BrowseHeaderItem.java @@ -2,21 +2,21 @@ package com.liskovsoft.smartyoutubetv2.tv.ui.browse; import androidx.leanback.widget.HeaderItem; -public class CustomHeaderItem extends HeaderItem { +public class BrowseHeaderItem extends HeaderItem { private int mType = -1; private int mResId = -1; - public CustomHeaderItem(long id, String name, int type, int resId) { + public BrowseHeaderItem(long id, String name, int type, int resId) { super(id, name); mType = type; mResId = resId; } - public CustomHeaderItem(long id, String name) { + public BrowseHeaderItem(long id, String name) { super(id, name); } - public CustomHeaderItem(String name) { + public BrowseHeaderItem(String name) { super(name); } diff --git a/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/HeaderFragmentFactory.java b/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/HeaderFragmentFactory.java index d6234a561..252e1be80 100644 --- a/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/HeaderFragmentFactory.java +++ b/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/HeaderFragmentFactory.java @@ -38,8 +38,8 @@ public class HeaderFragmentFactory extends BrowseSupportFragment.FragmentFactory HeaderItem header = row.getHeaderItem(); Fragment fragment = null; - if (header instanceof CustomHeaderItem) { - int type = ((CustomHeaderItem) header).getType(); + if (header instanceof BrowseHeaderItem) { + int type = ((BrowseHeaderItem) header).getType(); if (type == Header.TYPE_ROW) { fragment = new HeaderRowsFragment(); diff --git a/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/BrowseDialogFragment.java b/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/dialog/LoginDialogFragment.java similarity index 88% rename from smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/BrowseDialogFragment.java rename to smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/dialog/LoginDialogFragment.java index ba3d4a548..006cf3648 100644 --- a/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/BrowseDialogFragment.java +++ b/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/dialog/LoginDialogFragment.java @@ -1,4 +1,4 @@ -package com.liskovsoft.smartyoutubetv2.tv.ui.browse; +package com.liskovsoft.smartyoutubetv2.tv.ui.browse.dialog; import android.os.Bundle; import android.os.Handler; @@ -10,7 +10,7 @@ import androidx.leanback.app.ErrorSupportFragment; import com.liskovsoft.smartyoutubetv2.common.app.models.signin.ErrorFragmentData; import com.liskovsoft.smartyoutubetv2.tv.R; -public class BrowseDialogFragment extends ErrorSupportFragment implements BrowseSupportFragment.MainFragmentAdapterProvider { +public class LoginDialogFragment extends ErrorSupportFragment implements BrowseSupportFragment.MainFragmentAdapterProvider { private static final boolean TRANSLUCENT = true; private static final int TIMER_DELAY = 1000; @@ -24,7 +24,7 @@ public class BrowseDialogFragment extends ErrorSupportFragment implements Browse } }; - public BrowseDialogFragment(ErrorFragmentData dialogData) { + public LoginDialogFragment(ErrorFragmentData dialogData) { mDialogData = dialogData; } diff --git a/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/row/DynamicRowsFragment.java b/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/row/DynamicRowsFragment.java index af7c69085..ad38e17ad 100644 --- a/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/row/DynamicRowsFragment.java +++ b/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/row/DynamicRowsFragment.java @@ -6,6 +6,7 @@ import android.widget.Toast; import androidx.annotation.Nullable; import androidx.leanback.app.RowsSupportFragment; import androidx.leanback.widget.ArrayObjectAdapter; +import androidx.leanback.widget.FocusHighlight; import androidx.leanback.widget.HeaderItem; import androidx.leanback.widget.ListRow; import androidx.leanback.widget.ListRowPresenter; @@ -30,6 +31,7 @@ import java.util.Map; public abstract class DynamicRowsFragment extends RowsSupportFragment implements VideoGroupFragment { private static final String TAG = DynamicRowsFragment.class.getSimpleName(); + private static final int ZOOM_FACTOR = FocusHighlight.ZOOM_FACTOR_MEDIUM; private UriBackgroundManager mBackgroundManager; private Handler mHandler; private ArrayObjectAdapter mRowsAdapter; @@ -67,7 +69,7 @@ public abstract class DynamicRowsFragment extends RowsSupportFragment implements } if (mRowsAdapter == null) { - mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter()); + mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter(ZOOM_FACTOR)); setAdapter(mRowsAdapter); } } diff --git a/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/row/HeaderRowsFragment.java b/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/row/HeaderRowsFragment.java index 3af11f1c0..2d43931f1 100644 --- a/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/row/HeaderRowsFragment.java +++ b/smartyoutubetv2/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/row/HeaderRowsFragment.java @@ -19,4 +19,10 @@ public class HeaderRowsFragment extends DynamicRowsFragment { protected VideoGroupPresenter getMainPresenter() { return BrowsePresenter.instance(getContext()); } + + @Override + public void setExpand(boolean expand) { + // force expand by default + super.setExpand(true); + } }