From b1ee686acc3e47b5dfa1227454fd11bbd0b718de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8E=E4=BF=8A?= <215613905@qq.com> Date: Fri, 21 Mar 2025 17:36:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AE=8C=E5=96=84=E5=97=85?= =?UTF-8?q?=E6=8E=A2click=E7=82=B9=E5=87=BB=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tvbox/osc/ui/activity/HomeActivity.java | 36 +++++++++--------- .../tvbox/osc/ui/activity/PlayActivity.java | 10 ++++- .../tvbox/osc/ui/dialog/SelectDialog.java | 37 ++++++++++++++----- .../tvbox/osc/ui/fragment/PlayFragment.java | 31 ++++++++++------ 4 files changed, 75 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java index 3cf1ed6d..de871dd1 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java @@ -631,22 +631,26 @@ public class HomeActivity extends BaseActivity { ControlManager.get().stopServer(); } + private SelectDialog mSiteSwitchDialog; + void showSiteSwitch() { List sites = ApiConfig.get().getSwitchSourceBeanList(); - if (sites.size() > 0) { - SelectDialog dialog = new SelectDialog<>(HomeActivity.this); - TvRecyclerView tvRecyclerView = dialog.findViewById(R.id.list); - int spanCount; - spanCount = (int)Math.floor(sites.size()/20); + if (sites.isEmpty()) return; + int select = sites.indexOf(ApiConfig.get().getHomeSourceBean()); + if (select < 0) select = 0; + if (mSiteSwitchDialog == null) { + mSiteSwitchDialog = new SelectDialog<>(HomeActivity.this); + TvRecyclerView tvRecyclerView = mSiteSwitchDialog.findViewById(R.id.list); + // 根据 sites 数量动态计算列数 + int spanCount = (int) Math.floor(sites.size() / 20.0); spanCount = Math.min(spanCount, 2); - tvRecyclerView.setLayoutManager(new V7GridLayoutManager(dialog.getContext(), spanCount+1)); - ConstraintLayout cl_root = dialog.findViewById(R.id.cl_root); + tvRecyclerView.setLayoutManager(new V7GridLayoutManager(mSiteSwitchDialog.getContext(), spanCount + 1)); + // 设置对话框宽度 + ConstraintLayout cl_root = mSiteSwitchDialog.findViewById(R.id.cl_root); ViewGroup.LayoutParams clp = cl_root.getLayoutParams(); - clp.width = AutoSizeUtils.mm2px(dialog.getContext(), 380+200*spanCount); - dialog.setTip("请选择首页数据源"); - int select = sites.indexOf(ApiConfig.get().getHomeSourceBean()); - if (select<0) select = 0; - dialog.setAdapter(new SelectDialogAdapter.SelectDialogInterface() { + clp.width = AutoSizeUtils.mm2px(mSiteSwitchDialog.getContext(), 380 + 200 * spanCount); + mSiteSwitchDialog.setTip("请选择首页数据源"); + mSiteSwitchDialog.setAdapter(new SelectDialogAdapter.SelectDialogInterface() { @Override public void click(SourceBean value, int pos) { ApiConfig.get().setSourceBean(value); @@ -657,23 +661,21 @@ public class HomeActivity extends BaseActivity { intent.putExtras(bundle); HomeActivity.this.startActivity(intent); } - @Override public String getDisplay(SourceBean val) { return val.getName(); } }, new DiffUtil.ItemCallback() { @Override - public boolean areItemsTheSame(@NonNull @NotNull SourceBean oldItem, @NonNull @NotNull SourceBean newItem) { + public boolean areItemsTheSame(@NonNull SourceBean oldItem, @NonNull SourceBean newItem) { return oldItem == newItem; } - @Override - public boolean areContentsTheSame(@NonNull @NotNull SourceBean oldItem, @NonNull @NotNull SourceBean newItem) { + public boolean areContentsTheSame(@NonNull SourceBean oldItem, @NonNull SourceBean newItem) { return oldItem.getKey().equals(newItem.getKey()); } }, sites, select); - dialog.show(); } + mSiteSwitchDialog.show(); } } diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java index b8bf106f..6a9cdf15 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java @@ -1546,8 +1546,14 @@ public class PlayActivity extends BaseActivity { }else { selector=click.trim(); } - String js="$(\""+ selector+"\").click();"; - mSysWebView.loadUrl("javascript:"+js); + String js = selector; + if(!selector.contains("click()"))js+=".click();"; + LOG.i("echo-javascript:" + js); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + view.evaluateJavascript(js, null); + } else { + view.loadUrl("javascript:" + js); + } } } diff --git a/app/src/main/java/com/github/tvbox/osc/ui/dialog/SelectDialog.java b/app/src/main/java/com/github/tvbox/osc/ui/dialog/SelectDialog.java index 422dfa6d..f306f2a1 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/dialog/SelectDialog.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/dialog/SelectDialog.java @@ -6,9 +6,12 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.github.tvbox.osc.R; import com.github.tvbox.osc.ui.adapter.SelectDialogAdapter; +import com.owen.tvrecyclerview.widget.GridLayoutManager; import com.owen.tvrecyclerview.widget.TvRecyclerView; import org.jetbrains.annotations.NotNull; @@ -35,18 +38,34 @@ public class SelectDialog extends BaseDialog { ((TextView) findViewById(R.id.title)).setText(tip); } - public void setAdapter(SelectDialogAdapter.SelectDialogInterface sourceBeanSelectDialogInterface, DiffUtil.ItemCallback sourceBeanItemCallback, List data, int select) { - SelectDialogAdapter adapter = new SelectDialogAdapter(sourceBeanSelectDialogInterface, sourceBeanItemCallback); + public void setAdapter(SelectDialogAdapter.SelectDialogInterface sourceBeanSelectDialogInterface, + DiffUtil.ItemCallback sourceBeanItemCallback, + List data, int select) { + SelectDialogAdapter adapter = new SelectDialogAdapter<>(sourceBeanSelectDialogInterface, sourceBeanItemCallback); adapter.setData(data, select); - TvRecyclerView tvRecyclerView = ((TvRecyclerView) findViewById(R.id.list)); + TvRecyclerView tvRecyclerView = findViewById(R.id.list); tvRecyclerView.setAdapter(adapter); - tvRecyclerView.setSelectedPosition(select); - tvRecyclerView.post(new Runnable() { - @Override - public void run() { - tvRecyclerView.smoothScrollToPosition(select); - tvRecyclerView.setSelectionWithSmooth(select); + tvRecyclerView.post(() -> { + RecyclerView.LayoutManager layoutManager = tvRecyclerView.getLayoutManager(); + if (layoutManager instanceof GridLayoutManager) { + GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager; + int spanCount = gridLayoutManager.getNumColumns(); + int rowIndex = select / spanCount; + int firstVisibleRow = gridLayoutManager.getFirstVisiblePosition() / spanCount; + int lastVisibleRow = gridLayoutManager.getLastVisiblePosition() / spanCount; + // 平滑滚动并调整位置 + if (rowIndex < firstVisibleRow || rowIndex > lastVisibleRow) { + int offset = tvRecyclerView.getHeight() / 3; + gridLayoutManager.scrollToPositionWithOffset(select, offset); + } +// tvRecyclerView.postDelayed(() -> tvRecyclerView.smoothScrollToPosition(select), 200); + } else if (layoutManager instanceof LinearLayoutManager) { + LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager; + int offset = tvRecyclerView.getHeight() / 3; + linearLayoutManager.scrollToPositionWithOffset(select, offset); +// tvRecyclerView.postDelayed(() -> tvRecyclerView.smoothScrollToPosition(select), 200); } }); } + } diff --git a/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java b/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java index 6a3650ac..f2350615 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java @@ -1585,21 +1585,30 @@ public class PlayFragment extends BaseLazyFragment { @Override public void onPageFinished(WebView view, String url) { - super.onPageFinished(view,url); - String click=sourceBean.getClickSelector(); + super.onPageFinished(view, url); + String clickSelector = sourceBean.getClickSelector(); LOG.i("echo-onPageFinished url:" + url); - - if(!click.isEmpty()){ + if (clickSelector != null && !clickSelector.trim().isEmpty()) { String selector; - if(click.contains(";")){ - if(!url.contains(click.split(";")[0]))return; - selector=click.split(";")[1]; - }else { - selector=click.trim(); + if (clickSelector.contains(";")) { + String[] parts = clickSelector.split(";", 2); + if (!url.contains(parts[0])) { + return; + } + selector = parts[1].trim(); + } else { + selector = clickSelector.trim(); } - String js="$(\""+ selector+"\").click();"; +// selector="document.getElementById('playleft').children[0].contentWindow.document.getElementById('start')"; + // 构造点击的 JS 代码 + String js = selector; + if(!selector.contains("click()"))js+=".click();"; LOG.i("echo-javascript:" + js); - mSysWebView.loadUrl("javascript:"+js); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + view.evaluateJavascript(js, null); + } else { + view.loadUrl("javascript:" + js); + } } }