From 580c270095a87522c022199811ee0dfe0191c477 Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 3 Mar 2026 09:42:31 +0800 Subject: [PATCH] Clean code --- .../android/tv/ui/activity/HomeActivity.java | 4 + .../android/tv/ui/activity/LiveActivity.java | 4 +- .../android/tv/api/config/BaseConfig.java | 84 +++++++++++++++ .../android/tv/api/config/LiveConfig.java | 100 ++++++------------ .../android/tv/api/config/VodConfig.java | 61 ++++------- .../android/tv/api/config/WallConfig.java | 72 ++++++------- .../fongmi/android/tv/event/RefreshEvent.java | 8 +- .../android/tv/model/LiveViewModel.java | 2 +- .../com/fongmi/android/tv/utils/UrlUtil.java | 7 ++ .../android/tv/ui/activity/HomeActivity.java | 1 + .../android/tv/ui/activity/LiveActivity.java | 2 +- 11 files changed, 191 insertions(+), 154 deletions(-) create mode 100644 app/src/main/java/com/fongmi/android/tv/api/config/BaseConfig.java 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 c4c6f3db4..8955e3590 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 @@ -23,6 +23,7 @@ import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.App; import com.fongmi.android.tv.Product; import com.fongmi.android.tv.R; +import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.Updater; import com.fongmi.android.tv.api.config.LiveConfig; import com.fongmi.android.tv.api.config.VodConfig; @@ -333,6 +334,9 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen getVideo(); getHistory(true); break; + case BOOT: + LiveActivity.start(this); + break; } } 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 233fa2cf6..fea616628 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 @@ -261,7 +261,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick List items = new ArrayList<>(); for (Group group : live.getGroups()) (group.isHidden() ? mHides : items).add(group); mGroupAdapter.setItems(items, null); - setPosition(LiveConfig.get().find(items)); + setPosition(LiveConfig.get().findKeepPosition(items)); } private void setWidth(Live live) { @@ -957,7 +957,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override public void onFind(String number) { mBinding.widget.digital.setVisibility(View.GONE); - setPosition(LiveConfig.get().find(number, mGroupAdapter.unmodifiableList())); + setPosition(LiveConfig.get().findByChannelNumber(number, mGroupAdapter.unmodifiableList())); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/api/config/BaseConfig.java b/app/src/main/java/com/fongmi/android/tv/api/config/BaseConfig.java new file mode 100644 index 000000000..0259c0798 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/api/config/BaseConfig.java @@ -0,0 +1,84 @@ +package com.fongmi.android.tv.api.config; + +import android.text.TextUtils; + +import com.fongmi.android.tv.App; +import com.fongmi.android.tv.R; +import com.fongmi.android.tv.bean.Config; +import com.fongmi.android.tv.impl.Callback; +import com.fongmi.android.tv.server.Server; +import com.fongmi.android.tv.utils.Notify; +import com.github.catvod.net.OkHttp; + +import java.io.InterruptedIOException; +import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicInteger; + +abstract class BaseConfig { + + public static final int VOD = 0; + public static final int LIVE = 1; + public static final int WALL = 2; + + private final AtomicInteger taskId = new AtomicInteger(0); + private Future future; + + protected Config config; + protected boolean sync; + + protected abstract String getTag(); + + protected abstract Config defaultConfig(); + + protected abstract void doLoad(int id, Config config, Callback callback) throws Throwable; + + public boolean needSync(String url) { + return sync || TextUtils.isEmpty(config.getUrl()) || url.equals(config.getUrl()); + } + + public Config getConfig() { + return config == null ? defaultConfig() : config; + } + + public static String getUrl(BaseConfig instance) { + return instance.getConfig().getUrl(); + } + + public static String getDesc(BaseConfig instance) { + return instance.getConfig().getDesc(); + } + + public void load(Callback callback) { + int id = taskId.incrementAndGet(); + if (future != null && !future.isDone()) future.cancel(true); + future = App.submit(() -> loadConfig(id, config, callback)); + callback.start(); + } + + protected void loadConfig(int id, Config config, Callback callback) { + try { + Server.get().start(); + OkHttp.cancel(getTag()); + doLoad(id, config, callback); + if (taskId.get() == id && config.equals(this.config)) config.update(); + } catch (Throwable e) { + e.printStackTrace(); + if (isCanceled(e)) return; + if (taskId.get() != id) return; + if (TextUtils.isEmpty(config.getUrl())) App.post(() -> callback.error("")); + else App.post(() -> callback.error(Notify.getError(R.string.error_config_get, e))); + } + } + + protected boolean isCanceled(Throwable e) { + return "Canceled".equals(e.getMessage()) || e instanceof InterruptedException || e instanceof InterruptedIOException || e.getCause() instanceof InterruptedIOException; + } + + protected int getTaskId() { + return taskId.get(); + } + + protected int nextTaskId() { + return taskId.incrementAndGet(); + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java b/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java index 44c4f5021..9bce98f94 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java @@ -1,8 +1,5 @@ package com.fongmi.android.tv.api.config; -import android.net.Uri; -import android.text.TextUtils; - import com.fongmi.android.tv.App; import com.fongmi.android.tv.R; import com.fongmi.android.tv.Setting; @@ -17,9 +14,8 @@ import com.fongmi.android.tv.bean.Keep; import com.fongmi.android.tv.bean.Live; import com.fongmi.android.tv.bean.Rule; import com.fongmi.android.tv.db.AppDatabase; +import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.impl.Callback; -import com.fongmi.android.tv.server.Server; -import com.fongmi.android.tv.ui.activity.LiveActivity; import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.UrlUtil; import com.github.catvod.bean.Header; @@ -28,29 +24,22 @@ import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Json; import com.google.gson.JsonObject; -import java.io.InterruptedIOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.stream.Collectors; -public class LiveConfig { +public class LiveConfig extends BaseConfig { private static final String TAG = LiveConfig.class.getSimpleName(); - private final AtomicInteger taskId = new AtomicInteger(0); private Live home; - private Config config; private List lives; private List rules; private List ads; - private Future future; - private boolean sync; private static class Loader { static volatile LiveConfig INSTANCE = new LiveConfig(); @@ -85,7 +74,8 @@ public class LiveConfig { } public static boolean hasUrl() { - return getUrl() != null && !getUrl().isEmpty(); + String url = getUrl(); + return url != null && !url.isEmpty(); } public static void load(Config config, Callback callback) { @@ -106,55 +96,39 @@ public class LiveConfig { public LiveConfig clear() { home = null; lives = null; + rules = null; + ads = null; return this; } - private boolean isCanceled(Throwable e) { - return "Canceled".equals(e.getMessage()) || e instanceof InterruptedException || e instanceof InterruptedIOException; + @Override + protected String getTag() { + return TAG; } - public void load() { - if (sync) return; - load(new Callback()); + @Override + protected Config defaultConfig() { + return Config.live(); } - public void load(Callback callback) { - int id = taskId.incrementAndGet(); - if (future != null && !future.isDone()) future.cancel(true); - future = App.submit(() -> loadConfig(id, config, callback)); - callback.start(); + @Override + protected void doLoad(int id, Config config, Callback callback) throws Throwable { + String json = Decoder.getJson(UrlUtil.convert(config.getUrl()), TAG); + if (Json.isObj(json)) checkJson(id, config, callback, Json.parse(json).getAsJsonObject()); + else parseText(id, config, callback, json); } - private void loadConfig(int id, Config config, Callback callback) { - try { - OkHttp.cancel(TAG); - Server.get().start(); - String json = Decoder.getJson(UrlUtil.convert(config.getUrl()), TAG); - if (Json.isObj(json)) checkJson(id, config, callback, Json.parse(json).getAsJsonObject()); - else parseText(id, config, callback, json); - if (taskId.get() == id && config.equals(this.config)) config.update(); - } catch (Throwable e) { - e.printStackTrace(); - if (isCanceled(e)) return; - if (taskId.get() != id) return; - if (TextUtils.isEmpty(config.getUrl())) App.post(() -> callback.error("")); - else App.post(() -> callback.error(Notify.getError(R.string.error_config_get, e))); - } + public void load() { + if (sync) return; + load(new Callback()); } private void parseText(int id, Config config, Callback callback, String text) { - Live live = new Live(parseName(config.getUrl()), config.getUrl()).sync(); + Live live = new Live(UrlUtil.getName(config.getUrl()), config.getUrl()).sync(); lives = new ArrayList<>(List.of(live)); LiveParser.text(live, text); setHome(config, live, false); - if (taskId.get() == id) App.post(callback::success); - } - - private String parseName(String url) { - Uri uri = Uri.parse(url); - String path = UrlUtil.path(uri); - String host = UrlUtil.host(uri); - return !path.isEmpty() ? path : !host.isEmpty() ? host : url; + if (getTaskId() == id) App.post(callback::success); } private void checkJson(int id, Config config, Callback callback, JsonObject object) { @@ -170,7 +144,7 @@ public class LiveConfig { private void parseDepot(int id, Config config, Callback callback, JsonObject object) { List items = Depot.arrayFrom(object.getAsJsonArray("urls").toString()); List configs = new ArrayList<>(); - for (Depot item : items) configs.add(Config.find(item, 1)); + for (Depot item : items) configs.add(Config.find(item, LIVE)); loadConfig(id, this.config = configs.get(0), callback); Config.delete(config.getUrl()); } @@ -179,11 +153,11 @@ public class LiveConfig { try { initList(object); initLive(config, object); - if (taskId.get() != id) return; + if (getTaskId() != id) return; if (callback != null) App.post(callback::success); } catch (Throwable e) { e.printStackTrace(); - if (taskId.get() != id) return; + if (getTaskId() != id) return; if (callback != null) App.post(() -> callback.error(Notify.getError(R.string.error_config_parse, e))); } } @@ -205,13 +179,8 @@ public class LiveConfig { setHome(config, getLives().isEmpty() ? new Live() : getLives().stream().filter(item -> item.getName().equals(config.getHome())).findFirst().orElse(getLives().get(0)), false); } - private void bootLive() { - Setting.putBootLive(false); - LiveActivity.start(App.get()); - } - public void parse(JsonObject object) { - int id = taskId.incrementAndGet(); + int id = nextTaskId(); parseConfig(id, getConfig(), null, object); } @@ -219,7 +188,7 @@ public class LiveConfig { if (home != null && !channel.getGroup().isHidden()) home.keep(channel).save(); } - public void setKeep(List items) { + public void applyKeepsToGroups(List items) { Set key = Keep.getLive().stream().map(Keep::getKey).collect(Collectors.toSet()); items.stream().filter(group -> !group.isKeep()) .flatMap(group -> group.getChannel().stream()) @@ -227,7 +196,7 @@ public class LiveConfig { .forEach(channel -> items.get(0).add(channel)); } - public int[] find(List items) { + public int[] findKeepPosition(List items) { String[] splits = getHome().getKeep().split(AppDatabase.SYMBOL); if (splits.length < 3) return new int[]{1, 0}; for (int i = 0; i < items.size(); i++) { @@ -243,7 +212,7 @@ public class LiveConfig { return new int[]{1, 0}; } - public int[] find(String number, List items) { + public int[] findByChannelNumber(String number, List items) { for (int i = 0; i < items.size(); i++) { int j = items.get(i).find(Integer.parseInt(number)); if (j != -1) return new int[]{i, j}; @@ -251,10 +220,6 @@ public class LiveConfig { return new int[]{-1, -1}; } - public boolean needSync(String url) { - return sync || TextUtils.isEmpty(config.getUrl()) || url.equals(config.getUrl()); - } - public List getLives() { return lives == null ? lives = new ArrayList<>() : lives; } @@ -292,10 +257,6 @@ public class LiveConfig { this.ads = ads; } - public Config getConfig() { - return config == null ? Config.live() : config; - } - public Live getHome() { return home == null ? new Live() : home; } @@ -314,7 +275,6 @@ public class LiveConfig { config.home(home.getName()); if (save) config.save(); getLives().forEach(item -> item.setActivated(home)); - if (App.activity() != null && App.activity() instanceof LiveActivity) return; - if (!save && (home.isBoot() || Setting.isBootLive())) App.post(this::bootLive); + if (!save && (home.isBoot() || Setting.isBootLive())) RefreshEvent.boot(); } } diff --git a/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java b/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java index 4c321712f..376a7d1c5 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java @@ -12,7 +12,6 @@ import com.fongmi.android.tv.bean.Parse; import com.fongmi.android.tv.bean.Rule; import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.impl.Callback; -import com.fongmi.android.tv.server.Server; import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.UrlUtil; import com.github.catvod.bean.Doh; @@ -22,32 +21,26 @@ import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Json; import com.google.gson.JsonObject; -import java.io.InterruptedIOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.stream.Collectors; -public class VodConfig { +public class VodConfig extends BaseConfig { private static final String TAG = VodConfig.class.getSimpleName(); - private final AtomicInteger taskId = new AtomicInteger(0); private Site home; private String wall; private Parse parse; - private Config config; private List doh; private List rules; private List sites; private List ads; private List flags; private List parses; - private Future future; private static class Loader { static volatile VodConfig INSTANCE = new VodConfig(); @@ -95,35 +88,29 @@ public class VodConfig { wall = null; parse = null; sites = null; + parses = null; + rules = null; + ads = null; + doh = null; + flags = null; BaseLoader.get().clear(); return this; } - private boolean isCanceled(Throwable e) { - return "Canceled".equals(e.getMessage()) || e instanceof InterruptedException || e instanceof InterruptedIOException; + @Override + protected String getTag() { + return TAG; } - public void load(Callback callback) { - int id = taskId.incrementAndGet(); - if (future != null && !future.isDone()) future.cancel(true); - future = App.submit(() -> loadConfig(id, config, callback)); - callback.start(); + @Override + protected Config defaultConfig() { + return Config.vod(); } - private void loadConfig(int id, Config config, Callback callback) { - try { - OkHttp.cancel(TAG); - Server.get().start(); - String json = Decoder.getJson(UrlUtil.convert(config.getUrl()), TAG); - checkJson(id, config, callback, Json.parse(json).getAsJsonObject()); - if (taskId.get() == id && config.equals(this.config)) config.update(); - } catch (Throwable e) { - e.printStackTrace(); - if (isCanceled(e)) return; - if (taskId.get() != id) return; - if (TextUtils.isEmpty(config.getUrl())) App.post(() -> callback.error("")); - else App.post(() -> callback.error(Notify.getError(R.string.error_config_get, e))); - } + @Override + protected void doLoad(int id, Config config, Callback callback) throws Throwable { + String json = Decoder.getJson(UrlUtil.convert(config.getUrl()), TAG); + checkJson(id, config, callback, Json.parse(json).getAsJsonObject()); } private void checkJson(int id, Config config, Callback callback, JsonObject object) { @@ -139,7 +126,7 @@ public class VodConfig { private void parseDepot(int id, Config config, Callback callback, JsonObject object) { List items = Depot.arrayFrom(object.getAsJsonArray("urls").toString()); List configs = new ArrayList<>(); - for (Depot item : items) configs.add(Config.find(item, 0)); + for (Depot item : items) configs.add(Config.find(item, VOD)); loadConfig(id, this.config = configs.get(0), callback); Config.delete(config.getUrl()); } @@ -152,13 +139,11 @@ public class VodConfig { initSite(config, object); initParse(config, object); config.logo(Json.safeString(object, "logo")); - String notice = Json.safeString(object, "notice"); - if (taskId.get() != id) return; - App.post(() -> callback.success(notice)); + if (getTaskId() != id) return; App.post(callback::success); } catch (Throwable e) { e.printStackTrace(); - if (taskId.get() != id) return; + if (getTaskId() != id) return; App.post(() -> callback.error(Notify.getError(R.string.error_config_parse, e))); } } @@ -175,7 +160,7 @@ public class VodConfig { private void initLive(Config config, JsonObject object) { if (Json.isEmpty(object, "lives")) return; - Config temp = Config.find(config, 1).save(); + Config temp = Config.find(config, LIVE).save(); boolean sync = LiveConfig.get().needSync(config.getUrl()); if (sync) LiveConfig.get().config(temp.update()).parse(object); } @@ -183,7 +168,7 @@ public class VodConfig { private void initWall(Config config, JsonObject object) { if (Json.isEmpty(object, "wallpaper")) return; this.wall = Json.safeString(object, "wallpaper"); - Config temp = Config.find(wall, config.getName(), 2).save(); + Config temp = Config.find(wall, config.getName(), WALL).save(); boolean sync = WallConfig.get().needSync(wall); if (sync) WallConfig.get().config(temp.update()); } @@ -278,10 +263,6 @@ public class VodConfig { this.ads = ads; } - public Config getConfig() { - return config == null ? Config.vod() : config; - } - public Parse getParse() { return parse == null ? new Parse() : parse; } diff --git a/app/src/main/java/com/fongmi/android/tv/api/config/WallConfig.java b/app/src/main/java/com/fongmi/android/tv/api/config/WallConfig.java index a81065f3b..4ab24005b 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/config/WallConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/config/WallConfig.java @@ -24,18 +24,10 @@ import com.github.catvod.utils.Path; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.io.InterruptedIOException; -import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicInteger; -public class WallConfig { +public class WallConfig extends BaseConfig { private static final String TAG = WallConfig.class.getSimpleName(); - private final AtomicInteger taskId = new AtomicInteger(0); - - private Config config; - private Future future; - private boolean sync; private static class Loader { static volatile WallConfig INSTANCE = new WallConfig(); @@ -68,34 +60,40 @@ public class WallConfig { return this; } - private boolean isCanceled(Throwable e) { - return "Canceled".equals(e.getMessage()) || e instanceof InterruptedException || e.getCause() instanceof InterruptedIOException; - } - public void load() { + if (sync) return; load(new Callback()); } - public void load(Callback callback) { - int id = taskId.incrementAndGet(); - if (future != null && !future.isDone()) future.cancel(true); - future = App.submit(() -> loadConfig(id, config, callback)); - callback.start(); + @Override + protected String getTag() { + return TAG; } - private void loadConfig(int id, Config config, Callback callback) { + @Override + protected Config defaultConfig() { + return Config.wall(); + } + + @Override + protected void doLoad(int id, Config config, Callback callback) throws Throwable { + download(id, config.getUrl(), callback); + } + + @Override + protected void loadConfig(int id, Config config, Callback callback) { try { OkHttp.cancel(TAG); - download(id, config.getUrl(), callback); - if (taskId.get() == id && config.equals(this.config)) config.update(); + doLoad(id, config, callback); + if (getTaskId() == id && config.equals(this.config)) config.update(); } catch (Throwable e) { e.printStackTrace(); if (isCanceled(e)) return; - if (taskId.get() != id) return; - if (TextUtils.isEmpty(config.getUrl())) App.post(() -> callback.error("")); - else App.post(() -> callback.error(Notify.getError(R.string.error_config_get, e))); + if (getTaskId() != id) return; Setting.putWall(1); RefreshEvent.wall(); + if (TextUtils.isEmpty(config.getUrl())) App.post(() -> callback.error("")); + else App.post(() -> callback.error(Notify.getError(R.string.error_config_get, e))); } } @@ -104,27 +102,31 @@ public class WallConfig { if (url.startsWith("file")) Path.copy(Path.local(url), file); else Download.create(UrlUtil.convert(url), file).tag(TAG).get(); if (!Path.exists(file)) throw new FileNotFoundException(); - if (taskId.get() != id) return; - setWallType(file); - setSnapshot(file); + if (getTaskId() != id) return; + process(file); RefreshEvent.wall(); App.post(callback::success); } - private void setWallType(File file) { + private static void process(File file) throws Throwable { + setWallType(file); + setSnapshot(file); + } + + private static void setWallType(File file) { Setting.putWallType(0); if (isGif(file)) Setting.putWallType(1); else if (isVideo(file)) Setting.putWallType(2); } - private void setSnapshot(File file) throws Throwable { + private static void setSnapshot(File file) throws Throwable { Bitmap bitmap = Glide.with(App.get()).asBitmap().frame(0).load(file).override(ResUtil.getScreenWidth(), ResUtil.getScreenHeight()).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE).submit().get(); try (FileOutputStream fos = new FileOutputStream(FileUtil.getWallCache())) { bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); } } - private boolean isVideo(File file) { + private static boolean isVideo(File file) { try (MediaMetadataRetriever retriever = new MediaMetadataRetriever()) { retriever.setDataSource(file.getAbsolutePath()); return "yes".equalsIgnoreCase(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO)); @@ -133,7 +135,7 @@ public class WallConfig { } } - private boolean isGif(File file) { + private static boolean isGif(File file) { try { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; @@ -143,12 +145,4 @@ public class WallConfig { return false; } } - - public boolean needSync(String url) { - return sync || TextUtils.isEmpty(config.getUrl()) || url.equals(config.getUrl()); - } - - public Config getConfig() { - return config == null ? Config.wall() : config; - } } diff --git a/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java b/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java index 6226278b4..f0492949d 100644 --- a/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java +++ b/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java @@ -1,5 +1,6 @@ package com.fongmi.android.tv.event; +import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.bean.Vod; import org.greenrobot.eventbus.EventBus; @@ -38,6 +39,11 @@ public class RefreshEvent { EventBus.getDefault().post(new RefreshEvent(Type.LIVE)); } + public static void boot() { + EventBus.getDefault().post(new RefreshEvent(Type.BOOT)); + Setting.putBootLive(false); + } + public static void detail() { EventBus.getDefault().post(new RefreshEvent(Type.DETAIL)); } @@ -85,6 +91,6 @@ public class RefreshEvent { } public enum Type { - CONFIG, VIDEO, HISTORY, KEEP, SIZE, WALL, LIVE, DETAIL, PLAYER, SUBTITLE, DANMAKU, VOD + CONFIG, VIDEO, HISTORY, KEEP, SIZE, WALL, LIVE, BOOT, DETAIL, PLAYER, SUBTITLE, DANMAKU, VOD } } diff --git a/app/src/main/java/com/fongmi/android/tv/model/LiveViewModel.java b/app/src/main/java/com/fongmi/android/tv/model/LiveViewModel.java index b78966b1b..002754d92 100644 --- a/app/src/main/java/com/fongmi/android/tv/model/LiveViewModel.java +++ b/app/src/main/java/com/fongmi/android/tv/model/LiveViewModel.java @@ -139,7 +139,7 @@ public class LiveViewModel extends ViewModel { item.getGroups().removeIf(Group::isEmpty); if (item.getGroups().isEmpty() || item.getGroups().get(0).isKeep()) return; item.getGroups().add(0, Group.create(R.string.keep)); - LiveConfig.get().setKeep(item.getGroups()); + LiveConfig.get().applyKeepsToGroups(item.getGroups()); } private void execute(TaskType type, Callable callable) { diff --git a/app/src/main/java/com/fongmi/android/tv/utils/UrlUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/UrlUtil.java index 608b62cf1..3b436258f 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/UrlUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/UrlUtil.java @@ -52,6 +52,13 @@ public class UrlUtil { return path != null ? url.replace(scheme + "://", Server.get().getAddress(path)) : url; } + public static String getName(String url) { + Uri uri = Uri.parse(url); + String path = path(uri); + String host = host(uri); + return !path.isEmpty() ? path : !host.isEmpty() ? host : url; + } + public static String fixHeader(String key) { if (HttpHeaders.USER_AGENT.equalsIgnoreCase(key)) return HttpHeaders.USER_AGENT; if (HttpHeaders.REFERER.equalsIgnoreCase(key)) return HttpHeaders.REFERER; diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/HomeActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/HomeActivity.java index b6a733eae..9e8e1d754 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/HomeActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/HomeActivity.java @@ -178,6 +178,7 @@ public class HomeActivity extends BaseActivity implements NavigationBarView.OnIt @Subscribe(threadMode = ThreadMode.MAIN) public void onRefreshEvent(RefreshEvent event) { if (event.getType().equals(RefreshEvent.Type.CONFIG)) setNavigation(); + if (event.getType().equals(RefreshEvent.Type.BOOT)) LiveActivity.start(this); } @Subscribe(threadMode = ThreadMode.MAIN) diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index bc26425a3..037b26af3 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -268,7 +268,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener List items = new ArrayList<>(); for (Group group : live.getGroups()) (group.isHidden() ? mHides : items).add(group); mGroupAdapter.addAll(items); - setPosition(LiveConfig.get().find(items)); + setPosition(LiveConfig.get().findKeepPosition(items)); } private void setWidth(Live live) {