From 73c79ce4eae336b593c9c025a4d3f1e121591f43 Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 23 Oct 2022 01:14:07 +0800 Subject: [PATCH] support live - part 6 --- .../tv/ui/activity/DetailActivity.java | 8 +- .../android/tv/ui/activity/LiveActivity.java | 92 ++++++++++++++++-- .../tv/ui/custom/CustomKeyDownLive.java | 94 +++++++++++++++++++ ...stomKeyDown.java => CustomKeyDownVod.java} | 26 ++--- app/src/leanback/res/layout/activity_live.xml | 3 +- .../com/fongmi/android/tv/api/ApiConfig.java | 10 +- .../com/fongmi/android/tv/api/LiveConfig.java | 42 +++++++-- .../com/fongmi/android/tv/bean/Channel.java | 38 ++++---- .../com/fongmi/android/tv/bean/Group.java | 4 +- .../com/fongmi/android/tv/player/Players.java | 7 +- .../android/tv/ui/activity/BaseActivity.java | 9 +- .../com/fongmi/android/tv/utils/Prefers.java | 8 ++ .../com/fongmi/android/tv/utils/Utils.java | 4 + 13 files changed, 280 insertions(+), 65 deletions(-) create mode 100644 app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java rename app/src/leanback/java/com/fongmi/android/tv/ui/custom/{CustomKeyDown.java => CustomKeyDownVod.java} (64%) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index 5b551f985..df3010d49 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -38,7 +38,7 @@ import com.fongmi.android.tv.net.Callback; import com.fongmi.android.tv.net.OKHttp; import com.fongmi.android.tv.player.ExoUtil; import com.fongmi.android.tv.player.Players; -import com.fongmi.android.tv.ui.custom.CustomKeyDown; +import com.fongmi.android.tv.ui.custom.CustomKeyDownVod; import com.fongmi.android.tv.ui.custom.TrackSelectionDialog; import com.fongmi.android.tv.ui.custom.dialog.DescDialog; import com.fongmi.android.tv.ui.presenter.EpisodePresenter; @@ -66,7 +66,7 @@ import java.util.List; import okhttp3.Call; import okhttp3.Response; -public class DetailActivity extends BaseActivity implements CustomKeyDown.Listener, ArrayPresenter.OnClickListener, Clock.Callback { +public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Listener, ArrayPresenter.OnClickListener, Clock.Callback { private ActivityDetailBinding mBinding; private ViewControllerBottomBinding mControl; @@ -78,8 +78,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen private ArrayObjectAdapter mPartAdapter; private EpisodePresenter mEpisodePresenter; private PartPresenter mPartPresenter; + private CustomKeyDownVod mKeyDown; private SiteViewModel mViewModel; - private CustomKeyDown mKeyDown; private boolean mFullscreen; private Handler mHandler; private History mHistory; @@ -136,7 +136,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen @Override protected void initView() { - mKeyDown = CustomKeyDown.create(this); + mKeyDown = CustomKeyDownVod.create(this); mHandler = new Handler(Looper.getMainLooper()); mFrameParams = mBinding.video.getLayoutParams(); mBinding.progressLayout.showProgress(); 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 ef08ee7fe..ae1e555d7 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 @@ -4,6 +4,7 @@ import android.app.Activity; import android.content.Intent; import android.os.Handler; import android.os.Looper; +import android.view.KeyEvent; import android.view.View; import androidx.annotation.NonNull; @@ -20,6 +21,7 @@ import com.fongmi.android.tv.bean.Group; import com.fongmi.android.tv.databinding.ActivityLiveBinding; import com.fongmi.android.tv.event.PlayerEvent; import com.fongmi.android.tv.player.Players; +import com.fongmi.android.tv.ui.custom.CustomKeyDownLive; import com.fongmi.android.tv.ui.presenter.ChannelPresenter; import com.fongmi.android.tv.ui.presenter.GroupPresenter; import com.fongmi.android.tv.utils.Prefers; @@ -31,11 +33,12 @@ import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; -public class LiveActivity extends BaseActivity implements GroupPresenter.OnClickListener, ChannelPresenter.OnClickListener { +public class LiveActivity extends BaseActivity implements GroupPresenter.OnClickListener, ChannelPresenter.OnClickListener, CustomKeyDownLive.Listener { private ActivityLiveBinding mBinding; private ArrayObjectAdapter mChannelAdapter; private ArrayObjectAdapter mGroupAdapter; + private CustomKeyDownLive mKeyDown; private Handler mHandler; private Players mPlayers; @@ -55,8 +58,12 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick return (Channel) mChannelAdapter.get(mBinding.channel.getSelectedPosition()); } - private boolean isRecyclerVisible() { - return mBinding.recycler.getVisibility() == View.VISIBLE; + private boolean isVisible(View view) { + return view.getVisibility() == View.VISIBLE; + } + + private boolean isGone(View view) { + return view.getVisibility() == View.GONE; } @Override @@ -67,6 +74,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override protected void initView() { mHandler = new Handler(Looper.getMainLooper()); + mKeyDown = CustomKeyDownLive.create(this); mPlayers = new Players().init(); setRecyclerView(); setVideoView(); @@ -89,17 +97,26 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick mBinding.channel.setAdapter(new ItemBridgeAdapter(mChannelAdapter = new ArrayObjectAdapter(new ChannelPresenter(this)))); } - private void getLive() { - mGroupAdapter.setItems(LiveConfig.get().getHome().getGroups(), null); - mBinding.channel.requestFocus(); - } - private void setVideoView() { getPlayerView().setPlayer(mPlayers.exo()); getPlayerView().setVisibility(View.VISIBLE); getPlayerView().setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL); } + private void getLive() { + int[] position = LiveConfig.get().getKeep(); + mGroupAdapter.setItems(LiveConfig.get().getHome().getGroups(), null); + if (position[0] == -1) mBinding.recycler.setVisibility(View.VISIBLE); + else setKeep(position); + } + + private void setKeep(int[] position) { + mBinding.group.setSelectedPosition(position[0]); + getGroup().setPosition(position[1]); + onItemClick(getGroup()); + onItemClick(getChannel()); + } + @Override public void onItemClick(Group item) { mChannelAdapter.setItems(item.getChannel(), null); @@ -109,9 +126,66 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override public void onItemClick(Channel item) { getGroup().setPosition(mBinding.channel.getSelectedPosition()); + LiveConfig.get().setKeep(getGroup(), item); + mBinding.recycler.setVisibility(View.GONE); mPlayers.start(item); } + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (isGone(mBinding.recycler) && mKeyDown.hasEvent(event)) return mKeyDown.onKeyDown(event); + else return super.dispatchKeyEvent(event); + } + + @Override + public void onShow(String number) { + + } + + @Override + public void onFind(String number) { + + } + + @Override + public void onKeyUp() { + int position = mBinding.channel.getSelectedPosition(); + position = position > 0 ? --position : mChannelAdapter.size() - 1; + mBinding.channel.setSelectedPosition(position); + mBinding.channel.scrollToPosition(position); + onItemClick(getChannel()); + } + + @Override + public void onKeyDown() { + int position = mBinding.channel.getSelectedPosition(); + position = position < mChannelAdapter.size() - 1 ? ++position : 0; + mBinding.channel.setSelectedPosition(position); + mBinding.channel.scrollToPosition(position); + onItemClick(getChannel()); + } + + @Override + public void onKeyLeft() { + + } + + @Override + public void onKeyRight() { + + } + + @Override + public void onKeyCenter() { + mBinding.recycler.setVisibility(View.VISIBLE); + mBinding.channel.requestFocus(); + } + + @Override + public void onLongPress() { + + } + @Subscribe(threadMode = ThreadMode.MAIN) public void onPlayerEvent(PlayerEvent event) { switch (event.getState()) { @@ -150,7 +224,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override public void onBackPressed() { - if (isRecyclerVisible()) { + if (isVisible(mBinding.recycler)) { mBinding.recycler.setVisibility(View.GONE); } else { super.onBackPressed(); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java new file mode 100644 index 000000000..e6e9ae9fa --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java @@ -0,0 +1,94 @@ +package com.fongmi.android.tv.ui.custom; + +import android.os.Handler; +import android.view.KeyEvent; + +import com.fongmi.android.tv.utils.Utils; + +public class CustomKeyDownLive { + + private final Listener listener; + private final StringBuilder text; + private final Handler handler; + private boolean press; + + private final Runnable runnable = new Runnable() { + @Override + public void run() { + listener.onFind(text.toString()); + text.setLength(0); + } + }; + + public static CustomKeyDownLive create(Listener listener) { + return new CustomKeyDownLive(listener); + } + + private CustomKeyDownLive(Listener listener) { + this.listener = listener; + this.handler = new Handler(); + this.text = new StringBuilder(); + } + + public void onKeyDown(int keyCode) { + if (text.length() >= 4) return; + text.append(getNumber(keyCode)); + handler.removeCallbacks(runnable); + handler.postDelayed(runnable, 1000); + listener.onShow(text.toString()); + } + + public boolean onKeyDown(KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isUpKey(event)) { + listener.onKeyUp(); + } else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isDownKey(event)) { + listener.onKeyDown(); + } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isLeftKey(event)) { + listener.onKeyLeft(); + } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isRightKey(event)) { + listener.onKeyRight(); + } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isDigitKey(event)) { + onKeyDown(event.getKeyCode()); + } else if (Utils.isEnterKey(event)) { + checkPress(event); + } + return true; + } + + private void checkPress(KeyEvent event) { + if (event.isLongPress()) { + press = true; + listener.onLongPress(); + } else if (event.getAction() == KeyEvent.ACTION_UP) { + if (press) press = false; + else listener.onKeyCenter(); + } + } + + public boolean hasEvent(KeyEvent event) { + return Utils.isEnterKey(event) || Utils.isUpKey(event) || Utils.isDownKey(event) || Utils.isLeftKey(event) || Utils.isRightKey(event) || Utils.isDigitKey(event) || event.isLongPress(); + } + + private int getNumber(int keyCode) { + return keyCode >= 144 ? keyCode - 144 : keyCode - 7; + } + + public interface Listener { + + void onShow(String number); + + void onFind(String number); + + void onKeyUp(); + + void onKeyDown(); + + void onKeyLeft(); + + void onKeyRight(); + + void onKeyCenter(); + + void onLongPress(); + } +} diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDown.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java similarity index 64% rename from app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDown.java rename to app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java index 6a44d2f76..bdc7d868a 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDown.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java @@ -4,30 +4,32 @@ import android.view.KeyEvent; import com.fongmi.android.tv.utils.Utils; -public class CustomKeyDown { +public class CustomKeyDownVod { - private final Listener mListener; + private final Listener listener; private int holdTime; - public static CustomKeyDown create(Listener listener) { - return new CustomKeyDown(listener); + public static CustomKeyDownVod create(Listener listener) { + return new CustomKeyDownVod(listener); } - private CustomKeyDown(Listener listener) { - this.mListener = listener; + private CustomKeyDownVod(Listener listener) { + this.listener = listener; } public boolean onKeyDown(KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_DOWN && (Utils.isLeftKey(event) || Utils.isRightKey(event))) { - mListener.onSeeking(Utils.isRightKey(event) ? addTime() : subTime()); + if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isLeftKey(event)) { + listener.onSeeking(subTime()); + } else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isRightKey(event)) { + listener.onSeeking(addTime()); } else if (event.getAction() == KeyEvent.ACTION_UP && (Utils.isLeftKey(event) || Utils.isRightKey(event))) { - mListener.onSeekTo(holdTime); + listener.onSeekTo(holdTime); } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isUpKey(event)) { - mListener.onKeyUp(); + listener.onKeyUp(); } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isDownKey(event)) { - mListener.onKeyDown(); + listener.onKeyDown(); } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isEnterKey(event)) { - mListener.onKeyCenter(); + listener.onKeyCenter(); } return true; } diff --git a/app/src/leanback/res/layout/activity_live.xml b/app/src/leanback/res/layout/activity_live.xml index 2bd097790..f934fb7b3 100644 --- a/app/src/leanback/res/layout/activity_live.xml +++ b/app/src/leanback/res/layout/activity_live.xml @@ -33,7 +33,8 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:background="@drawable/shape_live" - android:orientation="horizontal"> + android:orientation="horizontal" + android:visibility="gone"> (); this.sites = new ArrayList<>(); this.flags = new ArrayList<>(); @@ -108,6 +108,7 @@ public class ApiConfig { private void parseConfig(JsonObject object, Callback callback) { try { parseJson(object); + LiveConfig.get().parse(object); jLoader.parseJar("", Json.safeString(object, "spider", "")); handler.post(() -> callback.success(object.toString())); } catch (Exception e) { @@ -128,14 +129,10 @@ public class ApiConfig { if (parse.getName().equals(Prefers.getParse())) setParse(parse); if (!parses.contains(parse)) parses.add(parse); } - for (JsonElement element : Json.safeListElement(object, "lives")) { - LiveConfig.get().parse(Live.objectFrom(element)); - } if (home == null) setHome(sites.isEmpty() ? new Site() : sites.get(0)); if (parse == null) setParse(parses.isEmpty() ? new Parse() : parses.get(0)); flags.addAll(Json.safeListString(object, "flags")); ads.addAll(Json.safeListString(object, "ads")); - LiveConfig.get().setHome(); } private String parseExt(String ext) { @@ -219,13 +216,14 @@ public class ApiConfig { } public ApiConfig clear() { + this.home = null; this.ads.clear(); this.sites.clear(); this.flags.clear(); this.parses.clear(); this.jLoader.clear(); this.pLoader.clear(); - this.home = null; + LiveConfig.get().clear(); return this; } } \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java b/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java index 19ca4c176..0977796b9 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java @@ -5,9 +5,13 @@ import android.util.Base64; import com.fongmi.android.tv.bean.Channel; import com.fongmi.android.tv.bean.Group; import com.fongmi.android.tv.bean.Live; +import com.fongmi.android.tv.db.AppDatabase; import com.fongmi.android.tv.net.OKHttp; import com.fongmi.android.tv.utils.FileUtil; +import com.fongmi.android.tv.utils.Json; import com.fongmi.android.tv.utils.Prefers; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import java.util.ArrayList; import java.util.List; @@ -38,10 +42,6 @@ public class LiveConfig { return home; } - public void setHome() { - if (home == null) setHome(lives.isEmpty() ? new Live() : lives.get(0)); - } - public void setHome(Live home) { this.home = home; this.home.setActivated(true); @@ -49,13 +49,35 @@ public class LiveConfig { for (Live item : lives) item.setActivated(home); } + public void setKeep(Group group, Channel channel) { + Prefers.putKeep(getHome().getName() + AppDatabase.SYMBOL + group.getName() + AppDatabase.SYMBOL + channel.getName()); + } + + public int[] getKeep() { + String[] splits = Prefers.getKeep().split(AppDatabase.SYMBOL); + if (!getHome().getName().equals(splits[0])) return new int[]{-1, -1}; + for (int i = 0; i < getHome().getGroups().size(); i++) { + Group group = getHome().getGroups().get(i); + if (group.getName().equals(splits[1])) { + int j = group.find(splits[2]); + if (j != -1) return new int[]{i, j}; + } + } + return new int[]{-1, -1}; + } + private boolean isProxy(Live live) { return live.getGroup().equals("redirect") && live.getChannels().size() > 0 && live.getChannels().get(0).getUrls().size() > 0 && live.getChannels().get(0).getUrls().get(0).startsWith("proxy"); } + public void parse(JsonObject object) { + if (!object.has("lives")) return; + for (JsonElement element : Json.safeListElement(object, "lives")) parse(Live.objectFrom(element)); + if (home == null) setHome(lives.isEmpty() ? new Live() : lives.get(0)); + } + public void parse(Live live) { try { - if (lives == null) init(); if (isProxy(live)) live = new Live(live.getChannels().get(0).getName(), live.getChannels().get(0).getUrl().split("ext=")[1]); if (live.getType() == 0) parse(live, getTxt(live.getUrl())); if (live.getGroups().size() > 0) getLives().add(live); @@ -73,6 +95,7 @@ public class LiveConfig { } private void parse(Live live, String txt) { + int number = 0; for (String line : txt.split("\n")) { String[] split = line.split(","); if (split.length < 2) continue; @@ -81,11 +104,16 @@ public class LiveConfig { } if (split[1].contains("://")) { Group group = live.getGroups().get(live.getGroups().size() - 1); - Channel channel = new Channel(group.getChannel().size() + 1, split[0], split[1].split("#")); + Channel channel = new Channel(split[0], split[1].split("#")); int index = group.getChannel().indexOf(channel); if (index != -1) group.getChannel().get(index).getUrls().addAll(channel.getUrls()); - else group.getChannel().add(channel); + else group.getChannel().add(channel.setNumber(++number)); } } } + + public void clear() { + this.lives.clear(); + this.home = null; + } } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Channel.java b/app/src/main/java/com/fongmi/android/tv/bean/Channel.java index 1d53152c5..98c913914 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Channel.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Channel.java @@ -11,6 +11,7 @@ import com.google.gson.annotations.SerializedName; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -26,8 +27,6 @@ public class Channel { private String icon; @SerializedName("name") private String name; - @SerializedName("group") - private Group group; @SerializedName("ua") private String ua; @@ -38,20 +37,22 @@ public class Channel { return new Gson().fromJson(element, Channel.class); } - public static Channel create(String number) { - return new Channel(String.format(Locale.getDefault(), "%03d", Integer.valueOf(number))); + public static Channel create(int number) { + return new Channel().setNumber(number); } - public Channel(String number) { - this.number = number; + public static Channel create(String name) { + return new Channel(name, Collections.emptyList()); + } + + public Channel() { } - public Channel(int number, String name, String... urls) { - this(number, name, new ArrayList<>(Arrays.asList(urls))); + public Channel(String name, String... urls) { + this(name, new ArrayList<>(Arrays.asList(urls))); } - public Channel(int number, String name, List urls) { - this.number = String.format(Locale.getDefault(), "%03d", number); + public Channel(String name, List urls) { this.name = name; this.urls = urls; } @@ -65,7 +66,7 @@ public class Channel { } public String getNumber() { - return number; + return TextUtils.isEmpty(number) ? "" : number; } public void setNumber(String number) { @@ -88,14 +89,6 @@ public class Channel { this.name = name; } - public Group getGroup() { - return group; - } - - public void setGroup(Group group) { - this.group = group; - } - public String getUa() { return TextUtils.isEmpty(ua) ? "" : ua; } @@ -132,6 +125,11 @@ public class Channel { return getUrls().get(getIndex()); } + public Channel setNumber(int number) { + setNumber(String.format(Locale.getDefault(), "%03d", number)); + return this; + } + public Map getHeaders() { HashMap map = new HashMap<>(); if (getUa().isEmpty()) return map; @@ -144,6 +142,6 @@ public class Channel { if (this == obj) return true; if (!(obj instanceof Channel)) return false; Channel it = (Channel) obj; - return getNumber().equals(it.getNumber()) || getName().equals(it.getName()); + return getName().equals(it.getName()) || (!getNumber().isEmpty() && getNumber().equals(it.getNumber())); } } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Group.java b/app/src/main/java/com/fongmi/android/tv/bean/Group.java index 83051eaa0..84bd0c458 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Group.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Group.java @@ -89,8 +89,8 @@ public class Group { if (!getIcon().isEmpty()) ImgUtil.load(getIcon(), view); } - public int find(String number) { - return getChannel().lastIndexOf(Channel.create(number)); + public int find(String name) { + return getChannel().lastIndexOf(Channel.create(name)); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/player/Players.java b/app/src/main/java/com/fongmi/android/tv/player/Players.java index c974dc237..0bd4d4020 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/Players.java +++ b/app/src/main/java/com/fongmi/android/tv/player/Players.java @@ -15,6 +15,7 @@ import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.analytics.AnalyticsListener; +import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.util.Util; @@ -41,9 +42,11 @@ public class Players implements Player.Listener, AnalyticsListener, ParseTask.Ca private void setupPlayer() { DefaultTrackSelector selector = new DefaultTrackSelector(App.get()); selector.setParameters(selector.getParameters().buildUpon().setPreferredTextLanguage("zh").build()); - DefaultRenderersFactory factory = new DefaultRenderersFactory(App.get()).experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(true).setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON); + DefaultRenderersFactory factory = new DefaultRenderersFactory(App.get()).setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON); exoPlayer = new ExoPlayer.Builder(App.get()).setLoadControl(new DefaultLoadControl()).setRenderersFactory(factory).setTrackSelector(selector).build(); + exoPlayer.setAudioAttributes(AudioAttributes.DEFAULT, true); exoPlayer.addAnalyticsListener(this); + exoPlayer.setPlayWhenReady(true); exoPlayer.addListener(this); } @@ -168,7 +171,6 @@ public class Players implements Player.Listener, AnalyticsListener, ParseTask.Ca exoPlayer.setMediaSource(ExoUtil.getSource(result, errorCode)); PlayerEvent.state(0); exoPlayer.prepare(); - exoPlayer.play(); setErrorCode(0); } @@ -176,7 +178,6 @@ public class Players implements Player.Listener, AnalyticsListener, ParseTask.Ca exoPlayer.setMediaSource(ExoUtil.getSource(headers, url, errorCode)); PlayerEvent.state(0); exoPlayer.prepare(); - exoPlayer.play(); setErrorCode(0); } diff --git a/app/src/main/java/com/fongmi/android/tv/ui/activity/BaseActivity.java b/app/src/main/java/com/fongmi/android/tv/ui/activity/BaseActivity.java index 4d69e2f5e..7d5a8f42f 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/activity/BaseActivity.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/activity/BaseActivity.java @@ -36,9 +36,16 @@ public abstract class BaseActivity extends AppCompatActivity { protected void initEvent() { } + protected void hackResources() { + try { + AutoSizeCompat.autoConvertDensityOfGlobal(super.getResources()); + } catch (Exception ignored) { + } + } + @Override public Resources getResources() { - AutoSizeCompat.autoConvertDensityOfGlobal(super.getResources()); + hackResources(); return super.getResources(); } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java b/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java index 8108d515a..47ae85591 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java @@ -76,6 +76,14 @@ public class Prefers { put("live", live); } + public static String getKeep() { + return getString("keep"); + } + + public static void putKeep(String keep) { + put("keep", keep); + } + public static int getRender() { return getInt("render", 0); } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Utils.java b/app/src/main/java/com/fongmi/android/tv/utils/Utils.java index d780e769e..e4941c03f 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Utils.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Utils.java @@ -48,6 +48,10 @@ public class Utils { return event.getKeyCode() == KeyEvent.KEYCODE_BACK; } + public static boolean isDigitKey(KeyEvent event) { + return event.getKeyCode() >= KeyEvent.KEYCODE_0 && event.getKeyCode() <= KeyEvent.KEYCODE_9 || event.getKeyCode() >= KeyEvent.KEYCODE_NUMPAD_0 && event.getKeyCode() <= KeyEvent.KEYCODE_NUMPAD_9; + } + public static void hideSystemUI(Activity activity) { int flags = View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; activity.getWindow().getDecorView().setSystemUiVisibility(flags);