Clean code and fix some bug

pull/137/head
FongMi 4 years ago
parent 7f29fd4b6d
commit f4c297d78f
  1. 84
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  2. 14
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java
  3. 1
      app/src/leanback/res/layout/activity_home.xml
  4. 47
      app/src/leanback/res/layout/view_controller_widget.xml
  5. 7
      app/src/main/java/com/fongmi/android/tv/bean/History.java
  6. 33
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  7. 25
      app/src/main/java/com/fongmi/android/tv/utils/Clock.java

@ -44,6 +44,7 @@ import com.fongmi.android.tv.ui.presenter.FlagPresenter;
import com.fongmi.android.tv.ui.presenter.GroupPresenter;
import com.fongmi.android.tv.ui.presenter.ParsePresenter;
import com.fongmi.android.tv.ui.presenter.PartPresenter;
import com.fongmi.android.tv.utils.Clock;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.Prefers;
import com.fongmi.android.tv.utils.ResUtil;
@ -63,7 +64,7 @@ import java.util.List;
import okhttp3.Call;
import okhttp3.Response;
public class DetailActivity extends BaseActivity implements CustomKeyDown.Listener, GroupPresenter.OnClickListener {
public class DetailActivity extends BaseActivity implements CustomKeyDown.Listener, GroupPresenter.OnClickListener, Clock.Callback {
private ActivityDetailBinding mBinding;
private ViewControllerBottomBinding mControl;
@ -234,7 +235,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen
}
private void setDetail(Vod item) {
Players.get().setKey(getHistoryKey());
mBinding.progressLayout.showContent();
mBinding.video.setTag(item.getVodPic());
mBinding.name.setText(item.getVodName());
@ -275,7 +275,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen
for (int i = 0; i < mFlagAdapter.size(); i++) ((Vod.Flag) mFlagAdapter.get(i)).toggle(mCurrent == i, item);
mEpisodeAdapter.notifyArrayItemRangeChanged(0, mEpisodeAdapter.size());
mHandler.post(() -> mBinding.episode.setSelectedPosition(getEpisodePosition()));
mBinding.widget.title.setText(getString(R.string.detail_title, mBinding.name.getText(), item.getName()));
if (mEpisodeAdapter.size() == 0) return;
getPlayer(false);
}
@ -336,7 +335,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen
}
private void exitFullscreen() {
mBinding.widget.title.setVisibility(View.GONE);
mBinding.widget.top.setVisibility(View.GONE);
mBinding.widget.center.setVisibility(View.GONE);
mBinding.video.setForeground(ResUtil.getDrawable(R.drawable.selector_video));
mBinding.video.setLayoutParams(mFrameParams);
@ -398,7 +397,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen
private boolean onOpeningReset() {
mHistory.setOpening(0);
mControl.opening.setText(Players.get().getStringForTime(mHistory.getOpening()));
mHistory.update();
return true;
}
@ -411,7 +409,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen
private boolean onEndingReset() {
mHistory.setEnding(0);
mControl.ending.setText(Players.get().getStringForTime(mHistory.getEnding()));
mHistory.update();
return true;
}
@ -427,7 +424,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen
mHistory.setOpening(0);
mControl.ending.setText(Players.get().getStringForTime(mHistory.getEnding()));
mControl.opening.setText(Players.get().getStringForTime(mHistory.getOpening()));
mHistory.update();
}
private void onTracks() {
@ -450,6 +446,9 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen
private void checkHistory() {
mHistory = History.find(getHistoryKey());
if (mFlagAdapter.size() == 0) {
mBinding.flag.setVisibility(View.GONE);
mBinding.group.setVisibility(View.GONE);
mBinding.episode.setVisibility(View.GONE);
Notify.show(R.string.error_episode);
return;
}
@ -474,7 +473,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen
history.setCid(ApiConfig.getCid());
history.setVodPic(mBinding.video.getTag().toString());
history.setVodName(mBinding.name.getText().toString());
return history.save();
return history;
}
private void updateHistory(Vod.Flag.Episode item, boolean replay) {
@ -488,9 +487,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen
}
private void updateHistory() {
if (mHistory == null) return;
mHistory.setDuration(Players.get().getCurrentPosition());
mHistory.update();
if (mHistory != null) mHistory.update();
}
private final Runnable mHideCenter = new Runnable() {
@ -498,24 +495,20 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen
public void run() {
mBinding.widget.action.setImageResource(R.drawable.ic_play);
mBinding.widget.center.setVisibility(View.GONE);
mBinding.widget.title.setVisibility(View.GONE);
mBinding.widget.top.setVisibility(View.GONE);
}
};
private final Runnable mProgress = new Runnable() {
@Override
public void run() {
boolean keep = true;
long duration = Players.get().getDuration();
long current = Players.get().getCurrentPosition();
if (mHistory.getOpening() >= current) Players.get().seekTo(mHistory.getOpening());
if (mHistory.getEnding() > 0 && duration > 0 && mHistory.getEnding() + current >= duration) {
keep = false;
checkNext();
}
if (keep) mHandler.postDelayed(mProgress, 1000);
@Override
public void onTimeChanged() {
long duration = Players.get().getDuration();
long current = Players.get().getCurrentPosition();
if (mHistory.getOpening() >= current) Players.get().seekTo(mHistory.getOpening());
if (mHistory.getEnding() > 0 && duration > 0 && mHistory.getEnding() + current >= duration) {
Clock.get().setCallback(null);
checkNext();
}
};
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onPlayerEvent(PlayerEvent event) {
@ -545,20 +538,11 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen
private void checkPosition() {
Players.get().seekTo(mHistory.getDuration());
stopTimer();
setTimer();
}
private void stopTimer() {
mHandler.removeCallbacks(mProgress);
}
private void setTimer() {
mHandler.postDelayed(mProgress, 1000);
Clock.get().setCallback(this);
}
private void onRetry() {
updateHistory();
mHistory.setDuration(Players.get().getCurrentPosition());
getPlayer(false);
}
@ -566,14 +550,14 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen
mBinding.widget.progress.getRoot().setVisibility(View.GONE);
mBinding.widget.error.setVisibility(View.VISIBLE);
mBinding.widget.text.setText(msg);
Clock.get().setCallback(null);
Players.get().stop();
stopTimer();
}
private void onPause(boolean visible) {
mBinding.widget.exoPosition.setText(Players.get().getTime(0));
mBinding.widget.exoDuration.setText(mControl.exoDuration.getText());
mBinding.widget.title.setVisibility(visible ? View.VISIBLE : View.GONE);
mBinding.widget.top.setVisibility(visible ? View.VISIBLE : View.GONE);
mBinding.widget.center.setVisibility(visible ? View.VISIBLE : View.GONE);
Players.get().pause();
}
@ -616,16 +600,20 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen
else onPlay(0);
}
@Override
protected void onPause() {
super.onPause();
onPause(false);
}
@Override
protected void onResume() {
super.onResume();
onPlay(0);
Clock.start(mBinding.widget.time);
}
@Override
protected void onPause() {
super.onPause();
onPause(false);
updateHistory();
RefreshEvent.history();
Clock.get().release();
}
@Override
@ -635,16 +623,14 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen
} else if (mFullscreen) {
exitFullscreen();
} else {
destroy();
super.onBackPressed();
}
}
private void destroy() {
stopTimer();
updateHistory();
@Override
protected void onDestroy() {
super.onDestroy();
Players.get().stop();
RefreshEvent.history();
EventBus.getDefault().unregister(this);
}
}

