diff --git a/app/build.gradle b/app/build.gradle index 80618f72..b67e3bed 100644 --- a/app/build.gradle +++ b/app/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 diff --git a/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java b/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java index 435d35bc..72919f2b 100644 --- a/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java +++ b/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java @@ -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); } diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java index 871f50e1..925cdb8b 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java @@ -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 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(); } diff --git a/app/src/main/java/com/github/tvbox/osc/ui/adapter/ParseAdapter.java b/app/src/main/java/com/github/tvbox/osc/ui/adapter/ParseAdapter.java index 4d41ab21..087a1bdd 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/adapter/ParseAdapter.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/adapter/ParseAdapter.java @@ -26,5 +26,8 @@ public class ParseAdapter extends BaseQuickAdapter { tvParse.setTextColor(Color.WHITE); } tvParse.setText(item.getName()); + if (helper.getLayoutPosition() == 0) { + helper.itemView.setNextFocusLeftId(R.id.screen_display); + } } } \ No newline at end of file diff --git a/app/src/main/java/com/github/tvbox/osc/ui/adapter/SeriesAdapter.java b/app/src/main/java/com/github/tvbox/osc/ui/adapter/SeriesAdapter.java index c7d0f95c..aa50d18f 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/adapter/SeriesAdapter.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/adapter/SeriesAdapter.java @@ -29,5 +29,9 @@ public class SeriesAdapter extends BaseQuickAdapter @@ -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" diff --git a/app/src/main/res/layout/player_vod_control_view.xml b/app/src/main/res/layout/player_vod_control_view.xml index e69296a1..7079f66a 100644 --- a/app/src/main/res/layout/player_vod_control_view.xml +++ b/app/src/main/res/layout/player_vod_control_view.xml @@ -157,6 +157,7 @@ tools:visibility="visible">