diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index fe1e92913..d851bf7f6 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -29,6 +29,7 @@ import com.fongmi.android.tv.bean.Parse; import com.fongmi.android.tv.bean.Part; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.bean.Site; +import com.fongmi.android.tv.bean.Track; import com.fongmi.android.tv.bean.Vod; import com.fongmi.android.tv.databinding.ActivityDetailBinding; import com.fongmi.android.tv.db.AppDatabase; @@ -74,7 +75,7 @@ import okhttp3.Call; import okhttp3.Response; import tv.danmaku.ijk.media.player.ui.IjkVideoView; -public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Listener, ArrayPresenter.OnClickListener, Clock.Callback { +public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Listener, TrackSelectionDialog.Listener, ArrayPresenter.OnClickListener, Clock.Callback { private ActivityDetailBinding mBinding; private ViewGroup.LayoutParams mFrameParams; @@ -597,7 +598,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void onTrack(View view) { int type = Integer.parseInt(view.getTag().toString()); - TrackSelectionDialog.create(this).player(mPlayers).type(type).show(); + TrackSelectionDialog.create(this).player(mPlayers).type(type).listener(this).show(); hideControl(); } @@ -733,6 +734,13 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis keep.save(); } + @Override + public void onTrackClick(Track item) { + item.setPlayer(mPlayers.getPlayer()); + item.setKey(getHistoryKey()); + item.save(); + } + @Override public void onTimeChanged() { long current = mPlayers.getPosition(); diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Track.java b/app/src/main/java/com/fongmi/android/tv/bean/Track.java index 6fe1c729f..472f3fa57 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Track.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Track.java @@ -1,22 +1,46 @@ package com.fongmi.android.tv.bean; +import androidx.annotation.NonNull; +import androidx.room.Entity; +import androidx.room.Index; +import androidx.room.PrimaryKey; + +import com.fongmi.android.tv.db.AppDatabase; + +import java.util.List; + +@Entity(indices = @Index(value = {"key", "player", "type"}, unique = true)) public class Track { + @PrimaryKey(autoGenerate = true) + private int id; + private int type; private int group; private int track; + private int player; + private String key; private String name; private boolean selected; - public Track(String name) { + public Track(int type, String name) { + this.type = type; this.name = name; } - public String getName() { - return name; + public int getId() { + return id; } - public void setName(String name) { - this.name = name; + public void setId(int id) { + this.id = id; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; } public int getGroup() { @@ -35,6 +59,30 @@ public class Track { this.track = track; } + public int getPlayer() { + return player; + } + + public void setPlayer(int player) { + this.player = player; + } + + public String getKey() { + return key; + } + + public void setKey(@NonNull String key) { + this.key = key; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + public boolean isSelected() { return selected; } @@ -42,4 +90,17 @@ public class Track { public void setSelected(boolean selected) { this.selected = selected; } + + public Track toggle() { + setSelected(!isSelected()); + return this; + } + + public void save() { + AppDatabase.get().getTrackDao().insertOrUpdate(this); + } + + public static List find(String key) { + return AppDatabase.get().getTrackDao().find(key); + } } diff --git a/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java b/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java index f89be88a4..de583c134 100644 --- a/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java +++ b/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java @@ -14,15 +14,17 @@ import com.fongmi.android.tv.bean.Config; import com.fongmi.android.tv.bean.History; import com.fongmi.android.tv.bean.Keep; import com.fongmi.android.tv.bean.Site; +import com.fongmi.android.tv.bean.Track; import com.fongmi.android.tv.db.dao.ConfigDao; import com.fongmi.android.tv.db.dao.HistoryDao; import com.fongmi.android.tv.db.dao.KeepDao; import com.fongmi.android.tv.db.dao.SiteDao; +import com.fongmi.android.tv.db.dao.TrackDao; -@Database(entities = {Config.class, Site.class, History.class, Keep.class}, version = AppDatabase.VERSION, exportSchema = false) +@Database(entities = {Keep.class, Site.class, Track.class, Config.class, History.class}, version = AppDatabase.VERSION, exportSchema = false) public abstract class AppDatabase extends RoomDatabase { - public static final int VERSION = 16; + public static final int VERSION = 17; public static final String SYMBOL = "@@@"; private static volatile AppDatabase instance; @@ -48,6 +50,8 @@ public abstract class AppDatabase extends RoomDatabase { public abstract SiteDao getSiteDao(); + public abstract TrackDao getTrackDao(); + public abstract ConfigDao getConfigDao(); public abstract HistoryDao getHistoryDao(); diff --git a/app/src/main/java/com/fongmi/android/tv/db/dao/TrackDao.java b/app/src/main/java/com/fongmi/android/tv/db/dao/TrackDao.java new file mode 100644 index 000000000..9086fe7af --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/db/dao/TrackDao.java @@ -0,0 +1,27 @@ +package com.fongmi.android.tv.db.dao; + +import androidx.room.Dao; +import androidx.room.Insert; +import androidx.room.OnConflictStrategy; +import androidx.room.Query; +import androidx.room.Transaction; + +import com.fongmi.android.tv.bean.Track; + +import java.util.List; + +@Dao +public abstract class TrackDao extends BaseDao { + + @Query("SELECT * FROM Track WHERE `key` = :key") + public abstract List find(String key); + + @Insert(onConflict = OnConflictStrategy.REPLACE) + public abstract Long insert(Track item); + + @Transaction + public void insertOrUpdate(Track item) { + long id = insert(item); + if (id == -1) update(item); + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/ui/adapter/TrackAdapter.java b/app/src/main/java/com/fongmi/android/tv/ui/adapter/TrackAdapter.java index 1fce39fc8..28fcc32a1 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/adapter/TrackAdapter.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/adapter/TrackAdapter.java @@ -69,9 +69,7 @@ public class TrackAdapter extends RecyclerView.Adapter @Override public void onClick(View view) { - for (int i = 0; i < mItems.size(); i++) mItems.get(i).setSelected(i == getLayoutPosition()); - mListener.onItemClick(mItems.get(getLayoutPosition())); - notifyItemRangeChanged(0, mItems.size()); + mListener.onItemClick(mItems.get(getLayoutPosition()).toggle()); } } } diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog.java index 409580e90..cf3989f61 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog.java @@ -27,6 +27,7 @@ public final class TrackSelectionDialog implements TrackAdapter.OnClickListener private final TrackNameProvider provider; private final TrackAdapter adapter; private final AlertDialog dialog; + private Listener listener; private Players player; private int type; @@ -51,6 +52,11 @@ public final class TrackSelectionDialog implements TrackAdapter.OnClickListener return this; } + public TrackSelectionDialog listener(Listener listener) { + this.listener = listener; + return this; + } + public void show() { setRecyclerView(); setDialog(); @@ -84,7 +90,7 @@ public final class TrackSelectionDialog implements TrackAdapter.OnClickListener Tracks.Group trackGroup = groups.get(i); if (trackGroup.getType() != type) continue; for (int j = 0; j < trackGroup.length; j++) { - Track item = new Track(provider.getTrackName(trackGroup.getTrackFormat(j))); + Track item = new Track(type, provider.getTrackName(trackGroup.getTrackFormat(j))); item.setSelected(trackGroup.isTrackSelected(j)); item.setGroup(i); item.setTrack(j); @@ -99,7 +105,7 @@ public final class TrackSelectionDialog implements TrackAdapter.OnClickListener for (int i = 0; i < trackInfos.length; i++) { IjkTrackInfo trackInfo = trackInfos[i]; if (trackInfo.getTrackType() != type) continue; - Track item = new Track(provider.getTrackName(trackInfo)); + Track item = new Track(type, provider.getTrackName(trackInfo)); item.setSelected(track == i); item.setTrack(i); items.add(item); @@ -108,24 +114,30 @@ public final class TrackSelectionDialog implements TrackAdapter.OnClickListener private void setExoTrack(Track item) { if (item.isSelected()) { - player.exo().setTrackSelectionParameters(player.exo().getTrackSelectionParameters().buildUpon().setOverrideForType(new TrackSelectionOverride(player.exo().getCurrentTracks().getGroups().get(item.getGroup()).getMediaTrackGroup(), ImmutableList.of())).build()); - } else { player.exo().setTrackSelectionParameters(player.exo().getTrackSelectionParameters().buildUpon().setOverrideForType(new TrackSelectionOverride(player.exo().getCurrentTracks().getGroups().get(item.getGroup()).getMediaTrackGroup(), item.getTrack())).build()); + } else { + player.exo().setTrackSelectionParameters(player.exo().getTrackSelectionParameters().buildUpon().setOverrideForType(new TrackSelectionOverride(player.exo().getCurrentTracks().getGroups().get(item.getGroup()).getMediaTrackGroup(), ImmutableList.of())).build()); } } private void setIjkTrack(Track item) { if (item.isSelected()) { - player.ijk().deselectTrack(item.getTrack()); - } else { player.ijk().selectTrack(item.getTrack()); + } else { + player.ijk().deselectTrack(item.getTrack()); } } @Override public void onItemClick(Track item) { + if (listener != null) listener.onTrackClick(item); if (player.isExo()) setExoTrack(item); if (player.isIjk()) setIjkTrack(item); dialog.dismiss(); } + + public interface Listener { + + void onTrackClick(Track item); + } } \ No newline at end of file