From 1860e8dc14bad12238c4c916c4cbdf714d719d85 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 18 Dec 2025 11:36:10 +0800 Subject: [PATCH] Optimize code --- .../com/fongmi/android/tv/bean/Device.java | 13 ++++-------- .../tv/ui/adapter/BaseDiffAdapter.java | 17 ++++++++++------ .../android/tv/ui/dialog/CastDialog.java | 6 ++---- .../android/tv/ui/dialog/SyncDialog.java | 4 +--- catvod/build.gradle | 2 ++ .../java/com/github/catvod/bean/Proxy.java | 20 +++++++++---------- .../github/catvod/net/OkAuthenticator.java | 5 +++-- .../java/com/github/catvod/net/OkDns.java | 12 ++++------- .../github/catvod/net/OkProxySelector.java | 14 +++++++++---- .../net/interceptor/AuthInterceptor.java | 6 +++--- .../net/interceptor/RequestInterceptor.java | 5 +++-- .../net/interceptor/ResponseInterceptor.java | 5 +++-- 12 files changed, 55 insertions(+), 54 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Device.java b/app/src/main/java/com/fongmi/android/tv/bean/Device.java index 040103b49..b2a74bed7 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Device.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Device.java @@ -22,7 +22,7 @@ import java.util.Comparator; import java.util.List; @Entity(indices = @Index(value = {"uuid", "name"}, unique = true)) -public class Device implements Diffable { +public class Device implements Diffable, Comparable { @PrimaryKey(autoGenerate = true) @SerializedName("id") @@ -191,13 +191,8 @@ public class Device implements Diffable { return getName().equals(other.getName()) && getType() == other.getType(); } - public static class Sorter implements Comparator { - - @Override - public int compare(Device o1, Device o2) { - int comp = Integer.compare(o1.getType(), o2.getType()); - if (comp == 0) comp = o1.getName().compareToIgnoreCase(o2.getName()); - return comp != 0 ? comp : o1.getUuid().compareTo(o2.getUuid()); - } + @Override + public int compareTo(Device other) { + return Comparator.comparingInt(Device::getType).thenComparing(Device::getName, String.CASE_INSENSITIVE_ORDER).thenComparing(Device::getUuid).compare(this, other); } } diff --git a/app/src/main/java/com/fongmi/android/tv/ui/adapter/BaseDiffAdapter.java b/app/src/main/java/com/fongmi/android/tv/ui/adapter/BaseDiffAdapter.java index 2a848d728..43a13808f 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/adapter/BaseDiffAdapter.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/adapter/BaseDiffAdapter.java @@ -9,11 +9,14 @@ import androidx.recyclerview.widget.RecyclerView; import com.fongmi.android.tv.impl.Diffable; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.Stream; -public abstract class BaseDiffAdapter, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter { +public abstract class BaseDiffAdapter & Comparable, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter { protected final AsyncListDiffer differ; @@ -75,11 +78,13 @@ public abstract class BaseDiffAdapter, VH extends Recycler setItems(current, runnable); } - public void sort(T item, Comparator comparator) { - List current = new ArrayList<>(getItems()); - current.add(item); - if (current.size() >= 2) current.sort(comparator); - setItems(current); + public void sort(T item) { + sort(item, null); + } + + public void sort(T item, Runnable runnable) { + List current = Stream.concat(getItems().stream(), Stream.of(item)).distinct().sorted().collect(Collectors.toList()); + setItems(current, runnable); } public void remove(T item) { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/CastDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/CastDialog.java index baf6fd133..160155498 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/CastDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/CastDialog.java @@ -52,7 +52,6 @@ import okhttp3.Response; public class CastDialog extends BaseDialog implements DeviceAdapter.OnClickListener, ScanTask.Listener, OnDeviceRegistryListener, OnDeviceControlListener, ServiceActionCallback, okhttp3.Callback { private final FormBody.Builder body; - private final Device.Sorter sorter; private final OkHttpClient client; private final ScanTask scanTask; @@ -68,7 +67,6 @@ public class CastDialog extends BaseDialog implements DeviceAdapter.OnClickListe } public CastDialog() { - sorter = new Device.Sorter(); scanTask = new ScanTask(this); body = new FormBody.Builder(); body.add("device", Device.get().toString()); @@ -163,12 +161,12 @@ public class CastDialog extends BaseDialog implements DeviceAdapter.OnClickListe @Override public void onFind(Device device) { - adapter.sort(device, sorter); + adapter.sort(device); } @Override public void onDeviceAdded(@NonNull org.fourthline.cling.model.meta.Device device) { - adapter.sort(DLNADevice.get().add(device), sorter); + adapter.sort(DLNADevice.get().add(device)); } @Override diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/SyncDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/SyncDialog.java index 7e316d1f7..3fef3848f 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/SyncDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/SyncDialog.java @@ -46,7 +46,6 @@ import okhttp3.Response; public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListener, ScanTask.Listener { private final FormBody.Builder body; - private final Device.Sorter sorter; private final OkHttpClient client; private final ScanTask scanTask; private final TypedArray mode; @@ -60,7 +59,6 @@ public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListe } public SyncDialog() { - sorter = new Device.Sorter(); body = new FormBody.Builder(); scanTask = new ScanTask(this); client = OkHttp.client(Constant.TIMEOUT_SYNC); @@ -158,7 +156,7 @@ public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListe @Override public void onFind(Device device) { - adapter.sort(device, sorter); + adapter.sort(device); } @Override diff --git a/catvod/build.gradle b/catvod/build.gradle index 6bd5faa51..9349f7ad2 100644 --- a/catvod/build.gradle +++ b/catvod/build.gradle @@ -17,6 +17,7 @@ android { } compileOptions { + coreLibraryDesugaringEnabled true sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } @@ -43,4 +44,5 @@ dependencies { exclude group: 'com.google.j2objc', module: 'j2objc-annotations' exclude group: 'org.codehaus.mojo', module: 'animal-sniffer-annotations' } + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs_nio:2.1.5' } \ No newline at end of file diff --git a/catvod/src/main/java/com/github/catvod/bean/Proxy.java b/catvod/src/main/java/com/github/catvod/bean/Proxy.java index 3e8977da9..363aff310 100644 --- a/catvod/src/main/java/com/github/catvod/bean/Proxy.java +++ b/catvod/src/main/java/com/github/catvod/bean/Proxy.java @@ -12,10 +12,12 @@ import java.lang.reflect.Type; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; -public class Proxy { +public class Proxy implements Comparable { @SerializedName("name") private String name; @@ -25,6 +27,7 @@ public class Proxy { private List urls; private List proxies; + private boolean wildcard; public static List arrayFrom(JsonElement element) { try { @@ -37,9 +40,8 @@ public class Proxy { } public void init() { - proxies = new ArrayList<>(); - for (String url : getUrls()) proxies.add(create(url)); - proxies.removeIf(Objects::isNull); + wildcard = getHosts().stream().anyMatch(host -> host.contains("*")); + proxies = getUrls().stream().map(this::create).filter(Objects::nonNull).toList(); } public String getName() { @@ -66,12 +68,8 @@ public class Proxy { return null; } - public static void sort(List items) { - items.sort((o1, o2) -> { - boolean g1 = o1.getHosts().stream().anyMatch(h -> h.contains("*")); - boolean g2 = o2.getHosts().stream().anyMatch(h -> h.contains("*")); - if (g1 == g2) return 0; - return g1 ? 1 : -1; - }); + @Override + public int compareTo(Proxy other) { + return Boolean.compare(this.wildcard, other.wildcard); } } \ No newline at end of file diff --git a/catvod/src/main/java/com/github/catvod/net/OkAuthenticator.java b/catvod/src/main/java/com/github/catvod/net/OkAuthenticator.java index d21447ba6..567540ea0 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkAuthenticator.java +++ b/catvod/src/main/java/com/github/catvod/net/OkAuthenticator.java @@ -12,6 +12,7 @@ import com.google.common.net.HttpHeaders; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import okhttp3.Authenticator; import okhttp3.Request; @@ -23,10 +24,10 @@ public class OkAuthenticator implements Authenticator { private final List proxy; public OkAuthenticator() { - proxy = new ArrayList<>(); + proxy = new CopyOnWriteArrayList<>(); } - public synchronized void addAll(List items) { + public void addAll(List items) { proxy.addAll(items); } diff --git a/catvod/src/main/java/com/github/catvod/net/OkDns.java b/catvod/src/main/java/com/github/catvod/net/OkDns.java index 21f6ab59a..c1af4ded2 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkDns.java +++ b/catvod/src/main/java/com/github/catvod/net/OkDns.java @@ -7,10 +7,12 @@ import com.github.catvod.utils.Util; import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import kotlin._Assertions; import okhttp3.Dns; import okhttp3.HttpUrl; import okhttp3.OkHttpClient; @@ -34,14 +36,8 @@ public class OkDns implements Dns { map.clear(); } - public synchronized void addAll(List hosts) { - for (String host : hosts) { - if (!host.contains("=")) continue; - String[] splits = host.split("=", 2); - String oldHost = splits[0]; - String newHost = splits[1]; - map.put(oldHost, newHost); - } + public void addAll(List hosts) { + hosts.stream().map(host -> host.split("=", 2)).filter(splits -> splits.length == 2).forEach(splits -> map.put(splits[0], splits[1])); } @NonNull diff --git a/catvod/src/main/java/com/github/catvod/net/OkProxySelector.java b/catvod/src/main/java/com/github/catvod/net/OkProxySelector.java index 4bcdcfb3a..33e2b4ded 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkProxySelector.java +++ b/catvod/src/main/java/com/github/catvod/net/OkProxySelector.java @@ -8,7 +8,12 @@ import java.net.ProxySelector; import java.net.SocketAddress; import java.net.URI; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class OkProxySelector extends ProxySelector { @@ -16,14 +21,15 @@ public class OkProxySelector extends ProxySelector { private final ProxySelector system; public OkProxySelector() { - proxy = new ArrayList<>(); + proxy = new CopyOnWriteArrayList<>(); system = ProxySelector.getDefault(); } public synchronized void addAll(List items) { - for (Proxy item : items) item.init(); - proxy.addAll(items); - Proxy.sort(proxy); + items.forEach(Proxy::init); + List newList = Stream.concat(proxy.stream(), items.stream()).sorted().toList(); + proxy.clear(); + proxy.addAll(newList); } public void clear() { diff --git a/catvod/src/main/java/com/github/catvod/net/interceptor/AuthInterceptor.java b/catvod/src/main/java/com/github/catvod/net/interceptor/AuthInterceptor.java index bfdbd6cc6..5602e355b 100644 --- a/catvod/src/main/java/com/github/catvod/net/interceptor/AuthInterceptor.java +++ b/catvod/src/main/java/com/github/catvod/net/interceptor/AuthInterceptor.java @@ -33,10 +33,10 @@ public class AuthInterceptor implements Interceptor { if (response.code() != 401) return response; String host = request.url().host(); String user = request.url().uri().getUserInfo(); - String header = response.header(HttpHeaders.WWW_AUTHENTICATE); - if (user == null && userMap.containsKey(host)) user = userMap.get(host); + if (user == null) user = userMap.get(host); if (user == null) return response; - else response.close(); + response.close(); + String header = response.header(HttpHeaders.WWW_AUTHENTICATE); String auth = digest(header) ? Util.digest(user, header, request) : Util.basic(user); return chain.proceed(request.newBuilder().header(HttpHeaders.AUTHORIZATION, auth).build()); } diff --git a/catvod/src/main/java/com/github/catvod/net/interceptor/RequestInterceptor.java b/catvod/src/main/java/com/github/catvod/net/interceptor/RequestInterceptor.java index 3628ea67c..fc43a4de8 100644 --- a/catvod/src/main/java/com/github/catvod/net/interceptor/RequestInterceptor.java +++ b/catvod/src/main/java/com/github/catvod/net/interceptor/RequestInterceptor.java @@ -33,8 +33,9 @@ public class RequestInterceptor implements Interceptor { } private void checkAuth(HttpUrl url, Request.Builder builder) { + String host = url.host(); String auth = url.queryParameter("auth"); - if (auth != null) authMap.put(url.host(), auth); - if (authMap.containsKey(url.host()) && auth == null) builder.url(url.newBuilder().addQueryParameter("auth", authMap.get(url.host())).build()); + if (auth != null) authMap.put(host, auth); + else if (authMap.containsKey(host)) builder.url(url.newBuilder().addQueryParameter("auth", authMap.get(host)).build()); } } diff --git a/catvod/src/main/java/com/github/catvod/net/interceptor/ResponseInterceptor.java b/catvod/src/main/java/com/github/catvod/net/interceptor/ResponseInterceptor.java index ae5113d5b..04c07eeb6 100644 --- a/catvod/src/main/java/com/github/catvod/net/interceptor/ResponseInterceptor.java +++ b/catvod/src/main/java/com/github/catvod/net/interceptor/ResponseInterceptor.java @@ -12,6 +12,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; @@ -29,11 +30,11 @@ public class ResponseInterceptor implements Interceptor { private final ConcurrentHashMap redirectMap; public ResponseInterceptor() { - headers = new ArrayList<>(); + headers = new CopyOnWriteArrayList<>(); redirectMap = new ConcurrentHashMap<>(); } - public synchronized void addAll(List
items) { + public void addAll(List
items) { headers.addAll(items); }