pull/605/head
jhengazuki 6 months ago
parent aa93d69cf6
commit 576148cf24
  1. 84
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomSelector.java
  2. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomTextListener.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<Presenter> mPresenters;
private final ArrayMap<Class<?>, Presenter> mSingleMap;
private final ArrayMap<Class<?>, ArrayMap<Class<?>, Presenter>> mClassMap;
public CustomSelector() {
super();
mPresenters = new ArrayList<>();
mSingleMap = new ArrayMap<>();
mClassMap = new ArrayMap<>();
}
private final Set<Presenter> presenters = new LinkedHashSet<>();
private final ArrayMap<Key, Presenter> cacheMap = new ArrayMap<>();
private final ArrayMap<Class<?>, Presenter> singleMap = new ArrayMap<>();
private final ArrayMap<Class<?>, ArrayMap<Class<? extends Presenter>, 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<Class<?>, 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<? extends Presenter> 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<Class<?>, 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<Class<? extends Presenter>, Presenter> map = nestedMap.get(cls);
if (map == null || map.isEmpty()) return null;
if (map.size() == 1) {
Presenter only = map.valueAt(0);
Class<? extends Presenter> 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) {
}
}

@ -41,7 +41,7 @@ public abstract class CustomTextListener implements TextWatcher, RecognitionList
List<String> 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

Loading…
Cancel
Save