From 576148cf249a77ba720330a54841d5d3377e513f Mon Sep 17 00:00:00 2001 From: jhengazuki Date: Wed, 22 Oct 2025 18:51:09 +0800 Subject: [PATCH] Clean code --- .../android/tv/ui/custom/CustomSelector.java | 84 ++++++++++--------- .../tv/ui/custom/CustomTextListener.java | 2 +- 2 files changed, 46 insertions(+), 40 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomSelector.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomSelector.java index 36ab0bb82..a81935d94 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomSelector.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomSelector.java @@ -1,66 +1,72 @@ package com.fongmi.android.tv.ui.custom; +import androidx.annotation.NonNull; import androidx.collection.ArrayMap; import androidx.leanback.widget.ListRow; import androidx.leanback.widget.Presenter; import androidx.leanback.widget.PresenterSelector; -import java.util.ArrayList; -import java.util.List; +import java.util.LinkedHashSet; +import java.util.Set; public class CustomSelector extends PresenterSelector { - private final List mPresenters; - private final ArrayMap, Presenter> mSingleMap; - private final ArrayMap, ArrayMap, Presenter>> mClassMap; - - public CustomSelector() { - super(); - mPresenters = new ArrayList<>(); - mSingleMap = new ArrayMap<>(); - mClassMap = new ArrayMap<>(); - } + private final Set presenters = new LinkedHashSet<>(); + private final ArrayMap cacheMap = new ArrayMap<>(); + private final ArrayMap, Presenter> singleMap = new ArrayMap<>(); + private final ArrayMap, ArrayMap, Presenter>> nestedMap = new ArrayMap<>(); public void addPresenter(Class cls, Presenter presenter) { - mSingleMap.put(cls, presenter); - if (!mPresenters.contains(presenter)) { - mPresenters.add(presenter); - } + singleMap.put(cls, presenter); + presenters.add(presenter); + cacheMap.clear(); } - public void addPresenter(Class cls, Presenter presenter, Class childType) { - ArrayMap, Presenter> classPresenterArrayMap = mClassMap.get(cls); - if (classPresenterArrayMap == null) classPresenterArrayMap = new ArrayMap<>(); - classPresenterArrayMap.put(childType, presenter); - mClassMap.put(cls, classPresenterArrayMap); - if (!mPresenters.contains(presenter)) { - mPresenters.add(presenter); - } + public void addPresenter(Class cls, Presenter presenter, Class childType) { + nestedMap.computeIfAbsent(cls, k -> new ArrayMap<>()).put(childType, presenter); + presenters.add(presenter); + cacheMap.clear(); } @Override public Presenter getPresenter(Object item) { + if (item == null) return null; Class cls = item.getClass(); - Presenter presenter; - presenter = mSingleMap.get(cls); + Presenter presenter = singleMap.get(cls); if (presenter != null) return presenter; - ArrayMap, Presenter> presenters = mClassMap.get(cls); - assert presenters != null; - if (presenters.size() == 1) return presenters.valueAt(0); - if (item instanceof ListRow) { - ListRow listRow = (ListRow) item; - Presenter childPresenter = listRow.getAdapter().getPresenter(listRow); - Class childCls = childPresenter.getClass(); - do { - presenter = presenters.get(childCls); - childCls = childCls.getSuperclass(); - } while (presenter == null && childCls != null); + ArrayMap, Presenter> map = nestedMap.get(cls); + if (map == null || map.isEmpty()) return null; + if (map.size() == 1) { + Presenter only = map.valueAt(0); + Class childType = map.keyAt(0); + cacheMap.put(new Key(cls, childType), only); + return only; } - return presenter; + if (item instanceof ListRow row) { + if (row.getAdapter() == null) return null; + Presenter child = row.getAdapter().getPresenter(row); + if (child == null) return null; + Class childCls = child.getClass(); + Key key = new Key(cls, childCls); + Presenter cached = cacheMap.get(key); + if (cached != null) return cached; + for (Class type = childCls; type != null && type != Object.class; type = type.getSuperclass()) { + Presenter found = map.get(type); + if (found != null) { + cacheMap.put(key, found); + return found; + } + } + } + return null; } + @NonNull @Override public Presenter[] getPresenters() { - return mPresenters.toArray(new Presenter[]{}); + return presenters.toArray(new Presenter[0]); + } + + private record Key(Class parent, Class child) { } } \ No newline at end of file diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomTextListener.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomTextListener.java index b9bf83dc7..3fb3cf5fc 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomTextListener.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomTextListener.java @@ -41,7 +41,7 @@ public abstract class CustomTextListener implements TextWatcher, RecognitionList List texts = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); for (String text : texts) sb.append(text).append("\n"); String result = sb.toString().trim(); - if (result.length() > 0) onResults(result); + if (!result.isEmpty()) onResults(result); } @Override