遥控上键直接定位到片头;

修正详情及解析列表焦点问题;
pull/144/head
21561 1 year ago
parent 9d493b09ac
commit 99960433a3
  1. 2
      app/build.gradle
  2. 50
      app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java
  3. 43
      app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java
  4. 3
      app/src/main/java/com/github/tvbox/osc/ui/adapter/ParseAdapter.java
  5. 4
      app/src/main/java/com/github/tvbox/osc/ui/adapter/SeriesAdapter.java
  6. 4
      app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java
  7. 10
      app/src/main/res/layout/activity_detail.xml
  8. 3
      app/src/main/res/layout/player_vod_control_view.xml
  9. 2
      player/build.gradle
  10. 2
      pyramid/build.gradle
  11. 2
      quickjs/build.gradle

@ -5,7 +5,7 @@ android {
defaultConfig {
applicationId 'com.github.tvbox.osc'
targetSdkVersion 28
targetSdkVersion 26
versionCode 1
versionName '1.0.0'
multiDexEnabled true

@ -90,7 +90,6 @@ public class VodController extends BaseController {
mPlayPauseTime.setVisibility(VISIBLE);
}
mPlayTitle.setVisibility(GONE);
mNextBtn.requestFocus();
backBtn.setVisibility(ScreenUtils.isTv(context) ? INVISIBLE : VISIBLE);
showLockView();
break;
@ -131,10 +130,11 @@ public class VodController extends BaseController {
ImageView mProgressIcon;
ImageView mLockView;
LinearLayout mBottomRoot;
LinearLayout mPlayBtnGroup;
LinearLayout mTopRoot1;
LinearLayout mTopRoot2;
LinearLayout mParseRoot;
TvRecyclerView mGridView;
TvRecyclerView mGridParseView;
TextView mPlayTitle;
TextView mPlayTitle1;
TextView mPlayLoadNetSpeedRightTop;
@ -211,9 +211,10 @@ public class VodController extends BaseController {
mBottomRoot = findViewById(R.id.bottom_container);
mTopRoot1 = findViewById(R.id.tv_top_l_container);
mTopRoot2 = findViewById(R.id.tv_top_r_container);
mPlayBtnGroup = findViewById(R.id.play_btn_group);
tv_screen_display = findViewById(R.id.tv_screen_display);
mParseRoot = findViewById(R.id.parse_root);
mGridView = findViewById(R.id.mGridView);
mGridParseView = findViewById(R.id.mGridParseView);
mPlayerRetry = findViewById(R.id.play_retry);
mPlayrefresh = findViewById(R.id.play_refresh);
mNextBtn = findViewById(R.id.play_next);
@ -289,7 +290,7 @@ public class VodController extends BaseController {
}
});
mGridView.setLayoutManager(new V7LinearLayoutManager(getContext(), 0, false));
mGridParseView.setLayoutManager(new V7LinearLayoutManager(getContext(), 0, false));
ParseAdapter parseAdapter = new ParseAdapter();
parseAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
@Override
@ -304,7 +305,7 @@ public class VodController extends BaseController {
hideBottom();
}
});
mGridView.setAdapter(parseAdapter);
mGridParseView.setAdapter(parseAdapter);
parseAdapter.setNewData(ApiConfig.get().getParseBeanList());
mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@ -450,8 +451,6 @@ public class VodController extends BaseController {
} catch (JSONException e) {
e.printStackTrace();
}
mPlayerBtn.requestFocus();
mPlayerBtn.requestFocusFromTouch();
}
});
@ -490,8 +489,6 @@ public class VodController extends BaseController {
} catch (Exception e) {
e.printStackTrace();
}
mPlayerBtn.requestFocus();
mPlayerBtn.requestFocusFromTouch();
}
@Override
@ -543,8 +540,6 @@ public class VodController extends BaseController {
} catch (JSONException e) {
e.printStackTrace();
}
mPlayerIJKBtn.requestFocus();
mPlayerIJKBtn.requestFocusFromTouch();
}
});
// 增加播放页面片头片尾时间重置
@ -670,9 +665,11 @@ public class VodController extends BaseController {
seekTime.setVisibility(disPlay);
if(disPlay==VISIBLE)mPlayPauseTime.setVisibility(disPlay);
Hawk.put(HawkConfig.SCREEN_DISPLAY, disPlay);
hideBottom();
}
});
mNextBtn.setNextFocusLeftId(R.id.play_time_start);
mNextBtn.setNextFocusLeftId(R.id.screen_display);
mScreenDisplay.setNextFocusRightId(R.id.play_next);
}
private void hideLiveAboutBtn() {
@ -682,14 +679,12 @@ public class VodController extends BaseController {
mPlayerTimeStartBtn.setVisibility(GONE);
mPlayerTimeSkipBtn.setVisibility(GONE);
mPlayerTimeResetBtn.setVisibility(GONE);
mNextBtn.setNextFocusLeftId(R.id.zimu_select);
} else {
mPlayerSpeedBtn.setVisibility(View.VISIBLE);
mPlayerTimeStartEndText.setVisibility(View.VISIBLE);
mPlayerTimeStartBtn.setVisibility(View.VISIBLE);
mPlayerTimeSkipBtn.setVisibility(View.VISIBLE);
mPlayerTimeResetBtn.setVisibility(View.VISIBLE);
mNextBtn.setNextFocusLeftId(R.id.play_time_start);
}
}
@ -940,6 +935,13 @@ public class VodController extends BaseController {
void showBottom() {
mHandler.removeMessages(1003);
mHandler.sendEmptyMessage(1002);
mNextBtn.requestFocus();
}
void showUpBottom() {
mHandler.removeMessages(1003);
mHandler.sendEmptyMessage(1002);
mPlayerTimeStartBtn.requestFocus();
}
void hideBottom() {
@ -973,7 +975,6 @@ public class VodController extends BaseController {
togglePlay();
return true;
}
// } else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) { return true;// 闲置开启计时关闭透明底栏
} else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN || keyCode== KeyEvent.KEYCODE_MENU) {
if (!isBottomVisible()) {
showBottom();
@ -1045,14 +1046,18 @@ public class VodController extends BaseController {
private final Handler mmHandler = new Handler();
private Runnable mLongPressRunnable;
private static final long LONG_PRESS_DELAY = 800;
private boolean isLongPressTriggered = false;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (isBottomVisible()) return super.onKeyDown(keyCode, event);
if ((keyCode == KeyEvent.KEYCODE_DPAD_UP) && event.getRepeatCount() == 0) {
if (keyCode == KeyEvent.KEYCODE_DPAD_UP && event.getRepeatCount() == 0) {
isLongPressTriggered = false;
mLongPressRunnable = new Runnable() {
@Override
public void run() {
speedPlayStart();
isLongPressTriggered = true;
}
};
mmHandler.postDelayed(mLongPressRunnable, LONG_PRESS_DELAY);
@ -1064,11 +1069,22 @@ public class VodController extends BaseController {
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
// 移除长按回调
if (mLongPressRunnable != null) {
mmHandler.removeCallbacks(mLongPressRunnable);
mLongPressRunnable = null;
}
speedPlayEnd();
if (isLongPressTriggered) {
speedPlayEnd();
} else {
if (!isBottomVisible()) {
showUpBottom();
myHandle.postDelayed(myRunnable, myHandleSeconds);
}else {
return super.onKeyUp(keyCode, event);
}
}
return true;
}
return super.onKeyUp(keyCode, event);
}

@ -9,7 +9,6 @@ import android.os.Bundle;
import android.text.Html;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
@ -50,12 +49,7 @@ import com.github.tvbox.osc.util.MD5;
import com.github.tvbox.osc.util.SearchHelper;
import com.github.tvbox.osc.util.SubtitleHelper;
import com.github.tvbox.osc.viewmodel.SourceViewModel;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.AbsCallback;
import com.lzy.okgo.model.Response;
import com.orhanobut.hawk.Hawk;
import com.owen.tvrecyclerview.widget.TvRecyclerView;
import com.owen.tvrecyclerview.widget.V7GridLayoutManager;
@ -71,22 +65,16 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import me.jessyan.autosize.utils.AutoSizeUtils;
import android.graphics.Paint;
import android.text.TextPaint;
import androidx.annotation.NonNull;
import android.graphics.Typeface;
import androidx.recyclerview.widget.RecyclerView;
/**
* @author pj567
@ -203,7 +191,6 @@ public class DetailActivity extends BaseActivity {
getSupportFragmentManager().beginTransaction().show(playFragment).commitAllowingStateLoss();
tvPlay.setText("全屏");
}
llPlayerFragmentContainerBlock.setFocusable(showPreview);
mSeriesGroupView = findViewById(R.id.mSeriesGroupView);
tvSeriesGroup = findViewById(R.id.mSeriesGroupTv);
@ -218,9 +205,6 @@ public class DetailActivity extends BaseActivity {
};
mSeriesGroupView.setAdapter(seriesGroupAdapter);
//禁用播放地址焦点
tvPlayUrl.setFocusable(false);
llPlayerFragmentContainerBlock.setOnClickListener(v -> {
toggleFullPreview();
if (firstReverse) {
@ -491,7 +475,12 @@ public class DetailActivity extends BaseActivity {
}
});
llPlayerFragmentContainerBlock.setFocusable(showPreview);
if(showPreview){
llPlayerFragmentContainerBlock.requestFocus();
}else {
tvPlay.requestFocus();
}
setLoadSir(llLayout);
}
@ -624,7 +613,6 @@ public class DetailActivity extends BaseActivity {
seriesGroupAdapter.notifyDataSetChanged();
}else {
tvSeriesGroup.setVisibility(View.GONE);
mGridView.setNextFocusUpId(R.id.mGridViewFlag);
}
}
@ -787,28 +775,29 @@ public class DetailActivity extends BaseActivity {
}
}
private boolean isFirstLoad = true;
@Subscribe(threadMode = ThreadMode.MAIN)
public void refresh(RefreshEvent event) {
if (event.type == RefreshEvent.TYPE_REFRESH) {
if (event.obj != null) {
if (event.obj instanceof Integer) {
int index = (int) event.obj;
for (int j = 0; j < vodInfo.seriesMap.get(vodInfo.playFlag).size(); j++) {
for (int j = 0; j < Objects.requireNonNull(vodInfo.seriesMap.get(vodInfo.playFlag)).size(); j++) {
seriesAdapter.getData().get(j).selected = false;
seriesAdapter.notifyItemChanged(j);
}
seriesAdapter.getData().get(index).selected = true;
seriesAdapter.notifyItemChanged(index);
mGridView.setSelection(index);
if(!isFirstLoad)mGridView.setSelection(index);
vodInfo.playIndex = index;
//保存历史
insertVod(firstsourceKey, vodInfo);
// insertVod(sourceKey, vodInfo);
isFirstLoad = false;
} else if (event.obj instanceof JSONObject) {
vodInfo.playerCfg = ((JSONObject) event.obj).toString();
vodInfo.playerCfg = event.obj.toString();
//保存历史
insertVod(firstsourceKey, vodInfo);
// insertVod(sourceKey, vodInfo);
}
}
@ -971,10 +960,10 @@ public class DetailActivity extends BaseActivity {
if (playFragment.onBackPressed())
return;
toggleFullPreview();
mGridView.requestFocus();
List<VodInfo.VodSeries> list = vodInfo.seriesMap.get(vodInfo.playFlag);
assert list != null;
tvSeriesGroup.setVisibility(list.size()>1 ? View.VISIBLE : View.GONE);
if(list.size()<=1)mGridView.setNextFocusUpId(R.id.mGridViewFlag);
mGridView.requestFocus();
return;
}
if (seriesSelect) {
@ -1038,10 +1027,10 @@ public class DetailActivity extends BaseActivity {
//全屏下禁用详情页几个按键的焦点 防止上键跑过来
tvPlay.setFocusable(!fullWindows);
// tvSort.setFocusable(!fullWindows);
tvDesc.setFocusable(!fullWindows);
tvCollect.setFocusable(!fullWindows);
tvQuickSearch.setFocusable(!fullWindows);
llPlayerFragmentContainerBlock.setFocusable(!fullWindows);
toggleSubtitleTextSize();
}

@ -26,5 +26,8 @@ public class ParseAdapter extends BaseQuickAdapter<ParseBean, BaseViewHolder> {
tvParse.setTextColor(Color.WHITE);
}
tvParse.setText(item.getName());
if (helper.getLayoutPosition() == 0) {
helper.itemView.setNextFocusLeftId(R.id.screen_display);
}
}
}

@ -29,5 +29,9 @@ public class SeriesAdapter extends BaseQuickAdapter<VodInfo.VodSeries, BaseViewH
tvSeries.setTextColor(Color.WHITE);
}
helper.setText(R.id.tvSeries, item.name);
if (getData().size() == 1 && helper.getLayoutPosition() == 0) {
helper.itemView.setNextFocusUpId(R.id.mGridViewFlag);
}
}
}

@ -784,9 +784,9 @@ public class PlayFragment extends BaseLazyFragment {
}
public boolean onBackPressed() {
int requestedOrientation = getActivity().getRequestedOrientation();
int requestedOrientation = requireActivity().getRequestedOrientation();
if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT || requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT || requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT) {
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
mController.mLandscapePortraitBtn.setText("竖屏");
}
if (mController.onBackPressed()) {

@ -45,6 +45,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/vs_5"
android:focusable="false"
android:ellipsize="end"
android:maxLines="1"
android:singleLine="true"
@ -63,6 +64,7 @@
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/vs_10"
android:layout_marginRight="@dimen/vs_10"
android:focusable="false"
android:ellipsize="end"
android:maxLines="1"
android:singleLine="true"
@ -75,6 +77,7 @@
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/vs_10"
android:layout_marginRight="@dimen/vs_10"
android:focusable="false"
android:ellipsize="end"
android:maxLines="1"
android:singleLine="true"
@ -87,6 +90,7 @@
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/vs_10"
android:layout_marginRight="@dimen/vs_10"
android:focusable="false"
android:ellipsize="end"
android:maxLines="1"
android:singleLine="true"
@ -99,6 +103,7 @@
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/vs_10"
android:layout_marginRight="@dimen/vs_10"
android:focusable="false"
android:ellipsize="end"
android:maxLines="1"
android:singleLine="true"
@ -111,6 +116,7 @@
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/vs_10"
android:layout_marginRight="@dimen/vs_10"
android:focusable="false"
android:ellipsize="end"
android:maxLines="1"
android:singleLine="true"
@ -123,6 +129,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/vs_5"
android:focusable="false"
android:ellipsize="end"
android:singleLine="true"
android:textColor="@color/color_CCFFFFFF"
@ -133,6 +140,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/vs_5"
android:focusable="false"
android:ellipsize="end"
android:singleLine="true"
android:textColor="@color/color_CCFFFFFF"
@ -144,6 +152,7 @@
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:focusable="false"
android:textColor="@color/color_CCFFFFFF"
android:textSize="@dimen/ts_20" />
@ -152,6 +161,7 @@
android:id="@+id/tvDes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="false"
android:ellipsize="end"
android:lineSpacingMultiplier="1.2"
android:maxLines="3"

@ -157,6 +157,7 @@
tools:visibility="visible">
<LinearLayout
android:id="@+id/play_btn_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/vs_10"
@ -419,7 +420,7 @@
android:textSize="@dimen/ts_20" />
<com.owen.tvrecyclerview.widget.TvRecyclerView
android:id="@+id/mGridView"
android:id="@+id/mGridParseView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="false"

@ -7,7 +7,7 @@ android {
defaultConfig {
minSdkVersion 16
targetSdkVersion 30
targetSdkVersion 26
}
buildTypes {

@ -8,7 +8,7 @@ android {
defaultConfig {
minSdkVersion 16
targetSdkVersion 30
targetSdkVersion 26
ndk {
//abiFilters 'arm64-v8a'
//noinspection ChromeOsAbiSupport

@ -8,7 +8,7 @@ android {
defaultConfig {
minSdkVersion 16
targetSdkVersion 30
targetSdkVersion 26
externalNativeBuild {
cmake {
abiFilters 'armeabi-v7a'

Loading…
Cancel
Save