From a7ce584025deaca741438ffdbc3617a880cce4da Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 15 Feb 2024 15:10:21 +0800 Subject: [PATCH] Remove recordable --- .../{28.json => 29.json} | 20 ++---- .../android/tv/ui/activity/VideoActivity.java | 4 +- .../android/tv/ui/adapter/SiteAdapter.java | 4 -- .../android/tv/ui/dialog/SiteDialog.java | 28 +++++---- app/src/leanback/res/drawable/ic_site_all.xml | 10 +++ .../leanback/res/drawable/ic_site_none.xml | 10 +++ .../leanback/res/drawable/ic_site_record.xml | 10 --- app/src/leanback/res/layout/dialog_site.xml | 23 +++---- .../java/com/fongmi/android/tv/bean/Live.java | 48 ++++++++++++-- .../java/com/fongmi/android/tv/bean/Site.java | 62 +++++++++---------- .../com/fongmi/android/tv/db/AppDatabase.java | 49 +++++++++++++-- .../java/com/github/catvod/utils/Prefers.java | 3 +- 12 files changed, 172 insertions(+), 99 deletions(-) rename app/schemas/com.fongmi.android.tv.db.AppDatabase/{28.json => 29.json} (95%) create mode 100644 app/src/leanback/res/drawable/ic_site_all.xml create mode 100644 app/src/leanback/res/drawable/ic_site_none.xml delete mode 100644 app/src/leanback/res/drawable/ic_site_record.xml diff --git a/app/schemas/com.fongmi.android.tv.db.AppDatabase/28.json b/app/schemas/com.fongmi.android.tv.db.AppDatabase/29.json similarity index 95% rename from app/schemas/com.fongmi.android.tv.db.AppDatabase/28.json rename to app/schemas/com.fongmi.android.tv.db.AppDatabase/29.json index 114f6f298..b5fd0a5ef 100644 --- a/app/schemas/com.fongmi.android.tv.db.AppDatabase/28.json +++ b/app/schemas/com.fongmi.android.tv.db.AppDatabase/29.json @@ -1,8 +1,8 @@ { "formatVersion": 1, "database": { - "version": 28, - "identityHash": "d4921f6e0b243ebdcdb3a62512537b4d", + "version": 29, + "identityHash": "fe3a6989063bdf1f7fad4037f38f3b97", "entities": [ { "tableName": "Keep", @@ -62,7 +62,7 @@ }, { "tableName": "Site", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `name` TEXT, `searchable` INTEGER, `changeable` INTEGER, `recordable` INTEGER, PRIMARY KEY(`key`))", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `searchable` INTEGER, `changeable` INTEGER, PRIMARY KEY(`key`))", "fields": [ { "fieldPath": "key", @@ -70,12 +70,6 @@ "affinity": "TEXT", "notNull": true }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": false - }, { "fieldPath": "searchable", "columnName": "searchable", @@ -87,12 +81,6 @@ "columnName": "changeable", "affinity": "INTEGER", "notNull": false - }, - { - "fieldPath": "recordable", - "columnName": "recordable", - "affinity": "INTEGER", - "notNull": false } ], "primaryKey": { @@ -464,7 +452,7 @@ "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd4921f6e0b243ebdcdb3a62512537b4d')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'fe3a6989063bdf1f7fad4037f38f3b97')" ] } } \ No newline at end of file diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index c802f35d6..4939ae91c 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -1016,7 +1016,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List mHistory = History.find(getHistoryKey()); mHistory = mHistory == null ? createHistory(item) : mHistory; if (!TextUtils.isEmpty(getMark())) mHistory.setVodRemarks(getMark()); - if (!getSite().isRecordable() && mHistory.getKey().equals(getHistoryKey())) mHistory.delete(); + //if (!getSite().isRecordable() && mHistory.getKey().equals(getHistoryKey())) mHistory.delete(); mBinding.control.opening.setText(mHistory.getOpening() == 0 ? getString(R.string.play_op) : mPlayers.stringToTime(mHistory.getOpening())); mBinding.control.ending.setText(mHistory.getEnding() == 0 ? getString(R.string.play_ed) : mPlayers.stringToTime(mHistory.getEnding())); mBinding.control.speed.setText(mPlayers.setSpeed(mHistory.getSpeed())); @@ -1073,7 +1073,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List long position, duration; mHistory.setPosition(position = mPlayers.getPosition()); mHistory.setDuration(duration = mPlayers.getDuration()); - if (position >= 0 && duration > 0 && getSite().isRecordable()) App.execute(() -> mHistory.update()); + //if (position >= 0 && duration > 0 && getSite().isRecordable()) App.execute(() -> mHistory.update()); if (mHistory.getEnding() > 0 && duration > 0 && mHistory.getEnding() + position >= duration) { mClock.setCallback(null); checkNext(); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/SiteAdapter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/SiteAdapter.java index b8133443f..fe458b442 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/SiteAdapter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/SiteAdapter.java @@ -71,7 +71,6 @@ public class SiteAdapter extends RecyclerView.Adapter { private boolean getChecked(Site item) { if (type == 1) return item.isSearchable(); if (type == 2) return item.isChangeable(); - if (type == 3) return !item.isRecordable(); return false; } @@ -79,21 +78,18 @@ public class SiteAdapter extends RecyclerView.Adapter { if (type == 0) mListener.onItemClick(item); if (type == 1) item.setSearchable(!item.isSearchable()).save(); if (type == 2) item.setChangeable(!item.isChangeable()).save(); - if (type == 3) item.setRecordable(!item.isRecordable()).save(); if (type != 0) notifyItemChanged(position); } private boolean setLongListener(Site item) { if (type == 1) setEnable(!item.isSearchable()); if (type == 2) setEnable(!item.isChangeable()); - if (type == 3) setEnable(!item.isRecordable()); return true; } private void setEnable(boolean enable) { if (type == 1) for (Site site : VodConfig.get().getSites()) site.setSearchable(enable).save(); if (type == 2) for (Site site : VodConfig.get().getSites()) site.setChangeable(enable).save(); - if (type == 3) for (Site site : VodConfig.get().getSites()) site.setRecordable(enable).save(); notifyItemRangeChanged(0, getItemCount()); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/SiteDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/SiteDialog.java index 34bb156f3..99d7e0d51 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/SiteDialog.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/SiteDialog.java @@ -4,7 +4,6 @@ import android.app.Activity; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; -import android.widget.CompoundButton; import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.GridLayoutManager; @@ -21,7 +20,7 @@ import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; import com.fongmi.android.tv.utils.ResUtil; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -public class SiteDialog implements SiteAdapter.OnClickListener, CompoundButton.OnCheckedChangeListener { +public class SiteDialog implements SiteAdapter.OnClickListener { private RecyclerView.ItemDecoration decoration; private final DialogSiteBinding binding; @@ -80,11 +79,11 @@ public class SiteDialog implements SiteAdapter.OnClickListener, CompoundButton.O } private void initEvent() { - binding.check.setOnCheckedChangeListener(this); + binding.all.setOnClickListener(this::setAll); + binding.none.setOnClickListener(this::setNone); binding.mode.setOnClickListener(this::setMode); binding.search.setOnClickListener(v -> setType(v.isActivated() ? 0 : 1)); binding.change.setOnClickListener(v -> setType(v.isActivated() ? 0 : 2)); - binding.record.setOnClickListener(v -> setType(v.isActivated() ? 0 : 3)); } private void setRecyclerView() { @@ -94,7 +93,8 @@ public class SiteDialog implements SiteAdapter.OnClickListener, CompoundButton.O if (decoration != null) binding.recycler.removeItemDecoration(decoration); binding.recycler.addItemDecoration(decoration = new SpaceItemDecoration(getCount(), 16)); binding.recycler.setLayoutManager(new GridLayoutManager(dialog.getContext(), getCount())); - if (!binding.mode.hasFocus()) binding.recycler.post(() -> binding.recycler.scrollToPosition(VodConfig.getHomeIndex())); + if (!binding.mode.hasFocus()) + binding.recycler.post(() -> binding.recycler.scrollToPosition(VodConfig.getHomeIndex())); } private void setDialog() { @@ -115,22 +115,24 @@ public class SiteDialog implements SiteAdapter.OnClickListener, CompoundButton.O private void setType(int type) { binding.search.setActivated(type == 1); binding.change.setActivated(type == 2); - binding.record.setActivated(type == 3); adapter.setType(this.type = type); } + private void setAll(View view) { + if (type == 0) return; + adapter.selectAll(); + } + + private void setNone(View view) { + if (type == 0) return; + adapter.cancelAll(); + } + private void setMode(View view) { Setting.putSiteMode(Math.abs(Setting.getSiteMode() - 1)); initView(); } - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (type == 0) buttonView.setChecked(!isChecked); - else if (isChecked) adapter.selectAll(); - else adapter.cancelAll(); - } - @Override public void onItemClick(Site item) { callback.setSite(item); diff --git a/app/src/leanback/res/drawable/ic_site_all.xml b/app/src/leanback/res/drawable/ic_site_all.xml new file mode 100644 index 000000000..738c6892c --- /dev/null +++ b/app/src/leanback/res/drawable/ic_site_all.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/leanback/res/drawable/ic_site_none.xml b/app/src/leanback/res/drawable/ic_site_none.xml new file mode 100644 index 000000000..ab4b662b4 --- /dev/null +++ b/app/src/leanback/res/drawable/ic_site_none.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/leanback/res/drawable/ic_site_record.xml b/app/src/leanback/res/drawable/ic_site_record.xml deleted file mode 100644 index 3d4080ab6..000000000 --- a/app/src/leanback/res/drawable/ic_site_record.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/leanback/res/layout/dialog_site.xml b/app/src/leanback/res/layout/dialog_site.xml index cb6f34dac..e5d3508e6 100644 --- a/app/src/leanback/res/layout/dialog_site.xml +++ b/app/src/leanback/res/layout/dialog_site.xml @@ -47,13 +47,13 @@ android:focusable="true" android:focusableInTouchMode="true" android:nextFocusUp="@id/search" - android:nextFocusDown="@id/record" + android:nextFocusDown="@id/all" android:padding="8dp" android:src="@drawable/ic_site_change" app:tint="@color/text" /> + android:src="@drawable/ic_site_all" /> - + android:padding="8dp" + android:src="@drawable/ic_site_none" /> diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Live.java b/app/src/main/java/com/fongmi/android/tv/bean/Live.java index db104fe75..7485cfd61 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Live.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Live.java @@ -5,6 +5,7 @@ import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.room.Entity; +import androidx.room.Ignore; import androidx.room.PrimaryKey; import com.fongmi.android.tv.App; @@ -21,51 +22,88 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -@Entity(ignoredColumns = {"type", "group", "url", "jar", "logo", "epg", "ua", "click", "origin", "referer", "timeout", "header", "playerType", "channels", "groups", "core", "activated", "width"}) +@Entity public class Live { @NonNull @PrimaryKey @SerializedName("name") private String name; + + @Ignore @SerializedName("type") private int type; - @SerializedName("boot") - private boolean boot; - @SerializedName("pass") - private boolean pass; + + @Ignore @SerializedName("group") private String group; + + @Ignore @SerializedName("url") private String url; + + @Ignore @SerializedName("jar") private String jar; + + @Ignore @SerializedName("logo") private String logo; + + @Ignore @SerializedName("epg") private String epg; + + @Ignore @SerializedName("ua") private String ua; + + @Ignore @SerializedName("click") private String click; + + @Ignore @SerializedName("origin") private String origin; + + @Ignore @SerializedName("referer") private String referer; + + @Ignore @SerializedName("timeout") private Integer timeout; + + @Ignore @SerializedName("header") private JsonElement header; + + @Ignore @SerializedName("playerType") private Integer playerType; + + @Ignore @SerializedName("channels") private List channels; + + @Ignore @SerializedName("groups") private List groups; + + @Ignore @SerializedName("core") private Core core; + @SerializedName("boot") + private boolean boot; + + @SerializedName("pass") + private boolean pass; + + @Ignore private boolean activated; + + @Ignore private int width; public static Live objectFrom(JsonElement element) { diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Site.java b/app/src/main/java/com/fongmi/android/tv/bean/Site.java index 71e434f3d..2e55c1bb5 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Site.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Site.java @@ -6,6 +6,7 @@ import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.room.Entity; +import androidx.room.Ignore; import androidx.room.PrimaryKey; import com.fongmi.android.tv.App; @@ -22,47 +23,74 @@ import java.util.List; import okhttp3.Headers; -@Entity(ignoredColumns = {"api", "ext", "jar", "click", "playUrl", "type", "indexs", "timeout", "playerType", "categories", "header", "style", "activated"}) +@Entity public class Site implements Parcelable { @NonNull @PrimaryKey @SerializedName("key") private String key; + + @Ignore @SerializedName("name") private String name; + + @Ignore @SerializedName("api") private String api; + + @Ignore @JsonAdapter(ExtAdapter.class) @SerializedName("ext") private String ext; + + @Ignore @SerializedName("jar") private String jar; + + @Ignore @SerializedName("click") private String click; + + @Ignore @SerializedName("playUrl") private String playUrl; + + @Ignore @SerializedName("type") private Integer type; + + @Ignore @SerializedName("indexs") private Integer indexs; + + @Ignore @SerializedName("timeout") private Integer timeout; + + @Ignore @SerializedName("playerType") private Integer playerType; + @SerializedName("searchable") private Integer searchable; + @SerializedName("changeable") private Integer changeable; - @SerializedName("recordable") - private Integer recordable; + + @Ignore @SerializedName("categories") private List categories; + + @Ignore @SerializedName("header") private JsonElement header; + + @Ignore @SerializedName("style") private Style style; + @Ignore private boolean activated; public static Site objectFrom(JsonElement element) { @@ -137,18 +165,10 @@ public class Site implements Parcelable { return type == null ? 0 : type; } - public void setType(int type) { - this.type = type; - } - public Integer getIndexs() { return indexs == null ? 0 : indexs; } - public void setIndexs(Integer indexs) { - this.indexs = indexs; - } - public Integer getTimeout() { return timeout == null ? Constant.TIMEOUT_PLAY : Math.max(timeout, 1) * 1000; } @@ -173,14 +193,6 @@ public class Site implements Parcelable { this.changeable = changeable; } - public Integer getRecordable() { - return recordable == null ? 1 : recordable; - } - - public void setRecordable(Integer recordable) { - this.recordable = recordable; - } - public List getCategories() { return categories == null ? Collections.emptyList() : categories; } @@ -231,15 +243,6 @@ public class Site implements Parcelable { return this; } - public boolean isRecordable() { - return getRecordable() == 1; - } - - public Site setRecordable(boolean recordable) { - if (getRecordable() != 0) setRecordable(recordable ? 1 : 2); - return this; - } - public boolean isEmpty() { return getKey().isEmpty() && getName().isEmpty(); } @@ -252,7 +255,6 @@ public class Site implements Parcelable { Site item = find(getKey()); if (item == null) return this; if (getChangeable() != 0) setChangeable(Math.max(1, item.getChangeable())); - if (getRecordable() != 0) setRecordable(Math.max(1, item.getRecordable())); if (getSearchable() != 0) setSearchable(Math.max(1, item.getSearchable())); return this; } @@ -293,7 +295,6 @@ public class Site implements Parcelable { dest.writeValue(this.playerType); dest.writeValue(this.searchable); dest.writeValue(this.changeable); - dest.writeValue(this.recordable); dest.writeStringList(this.categories); dest.writeParcelable(this.style, flags); dest.writeByte(this.activated ? (byte) 1 : (byte) 0); @@ -313,7 +314,6 @@ public class Site implements Parcelable { this.playerType = (Integer) in.readValue(Integer.class.getClassLoader()); this.searchable = (Integer) in.readValue(Integer.class.getClassLoader()); this.changeable = (Integer) in.readValue(Integer.class.getClassLoader()); - this.recordable = (Integer) in.readValue(Integer.class.getClassLoader()); this.categories = in.createStringArrayList(); this.style = in.readParcelable(Style.class.getClassLoader()); this.activated = in.readByte() != 0; 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 78e78a53f..3bbcc2832 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 @@ -38,7 +38,7 @@ import java.util.Locale; @Database(entities = {Keep.class, Site.class, Live.class, Track.class, Config.class, Device.class, History.class}, version = AppDatabase.VERSION) public abstract class AppDatabase extends RoomDatabase { - public static final int VERSION = 28; + public static final int VERSION = 29; public static final String NAME = "tv"; public static final String SYMBOL = "@@@"; @@ -80,16 +80,38 @@ public abstract class AppDatabase extends RoomDatabase { File wal = new File(Path.tv(), NAME + "-wal"); File shm = new File(Path.tv(), NAME + "-shm"); File pref = new File(Path.tv(), NAME + "-pref"); - if (db.exists()) Path.move(db, App.get().getDatabasePath(db.getName()).getAbsoluteFile()); - if (wal.exists()) Path.move(wal, App.get().getDatabasePath(wal.getName()).getAbsoluteFile()); - if (shm.exists()) Path.move(shm, App.get().getDatabasePath(shm.getName()).getAbsoluteFile()); + if (db.exists()) + Path.move(db, App.get().getDatabasePath(db.getName()).getAbsoluteFile()); + if (wal.exists()) + Path.move(wal, App.get().getDatabasePath(wal.getName()).getAbsoluteFile()); + if (shm.exists()) + Path.move(shm, App.get().getDatabasePath(shm.getName()).getAbsoluteFile()); if (pref.exists()) Prefers.restore(pref); App.post(callback::success); }); } private static AppDatabase create(Context context) { - return Room.databaseBuilder(context, AppDatabase.class, NAME).addMigrations(MIGRATION_11_12).addMigrations(MIGRATION_12_13).addMigrations(MIGRATION_13_14).addMigrations(MIGRATION_14_15).addMigrations(MIGRATION_15_16).addMigrations(MIGRATION_16_17).addMigrations(MIGRATION_17_18).addMigrations(MIGRATION_18_19).addMigrations(MIGRATION_19_20).addMigrations(MIGRATION_20_21).addMigrations(MIGRATION_21_22).addMigrations(MIGRATION_22_23).addMigrations(MIGRATION_23_24).addMigrations(MIGRATION_24_25).addMigrations(MIGRATION_25_26).addMigrations(MIGRATION_26_27).allowMainThreadQueries().fallbackToDestructiveMigration().build(); + return Room.databaseBuilder(context, AppDatabase.class, NAME) + .addMigrations(MIGRATION_11_12) + .addMigrations(MIGRATION_12_13) + .addMigrations(MIGRATION_13_14) + .addMigrations(MIGRATION_14_15) + .addMigrations(MIGRATION_15_16) + .addMigrations(MIGRATION_16_17) + .addMigrations(MIGRATION_17_18) + .addMigrations(MIGRATION_18_19) + .addMigrations(MIGRATION_19_20) + .addMigrations(MIGRATION_20_21) + .addMigrations(MIGRATION_21_22) + .addMigrations(MIGRATION_22_23) + .addMigrations(MIGRATION_23_24) + .addMigrations(MIGRATION_24_25) + .addMigrations(MIGRATION_25_26) + .addMigrations(MIGRATION_26_27) + .addMigrations(MIGRATION_27_28) + .addMigrations(MIGRATION_28_29) + .allowMainThreadQueries().fallbackToDestructiveMigration().build(); } public abstract KeepDao getKeepDao(); @@ -227,4 +249,21 @@ public abstract class AppDatabase extends RoomDatabase { database.execSQL("CREATE TABLE IF NOT EXISTS `Live` (`name` TEXT NOT NULL, `boot` INTEGER NOT NULL, `pass` INTEGER NOT NULL, PRIMARY KEY(`name`))"); } }; + + static final Migration MIGRATION_27_28 = new Migration(27, 28) { + @Override + public void migrate(@NonNull SupportSQLiteDatabase database) { + Prefers.remove("danmu_size"); + } + }; + + static final Migration MIGRATION_28_29 = new Migration(28, 29) { + @Override + public void migrate(@NonNull SupportSQLiteDatabase database) { + database.execSQL("CREATE TABLE Site_Backup (`key` TEXT NOT NULL, searchable INTEGER, changeable INTEGER, PRIMARY KEY (`key`))"); + database.execSQL("INSERT INTO Site_Backup SELECT `key`, searchable, changeable FROM Site"); + database.execSQL("DROP TABLE Site"); + database.execSQL("ALTER TABLE Site_Backup RENAME to Site"); + } + }; } diff --git a/catvod/src/main/java/com/github/catvod/utils/Prefers.java b/catvod/src/main/java/com/github/catvod/utils/Prefers.java index 63aeafcb2..2bc15afa8 100644 --- a/catvod/src/main/java/com/github/catvod/utils/Prefers.java +++ b/catvod/src/main/java/com/github/catvod/utils/Prefers.java @@ -96,8 +96,7 @@ public class Prefers { public static void restore(File file) { try { Gson gson = new GsonBuilder().setObjectToNumberStrategy(ToNumberPolicy.LAZILY_PARSED_NUMBER).create(); - Map map = gson.fromJson(Path.read(file), new TypeToken>() { - }.getType()); + Map map = gson.fromJson(Path.read(file), new TypeToken>() {}.getType()); for (Map.Entry entry : map.entrySet()) Prefers.put(entry.getKey(), convert(entry)); } catch (Exception e) { e.printStackTrace();