[mobile] support dlna

pull/123/head
FongMi 3 years ago
parent a5cc48d2da
commit e77d35e3cf
  1. 5
      app/build.gradle
  2. 4
      app/src/main/java/com/fongmi/android/tv/bean/Result.java
  3. 15
      app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java
  4. 2
      app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java
  5. 12
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  6. 2
      app/src/main/java/com/fongmi/android/tv/server/Nano.java
  7. 4
      app/src/main/java/com/fongmi/android/tv/server/Server.java
  8. 2
      app/src/main/java/com/fongmi/android/tv/server/process/InputRequestProcess.java
  9. 1
      app/src/main/res/values/strings.xml
  10. 12
      app/src/mobile/AndroidManifest.xml
  11. 25
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  12. 8
      app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java
  13. 2
      gradle.properties
  14. 2
      gradle/wrapper/gradle-wrapper.properties
  15. 5
      settings.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'

@ -189,6 +189,10 @@ public class Result {
return subs == null ? Collections.emptyList() : subs;
}
public String getRealUrl() {
return getPlayUrl() + getUrl();
}
public Map<String, String> getHeaders() {
return Json.toMap(getHeader());
}

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

@ -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<String, String> headers, String url, int errorCode) {

@ -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<String, String> 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() {

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

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

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

@ -2,6 +2,7 @@
<!-- App -->
<string name="app_name">TV</string>
<string name="app_id">C0868879</string>
<string name="app_exit">Press back again to exit</string>
<!-- Vod -->

@ -6,14 +6,6 @@
<application>
<meta-data
android:name="design_width_in_dp"
android:value="411" />
<meta-data
android:name="design_height_in_dp"
android:value="891" />
<activity
android:name=".ui.activity.MainActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
@ -69,5 +61,9 @@
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:screenOrientation="userPortrait" />
<service
android:name="com.android.cast.dlna.dmc.DLNACastService"
android:exported="false" />
</application>
</manifest>

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

@ -66,10 +66,10 @@ public class HistoryAdapter extends RecyclerView.Adapter<HistoryAdapter.ViewHold
}
public void remove(History item) {
int position = mItems.indexOf(item);
if (position == -1) return;
mItems.remove(position);
notifyItemRemoved(position);
int index = mItems.indexOf(item);
if (index == -1) return;
mItems.remove(index);
notifyItemRemoved(index);
}
@Override

@ -6,7 +6,7 @@
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx8192m -Dfile.encoding=UTF-8
org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects

@ -1,6 +1,6 @@
#Wed Mar 29 12:54:35 CST 2023
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

@ -12,6 +12,11 @@ dependencyResolutionManagement {
mavenCentral()
jcenter()
google()
maven { url 'https://jitpack.io' }
maven {
url 'http://4thline.org/m2'
allowInsecureProtocol = true
}
}
}
include ':app'

Loading…
Cancel
Save