diff --git a/app/build.gradle b/app/build.gradle index 4083009b7..64c9e49e1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -50,6 +50,10 @@ android { } } + packagingOptions { + exclude 'META-INF/beans.xml' + } + compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 @@ -110,6 +114,7 @@ dependencies { leanbackImplementation 'androidx.leanback:leanback:1.2.0-alpha02' leanbackImplementation 'me.jessyan:autosize:1.2.1' mobileImplementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' + mobileImplementation 'com.github.devin1014.DLNA-Cast:dlna-dmc:V1.0.0' mobileImplementation('com.journeyapps:zxing-android-embedded:4.3.0') { transitive = false } annotationProcessor 'androidx.room:room-compiler:2.5.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.14.2' diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Result.java b/app/src/main/java/com/fongmi/android/tv/bean/Result.java index ad25f424a..3724b41a0 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Result.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Result.java @@ -189,6 +189,10 @@ public class Result { return subs == null ? Collections.emptyList() : subs; } + public String getRealUrl() { + return getPlayUrl() + getUrl(); + } + public Map getHeaders() { return Json.toMap(getHeader()); } diff --git a/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java b/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java index eed8d1ca4..593b4ced4 100644 --- a/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java +++ b/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java @@ -7,6 +7,7 @@ import org.greenrobot.eventbus.EventBus; public class PlayerEvent { private final int state; + private final String url; public static void ready() { EventBus.getDefault().post(new PlayerEvent(Player.STATE_READY)); @@ -16,11 +17,25 @@ public class PlayerEvent { EventBus.getDefault().post(new PlayerEvent(state)); } + public static void url(String url) { + EventBus.getDefault().post(new PlayerEvent(url)); + } + private PlayerEvent(int state) { this.state = state; + this.url = ""; + } + + public PlayerEvent(String url) { + this.state = 0; + this.url = url; } public int getState() { return state; } + + public String getUrl() { + return url; + } } diff --git a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java index b52b5b339..d68b27d09 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java @@ -72,7 +72,7 @@ public class ExoUtil { } public static MediaSource getSource(Result result, int errorCode) { - return getSource(result.getHeaders(), result.getPlayUrl() + result.getUrl(), result.getSubs(), errorCode); + return getSource(result.getHeaders(), result.getRealUrl(), result.getSubs(), errorCode); } public static MediaSource getSource(Map headers, String url, int errorCode) { diff --git a/app/src/main/java/com/fongmi/android/tv/player/Players.java b/app/src/main/java/com/fongmi/android/tv/player/Players.java index a3824c0ad..0961d623b 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/Players.java +++ b/app/src/main/java/com/fongmi/android/tv/player/Players.java @@ -332,11 +332,11 @@ public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IM } private void setMediaSource(Result result) { - SpiderDebug.log(errorCode + "," + result.getUrl() + "," + result.getHeaders()); - if (isIjk()) ijkPlayer.setMediaSource(result.getPlayUrl() + result.getUrl(), result.getHeaders()); + SpiderDebug.log(errorCode + "," + result.getRealUrl() + "," + result.getHeaders()); + if (isIjk()) ijkPlayer.setMediaSource(result.getRealUrl(), result.getHeaders()); if (isExo()) exoPlayer.setMediaSource(ExoUtil.getSource(result, errorCode)); if (isExo()) exoPlayer.prepare(); - setTimeoutCheck(); + setTimeoutCheck(result.getRealUrl()); } private void setMediaSource(Map headers, String url) { @@ -344,12 +344,12 @@ public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IM if (isIjk()) ijkPlayer.setMediaSource(url, headers); if (isExo()) exoPlayer.setMediaSource(ExoUtil.getSource(headers, url, errorCode)); if (isExo()) exoPlayer.prepare(); - setTimeoutCheck(); + setTimeoutCheck(url); } - private void setTimeoutCheck() { + private void setTimeoutCheck(String url) { App.post(runnable, timeout); - PlayerEvent.state(0); + PlayerEvent.url(url); } private void removeTimeoutCheck() { diff --git a/app/src/main/java/com/fongmi/android/tv/server/Nano.java b/app/src/main/java/com/fongmi/android/tv/server/Nano.java index 4959b0080..f4367e49c 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/Nano.java +++ b/app/src/main/java/com/fongmi/android/tv/server/Nano.java @@ -183,6 +183,6 @@ public class Nano extends NanoHTTPD { void onApi(String url); - void onCast(String url, String device, String history); + void onCast(String device, String config, String history); } } diff --git a/app/src/main/java/com/fongmi/android/tv/server/Server.java b/app/src/main/java/com/fongmi/android/tv/server/Server.java index 074c7782f..40e3813b7 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/Server.java +++ b/app/src/main/java/com/fongmi/android/tv/server/Server.java @@ -106,7 +106,7 @@ public class Server implements Nano.Listener { } @Override - public void onCast(String url, String device, String history) { - CastEvent.post(url, device, history); + public void onCast(String device, String config, String history) { + CastEvent.post(device, config, history); } } diff --git a/app/src/main/java/com/fongmi/android/tv/server/process/InputRequestProcess.java b/app/src/main/java/com/fongmi/android/tv/server/process/InputRequestProcess.java index 41400008e..6b0305999 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/process/InputRequestProcess.java +++ b/app/src/main/java/com/fongmi/android/tv/server/process/InputRequestProcess.java @@ -34,7 +34,7 @@ public class InputRequestProcess implements RequestProcess { nano.getListener().onApi(params.get("url").trim()); break; case "cast": - nano.getListener().onCast(params.get("url").trim(), params.get("device").trim(), params.get("history").trim()); + nano.getListener().onCast(params.get("device").trim(), params.get("config").trim(), params.get("history").trim()); break; } return Nano.createPlainTextResponse(NanoHTTPD.Response.Status.OK, "ok"); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8171148d1..9c2434cd8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,6 +2,7 @@ TV + C0868879 Press back again to exit diff --git a/app/src/mobile/AndroidManifest.xml b/app/src/mobile/AndroidManifest.xml index 410e8ce9c..fb70d14b0 100644 --- a/app/src/mobile/AndroidManifest.xml +++ b/app/src/mobile/AndroidManifest.xml @@ -6,14 +6,6 @@ - - - - + + \ No newline at end of file diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index 021dd8051..a4feb4b5d 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -30,13 +30,13 @@ import com.fongmi.android.tv.App; import com.fongmi.android.tv.Constant; import com.fongmi.android.tv.R; import com.fongmi.android.tv.api.ApiConfig; -import com.fongmi.android.tv.bean.Device; import com.fongmi.android.tv.bean.History; import com.fongmi.android.tv.bean.Keep; import com.fongmi.android.tv.bean.Parse; import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.bean.Track; import com.fongmi.android.tv.bean.Vod; +import com.fongmi.android.tv.cast.CastVideo; import com.fongmi.android.tv.databinding.ActivityDetailBinding; import com.fongmi.android.tv.db.AppDatabase; import com.fongmi.android.tv.event.ErrorEvent; @@ -106,6 +106,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private Runnable mR2; private Runnable mR3; private String mKey; + private String url; private PiP mPiP; public static void file(FragmentActivity activity, String url) { @@ -331,6 +332,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mViewModel.playerContent(getKey(), flag.getFlag(), episode.getUrl()); updateHistory(episode, replay); showProgress(); + setUrl(null); } private void setEmpty() { @@ -451,7 +453,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void onCast() { for (Fragment fragment : getSupportFragmentManager().getFragments()) if (fragment instanceof BottomSheetDialogFragment) return; - CastDialog.create(this).url(ApiConfig.getUrl()).history(mHistory).show(getSupportFragmentManager(), null); + CastDialog.create(this).config(ApiConfig.getUrl()).video(CastVideo.get(mHistory, getUrl())).history(mHistory).show(getSupportFragmentManager(), null); } private void onKeep() { @@ -671,8 +673,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private void showControl() { - mBinding.control.cast.setVisibility(mHistory == null || isFullscreen() ? View.GONE : View.VISIBLE); mBinding.control.keep.setVisibility(mHistory == null || isFullscreen() ? View.GONE : View.VISIBLE); + mBinding.control.cast.setVisibility(getUrl() == null || isFullscreen() ? View.GONE : View.VISIBLE); mBinding.control.parse.setVisibility(isFullscreen() && isUseParse() ? View.VISIBLE : View.GONE); mBinding.control.rotate.setVisibility(isFullscreen() && !isLock() ? View.VISIBLE : View.GONE); mBinding.control.back.setVisibility(isFullscreen() && !isLock() ? View.VISIBLE : View.GONE); @@ -681,7 +683,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mBinding.control.title.setVisibility(isFullscreen() ? View.VISIBLE : View.GONE); mBinding.control.share.setVisibility(isFullscreen() ? View.GONE : View.VISIBLE); mBinding.control.lock.setVisibility(isFullscreen() ? View.VISIBLE : View.GONE); - mBinding.control.size.setVisibility(isFullscreen() ? View.VISIBLE : View.GONE); mBinding.control.center.setVisibility(isLock() ? View.GONE : View.VISIBLE); mBinding.control.bottom.setVisibility(isLock() ? View.GONE : View.VISIBLE); mBinding.control.top.setVisibility(isLock() ? View.GONE : View.VISIBLE); @@ -798,6 +799,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis switch (event.getState()) { case 0: checkPosition(); + setUrl(event.getUrl()); setTrackVisible(false); break; case Player.STATE_IDLE: @@ -1027,21 +1029,24 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis this.lock = lock; } + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + private void notifyItemChanged(RecyclerView.Adapter adapter) { adapter.notifyItemRangeChanged(0, adapter.getItemCount()); } @Override - public void onCastTo(Device device) { - Notify.show(getString(R.string.cast_to, device.getName())); + public void onCastSuccess() { checkPlayImg(false); mPlayers.pause(); } - @Override - public void onCastError() { - } - @Override public void onScale(int tag) { mHistory.setScale(tag); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java index 42ba884c2..2c2a1935e 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java @@ -66,10 +66,10 @@ public class HistoryAdapter extends RecyclerView.Adapter