Optimize live ui

pull/590/head
FongMi 11 months ago
parent 2c1677122b
commit 6fc25cbcd9
  1. 60
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  2. 4
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomLiveListView.java
  3. 4
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/EpgDataPresenter.java
  4. 14
      app/src/leanback/res/layout/activity_live.xml
  5. 16
      app/src/leanback/res/layout/view_control_live.xml
  6. 75
      app/src/leanback/res/layout/view_widget_live.xml
  7. 1
      app/src/leanback/res/layout/view_widget_vod.xml
  8. 1
      app/src/main/res/values-zh-rCN/strings.xml
  9. 1
      app/src/main/res/values-zh-rTW/strings.xml
  10. 1
      app/src/main/res/values/strings.xml

@ -151,6 +151,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
protected void initEvent() {
mBinding.group.setListener(this);
mBinding.channel.setListener(this);
mBinding.epgData.setListener(this);
mBinding.control.seek.setListener(mPlayers);
mBinding.control.text.setOnClickListener(this::onTrack);
mBinding.control.audio.setOnClickListener(this::onTrack);
@ -163,6 +164,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
mBinding.control.line.setOnClickListener(view -> onLine());
mBinding.control.scale.setOnClickListener(view -> onScale());
mBinding.control.speed.setOnClickListener(view -> onSpeed());
mBinding.control.action.setOnClickListener(view -> onAction());
mBinding.control.invert.setOnClickListener(view -> onInvert());
mBinding.control.across.setOnClickListener(view -> onAcross());
mBinding.control.change.setOnClickListener(view -> onChange());
@ -181,10 +183,10 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
private void setRecyclerView() {
mBinding.group.setItemAnimator(null);
mBinding.channel.setItemAnimator(null);
mBinding.widget.epgData.setItemAnimator(null);
mBinding.epgData.setItemAnimator(null);
mBinding.group.setAdapter(new ItemBridgeAdapter(mGroupAdapter = new ArrayObjectAdapter(new GroupPresenter(this))));
mBinding.channel.setAdapter(new ItemBridgeAdapter(mChannelAdapter = new ArrayObjectAdapter(new ChannelPresenter(this))));
mBinding.widget.epgData.setAdapter(new ItemBridgeAdapter(mEpgDataAdapter = new ArrayObjectAdapter(new EpgDataPresenter(this))));
mBinding.epgData.setAdapter(new ItemBridgeAdapter(mEpgDataAdapter = new ArrayObjectAdapter(new EpgDataPresenter(this))));
}
private void setVideoView() {
@ -193,7 +195,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
setScale(Setting.getLiveScale());
ExoUtil.setSubtitleView(mBinding.exo);
mPlayers.setTag(tag = UUID.randomUUID().toString());
findViewById(R.id.timeBar).setNextFocusUpId(R.id.player);
findViewById(R.id.timeBar).setNextFocusUpId(R.id.action);
mBinding.control.invert.setActivated(Setting.isInvert());
mBinding.control.across.setActivated(Setting.isAcross());
mBinding.control.change.setActivated(Setting.isChange());
@ -263,7 +265,6 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
int padding = ResUtil.dp2px(48);
if (live.getWidth() == 0) for (Group item : live.getGroups()) live.setWidth(Math.max(live.getWidth(), ResUtil.getTextWidth(item.getName(), 16)));
mBinding.group.getLayoutParams().width = live.getWidth() == 0 ? 0 : Math.min(live.getWidth() + padding, ResUtil.getScreenWidth() / 4);
mBinding.divide.setVisibility(live.getWidth() == 0 ? View.GONE : View.VISIBLE);
}
private Group setWidth(Group group) {
@ -280,7 +281,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
if (epg.getList().isEmpty()) return;
int minWidth = ResUtil.getTextWidth(epg.getList().get(0).getTime(), 16);
if (epg.getWidth() == 0) for (EpgData item : epg.getList()) epg.setWidth(Math.max(epg.getWidth(), ResUtil.getTextWidth(item.getTitle(), 16)));
mBinding.widget.epgData.getLayoutParams().width = epg.getWidth() == 0 ? 0 : Math.min(Math.max(epg.getWidth(), minWidth) + padding, ResUtil.getScreenWidth() / 2);
mBinding.epgData.getLayoutParams().width = epg.getWidth() == 0 ? 0 : Math.min(Math.max(epg.getWidth(), minWidth) + padding, ResUtil.getScreenWidth() / 2);
}
private void setPosition(int[] position) {
@ -321,7 +322,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
private void setActivated(EpgData item) {
for (int i = 0; i < mEpgDataAdapter.size(); i++) ((EpgData) mEpgDataAdapter.get(i)).setSelected(item);
notifyItemChanged(mBinding.widget.epgData, mEpgDataAdapter);
notifyItemChanged(mBinding.epgData, mEpgDataAdapter);
}
private void checkPlay() {
@ -367,6 +368,10 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
return true;
}
private void onAction() {
checkPlay();
}
private void onInvert() {
Setting.putInvert(!Setting.isInvert());
mBinding.control.invert.setActivated(Setting.isInvert());
@ -399,11 +404,9 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
setPosition();
}
@Override
public void showUI() {
private void showUI() {
if (isVisible(mBinding.recycler)) return;
mBinding.recycler.setVisibility(View.VISIBLE);
mBinding.channel.requestFocus();
setPosition();
setUITimer();
hideEpg();
@ -412,14 +415,19 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
@Override
public void showEpg(Channel item) {
if (mChannel == null || mChannel.getData().getList().isEmpty() || mEpgDataAdapter.size() == 0 || !mChannel.equals(item) || !mChannel.getGroup().equals(mGroup)) return;
mBinding.widget.epgData.setSelectedPosition(mChannel.getData().getSelected());
mBinding.widget.epg.setVisibility(View.VISIBLE);
mBinding.widget.epg.requestFocus();
hideUI();
mBinding.epgData.setSelectedPosition(mChannel.getData().getSelected());
mBinding.epgData.setVisibility(View.VISIBLE);
mBinding.channel.setVisibility(View.GONE);
mBinding.group.setVisibility(View.GONE);
mBinding.epgData.requestFocus();
}
private void hideEpg() {
mBinding.widget.epg.setVisibility(View.GONE);
@Override
public void hideEpg() {
mBinding.channel.setVisibility(View.VISIBLE);
mBinding.group.setVisibility(View.VISIBLE);
mBinding.epgData.setVisibility(View.GONE);
mBinding.channel.requestFocus();
}
private void showProgress() {
@ -447,16 +455,15 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
private void showControl(View view) {
mBinding.control.getRoot().setVisibility(View.VISIBLE);
mBinding.widget.top.setVisibility(View.VISIBLE);
mBinding.widget.info.setVisibility(View.VISIBLE);
App.post(view::requestFocus, 25);
setR1Callback();
hideInfo();
hideEpg();
}
private void hideControl() {
mBinding.control.getRoot().setVisibility(View.GONE);
mBinding.widget.top.setVisibility(View.GONE);
mBinding.widget.info.setVisibility(View.GONE);
App.removeCallbacks(mR1);
}
@ -468,7 +475,6 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
private void showInfo() {
mBinding.widget.bottom.setVisibility(View.VISIBLE);
setR3Callback();
hideEpg();
setInfo();
}
@ -555,6 +561,8 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
if (item.isSelected()) {
fetch(item);
} else if (mChannel.hasCatchup()) {
mBinding.widget.epg.setVisibility(item.isInRange() ? View.GONE : View.VISIBLE);
mBinding.widget.epg.setText(item.isInRange() ? "" : item.getTitle());
Notify.show(getString(R.string.play_ready, item.getTitle()));
setActivated(item);
fetch(item);
@ -588,6 +596,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
mBinding.widget.play.setText("");
mChannel.loadLogo(mBinding.widget.logo);
mBinding.widget.title.setSelected(true);
mBinding.widget.epg.setVisibility(View.GONE);
mBinding.widget.name.setText(mChannel.getName());
mBinding.widget.title.setText(mChannel.getName());
mBinding.widget.line.setText(mChannel.getLineText());
@ -619,7 +628,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
mViewModel.getUrl(mChannel, item);
mPlayers.clear();
mPlayers.stop();
hideEpg();
hideUI();
}
private void fetch() {
@ -637,13 +646,13 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
private void checkPlayImg() {
ActionEvent.update();
mBinding.control.action.setText(mPlayers.isPlaying() ? R.string.pause : R.string.play);
}
private void resetAdapter() {
mBinding.widget.epgData.getLayoutParams().width = 0;
mBinding.channel.getLayoutParams().width = 0;
mBinding.epgData.getLayoutParams().width = 0;
mBinding.group.getLayoutParams().width = 0;
mBinding.divide.setVisibility(View.GONE);
mEpgDataAdapter.clear();
mChannelAdapter.clear();
mGroupAdapter.clear();
@ -882,7 +891,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
@Override
public boolean dispatch(boolean check) {
return !check || isGone(mBinding.recycler) && isGone(mBinding.control.getRoot()) && isGone(mBinding.widget.epg);
return !check || isGone(mBinding.recycler) && isGone(mBinding.control.getRoot());
}
@Override
@ -937,7 +946,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
@Override
public void onMenu() {
showControl(mBinding.control.player);
showControl(mBinding.control.action);
}
@Override
@ -948,7 +957,6 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
@Override
public void onDoubleTap() {
if (isVisible(mBinding.recycler)) hideUI();
else if (isVisible(mBinding.widget.epg)) hideEpg();
else if (isVisible(mBinding.control.getRoot())) hideControl();
else onMenu();
}
@ -986,8 +994,6 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
hideControl();
} else if (isVisible(mBinding.widget.bottom)) {
hideInfo();
} else if (isVisible(mBinding.widget.epg)) {
hideEpg();
} else if (isVisible(mBinding.recycler)) {
hideUI();
} else {

@ -34,14 +34,14 @@ public class CustomLiveListView extends VerticalGridView {
private boolean onKeyDown() {
if (getSelectedPosition() != getAdapter().getItemCount() - 1) return false;
if (getId() == R.id.channel) setSelectedPosition(0);
if (getId() == R.id.channel || getId() == R.id.epg) setSelectedPosition(0);
else if (listener != null) listener.nextGroup(false);
return true;
}
private boolean onKeyUp() {
if (getSelectedPosition() != 0) return false;
if (getId() == R.id.channel) setSelectedPosition(getAdapter().getItemCount());
if (getId() == R.id.channel || getId() == R.id.epg) setSelectedPosition(getAdapter().getItemCount());
else if (listener != null) listener.prevGroup(false);
return true;
}

@ -19,7 +19,7 @@ public class EpgDataPresenter extends Presenter {
public interface OnClickListener {
void showUI();
void hideEpg();
void onItemClick(EpgData item);
}
@ -36,7 +36,7 @@ public class EpgDataPresenter extends Presenter {
holder.binding.time.setText(item.getTime());
holder.binding.title.setText(item.getTitle());
holder.binding.getRoot().setSelected(item.isSelected());
holder.binding.getRoot().setLeftListener(mListener::showUI);
holder.binding.getRoot().setLeftListener(mListener::hideEpg);
setOnClickListener(holder, view -> {
if (!item.isFuture()) mListener.onItemClick(item);
});

@ -53,13 +53,6 @@
tools:itemCount="5"
tools:listitem="@layout/adapter_group" />
<View
android:id="@+id/divide"
android:layout_width="0.3dp"
android:layout_height="match_parent"
android:background="@color/grey_700"
android:visibility="gone" />
<com.fongmi.android.tv.ui.custom.CustomLiveListView
android:id="@+id/channel"
android:layout_width="0dp"
@ -67,6 +60,13 @@
tools:itemCount="5"
tools:listitem="@layout/adapter_channel" />
<com.fongmi.android.tv.ui.custom.CustomLiveListView
android:id="@+id/epgData"
android:layout_width="0dp"
android:layout_height="match_parent"
tools:itemCount="5"
tools:listitem="@layout/adapter_epg_data" />
</LinearLayout>
</FrameLayout>

@ -18,7 +18,7 @@
android:orientation="horizontal">
<TextView
android:id="@+id/player"
android:id="@+id/action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
@ -26,6 +26,18 @@
android:focusable="true"
android:focusableInTouchMode="true"
android:nextFocusLeft="@id/change"
android:text="@string/play"
android:textColor="@color/white"
android:textSize="14sp" />
<TextView
android:id="@+id/player"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:text="@string/play_exo"
android:textColor="@color/white"
android:textSize="14sp" />
@ -170,7 +182,7 @@
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:nextFocusRight="@id/player"
android:nextFocusRight="@id/action"
android:text="@string/play_change"
android:textColor="@color/text"
android:textSize="14sp" />

@ -5,7 +5,7 @@
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/top"
android:id="@+id/info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
@ -18,6 +18,7 @@
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_toStartOf="@+id/clock"
android:ellipsize="marquee"
android:shadowColor="@color/grey_900"
android:shadowDx="2"
@ -26,14 +27,30 @@
android:singleLine="true"
android:textColor="@color/white"
android:textSize="20sp"
tools:text="CCTV-1" />
tools:text="民視" />
<TextView
android:id="@+id/size"
android:layout_width="match_parent"
android:id="@+id/epg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/title"
android:layout_alignStart="@+id/title"
android:ellipsize="marquee"
android:shadowColor="@color/grey_900"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="16sp"
tools:text="食神" />
<TextView
android:id="@+id/size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/epg"
android:layout_alignStart="@+id/title"
android:shadowColor="@color/grey_900"
android:shadowDx="2"
android:shadowDy="2"
@ -42,6 +59,21 @@
android:textSize="16sp"
tools:text="1920 x 1080" />
<TextView
android:id="@+id/clock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginTop="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="20sp"
tools:text="09:20:00" />
</RelativeLayout>
<LinearLayout
@ -99,16 +131,17 @@
android:id="@+id/digital"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|end"
android:layout_margin="16dp"
android:layout_gravity="center"
android:background="@drawable/shape_widget"
android:includeFontPadding="false"
android:letterSpacing="0.05"
android:padding="16dp"
android:shadowColor="@color/grey_900"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:textColor="@color/white"
android:textSize="30sp"
android:textSize="64sp"
android:textStyle="bold"
android:visibility="gone"
tools:text="05"
@ -225,38 +258,10 @@
android:id="@+id/line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold"
tools:text="來源 1" />
<TextView
android:id="@+id/clock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold"
tools:text="16:50" />
</LinearLayout>
<LinearLayout
android:id="@+id/epg"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@drawable/shape_live_list"
android:orientation="vertical"
android:visibility="gone"
tools:visibility="visible">
<androidx.leanback.widget.VerticalGridView
android:id="@+id/epg_data"
android:layout_width="0dp"
android:layout_height="match_parent"
tools:itemCount="5"
tools:listitem="@layout/adapter_epg_data" />
</LinearLayout>
</FrameLayout>

@ -33,7 +33,6 @@
android:layout_height="wrap_content"
android:layout_below="@+id/title"
android:layout_alignStart="@+id/title"
android:layout_marginBottom="16dp"
android:shadowColor="@color/grey_900"
android:shadowDx="2"
android:shadowDy="2"

@ -28,6 +28,7 @@
<!-- Play -->
<string name="play">播放</string>
<string name="pause">暂停</string>
<string name="play_op">片头</string>
<string name="play_ed">片尾</string>
<string name="play_exo">EXO</string>

@ -28,6 +28,7 @@
<!-- Play -->
<string name="play">播放</string>
<string name="pause">暫停</string>
<string name="play_op">片頭</string>
<string name="play_ed">片尾</string>
<string name="play_exo">EXO</string>

@ -28,6 +28,7 @@
<!-- Play -->
<string name="play">Play</string>
<string name="pause">Pause</string>
<string name="play_op">OP</string>
<string name="play_ed">ED</string>
<string name="play_exo">EXO</string>

Loading…
Cancel
Save