display duration

pull/259/head
okjack 2 years ago
parent 3ecde6ea5d
commit b596c55c27
  1. 32
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  2. 7
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java
  3. 8
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  4. 4
      app/src/leanback/res/drawable/shape_controller.xml
  5. 15
      app/src/leanback/res/drawable/shape_info.xml
  6. 2
      app/src/leanback/res/drawable/shape_text_activated.xml
  7. 2
      app/src/leanback/res/drawable/shape_text_normal.xml
  8. 7
      app/src/leanback/res/layout/activity_live.xml
  9. 29
      app/src/leanback/res/layout/activity_setting_custom.xml
  10. 25
      app/src/leanback/res/layout/view_widget_display.xml
  11. 3
      app/src/leanback/res/layout/view_widget_vod.xml
  12. 8
      app/src/main/java/com/fongmi/android/tv/Setting.java
  13. 20
      app/src/main/java/com/fongmi/android/tv/utils/Clock.java
  14. 1
      app/src/main/res/values-zh-rCN/strings.xml
  15. 1
      app/src/main/res/values-zh-rTW/strings.xml
  16. 1
      app/src/main/res/values/strings.xml
  17. 32
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  18. 8
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  19. 9
      app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ControlDialog.java
  20. 7
      app/src/mobile/res/layout/activity_live.xml
  21. 10
      app/src/mobile/res/layout/dialog_control.xml
  22. 24
      app/src/mobile/res/layout/view_widget_display.xml

