diff --git a/app/build.gradle b/app/build.gradle
index e6e909126..ad9bfce0d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -3,12 +3,15 @@ plugins {
}
android {
+ namespace 'com.fongmi.android.tv'
+
compileSdk 34
flavorDimensions = ["mode", "api", "abi"]
defaultConfig {
applicationId "com.fongmi.android.tv"
minSdk 21
+ //noinspection ExpiredTargetSdkVersion
targetSdk 28
versionCode 235
versionName "0601"
@@ -47,6 +50,7 @@ android {
}
buildFeatures {
+ buildConfig true
viewBinding true
}
@@ -115,7 +119,6 @@ dependencies {
implementation project(':media-lib-ui')
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.biometric:biometric:1.1.0'
- implementation 'androidx.lifecycle:lifecycle-viewmodel:2.7.0'
implementation 'androidx.room:room-runtime:2.6.1'
implementation 'androidx.media:media:1.7.0'
implementation 'cat.ereza:customactivityoncrash:2.4.0'
@@ -134,6 +137,7 @@ dependencies {
implementation 'com.hierynomus:smbj:0.13.0'
implementation 'com.tencent.tbs:tbssdk:44286'
implementation 'com.github.YarikSOffice:lingver:1.3.0'
+ implementation 'javax.servlet:javax.servlet-api:3.1.0'
implementation 'org.chromium.net:cronet-embedded:76.3809.111'
implementation 'org.eclipse.jetty:jetty-client:8.1.21.v20160908'
implementation 'org.eclipse.jetty:jetty-server:8.1.21.v20160908'
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index df6ca28be..52592a5e8 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -34,13 +34,23 @@
# Cling
-keep class org.fourthline.cling.** { *; }
-keep class javax.xml.** { *; }
+-dontwarn org.ietf.jgss.**
+-dontwarn com.sun.net.**
+-dontwarn sun.net.**
+-dontwarn java.awt.**
+-dontwarn javax.**
# Cronet
-keep class org.chromium.net.** { *; }
-keep class com.google.net.cronet.** { *; }
# EXO
--keep class org.xmlpull.v1.** { *; }
+-dontwarn org.xmlpull.v1.**
+-dontwarn org.kxml2.io.**
+-dontwarn android.content.res.**
+-dontwarn org.slf4j.impl.StaticLoggerBinder
+-keep class org.xmlpull.** { *; }
+-keepclassmembers class org.xmlpull.** { *; }
-keep class androidx.media3.** { *; }
# IJK
diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java
index af762725d..f51815d6f 100644
--- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java
+++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java
@@ -91,7 +91,7 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List
@Override
protected void initView() {
bindService(new Intent(this, DLNARendererService.class), this, Context.BIND_AUTO_CREATE);
- mClock = Clock.create(mBinding.widget.time);
+ mClock = Clock.create(mBinding.widget.clock);
mKeyDown = CustomKeyDownCast.create(this);
mPlayers = new Players().init(this);
mParser = new DIDLParser();
diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java
index 179936335..ee21ab5af 100644
--- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java
+++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java
@@ -109,7 +109,7 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
@Override
protected void initView() {
DLNARendererService.Companion.start(this, R.drawable.ic_logo);
- mClock = Clock.create(mBinding.time).format("MM/dd HH:mm:ss");
+ mClock = Clock.create(mBinding.clock).format("MM/dd HH:mm:ss");
Updater.get().release().start(this);
Server.get().start();
Tbs.init();
@@ -154,10 +154,10 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
mBinding.homeSiteLock.setVisibility(Setting.isHomeSiteLock() ? View.VISIBLE : View.GONE);
if (Setting.getHomeUI() == 0) {
mBinding.title.setTextSize(24);
- mBinding.time.setTextSize(24);
+ mBinding.clock.setTextSize(24);
} else {
mBinding.title.setTextSize(20);
- mBinding.time.setTextSize(20);
+ mBinding.clock.setTextSize(20);
}
}
diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
index 9414fad56..cbaf51147 100644
--- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
+++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
@@ -140,7 +140,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP
@Override
protected void initView() {
- mClock = Clock.create(Arrays.asList(mBinding.widget.time, mBinding.display.time));
+ mClock = Clock.create(Arrays.asList(mBinding.widget.clock, mBinding.display.clock));
mKeyDown = CustomKeyDownLive.create(this);
mPlayers = new Players().init(this);
mHides = new ArrayList<>();
@@ -488,6 +488,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP
private void showControl(View view) {
mBinding.control.getRoot().setVisibility(View.VISIBLE);
mBinding.widget.top.setVisibility(View.VISIBLE);
+ App.post(view::requestFocus, 25);
view.requestFocus();
setR1Callback();
hideInfo();
@@ -503,7 +504,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP
private void showDisplayInfo() {
boolean controlVisible = isVisible(mBinding.control.getRoot());
boolean visible = !controlVisible;
- mBinding.display.time.setVisibility(Setting.isDisplayTime() && visible ? View.VISIBLE : View.GONE);
+ mBinding.display.clock.setVisibility(Setting.isDisplayTime() && visible ? View.VISIBLE : View.GONE);
mBinding.display.netspeed.setVisibility(Setting.isDisplaySpeed() && visible ? View.VISIBLE : View.GONE);
mBinding.display.duration.setVisibility(View.GONE);
}
@@ -851,14 +852,14 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP
}
private void prevLine() {
- if (mChannel == null) return;
+ if (mChannel == null || mChannel.isOnly()) return;
mChannel.prevLine();
showInfo();
fetch();
}
private void nextLine(boolean show) {
- if (mChannel == null) return;
+ if (mChannel == null || mChannel.isOnly()) return;
mChannel.nextLine();
if (show) showInfo();
else setInfo();
@@ -867,6 +868,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP
private void seekTo(int time) {
mPlayers.seekTo(time);
+ mKeyDown.resetTime();
showProgress();
hideCenter();
}
@@ -936,7 +938,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP
@Override
public void onSeeking(int time) {
- if (!mPlayers.isVod() || !mChannel.isOnly()) return;
+ if (!mPlayers.isVod()) return;
mBinding.widget.exoDuration.setText(mPlayers.getDurationTime());
mBinding.widget.exoPosition.setText(mPlayers.getPositionTime(time));
mBinding.widget.action.setImageResource(time > 0 ? R.drawable.ic_widget_forward : R.drawable.ic_widget_rewind);
@@ -946,28 +948,26 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP
@Override
public void onKeyUp() {
- prevChannel();
+ if (!mPlayers.isVod()) prevChannel();
+ else showControl(mBinding.control.player);
}
@Override
public void onKeyDown() {
- nextChannel();
+ if (!mPlayers.isVod()) nextChannel();
+ else showControl(mBinding.control.player);
}
@Override
public void onKeyLeft(int time) {
- if (mChannel == null) return;
- if (mChannel.isOnly() && mPlayers.isVod()) App.post(() -> seekTo(time), 250);
- else if (!mChannel.isOnly()) prevLine();
- mKeyDown.resetTime();
+ if (!mPlayers.isVod()) prevLine();
+ else App.post(() -> seekTo(time), 250);
}
@Override
public void onKeyRight(int time) {
- if (mChannel == null) return;
- if (mChannel.isOnly() && mPlayers.isVod()) App.post(() -> seekTo(time), 250);
- else if (!mChannel.isOnly()) nextLine(true);
- mKeyDown.resetTime();
+ if (!mPlayers.isVod()) nextLine(true);
+ else App.post(() -> seekTo(time), 250);
}
@Override
diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
index 662e3f7e6..ae856add9 100644
--- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
+++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
@@ -319,7 +319,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
protected void initView() {
mKeyDown = CustomKeyDownVod.create(this, mBinding.video);
mFrameParams = mBinding.video.getLayoutParams();
- mClock = Clock.create(mBinding.display.time);
+ mClock = Clock.create(mBinding.display.clock);
mDanmakuContext = DanmakuContext.create();
mPlayers = new Players().init(this);
mBroken = new ArrayList<>();
@@ -784,7 +784,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
}
private void showDisplayInfo() {
- mBinding.display.time.setVisibility(Setting.isDisplayTime() || isVisible(mBinding.widget.info) ? View.VISIBLE : View.GONE);
+ mBinding.display.clock.setVisibility(Setting.isDisplayTime() || isVisible(mBinding.widget.info) ? View.VISIBLE : View.GONE);
mBinding.display.netspeed.setVisibility(Setting.isDisplaySpeed() && !isVisible(mBinding.control.getRoot()) ? View.VISIBLE : View.GONE);
mBinding.display.duration.setVisibility(Setting.isDisplayDuration() && !isVisible(mBinding.control.getRoot()) ? View.VISIBLE : View.GONE);
mBinding.display.progress.setVisibility(Setting.isDisplayMiniProgress() && !isVisible(mBinding.control.getRoot()) && (mPlayers.getDuration() > 60000) ? View.VISIBLE : View.GONE);
@@ -1666,8 +1666,8 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
@Override
public void onSeekTo(int time) {
- mKeyDown.resetTime();
mPlayers.seekTo(time);
+ mKeyDown.resetTime();
showProgress();
onPlay();
}
diff --git a/app/src/leanback/res/layout/activity_home.xml b/app/src/leanback/res/layout/activity_home.xml
index 54c6af5df..1dc533755 100644
--- a/app/src/leanback/res/layout/activity_home.xml
+++ b/app/src/leanback/res/layout/activity_home.xml
@@ -71,7 +71,7 @@
android:layout_weight="1"
android:orientation="vertical">
mEpgDataAdapter.getItemCount() - 1;
- if (!limit) onItemClick(mChannel.getData().getList().get(position));
+ boolean hasNext = position <= current && position > 0;
+ if (hasNext) onItemClick(mChannel.getData().getList().get(position));
else nextChannel();
}
private void prevLine() {
- if (mChannel == null) return;
+ if (mChannel == null || mChannel.isOnly()) return;
mChannel.prevLine();
showInfo();
fetch();
}
private void nextLine(boolean show) {
- if (mChannel == null) return;
+ if (mChannel == null || mChannel.isOnly()) return;
mChannel.nextLine();
if (show) showInfo();
else setInfo();
fetch();
}
- private void seekTo() {
- mPlayers.seekTo(Constant.INTERVAL_SEEK * 3);
- showProgress();
- }
-
private void onPaused() {
checkPlayImg(false);
mPlayers.pause();
@@ -1036,6 +1032,21 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom
public void onCasted() {
}
+ @Override
+ public void onSpeedUp() {
+ if (!mPlayers.isVod() || !mPlayers.isPlaying() || !mPlayers.canAdjustSpeed()) return;
+ mBinding.control.action.speed.setText(mPlayers.setSpeed(mPlayers.getSpeed() < 3 ? 3 : 5));
+ mBinding.widget.speed.startAnimation(ResUtil.getAnim(R.anim.forward));
+ mBinding.widget.speed.setVisibility(View.VISIBLE);
+ }
+
+ @Override
+ public void onSpeedEnd() {
+ mBinding.control.action.speed.setText(mPlayers.setSpeed(1.0f));
+ mBinding.widget.speed.setVisibility(View.GONE);
+ mBinding.widget.speed.clearAnimation();
+ }
+
@Override
public void onBright(int progress) {
mBinding.widget.bright.setVisibility(View.VISIBLE);
@@ -1066,26 +1077,40 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom
@Override
public void onFlingUp() {
- prevChannel();
+ if (!mPlayers.isVod()) prevChannel();
}
@Override
public void onFlingDown() {
- nextChannel();
+ if (!mPlayers.isVod()) nextChannel();
}
@Override
public void onFlingLeft() {
- if (mChannel == null) return;
- if (mChannel.isOnly() && mPlayers.isVod()) App.post(this::seekTo, 250);
- else if (!mChannel.isOnly()) prevLine();
+ if (!mPlayers.isVod()) prevLine();
}
@Override
public void onFlingRight() {
- if (mChannel == null) return;
- if (mChannel.isOnly() && mPlayers.isVod()) App.post(this::seekTo, 250);
- else if (!mChannel.isOnly()) nextLine(true);
+ if (!mPlayers.isVod()) nextLine(true);
+ }
+
+ @Override
+ public void onSeek(int time) {
+ if (!mPlayers.isVod()) return;
+ mBinding.widget.action.setImageResource(time > 0 ? R.drawable.ic_widget_forward : R.drawable.ic_widget_rewind);
+ mBinding.widget.time.setText(mPlayers.getPositionTime(time));
+ mBinding.widget.seek.setVisibility(View.VISIBLE);
+ hideProgress();
+ }
+
+ @Override
+ public void onSeekEnd(int time) {
+ if (!mPlayers.isVod()) return;
+ mBinding.widget.seek.setVisibility(View.GONE);
+ mPlayers.seekTo(time);
+ showProgress();
+ onPlay();
}
@Override
diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
index 80abf5af3..7adb95db6 100644
--- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
+++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
@@ -311,7 +311,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
mObserveSearch = this::setSearch;
mDialogs = new ArrayList<>();
mBroken = new ArrayList<>();
- mClock = Clock.create(Arrays.asList(mBinding.display.time, mBinding.control.time));
+ mClock = Clock.create(Arrays.asList(mBinding.display.clock, mBinding.control.time));
mR0 = this::stopService;
mR1 = this::hideControl;
mR2 = this::setTraffic;
@@ -939,7 +939,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && isInPictureInPictureMode()) pictureMode = true;
boolean controlVisible = isVisible(mBinding.control.getRoot());
boolean visible = (!controlVisible || isLock()) && !pictureMode;
- mBinding.display.time.setVisibility(Setting.isDisplayTime() && visible ? View.VISIBLE : View.GONE);
+ mBinding.display.clock.setVisibility(Setting.isDisplayTime() && visible ? View.VISIBLE : View.GONE);
mBinding.display.netspeed.setVisibility(Setting.isDisplaySpeed() && visible ? View.VISIBLE : View.GONE);
mBinding.display.duration.setVisibility(Setting.isDisplayDuration() && visible ? View.VISIBLE : View.GONE);
mBinding.display.progress.setVisibility(Setting.isDisplayMiniProgress() && visible && (mPlayers.getDuration() > 60000) ? View.VISIBLE : View.GONE);
@@ -1645,8 +1645,8 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
@Override
public void onSeek(int time) {
mBinding.widget.action.setImageResource(time > 0 ? R.drawable.ic_widget_forward : R.drawable.ic_widget_rewind);
- mBinding.widget.seek.setVisibility(View.VISIBLE);
mBinding.widget.time.setText(mPlayers.getPositionTime(time));
+ mBinding.widget.seek.setVisibility(View.VISIBLE);
hideProgress();
}
diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java
index 604b3c7ee..fe473112e 100644
--- a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java
+++ b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java
@@ -26,11 +26,14 @@ public class CustomKeyDownLive extends GestureDetector.SimpleOnGestureListener {
private final View videoView;
private boolean changeBright;
private boolean changeVolume;
+ private boolean changeSpeed;
+ private boolean changeTime;
private boolean center;
private boolean touch;
private boolean lock;
private float bright;
private float volume;
+ private int time;
public static CustomKeyDownLive create(Activity activity, View videoView) {
return new CustomKeyDownLive(activity, videoView);
@@ -45,6 +48,8 @@ public class CustomKeyDownLive extends GestureDetector.SimpleOnGestureListener {
}
public boolean onTouchEvent(MotionEvent e) {
+ if (changeTime && e.getAction() == MotionEvent.ACTION_UP) onSeekEnd();
+ if (changeSpeed && e.getAction() == MotionEvent.ACTION_UP) listener.onSpeedEnd();
if (changeBright && e.getAction() == MotionEvent.ACTION_UP) listener.onBrightEnd();
if (changeVolume && e.getAction() == MotionEvent.ACTION_UP) listener.onVolumeEnd();
return e.getPointerCount() == 1 && detector.onTouchEvent(e);
@@ -65,16 +70,27 @@ public class CustomKeyDownLive extends GestureDetector.SimpleOnGestureListener {
bright = Util.getBrightness(activity);
changeBright = false;
changeVolume = false;
+ changeSpeed = false;
+ changeTime = false;
center = false;
touch = true;
return true;
}
+ @Override
+ public void onLongPress(@NonNull MotionEvent e) {
+ if (isEdge(e) || lock) return;
+ changeSpeed = true;
+ listener.onSpeedUp();
+ }
+
@Override
public boolean onScroll(@NonNull MotionEvent e1, @NonNull MotionEvent e2, float distanceX, float distanceY) {
if (isEdge(e1) || lock) return true;
+ float deltaX = e2.getX() - e1.getX();
float deltaY = e1.getY() - e2.getY();
if (touch) checkFunc(distanceX, distanceY, e2);
+ if (changeTime) listener.onSeek(time = (int) deltaX * 50);
if (changeBright) setBright(deltaY);
if (changeVolume) setVolume(deltaY);
return true;
@@ -101,10 +117,17 @@ public class CustomKeyDownLive extends GestureDetector.SimpleOnGestureListener {
return true;
}
+ private void onSeekEnd() {
+ listener.onSeekEnd(time);
+ changeTime = false;
+ time = 0;
+ }
+
private void checkFunc(float distanceX, float distanceY, MotionEvent e2) {
int four = ResUtil.getScreenWidthNav() / 4;
if (e2.getX() > four && e2.getX() < four * 3) center = true;
else if (Math.abs(distanceX) < Math.abs(distanceY)) checkSide(e2);
+ if (Math.abs(distanceX) >= Math.abs(distanceY)) changeTime = true;
touch = false;
}
@@ -153,6 +176,10 @@ public class CustomKeyDownLive extends GestureDetector.SimpleOnGestureListener {
public interface Listener {
+ void onSpeedUp();
+
+ void onSpeedEnd();
+
void onBright(int progress);
void onBrightEnd();
@@ -169,6 +196,10 @@ public class CustomKeyDownLive extends GestureDetector.SimpleOnGestureListener {
void onFlingRight();
+ void onSeek(int time);
+
+ void onSeekEnd(int time);
+
void onSingleTap();
void onDoubleTap();
diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ControlDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ControlDialog.java
index a39a24f44..7f4291a8a 100644
--- a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ControlDialog.java
+++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ControlDialog.java
@@ -129,7 +129,7 @@ public class ControlDialog extends BaseDialog implements ParseAdapter.OnClickLis
private void displayTime() {
boolean display = Setting.isDisplayTime();
- parent.display.time.setVisibility(!display ? View.VISIBLE : View.GONE);
+ parent.display.clock.setVisibility(!display ? View.VISIBLE : View.GONE);
Setting.putDisplayTime(!display);
binding.dptime.setActivated(!display);
}
diff --git a/app/src/mobile/res/layout/view_widget_display.xml b/app/src/mobile/res/layout/view_widget_display.xml
index da856e54f..06b503fde 100644
--- a/app/src/mobile/res/layout/view_widget_display.xml
+++ b/app/src/mobile/res/layout/view_widget_display.xml
@@ -5,7 +5,7 @@
android:layout_height="match_parent">
+
+
+
+
+
+
+
+
+
+
diff --git a/tvbus/build.gradle b/tvbus/build.gradle
index 7f685900b..1d86f69da 100644
--- a/tvbus/build.gradle
+++ b/tvbus/build.gradle
@@ -3,6 +3,8 @@ plugins {
}
android {
+ namespace 'com.tvbus.engine'
+
compileSdk 34
defaultConfig {
diff --git a/youtube/build.gradle b/youtube/build.gradle
index 1cc4b7c29..7a45fccbe 100644
--- a/youtube/build.gradle
+++ b/youtube/build.gradle
@@ -3,6 +3,8 @@ plugins {
}
android {
+ namespace 'com.github.kiulian.downloader'
+
compileSdk 34
defaultConfig {