Optimize danmaku load

pull/589/head
FongMi 1 year ago
parent 107a9a3e06
commit 39c4aac7e6
  1. 3
      app/src/leanback/res/layout/activity_video.xml
  2. 21
      app/src/main/java/com/fongmi/android/tv/bean/Danmaku.java
  3. 3
      app/src/main/java/com/fongmi/android/tv/gson/DanmakuAdapter.java
  4. 16
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  5. 5
      app/src/main/java/com/fongmi/android/tv/ui/adapter/DanmakuAdapter.java
  6. 2
      app/src/main/java/com/fongmi/android/tv/ui/dialog/DanmakuDialog.java
  7. 3
      app/src/mobile/res/layout-sw600dp/activity_video.xml
  8. 3
      app/src/mobile/res/layout/activity_video.xml

@ -30,8 +30,7 @@
<master.flame.danmaku.ui.widget.DanmakuView
android:id="@+id/danmaku"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
android:layout_height="match_parent" />
<include
android:id="@+id/widget"

@ -2,10 +2,11 @@ package com.fongmi.android.tv.bean;
import android.text.TextUtils;
import androidx.annotation.Nullable;
import com.google.gson.annotations.SerializedName;
import java.io.File;
import java.util.List;
public class Danmaku {
@ -16,7 +17,7 @@ public class Danmaku {
private boolean selected;
public static List<Danmaku> from(String path) {
public static Danmaku from(String path) {
if (path.startsWith("http")) {
return http(path);
} else {
@ -24,18 +25,18 @@ public class Danmaku {
}
}
public static List<Danmaku> http(String path) {
public static Danmaku http(String path) {
Danmaku danmaku = new Danmaku();
danmaku.setName(path);
danmaku.setUrl(path);
return List.of(danmaku);
return danmaku;
}
public static List<Danmaku> file(String path) {
public static Danmaku file(String path) {
Danmaku danmaku = new Danmaku();
danmaku.setName(new File(path).getName());
danmaku.setUrl("file:/" + path);
return List.of(danmaku);
return danmaku;
}
public static Danmaku empty() {
@ -69,4 +70,12 @@ public class Danmaku {
public boolean isEmpty() {
return getUrl().isEmpty();
}
@Override
public boolean equals(@Nullable Object obj) {
if (this == obj) return true;
if (!(obj instanceof Danmaku)) return false;
Danmaku it = (Danmaku) obj;
return getUrl().equals(it.getUrl());
}
}

@ -9,6 +9,7 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.List;
public class DanmakuAdapter implements JsonDeserializer<List<Danmaku>> {
@ -18,6 +19,6 @@ public class DanmakuAdapter implements JsonDeserializer<List<Danmaku>> {
if (!json.isJsonPrimitive()) return App.gson().fromJson(json, typeOfT);
String text = json.getAsString().trim();
if (Json.isArray(text)) return App.gson().fromJson(text, typeOfT);
else return Danmaku.from(text);
else return Arrays.asList(Danmaku.from(text));
}
}

@ -16,7 +16,6 @@ import android.support.v4.media.session.MediaControllerCompat;
import android.support.v4.media.session.MediaSessionCompat;
import android.support.v4.media.session.PlaybackStateCompat;
import android.text.TextUtils;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.media3.common.AudioAttributes;
@ -464,7 +463,7 @@ public class Players implements Player.Listener, ParseCallback, DrawHandler.Call
private void setMediaItem(Result result, int timeout) {
setMediaItem(result.getHeaders(), result.getRealUrl(), result.getFormat(), result.getDrm(), result.getSubs(), timeout);
setDanmaku(result.getDanmaku());
setDanmaku(danmakus = result.getDanmaku());
}
private void setMediaItem(Map<String, String> headers, String url, String format, Drm drm, List<Sub> subs, int timeout) {
@ -476,18 +475,17 @@ public class Players implements Player.Listener, ParseCallback, DrawHandler.Call
prepare();
}
public void setDanmaku(List<Danmaku> items) {
danmakus = items;
danmaku.release();
danmaku.setVisibility(items.isEmpty() ? View.GONE : View.VISIBLE);
if (!items.isEmpty()) App.execute(() -> danmaku.prepare(new Parser().load(new Loader(items.get(0)).getDataSource()), context));
if (!items.isEmpty()) items.get(0).setSelected(true);
private void setDanmaku(List<Danmaku> items) {
if (items.isEmpty()) danmaku.release();
else setDanmaku(items.get(0));
}
public void setDanmaku(Danmaku item) {
danmaku.release();
danmaku.setVisibility(item.isEmpty() ? View.GONE : View.VISIBLE);
if (danmakus == null) danmakus = new ArrayList<>();
if (!item.isEmpty() && !danmakus.contains(item)) danmakus.add(0, item);
if (!item.isEmpty()) App.execute(() -> danmaku.prepare(new Parser().load(new Loader(item).getDataSource()), context));
for (int i = 0; i < danmakus.size(); i++) danmakus.get(i).setSelected(danmakus.get(i).getUrl().equals(item.getUrl()) && !danmakus.get(i).isSelected());
}
public void setDanmakuSize(float size) {

@ -69,10 +69,7 @@ public class DanmakuAdapter extends RecyclerView.Adapter<DanmakuAdapter.ViewHold
@Override
public void onClick(View view) {
for (int i = 0; i < mItems.size(); i++) mItems.get(i).setSelected(i == getLayoutPosition() && !mItems.get(i).isSelected());
Danmaku item = mItems.get(getLayoutPosition());
notifyItemChanged(getLayoutPosition());
mListener.onItemClick(item);
mListener.onItemClick(mItems.get(getLayoutPosition()));
}
}
}

@ -73,7 +73,7 @@ public final class DanmakuDialog extends BaseDialog implements DanmakuAdapter.On
@Override
public void onItemClick(Danmaku item) {
player.setDanmaku(item.isSelected() ? item : Danmaku.empty());
player.setDanmaku(item.isSelected() ? Danmaku.empty() : item);
dismiss();
}

@ -31,8 +31,7 @@
<master.flame.danmaku.ui.widget.DanmakuView
android:id="@+id/danmaku"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
android:layout_height="match_parent" />
<include
android:id="@+id/widget"

@ -24,8 +24,7 @@
<master.flame.danmaku.ui.widget.DanmakuView
android:id="@+id/danmaku"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
android:layout_height="match_parent" />
<include
android:id="@+id/widget"

Loading…
Cancel
Save