@ -68,12 +68,13 @@ import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import tv.danmaku.ijk.media.player.ui.IjkVideoView;
public class LiveActivity extends BaseActivity implements GroupPresenter.OnClickListener, ChannelPresenter.OnClickListener, CustomKeyDownLive.Listener, CustomLiveListView.Callback, TrackDialog.Listener, Biometric.Callback, PassCallback, LiveCallback, SubtitleCallback {
public class LiveActivity extends BaseActivity implements Clock.Callback, GroupPresenter.OnClickListener, ChannelPresenter.OnClickListener, CustomKeyDownLive.Listener, CustomLiveListView.Callback, TrackDialog.Listener, Biometric.Callback, PassCallback, LiveCallback, SubtitleCallback {
private ActivityLiveBinding mBinding;
private ArrayObjectAdapter mChannelAdapter;
@ -139,7 +140,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
@Override
protected void initView() {
mClock = Clock.create(mBinding.widget.time);
mClock = Clock.create(Arrays.asList(mBinding.widget.time, mBinding.display.time));
mKeyDown = CustomKeyDownLive.create(this);
mPlayers = new Players().init(this);
mHides = new ArrayList<>();
@ -151,6 +152,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
Server.get().start();
setRecyclerView();
setVideoView();
setDisplayView();
setViewModel();
checkLive();
}
@ -217,6 +219,11 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
mBinding.control.home.setVisibility(LiveConfig.isOnly() ? View.GONE : View.VISIBLE);
}
private void setDisplayView() {
mBinding.display.getRoot().setVisibility(View.VISIBLE);
showDisplayInfo();
}
private void setScale(int scale) {
getExo().setResizeMode(scale);
getIjk().setResizeMode(scale);
@ -449,6 +456,21 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
App.removeCallbacks(mR1);
}
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.netspeed.setVisibility(Setting.isDisplaySpeed() && visible ? View.VISIBLE : View.GONE);
mBinding.display.duration.setVisibility(View.GONE);
}
private void onTimeChangeDisplaySpeed() {
boolean controlVisible = isVisible(mBinding.control.getRoot());
boolean visible = !controlVisible;
if (Setting.isDisplaySpeed() && visible) Traffic.setSpeed(mBinding.display.netspeed);
showDisplayInfo();
}
private void hideCenter() {
mBinding.widget.action.setImageResource(R.drawable.ic_widget_play);
mBinding.widget.center.setVisibility(View.GONE);
@ -608,6 +630,11 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
public void onTrackClick(Track item) {
}
@Override
public void onTimeChanged() {
onTimeChangeDisplaySpeed();
}
@Override
public void setLive(Live item) {
LiveConfig.get().setHome(item);
@ -660,6 +687,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
switch (event.getState()) {
case 0:
setTrackVisible(false);
mClock.setCallback(this);
break;
case Player.STATE_IDLE:
break;

@ -41,6 +41,7 @@ public class SettingCustomActivity extends BaseActivity {
mBinding.episodeText.setText((episode = ResUtil.getStringArray(R.array.select_episode))[Setting.getEpisode()]);
mBinding.displayTimeText.setText(getSwitch(Setting.isDisplayTime()));
mBinding.displayNetspeedText.setText(getSwitch(Setting.isDisplaySpeed()));
mBinding.displayDurationText.setText(getSwitch(Setting.isDisplayDuration()));
}
@Override
@ -50,6 +51,7 @@ public class SettingCustomActivity extends BaseActivity {
mBinding.episode.setOnClickListener(this::setEpisode);
mBinding.displayTime.setOnClickListener(this::setDisplayTime);
mBinding.displayNetspeed.setOnClickListener(this::setDisplaySpeed);
mBinding.displayDuration.setOnClickListener(this::setDisplayDuration);
}
private void setQuality(View view) {
@ -82,4 +84,9 @@ public class SettingCustomActivity extends BaseActivity {
mBinding.displayNetspeedText.setText(getSwitch(Setting.isDisplaySpeed()));
}
private void setDisplayDuration(View view) {
Setting.putDisplayDuration(!Setting.isDisplayDuration());
mBinding.displayDurationText.setText(getSwitch(Setting.isDisplayDuration()));
}
}

@ -748,11 +748,15 @@ 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.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);
}
private void onTimeChangeDisplaySpeed() {
if (isVisible(mBinding.control.getRoot())) showDisplayInfo();
else if (Setting.isDisplaySpeed()) Traffic.setSpeed(mBinding.display.netspeed);
boolean visible = isVisible(mBinding.control.getRoot());
long position = mPlayers.getPosition();
if (Setting.isDisplaySpeed() && !visible) Traffic.setSpeed(mBinding.display.netspeed);
if (Setting.isDisplayDuration() && !visible && position > 0) mBinding.display.duration.setText(mPlayers.getPositionTime(0) + "/" + mPlayers.getDurationTime());
showDisplayInfo();
}
@Override

@ -4,8 +4,8 @@
<gradient
android:type="linear"
android:startColor="@color/black_10"
android:endColor="@color/black_20"
android:startColor="@color/black_20"
android:endColor="@color/black_50"
android:angle="270"/>
<corners

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:type="linear"
android:startColor="@color/black_10"
android:endColor="@color/black_20"
android:angle="90"/>
<corners
android:topLeftRadius="8dp"
android:topRightRadius="8dp" />
</shape>

@ -2,7 +2,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/black_70" />
<solid android:color="@color/grey_600" />
<corners android:radius="4dp" />

@ -2,7 +2,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/black_70" />
<solid android:color="@color/grey_600" />
<corners android:radius="4dp" />

@ -45,6 +45,13 @@
android:layout_width="match_parent"
android:layout_height="match_parent" />
<include
android:id="@+id/display"
layout="@layout/view_widget_display"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
<include
android:id="@+id/control"
layout="@layout/view_control_live"

@ -159,5 +159,34 @@
</LinearLayout>
<LinearLayout
android:id="@+id/displayDuration"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@drawable/selector_item"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="@string/play_duration"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/displayDurationText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:textColor="@color/white"
android:textSize="18sp"
tools:text="開" />
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

@ -19,15 +19,36 @@
android:textSize="20sp"
tools:text="10:20:00" />
<TextView
android:id="@+id/duration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_marginBottom="16dp"
android:layout_marginStart="16dp"
android:shadowColor="@color/grey_900"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:textColor="@color/white"
android:textSize="16sp"
tools:text="00:00-10:20" />
<TextView
android:id="@+id/netspeed"
android:padding="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="16dp"
android:layout_marginEnd="16dp"
android:shadowColor="@color/grey_900"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:textColor="@color/white"
android:textSize="12sp"
android:textSize="16sp"
tools:text="10MB/S"/>
</RelativeLayout>

@ -7,7 +7,6 @@
<RelativeLayout
android:id="@+id/info"
android:background="@drawable/shape_info"
android:visibility="invisible"
tools:visibility="visible"
android:layout_width="match_parent"
@ -19,7 +18,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginEnd="100dp"
android:letterSpacing="0.02"
android:shadowColor="@color/grey_900"
android:shadowDx="2"

@ -357,4 +357,12 @@ public class Setting {
Prefers.put("display_speed", display);
}
public static boolean isDisplayDuration() {
return Prefers.getBoolean("display_duration", false);
}
public static void putDisplayDuration(boolean display) {
Prefers.put("display_duration", display);
}
}

