From 76855ca95292c4461473a5bbae7d8e209d68ec8a Mon Sep 17 00:00:00 2001 From: okjack Date: Thu, 15 Feb 2024 18:01:31 +0800 Subject: [PATCH 1/7] fix layout --- app/src/leanback/res/layout/activity_collect.xml | 2 +- app/src/leanback/res/layout/activity_vod.xml | 2 +- app/src/leanback/res/layout/fragment_vod.xml | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/leanback/res/layout/activity_collect.xml b/app/src/leanback/res/layout/activity_collect.xml index 646d7d2be..1941e452d 100644 --- a/app/src/leanback/res/layout/activity_collect.xml +++ b/app/src/leanback/res/layout/activity_collect.xml @@ -24,7 +24,7 @@ android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="16dp" + android:layout_marginBottom="12dp" android:clipChildren="false" android:clipToPadding="false" android:paddingStart="24dp" diff --git a/app/src/leanback/res/layout/activity_vod.xml b/app/src/leanback/res/layout/activity_vod.xml index 38059d78c..be1c5bd1e 100644 --- a/app/src/leanback/res/layout/activity_vod.xml +++ b/app/src/leanback/res/layout/activity_vod.xml @@ -10,7 +10,7 @@ android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="16dp" + android:layout_marginBottom="12dp" android:clipChildren="false" android:clipToPadding="false" android:paddingStart="24dp" diff --git a/app/src/leanback/res/layout/fragment_vod.xml b/app/src/leanback/res/layout/fragment_vod.xml index 71ed3eb92..15be2750b 100644 --- a/app/src/leanback/res/layout/fragment_vod.xml +++ b/app/src/leanback/res/layout/fragment_vod.xml @@ -11,6 +11,7 @@ android:clipChildren="false" android:clipToPadding="false" android:paddingStart="24dp" + android:paddingTop="12dp" android:paddingEnd="24dp" android:paddingBottom="24dp" app:focusOutEnd="true" From b422d1718c93e62b3b556e2950671e9ef3826290 Mon Sep 17 00:00:00 2001 From: okjack Date: Thu, 15 Feb 2024 23:13:31 +0800 Subject: [PATCH 2/7] remove recordable --- .../{28.json => 29.json} | 20 ++---- .../android/tv/ui/activity/VideoActivity.java | 2 - .../android/tv/ui/adapter/SiteAdapter.java | 4 -- .../android/tv/ui/dialog/SiteDialog.java | 25 +++---- 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 | 46 +++++++++++-- .../java/com/fongmi/android/tv/bean/Site.java | 66 +++++++++---------- .../com/fongmi/android/tv/db/AppDatabase.java | 33 +++++++++- 11 files changed, 154 insertions(+), 95 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 ecc12c20a..4ab876cbe 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 @@ -1186,7 +1186,6 @@ 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(); 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())); @@ -1245,7 +1244,6 @@ 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 (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..643a2c6aa 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() { @@ -115,22 +114,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..523285e8b --- /dev/null +++ b/app/src/leanback/res/drawable/ic_site_all.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file 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..d533156c1 --- /dev/null +++ b/app/src/leanback/res/drawable/ic_site_none.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file 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..d37a83418 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..a7b2de3e5 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,86 @@ 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; @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 00e178f47..875edafc7 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", "timeout", "playerType", "categories", "header", "style", "activated", "indexs"}) +@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; - @SerializedName("indexs") - private Integer indexs; + + @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,10 +165,6 @@ public class Site implements Parcelable { return type == null ? 0 : type; } - public void setType(int type) { - this.type = type; - } - public Integer getTimeout() { return timeout == null ? Constant.TIMEOUT_PLAY : Math.max(timeout, 1) * 1000; } @@ -165,14 +189,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 boolean isIndexs() { return getIndexs() == 1; } @@ -181,10 +197,6 @@ public class Site implements Parcelable { return indexs == null ? 0 : indexs; } - public void setIndexs(Integer indexs) { - this.indexs = indexs; - } - 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; } @@ -292,7 +294,6 @@ public class Site implements Parcelable { dest.writeValue(this.playerType); dest.writeValue(this.searchable); dest.writeValue(this.changeable); - dest.writeValue(this.recordable); dest.writeValue(this.indexs); dest.writeStringList(this.categories); dest.writeParcelable(this.style, flags); @@ -312,7 +313,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.indexs = (Integer) in.readValue(Integer.class.getClassLoader()); this.categories = in.createStringArrayList(); this.style = in.readParcelable(Style.class.getClassLoader()); 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 d3fae5f28..0aa0a2b54 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 = "@@@"; @@ -89,7 +89,26 @@ public abstract class AppDatabase extends RoomDatabase { } 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).addMigrations(MIGRATION_27_28).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(); @@ -234,4 +253,14 @@ public abstract class AppDatabase extends RoomDatabase { 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"); + } + }; } From d45cd4cf60ee7f57c8a5e3a26493c140230099b0 Mon Sep 17 00:00:00 2001 From: okjack Date: Thu, 15 Feb 2024 23:27:35 +0800 Subject: [PATCH 3/7] Add incognito mode setting --- .../tv/ui/activity/SettingCustomActivity.java | 7 ++++ .../android/tv/ui/activity/VideoActivity.java | 2 + .../res/layout/activity_setting_custom.xml | 37 +++++++++++++++++++ .../java/com/fongmi/android/tv/Setting.java | 8 ++++ app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + .../android/tv/ui/activity/VideoActivity.java | 2 + .../tv/ui/fragment/SettingCustomFragment.java | 7 ++++ .../res/layout/fragment_setting_custom.xml | 27 ++++++++++++++ 10 files changed, 93 insertions(+) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java index 3ed230a05..1f63e7ea3 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java @@ -47,6 +47,7 @@ public class SettingCustomActivity extends BaseActivity { mBinding.speedText.setText(Setting.getPlaySpeed() + "x"); mBinding.fullscreenMenuKeyText.setText((fullscreenMenuKey = ResUtil.getStringArray(R.array.select_fullscreen_menu_key))[Setting.getFullscreenMenuKey()]); mBinding.homeSiteLockText.setText(getSwitch(Setting.isHomeSiteLock())); + mBinding.incognitoText.setText(getSwitch(Setting.isIncognito())); } @Override @@ -62,6 +63,7 @@ public class SettingCustomActivity extends BaseActivity { mBinding.speed.setOnLongClickListener(this::resetSpeed); mBinding.fullscreenMenuKey.setOnClickListener(this::setfullscreenMenuKey); mBinding.homeSiteLock.setOnClickListener(this::setHomeSiteLock); + mBinding.incognito.setOnClickListener(this::setIncognito); } private void setQuality(View view) { @@ -129,4 +131,9 @@ public class SettingCustomActivity extends BaseActivity { mBinding.homeSiteLockText.setText(getSwitch(Setting.isHomeSiteLock())); } + private void setIncognito(View view) { + Setting.putIncognito(!Setting.isIncognito()); + mBinding.incognitoText.setText(getSwitch(Setting.isIncognito())); + } + } 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 4ab876cbe..94f910368 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 @@ -1186,6 +1186,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 (Setting.isIncognito() && 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())); @@ -1244,6 +1245,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 && !Setting.isIncognito()) App.execute(() -> mHistory.update()); if (mHistory.getEnding() > 0 && duration > 0 && mHistory.getEnding() + position >= duration) { mClock.setCallback(null); checkNext(); diff --git a/app/src/leanback/res/layout/activity_setting_custom.xml b/app/src/leanback/res/layout/activity_setting_custom.xml index 7638d2ac4..75b0718c6 100644 --- a/app/src/leanback/res/layout/activity_setting_custom.xml +++ b/app/src/leanback/res/layout/activity_setting_custom.xml @@ -345,5 +345,42 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/android/tv/Setting.java b/app/src/main/java/com/fongmi/android/tv/Setting.java index 34fbb18c6..d7c32099c 100644 --- a/app/src/main/java/com/fongmi/android/tv/Setting.java +++ b/app/src/main/java/com/fongmi/android/tv/Setting.java @@ -397,4 +397,12 @@ public class Setting { Prefers.put("home_site_lock", lock); } + public static boolean isIncognito() { + return Prefers.getBoolean("incognito"); + } + + public static void putIncognito(boolean incognito) { + Prefers.put("incognito", incognito); + } + } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index e3fb216cc..598346413 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -78,6 +78,7 @@ 图片尺寸 全屏菜单键 首页源锁定 + 無痕模式 DoH Proxy 缓存 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 4c7d063af..e346a2394 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -78,6 +78,7 @@ 圖片尺寸 全屏選單鍵 首頁源鎖定 + 無痕模式 DoH Proxy 暫存 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 097deeeb8..d6369cef6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -78,6 +78,7 @@ Image size Fullscreen menu key Home site lock + Incognito mode DoH Proxy Cache diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index aa2381a98..f75043e2d 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -1120,6 +1120,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo mHistory = History.find(getHistoryKey()); mHistory = mHistory == null ? createHistory(item) : mHistory; if (!TextUtils.isEmpty(getMark())) mHistory.setVodRemarks(getMark()); + if (Setting.isIncognito() && mHistory.getKey().equals(getHistoryKey())) mHistory.delete(); mBinding.control.action.opening.setText(mHistory.getOpening() == 0 ? getString(R.string.play_op) : mPlayers.stringToTime(mHistory.getOpening())); mBinding.control.action.ending.setText(mHistory.getEnding() == 0 ? getString(R.string.play_ed) : mPlayers.stringToTime(mHistory.getEnding())); mBinding.control.action.speed.setText(mPlayers.setSpeed(mHistory.getSpeed())); @@ -1192,6 +1193,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo long position, duration; mHistory.setPosition(position = mPlayers.getPosition()); mHistory.setDuration(duration = mPlayers.getDuration()); + if (position >= 0 && duration > 0 && !Setting.isIncognito()) App.execute(() -> mHistory.update()); if (position >= 0 && duration > 0) App.execute(() -> mHistory.update()); if (mHistory.getEnding() > 0 && duration > 0 && mHistory.getEnding() + position >= duration) { mClock.setCallback(null); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingCustomFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingCustomFragment.java index 11f4d9637..fbc211d84 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingCustomFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingCustomFragment.java @@ -39,6 +39,7 @@ public class SettingCustomFragment extends BaseFragment { mBinding.sizeText.setText((size = ResUtil.getStringArray(R.array.select_size))[Setting.getSize()]); mBinding.danmuSyncText.setText(getSwitch(Setting.isDanmuSync())); mBinding.speedText.setText(Setting.getPlaySpeed() + "x"); + mBinding.incognitoText.setText(getSwitch(Setting.isIncognito())); } @Override @@ -48,6 +49,7 @@ public class SettingCustomFragment extends BaseFragment { mBinding.danmuSync.setOnClickListener(this::setDanmuSync); mBinding.speed.setOnClickListener(this::setSpeed); mBinding.speed.setOnLongClickListener(this::resetSpeed); + mBinding.incognito.setOnClickListener(this::setIncognito); } private boolean onTitle(View view) { @@ -83,4 +85,9 @@ public class SettingCustomFragment extends BaseFragment { return true; } + private void setIncognito(View view) { + Setting.putIncognito(!Setting.isIncognito()); + mBinding.incognitoText.setText(getSwitch(Setting.isIncognito())); + } + } diff --git a/app/src/mobile/res/layout/fragment_setting_custom.xml b/app/src/mobile/res/layout/fragment_setting_custom.xml index 2c566b0c2..1d167db5c 100644 --- a/app/src/mobile/res/layout/fragment_setting_custom.xml +++ b/app/src/mobile/res/layout/fragment_setting_custom.xml @@ -126,6 +126,33 @@ + + + + + + + + \ No newline at end of file From 43d5584e4e98fd840b0e974b6d7860c48d307f39 Mon Sep 17 00:00:00 2001 From: okjack Date: Thu, 15 Feb 2024 23:31:56 +0800 Subject: [PATCH 4/7] Add 302 auth check --- catvod/src/main/java/com/github/catvod/net/OkHttp.java | 2 +- .../github/catvod/net/interceptor/DefaultInterceptor.java | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/catvod/src/main/java/com/github/catvod/net/OkHttp.java b/catvod/src/main/java/com/github/catvod/net/OkHttp.java index 1e5261d32..ff10e20fe 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkHttp.java +++ b/catvod/src/main/java/com/github/catvod/net/OkHttp.java @@ -132,7 +132,7 @@ public class OkHttp { } private static OkHttpClient.Builder getBuilder() { - OkHttpClient.Builder builder = new OkHttpClient.Builder().addInterceptor(new DefaultInterceptor()).connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS).readTimeout(TIMEOUT, TimeUnit.MILLISECONDS).writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS).dns(dns()).hostnameVerifier((hostname, session) -> true).sslSocketFactory(new SSLCompat(), SSLCompat.TM); + OkHttpClient.Builder builder = new OkHttpClient.Builder().addNetworkInterceptor(new DefaultInterceptor()).connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS).readTimeout(TIMEOUT, TimeUnit.MILLISECONDS).writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS).dns(dns()).hostnameVerifier((hostname, session) -> true).sslSocketFactory(new SSLCompat(), SSLCompat.TM); builder.proxySelector(get().proxy ? selector() : defaultSelector); return builder; } diff --git a/catvod/src/main/java/com/github/catvod/net/interceptor/DefaultInterceptor.java b/catvod/src/main/java/com/github/catvod/net/interceptor/DefaultInterceptor.java index 9279ecfac..4aeeb4db6 100644 --- a/catvod/src/main/java/com/github/catvod/net/interceptor/DefaultInterceptor.java +++ b/catvod/src/main/java/com/github/catvod/net/interceptor/DefaultInterceptor.java @@ -27,6 +27,7 @@ public class DefaultInterceptor implements Interceptor { public Response intercept(@NonNull Chain chain) throws IOException { Response response = chain.proceed(getRequest(chain.request())); String encoding = response.header(HttpHeaders.CONTENT_ENCODING); + if (response.isRedirect() && response.header(HttpHeaders.LOCATION) != null) checkAuth(response); if (response.body() == null || encoding == null || !encoding.equals("deflate")) return response; InflaterInputStream is = new InflaterInputStream(response.body().byteStream(), new Inflater(true)); return response.newBuilder().headers(response.headers()).body(new ResponseBody() { @@ -49,7 +50,7 @@ public class DefaultInterceptor implements Interceptor { }).build(); } - private Request getRequest(@NonNull Request request) { + private Request getRequest(Request request) { URI uri = request.url().uri(); String url = request.url().toString(); Request.Builder builder = request.newBuilder(); @@ -59,4 +60,9 @@ public class DefaultInterceptor implements Interceptor { if (uri.getUserInfo() != null) builder.header(HttpHeaders.AUTHORIZATION, Util.basic(uri.getUserInfo())); return builder.build(); } + + private void checkAuth(Response response) { + URI uri = URI.create(response.header(HttpHeaders.LOCATION)); + if (uri.getUserInfo() != null) response.header(HttpHeaders.AUTHORIZATION, Util.basic(uri.getUserInfo())); + } } From 0e5464bf324634c02266cd5d9c520ecf93b4160f Mon Sep 17 00:00:00 2001 From: okjack Date: Thu, 15 Feb 2024 23:36:11 +0800 Subject: [PATCH 5/7] clean code --- .../net/interceptor/DefaultInterceptor.java | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/catvod/src/main/java/com/github/catvod/net/interceptor/DefaultInterceptor.java b/catvod/src/main/java/com/github/catvod/net/interceptor/DefaultInterceptor.java index 4aeeb4db6..eb3e24c2d 100644 --- a/catvod/src/main/java/com/github/catvod/net/interceptor/DefaultInterceptor.java +++ b/catvod/src/main/java/com/github/catvod/net/interceptor/DefaultInterceptor.java @@ -26,9 +26,31 @@ public class DefaultInterceptor implements Interceptor { @Override public Response intercept(@NonNull Chain chain) throws IOException { Response response = chain.proceed(getRequest(chain.request())); + String location = response.header(HttpHeaders.LOCATION); String encoding = response.header(HttpHeaders.CONTENT_ENCODING); - if (response.isRedirect() && response.header(HttpHeaders.LOCATION) != null) checkAuth(response); - if (response.body() == null || encoding == null || !encoding.equals("deflate")) return response; + if (response.isRedirect() && location != null) checkAuth(response, location); + if (response.body() != null && "deflate".equals(encoding)) return deflate(response); + return response; + } + + private Request getRequest(Request request) { + URI uri = request.url().uri(); + String url = request.url().toString(); + Request.Builder builder = request.newBuilder(); + boolean local = url.contains(":" + Proxy.getPort() + "/"); + if (url.contains("+") && local) builder.url(url.replace("+", "%2B")); + if (url.contains("gitcode.net")) builder.header(HttpHeaders.USER_AGENT, Util.CHROME); + if (uri.getUserInfo() != null) builder.header(HttpHeaders.AUTHORIZATION, Util.basic(uri.getUserInfo())); + return builder.build(); + } + + private void checkAuth(Response response, String location) { + URI uri = URI.create(location); + if (uri.getUserInfo() == null) return; + response.header(HttpHeaders.AUTHORIZATION, Util.basic(uri.getUserInfo())); + } + + private Response deflate(Response response) { InflaterInputStream is = new InflaterInputStream(response.body().byteStream(), new Inflater(true)); return response.newBuilder().headers(response.headers()).body(new ResponseBody() { @Nullable @@ -49,20 +71,4 @@ public class DefaultInterceptor implements Interceptor { } }).build(); } - - private Request getRequest(Request request) { - URI uri = request.url().uri(); - String url = request.url().toString(); - Request.Builder builder = request.newBuilder(); - boolean local = url.contains(":" + Proxy.getPort() + "/"); - if (url.contains("+") && local) builder.url(url.replace("+", "%2B")); - if (url.contains("gitcode.net")) builder.header(HttpHeaders.USER_AGENT, Util.CHROME); - if (uri.getUserInfo() != null) builder.header(HttpHeaders.AUTHORIZATION, Util.basic(uri.getUserInfo())); - return builder.build(); - } - - private void checkAuth(Response response) { - URI uri = URI.create(response.header(HttpHeaders.LOCATION)); - if (uri.getUserInfo() != null) response.header(HttpHeaders.AUTHORIZATION, Util.basic(uri.getUserInfo())); - } -} +} \ No newline at end of file From 7c40cc1d048f44134882335fc92bda4bb74b0557 Mon Sep 17 00:00:00 2001 From: okjack Date: Thu, 15 Feb 2024 23:40:58 +0800 Subject: [PATCH 6/7] clean code --- .../fongmi/android/tv/ui/dialog/SiteDialog.java | 16 ++++------------ .../{ic_site_none.xml => ic_site_cancel.xml} | 0 .../{ic_site_all.xml => ic_site_select.xml} | 0 app/src/leanback/res/layout/dialog_site.xml | 14 +++++++------- 4 files changed, 11 insertions(+), 19 deletions(-) rename app/src/leanback/res/drawable/{ic_site_none.xml => ic_site_cancel.xml} (100%) rename app/src/leanback/res/drawable/{ic_site_all.xml => ic_site_select.xml} (100%) 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 643a2c6aa..5ae1c1e61 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 @@ -79,9 +79,9 @@ public class SiteDialog implements SiteAdapter.OnClickListener{ } private void initEvent() { - binding.all.setOnClickListener(this::setAll); - binding.none.setOnClickListener(this::setNone); binding.mode.setOnClickListener(this::setMode); + binding.select.setOnClickListener(v -> adapter.selectAll()); + binding.cancel.setOnClickListener(v -> adapter.cancelAll()); binding.search.setOnClickListener(v -> setType(v.isActivated() ? 0 : 1)); binding.change.setOnClickListener(v -> setType(v.isActivated() ? 0 : 2)); } @@ -114,19 +114,11 @@ public class SiteDialog implements SiteAdapter.OnClickListener{ private void setType(int type) { binding.search.setActivated(type == 1); binding.change.setActivated(type == 2); + binding.select.setClickable(type > 0); + binding.cancel.setClickable(type > 0); 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(); diff --git a/app/src/leanback/res/drawable/ic_site_none.xml b/app/src/leanback/res/drawable/ic_site_cancel.xml similarity index 100% rename from app/src/leanback/res/drawable/ic_site_none.xml rename to app/src/leanback/res/drawable/ic_site_cancel.xml diff --git a/app/src/leanback/res/drawable/ic_site_all.xml b/app/src/leanback/res/drawable/ic_site_select.xml similarity index 100% rename from app/src/leanback/res/drawable/ic_site_all.xml rename to app/src/leanback/res/drawable/ic_site_select.xml diff --git a/app/src/leanback/res/layout/dialog_site.xml b/app/src/leanback/res/layout/dialog_site.xml index d37a83418..b0da28dee 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/all" + android:nextFocusDown="@id/select" android:padding="8dp" android:src="@drawable/ic_site_change" app:tint="@color/text" /> + android:src="@drawable/ic_site_select" /> + android:src="@drawable/ic_site_cancel" /> Date: Fri, 16 Feb 2024 00:01:29 +0800 Subject: [PATCH 7/7] remove recordable --- app/src/main/java/com/fongmi/android/tv/bean/Live.java | 2 ++ 1 file changed, 2 insertions(+) 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 a7b2de3e5..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 @@ -45,6 +45,8 @@ public class Live { @Ignore @SerializedName("jar") private String jar; + + @Ignore @SerializedName("logo") private String logo;