This commit is contained in:
Yuriy Liskov
2020-10-06 20:18:46 +03:00
parent a97b68a632
commit b42fac341d
10 changed files with 99 additions and 51 deletions

View File

@@ -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();
}
}

View File

@@ -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));
}

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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();

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}