@ -5,7 +5,9 @@ import android.widget.TextView;
import com.fongmi.android.tv.App;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;
@ -15,7 +17,7 @@ public class Clock {
private SimpleDateFormat format;
private Callback callback;
private final Date date;
private TextView view;
private List<TextView> views;
private Timer timer;
public static Clock create() {
@ -26,12 +28,22 @@ public class Clock {
return new Clock().view(view).format("HH:mm:ss");
}
public static Clock create(List<TextView> views) {
return new Clock().view(views).format("HH:mm:ss");
}
public Clock() {
this.date = new Date();
this.views = new ArrayList<>();
}
public Clock view(TextView view) {
this.view = view;
this.views.add(view);
return this;
}
public Clock view(List<TextView> views) {
this.views = views;
return this;
}
@ -58,7 +70,9 @@ public class Clock {
try {
date.setTime(System.currentTimeMillis());
if (callback != null) callback.onTimeChanged();
if (view != null) view.setText(format.format(date));
for(TextView view : views) {
if (view != null) view.setText(format.format(date));
}
} catch (Exception ignored) {
}
}

@ -37,6 +37,7 @@
<string name="play_timer">定时</string>
<string name="play_time">时间</string>
<string name="play_netspeed">网速</string>
<string name="play_duration">进度</string>
<string name="play_danmu">弹幕</string>
<string name="play_change">换源</string>
<string name="play_forward"></string>

@ -37,6 +37,7 @@
<string name="play_timer">定時</string>
<string name="play_time">時間</string>
<string name="play_netspeed">網速</string>
<string name="play_duration">進度</string>
<string name="play_danmu">彈幕</string>
<string name="play_change">換源</string>
<string name="play_forward"></string>

@ -37,6 +37,7 @@
<string name="play_timer">Timer</string>
<string name="play_time">Time</string>
<string name="play_netspeed">Net Speed</string>
<string name="play_duration">Duration</string>
<string name="play_danmu">Danmu</string>
<string name="play_change">Change</string>
<string name="play_forward"></string>

@ -73,12 +73,13 @@ import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import tv.danmaku.ijk.media.player.ui.IjkVideoView;
public class LiveActivity extends BaseActivity implements CustomKeyDownLive.Listener, TrackDialog.Listener, Biometric.Callback, PassCallback, LiveCallback, GroupAdapter.OnClickListener, ChannelAdapter.OnClickListener, SubtitleCallback, CastDialog.Listener, InfoDialog.Listener {
public class LiveActivity extends BaseActivity implements Clock.Callback, CustomKeyDownLive.Listener, TrackDialog.Listener, Biometric.Callback, PassCallback, LiveCallback, GroupAdapter.OnClickListener, ChannelAdapter.OnClickListener, SubtitleCallback, CastDialog.Listener, InfoDialog.Listener {
private ActivityLiveBinding mBinding;
private ChannelAdapter mChannelAdapter;
@ -156,7 +157,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
@Override
protected void initView(Bundle savedInstanceState) {
mKeyDown = CustomKeyDownLive.create(this, mBinding.video);
mClock = Clock.create(mBinding.widget.time);
mClock = Clock.create(Arrays.asList(mBinding.widget.time, mBinding.display.time));
setPadding(mBinding.control.getRoot());
setPadding(mBinding.recycler, true);
mPlayers = new Players().init(this);
@ -172,6 +173,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
setForeground(true);
setRecyclerView();
setVideoView();
setDisplayView();
setViewModel();
checkLive();
}
@ -236,6 +238,11 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
mBinding.control.action.home.setVisibility(LiveConfig.isOnly() ? View.GONE : View.VISIBLE);
}
private void setDisplayView() {
mBinding.display.getRoot().setVisibility(View.VISIBLE);
showDisplayInfo();
}
@Override
public void setSubtitle(int size) {
getExo().getSubtitleView().setFixedTextSize(Dimension.SP, size);
@ -501,6 +508,21 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
App.removeCallbacks(mR1);
}
private void showDisplayInfo() {
boolean controlVisible = isVisible(mBinding.control.getRoot());
boolean visible = (!controlVisible || isLock());
mBinding.display.time.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);
}
private void onTimeChangeDisplaySpeed() {
boolean controlVisible = isVisible(mBinding.control.getRoot());
boolean visible = (!controlVisible || isLock());
if (Setting.isDisplaySpeed() && visible) Traffic.setSpeed(mBinding.display.netspeed);
showDisplayInfo();
}
private void showInfo() {
boolean pip = Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N && isInPictureInPictureMode();
mBinding.widget.infoPip.setVisibility(pip ? View.VISIBLE : View.GONE);
@ -670,6 +692,11 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
public void onTrackClick(Track item) {
}
@Override
public void onTimeChanged() {
onTimeChangeDisplaySpeed();
}
@Override
public void setLive(Live item) {
LiveConfig.get().setHome(item);
@ -720,6 +747,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
switch (event.getState()) {
case 0:
setTrackVisible(false);
mClock.setCallback(this);
break;
case Player.STATE_IDLE:
break;

@ -942,10 +942,16 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
boolean visible = (!controlVisible || isLock());
mBinding.display.time.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);
}
private void onTimeChangeDisplaySpeed() {
if (Setting.isDisplaySpeed() && (!isVisible(mBinding.control.getRoot()) || isLock())) Traffic.setSpeed(mBinding.display.netspeed);
boolean controlVisible = isVisible(mBinding.control.getRoot());
boolean visible = (!controlVisible || isLock());
long position = mPlayers.getPosition();
if (Setting.isDisplaySpeed() && visible) Traffic.setSpeed(mBinding.display.netspeed);
if (Setting.isDisplayDuration() && visible && position > 0) mBinding.display.duration.setText(mPlayers.getPositionTime(0) + "/" + mPlayers.getDurationTime());
showDisplayInfo();
}
private void toggleFullscreen() {

@ -98,6 +98,7 @@ public class ControlDialog extends BaseDialog implements ParseAdapter.OnClickLis
binding.timer.setActivated(Timer.get().isRunning());
binding.dptime.setActivated(Setting.isDisplayTime());
binding.dpspeed.setActivated(Setting.isDisplaySpeed());
binding.dpduration.setActivated(Setting.isDisplayDuration());
setTrackVisible();
setScaleText();
setParse();
@ -121,6 +122,7 @@ public class ControlDialog extends BaseDialog implements ParseAdapter.OnClickLis
binding.opening.setOnLongClickListener(v -> longClick(binding.opening, parent.control.action.opening));
binding.dptime.setOnClickListener(v -> displayTime());
binding.dpspeed.setOnClickListener(v -> displaySpeed());
binding.dpduration.setOnClickListener(v -> displayDuration());
}
private void displayTime() {
@ -137,6 +139,13 @@ public class ControlDialog extends BaseDialog implements ParseAdapter.OnClickLis
binding.dpspeed.setActivated(!display);
}
private void displayDuration() {
boolean display = Setting.isDisplayDuration();
parent.display.duration.setVisibility(!display ? View.VISIBLE : View.GONE);
Setting.putDisplayDuration(!display);
binding.dpduration.setActivated(!display);
}
private void onTimer(View view) {
App.post(() -> TimerDialog.create().show(activity), 200);
dismiss();

@ -45,6 +45,13 @@
android:layout_width="match_parent"
android:layout_height="match_parent" />
<include
android:id="@+id/display"
layout="@layout/view_widget_display"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
<include
android:id="@+id/control"
layout="@layout/view_control_live"

@ -272,11 +272,21 @@
android:id="@+id/dpspeed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:background="@drawable/shape_accent"
android:text="@string/play_netspeed"
android:textColor="@color/control"
android:textSize="14sp" />
<TextView
android:id="@+id/dpduration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_accent"
android:text="@string/play_duration"
android:textColor="@color/control"
android:textSize="14sp" />
</LinearLayout>
<TextView

@ -12,9 +12,29 @@
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:textColor="@color/white"
android:shadowColor="@color/grey_900"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:textSize="14sp"
tools:text="00:00:00"/>
<TextView
android:id="@+id/duration"
android:padding="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:textColor="@color/white"
android:shadowColor="@color/grey_900"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:textSize="12sp"
tools:text="00:00:00"/>
<TextView
android:id="@+id/netspeed"
android:padding="8dp"
@ -23,6 +43,10 @@
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:textColor="@color/white"
android:shadowColor="@color/grey_900"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:textSize="12sp"
tools:text="10MB/S"/>

Loading…
Cancel
Save