@ -75,7 +75,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
protected void initView() {
mHandler = new Handler(Looper.getMainLooper());
Updater.create(this).start();
Clock.start(mBinding.time);
Server.get().start();
Players.get().init();
setRecyclerView();
@ -264,6 +263,18 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
}
}
@Override
protected void onResume() {
super.onResume();
Clock.start(mBinding.time);
}
@Override
protected void onPause() {
super.onPause();
Clock.get().release();
}
@Override
public void onBackPressed() {
if (mHistoryPresenter.isDelete()) {
@ -283,7 +294,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
private void destroy() {
Server.get().stop();
Clock.get().release();
Players.get().release();
EventBus.getDefault().unregister(this);
}

@ -30,7 +30,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:letterSpacing="0.02"
android:textColor="@color/white"
android:textSize="24sp"
tools:text="07/25 09:20:00" />

@ -4,24 +4,45 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/title"
<LinearLayout
android:id="@+id/top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top|start"
android:background="@drawable/shape_title"
android:letterSpacing="0.02"
android:orientation="horizontal"
android:padding="16dp"
android:shadowColor="@color/grey_700"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="20sp"
android:visibility="gone"
tools:text="慶餘年第一季:第一集"
tools:visibility="visible" />
tools:visibility="visible">
<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:letterSpacing="0.02"
android:shadowColor="@color/grey_700"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="20sp"
tools:text="慶餘年第一季:第一集" />
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:shadowColor="@color/grey_700"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:textColor="@color/white"
android:textSize="20sp"
tools:text="07/25 09:20:00" />
</LinearLayout>
<include
android:id="@+id/progress"

@ -172,13 +172,8 @@ public class History {
AppDatabase.get().getHistoryDao().delete(id);
}
public History save() {
AppDatabase.get().getHistoryDao().insertOrUpdate(this);
return this;
}
public History update() {
AppDatabase.get().getHistoryDao().update(this);
AppDatabase.get().getHistoryDao().insertOrUpdate(this);
return this;
}

@ -25,7 +25,6 @@ public class Players implements Player.Listener, ParseTask.Callback {
private Formatter formatter;
private ExoPlayer exoPlayer;
private ParseTask parseTask;
private String key;
private int retry;
private static class Loader {
@ -52,14 +51,6 @@ public class Players implements Player.Listener, ParseTask.Callback {
return webView;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public int getRetry() {
return retry;
}
@ -100,27 +91,27 @@ public class Players implements Player.Listener, ParseTask.Callback {
}
public long getCurrentPosition() {
return exo().getCurrentPosition();
return exo() == null ? 0 : exo().getCurrentPosition();
}
public long getDuration() {
return exo().getDuration();
return exo() == null ? 0 : exo().getDuration();
}
public void seekTo(int time) {
exo().seekTo(getCurrentPosition() + time);
if (exo() != null) exo().seekTo(getCurrentPosition() + time);
}
public void seekTo(long time) {
exo().seekTo(time);
if (exo() != null) exo().seekTo(time);
}
public boolean isPlaying() {
return exo().isPlaying();
return exo() != null && exo().isPlaying();
}
public boolean isIdle() {
return exo().getPlaybackState() == Player.STATE_IDLE;
return exo() != null && exo().getPlaybackState() == Player.STATE_IDLE;
}
public boolean canNext() {
@ -142,18 +133,20 @@ public class Players implements Player.Listener, ParseTask.Callback {
exo().setMediaSource(ExoUtil.getSource(result));
PlayerEvent.state(0);
exo().prepare();
exo().play();
}
private void setMediaSource(Map<String, String> headers, String url) {
exo().setMediaSource(ExoUtil.getSource(headers, url));
PlayerEvent.state(0);
exo().prepare();
exo().play();
}
public void play() {
if (exo() != null) exo().play();
}
public void pause() {
exo().pause();
if (exo() != null) exo().pause();
}
public void stop() {
@ -164,10 +157,6 @@ public class Players implements Player.Listener, ParseTask.Callback {
if (webView != null) webView.stop(false);
}
public void play() {
exo().play();
}
public void release() {
if (exoPlayer != null) {
exoPlayer.removeListener(this);

@ -13,8 +13,10 @@ import java.util.TimerTask;
public class Clock {
private SimpleDateFormat formatter;
private Callback callback;
private Handler handler;
private Timer timer;
private Date date;
private static class Loader {
static volatile Clock INSTANCE = new Clock();
@ -27,6 +29,7 @@ public class Clock {
public void init() {
this.formatter = new SimpleDateFormat("MM/dd HH:mm:ss", Locale.getDefault());
this.handler = new Handler(Looper.getMainLooper());
this.date = new Date();
}
public static void start(TextView view) {
@ -34,21 +37,39 @@ public class Clock {
get().run(view);
}
public void setCallback(Callback callback) {
this.callback = callback;
}
private void run(TextView view) {
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
if (handler == null || view == null || formatter == null) return;
handler.post(() -> view.setText(formatter.format(new Date())));
handler.post(() -> doJob(view));
}
}, 0, 1000);
}
private void doJob(TextView view) {
try {
date.setTime(System.currentTimeMillis());
view.setText(formatter.format(date));
if (callback != null) callback.onTimeChanged();
} catch (Exception ignored) {
}
}
public void release() {
if (timer != null) timer.cancel();
formatter = null;
handler = null;
timer = null;
date = null;
}
public interface Callback {
void onTimeChanged();
}
}

Loading…
Cancel
Save