diff --git a/app/schemas/com.fongmi.android.tv.db.AppDatabase/27.json b/app/schemas/com.fongmi.android.tv.db.AppDatabase/28.json similarity index 99% rename from app/schemas/com.fongmi.android.tv.db.AppDatabase/27.json rename to app/schemas/com.fongmi.android.tv.db.AppDatabase/28.json index a0ec62a33..114f6f298 100644 --- a/app/schemas/com.fongmi.android.tv.db.AppDatabase/27.json +++ b/app/schemas/com.fongmi.android.tv.db.AppDatabase/28.json @@ -1,7 +1,7 @@ { "formatVersion": 1, "database": { - "version": 27, + "version": 28, "identityHash": "d4921f6e0b243ebdcdb3a62512537b4d", "entities": [ { diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java index 267fbb2dd..88c95ad9b 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java @@ -11,25 +11,26 @@ import com.fongmi.android.tv.R; import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.databinding.ActivitySettingPlayerBinding; import com.fongmi.android.tv.impl.BufferCallback; -import com.fongmi.android.tv.impl.DanmuMaxLineCallback; +import com.fongmi.android.tv.impl.DanmuLineCallback; +import com.fongmi.android.tv.impl.DanmuSizeCallback; import com.fongmi.android.tv.impl.SubtitleCallback; import com.fongmi.android.tv.impl.UaCallback; import com.fongmi.android.tv.player.ExoUtil; import com.fongmi.android.tv.player.Players; import com.fongmi.android.tv.ui.base.BaseActivity; import com.fongmi.android.tv.ui.dialog.BufferDialog; -import com.fongmi.android.tv.ui.dialog.DanmuMaxLineDialog; +import com.fongmi.android.tv.ui.dialog.DanmuLineDialog; +import com.fongmi.android.tv.ui.dialog.DanmuSizeDialog; import com.fongmi.android.tv.ui.dialog.SubtitleDialog; import com.fongmi.android.tv.ui.dialog.UaDialog; import com.fongmi.android.tv.utils.ResUtil; -public class SettingPlayerActivity extends BaseActivity implements UaCallback, BufferCallback, SubtitleCallback, DanmuMaxLineCallback { +public class SettingPlayerActivity extends BaseActivity implements UaCallback, BufferCallback, SubtitleCallback, DanmuLineCallback, DanmuSizeCallback { private ActivitySettingPlayerBinding mBinding; - private String[] player; private String[] danmuSpeed; - private String[] danmuSize; private String[] caption; + private String[] player; private String[] http; private String[] flag; @@ -48,47 +49,45 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback, B @Override protected void initView() { - mBinding.playerText.setText((player = ResUtil.getStringArray(R.array.select_player))[Setting.getPlayer()]); + setVisible(); mBinding.uaText.setText(Setting.getUa()); mBinding.tunnelText.setText(getSwitch(Setting.isTunnel())); mBinding.bufferText.setText(String.valueOf(Setting.getBuffer())); mBinding.subtitleText.setText(String.valueOf(Setting.getSubtitle())); - mBinding.caption.setVisibility(Setting.hasCaption() ? View.VISIBLE : View.GONE); - mBinding.http.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE); - mBinding.buffer.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE); - mBinding.tunnel.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE); + mBinding.danmuSizeText.setText(String.valueOf(Setting.getDanmuSize())); + mBinding.danmuLineText.setText(String.valueOf(Setting.getDanmuLine(3))); mBinding.flagText.setText((flag = ResUtil.getStringArray(R.array.select_flag))[Setting.getFlag()]); mBinding.httpText.setText((http = ResUtil.getStringArray(R.array.select_exo_http))[Setting.getHttp()]); + mBinding.playerText.setText((player = ResUtil.getStringArray(R.array.select_player))[Setting.getPlayer()]); mBinding.captionText.setText((caption = ResUtil.getStringArray(R.array.select_caption))[Setting.isCaption() ? 1 : 0]); - mBinding.danmuMaxLineText.setText(String.valueOf(Setting.getDanmuMaxLine(3))); - mBinding.danmuSizeText.setText((danmuSize = ResUtil.getStringArray(R.array.select_danmu_size))[Setting.getDanmuSize()]); mBinding.danmuSpeedText.setText((danmuSpeed = ResUtil.getStringArray(R.array.select_danmu_speed))[Setting.getDanmuSpeed()]); } @Override protected void initEvent() { - mBinding.player.setOnClickListener(this::setPlayer); mBinding.ua.setOnClickListener(this::onUa); mBinding.http.setOnClickListener(this::setHttp); mBinding.flag.setOnClickListener(this::setFlag); mBinding.buffer.setOnClickListener(this::onBuffer); + mBinding.player.setOnClickListener(this::setPlayer); mBinding.tunnel.setOnClickListener(this::setTunnel); mBinding.caption.setOnClickListener(this::setCaption); mBinding.subtitle.setOnClickListener(this::onSubtitle); mBinding.caption.setOnLongClickListener(this::onCaption); + mBinding.danmuSize.setOnClickListener(this::onDanmuSize); + mBinding.danmuLine.setOnClickListener(this::onDanmuLine); mBinding.danmuSpeed.setOnClickListener(this::setDanmuSpeed); - mBinding.danmuSize.setOnClickListener(this::setDanmuSize); - mBinding.danmuMaxLine.setOnClickListener(this::onDanmuMaxLine); } - private void onUa(View view) { - UaDialog.create(this).show(); + private void setVisible() { + mBinding.caption.setVisibility(Setting.hasCaption() ? View.VISIBLE : View.GONE); + mBinding.http.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE); + mBinding.buffer.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE); + mBinding.tunnel.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE); } - private void setPlayer(View view) { - int index = Setting.getPlayer(); - Setting.putPlayer(index = index == player.length - 1 ? 0 : ++index); - mBinding.playerText.setText(player[index]); + private void onUa(View view) { + UaDialog.create(this).show(); } @Override @@ -120,6 +119,13 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback, B Setting.putBuffer(times); } + private void setPlayer(View view) { + int index = Setting.getPlayer(); + Setting.putPlayer(index = index == player.length - 1 ? 0 : ++index); + mBinding.playerText.setText(player[index]); + setVisible(); + } + private void setTunnel(View view) { Setting.putTunnel(!Setting.isTunnel()); mBinding.tunnelText.setText(getSwitch(Setting.isTunnel())); @@ -144,26 +150,29 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback, B mBinding.subtitleText.setText(String.valueOf(size)); } - public void setDanmuSpeed(View view) { - int index = Setting.getDanmuSpeed(); - Setting.putDanmuSpeed(index = index == danmuSpeed.length - 1 ? 0 : ++index); - mBinding.danmuSpeedText.setText(danmuSpeed[index]); + public void onDanmuSize(View view) { + DanmuSizeDialog.create(this).show(); } - public void setDanmuSize(View view) { - int index = Setting.getDanmuSize(); - Setting.putDanmuSize(index = index == danmuSize.length - 1 ? 0 : ++index); - mBinding.danmuSizeText.setText(danmuSize[index]); + @Override + public void setDanmuSize(float size) { + mBinding.danmuSizeText.setText(String.valueOf(size)); + Setting.putDanmuSize(size); } - public void onDanmuMaxLine(View view) { - DanmuMaxLineDialog.create(this).show(); + public void onDanmuLine(View view) { + DanmuLineDialog.create(this).show(); } @Override - public void setDanmuMaxLine(int maxLine) { - mBinding.danmuMaxLineText.setText(String.valueOf(maxLine)); - Setting.putDanmuMaxLine(maxLine); + public void setDanmuLine(int line) { + mBinding.danmuLineText.setText(String.valueOf(line)); + Setting.putDanmuLine(line); } + public void setDanmuSpeed(View view) { + int index = Setting.getDanmuSpeed(); + Setting.putDanmuSpeed(index = index == danmuSpeed.length - 1 ? 0 : ++index); + mBinding.danmuSpeedText.setText(danmuSpeed[index]); + } } 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 25b55dbe8..8039e0164 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 @@ -399,11 +399,11 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } private void setDanmuView() { + int maxLine = Setting.getDanmuLine(3); mPlayers.setDanmuView(mBinding.danmaku); HashMap maxLines = new HashMap<>(); float scrollSpeedFactor = 1.6f - (Setting.getDanmuSpeed() * 0.2f); scrollSpeedFactor = scrollSpeedFactor < 0 ? 1.2f : scrollSpeedFactor; - int maxLine = Setting.getDanmuMaxLine(3); maxLines.put(BaseDanmaku.TYPE_FIX_TOP, maxLine); maxLines.put(BaseDanmaku.TYPE_SCROLL_RL, maxLine); maxLines.put(BaseDanmaku.TYPE_SCROLL_LR, maxLine); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/DanmuMaxLineDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/DanmuLineDialog.java similarity index 60% rename from app/src/leanback/java/com/fongmi/android/tv/ui/dialog/DanmuMaxLineDialog.java rename to app/src/leanback/java/com/fongmi/android/tv/ui/dialog/DanmuLineDialog.java index 9aa37ebcb..e951a03d1 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/DanmuMaxLineDialog.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/DanmuLineDialog.java @@ -6,24 +6,24 @@ import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentActivity; import com.fongmi.android.tv.Setting; -import com.fongmi.android.tv.databinding.DialogDanmuMaxlineBinding; -import com.fongmi.android.tv.impl.DanmuMaxLineCallback; +import com.fongmi.android.tv.databinding.DialogDanmuLineBinding; +import com.fongmi.android.tv.impl.DanmuLineCallback; import com.fongmi.android.tv.utils.KeyUtil; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -public class DanmuMaxLineDialog { +public class DanmuLineDialog { - private final DialogDanmuMaxlineBinding binding; - private final DanmuMaxLineCallback callback; + private final DialogDanmuLineBinding binding; + private final DanmuLineCallback callback; private final AlertDialog dialog; - public static DanmuMaxLineDialog create(FragmentActivity activity) { - return new DanmuMaxLineDialog(activity); + public static DanmuLineDialog create(FragmentActivity activity) { + return new DanmuLineDialog(activity); } - public DanmuMaxLineDialog(FragmentActivity activity) { - this.callback = (DanmuMaxLineCallback) activity; - this.binding = DialogDanmuMaxlineBinding.inflate(LayoutInflater.from(activity)); + public DanmuLineDialog(FragmentActivity activity) { + this.callback = (DanmuLineCallback) activity; + this.binding = DialogDanmuLineBinding.inflate(LayoutInflater.from(activity)); this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).create(); } @@ -39,11 +39,11 @@ public class DanmuMaxLineDialog { } private void initView() { - binding.slider.setValue(Setting.getDanmuMaxLine(3)); + binding.slider.setValue(Setting.getDanmuLine(3)); } private void initEvent() { - binding.slider.addOnChangeListener((slider, value, fromUser) -> callback.setDanmuMaxLine((int) value)); + binding.slider.addOnChangeListener((slider, value, fromUser) -> callback.setDanmuLine((int) value)); binding.slider.setOnKeyListener((view, keyCode, event) -> { boolean enter = KeyUtil.isEnterKey(event); if (enter) dialog.dismiss(); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/DanmuSizeDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/DanmuSizeDialog.java new file mode 100644 index 000000000..0e0ed1e60 --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/DanmuSizeDialog.java @@ -0,0 +1,53 @@ +package com.fongmi.android.tv.ui.dialog; + +import android.view.LayoutInflater; + +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.FragmentActivity; + +import com.fongmi.android.tv.Setting; +import com.fongmi.android.tv.databinding.DialogDanmuSizeBinding; +import com.fongmi.android.tv.impl.DanmuSizeCallback; +import com.fongmi.android.tv.utils.KeyUtil; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +public class DanmuSizeDialog { + + private final DialogDanmuSizeBinding binding; + private final DanmuSizeCallback callback; + private final AlertDialog dialog; + + public static DanmuSizeDialog create(FragmentActivity activity) { + return new DanmuSizeDialog(activity); + } + + public DanmuSizeDialog(FragmentActivity activity) { + this.callback = (DanmuSizeCallback) activity; + this.binding = DialogDanmuSizeBinding.inflate(LayoutInflater.from(activity)); + this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).create(); + } + + public void show() { + initDialog(); + initView(); + initEvent(); + } + + private void initDialog() { + dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); + dialog.show(); + } + + private void initView() { + binding.slider.setValue(Setting.getDanmuSize()); + } + + private void initEvent() { + binding.slider.addOnChangeListener((slider, value, fromUser) -> callback.setDanmuSize((float) (Math.round(value * 100.0) / 100.0))); + binding.slider.setOnKeyListener((view, keyCode, event) -> { + boolean enter = KeyUtil.isEnterKey(event); + if (enter) dialog.dismiss(); + return enter; + }); + } +} diff --git a/app/src/leanback/res/layout/activity_setting_player.xml b/app/src/leanback/res/layout/activity_setting_player.xml index 65daeff72..808a8b9db 100644 --- a/app/src/leanback/res/layout/activity_setting_player.xml +++ b/app/src/leanback/res/layout/activity_setting_player.xml @@ -23,22 +23,18 @@ android:orientation="horizontal"> @@ -166,7 +162,7 @@ + tools:text="慢" /> + tools:text="1" /> + + + tools:text="關" /> + tools:text="OkHttp" /> - + + \ No newline at end of file diff --git a/app/src/leanback/res/layout/dialog_danmu_maxline.xml b/app/src/leanback/res/layout/dialog_danmu_line.xml similarity index 100% rename from app/src/leanback/res/layout/dialog_danmu_maxline.xml rename to app/src/leanback/res/layout/dialog_danmu_line.xml diff --git a/app/src/leanback/res/layout/dialog_danmu_size.xml b/app/src/leanback/res/layout/dialog_danmu_size.xml new file mode 100644 index 000000000..a214a1de9 --- /dev/null +++ b/app/src/leanback/res/layout/dialog_danmu_size.xml @@ -0,0 +1,19 @@ + + + + + + \ 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 0978f1dce..205e68941 100644 --- a/app/src/main/java/com/fongmi/android/tv/Setting.java +++ b/app/src/main/java/com/fongmi/android/tv/Setting.java @@ -146,7 +146,7 @@ public class Setting { } public static int getSubtitle() { - return Math.max(Prefers.getInt("subtitle", 16), 14); + return Math.min(Math.max(Prefers.getInt("subtitle", 16), 14), 48); } public static void putSubtitle(int subtitle) { @@ -241,14 +241,6 @@ public class Setting { Prefers.put("danmu", danmu); } - public static int getDanmuMaxLine(int defaultValue) { - return Prefers.getInt("danmu_maxline", defaultValue); - } - - public static void putDanmuMaxLine(int maxline) { - Prefers.put("danmu_maxline", maxline); - } - public static int getDanmuSpeed() { return Prefers.getInt("danmu_speed", 2); } @@ -257,14 +249,22 @@ public class Setting { Prefers.put("danmu_speed", speed); } - public static int getDanmuSize() { - return Prefers.getInt("danmu_size", 0); + public static float getDanmuSize() { + return Math.min(Math.max(Prefers.getFloat("danmu_size"), 1.0f), 2.0f); } - public static void putDanmuSize(int size) { + public static void putDanmuSize(float size) { Prefers.put("danmu_size", size); } + public static int getDanmuLine(int line) { + return Math.min(Math.max(Prefers.getInt("danmu_line"), line), 15); + } + + public static void putDanmuLine(int line) { + Prefers.put("danmu_line", line); + } + public static boolean isCaption() { return Prefers.getBoolean("caption"); } 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 034021c6a..d3fae5f28 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 = 27; + public static final int VERSION = 28; public static final String NAME = "tv"; public static final String SYMBOL = "@@@"; @@ -89,26 +89,7 @@ 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) - .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).allowMainThreadQueries().fallbackToDestructiveMigration().build(); } public abstract KeepDao getKeepDao(); @@ -246,4 +227,11 @@ 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"); + } + }; } diff --git a/app/src/main/java/com/fongmi/android/tv/impl/DanmuLineCallback.java b/app/src/main/java/com/fongmi/android/tv/impl/DanmuLineCallback.java new file mode 100644 index 000000000..1c6c54b80 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/impl/DanmuLineCallback.java @@ -0,0 +1,6 @@ +package com.fongmi.android.tv.impl; + +public interface DanmuLineCallback { + + void setDanmuLine(int line); +} diff --git a/app/src/main/java/com/fongmi/android/tv/impl/DanmuMaxLineCallback.java b/app/src/main/java/com/fongmi/android/tv/impl/DanmuMaxLineCallback.java deleted file mode 100644 index 7cf238045..000000000 --- a/app/src/main/java/com/fongmi/android/tv/impl/DanmuMaxLineCallback.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.fongmi.android.tv.impl; - -public interface DanmuMaxLineCallback { - - void setDanmuMaxLine(int maxLine); -} diff --git a/app/src/main/java/com/fongmi/android/tv/impl/DanmuSizeCallback.java b/app/src/main/java/com/fongmi/android/tv/impl/DanmuSizeCallback.java new file mode 100644 index 000000000..d47346f8a --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/impl/DanmuSizeCallback.java @@ -0,0 +1,6 @@ +package com.fongmi.android.tv.impl; + +public interface DanmuSizeCallback { + + void setDanmuSize(float size); +} diff --git a/app/src/main/java/com/fongmi/android/tv/player/Players.java b/app/src/main/java/com/fongmi/android/tv/player/Players.java index 23465145f..42269d7a7 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/Players.java +++ b/app/src/main/java/com/fongmi/android/tv/player/Players.java @@ -662,11 +662,9 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic public void prepared() { App.post(() -> { if (danmuView == null) return; - if (isPlaying() && danmuView.isPrepared()) { - danmuView.start(getPosition()); - if (Setting.isDanmu()) danmuView.show(); - else danmuView.hide(); - } + if (isPlaying() && danmuView.isPrepared()) danmuView.start(getPosition()); + if (Setting.isDanmu()) danmuView.show(); + else danmuView.hide(); }); } @@ -677,12 +675,9 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic @Override public void danmakuShown(BaseDanmaku danmaku) { - } @Override public void drawingFinished() { - } - } diff --git a/app/src/main/java/com/fongmi/android/tv/player/danmu/Parser.java b/app/src/main/java/com/fongmi/android/tv/player/danmu/Parser.java index 12a121f3d..aed29abc0 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/danmu/Parser.java +++ b/app/src/main/java/com/fongmi/android/tv/player/danmu/Parser.java @@ -25,15 +25,15 @@ import master.flame.danmaku.danmaku.util.DanmakuUtils; public class Parser extends BaseDanmakuParser { private final Danmu danmu; + private final float dSize; private BaseDanmaku item; private float scaleX; private float scaleY; private int index; - private float danmuSizeTimes; public Parser(String path) { this.danmu = Danmu.fromXml(getContent(path)); - this.danmuSizeTimes = 1.0f + (Setting.getDanmuSize() * 0.2f); + this.dSize = Setting.getDanmuSize(); } private String getContent(String path) { @@ -73,7 +73,7 @@ public class Parser extends BaseDanmakuParser { item = mContext.mDanmakuFactory.createDanmaku(type, mContext); item.setTime(time); item.setTimer(mTimer); - item.textSize = size * danmuSizeTimes; + item.textSize = size * dSize; item.textColor = color; item.textShadowColor = color <= Color.BLACK ? Color.WHITE : Color.BLACK; item.flags = mContext.mGlobalFlagValues; diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 30303cfd7..1b8ffe7b3 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -74,15 +74,15 @@ 字幕样式 字幕大小 后台播放 + 弹幕大小 + 弹幕速度 + 弹幕行数 解码方式 渲染方式 缩放比例 图片品质 图片尺寸 DoH - 弹幕速度 - 弹幕大小 - 弹幕最大行数 Proxy 缓存 备份 @@ -133,6 +133,7 @@ 全部 + 软解 @@ -153,15 +154,6 @@ 超快 - - 1倍 - 1.2倍 - 1.4倍 - 1.6倍 - 1.8倍 - 2.0倍 - - diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d8beea87e..5b4360b5d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -74,15 +74,15 @@ 字幕樣式 字幕大小 背景播放 + 彈幕大小 + 彈幕速度 + 彈幕行數 解碼方式 渲染方式 縮放比例 圖片品質 圖片尺寸 DoH - 弹幕速度 - 弹幕大小 - 弹幕最大行數 Proxy 暫存 備份 @@ -133,6 +133,7 @@ 全部 + 軟解 @@ -153,15 +154,6 @@ 超快 - - 1倍 - 1.2倍 - 1.4倍 - 1.6倍 - 1.8倍 - 2.0倍 - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 25d8decf3..1462617cf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -74,15 +74,15 @@ Caption style Subtitle size Background play + Danmu size + Danmu speed + Danmu line Decode Render Scale Image quality Image size DoH - Bullet Speed - Bullet Size - Bullet Max Line Proxy Cache Backup @@ -133,6 +133,7 @@ All times + lines Soft @@ -153,15 +154,6 @@ Super Fast - - 1 times - 1.2 times - 1.4 times - 1.6 times - 1.8 times - 2.0 times - - Surface Texture 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 c6f183769..1c23499c0 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 @@ -412,11 +412,11 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo } private void setDanmuView() { + int maxLine = Setting.getDanmuLine(2); mPlayers.setDanmuView(mBinding.danmaku); HashMap maxLines = new HashMap<>(); float scrollSpeedFactor = 1.6f - (Setting.getDanmuSpeed() * 0.2f); scrollSpeedFactor = scrollSpeedFactor < 0 ? 1.2f : scrollSpeedFactor; - int maxLine = Setting.getDanmuMaxLine(2); maxLines.put(BaseDanmaku.TYPE_FIX_TOP, maxLine); maxLines.put(BaseDanmaku.TYPE_SCROLL_RL, maxLine); maxLines.put(BaseDanmaku.TYPE_SCROLL_LR, maxLine); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/DanmuLineDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/DanmuLineDialog.java new file mode 100644 index 000000000..be1ee0d06 --- /dev/null +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/DanmuLineDialog.java @@ -0,0 +1,54 @@ +package com.fongmi.android.tv.ui.dialog; + +import android.content.DialogInterface; +import android.view.LayoutInflater; + +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.Fragment; + +import com.fongmi.android.tv.R; +import com.fongmi.android.tv.Setting; +import com.fongmi.android.tv.databinding.DialogDanmuLineBinding; +import com.fongmi.android.tv.impl.DanmuLineCallback; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +public class DanmuLineDialog { + + private final DialogDanmuLineBinding binding; + private final DanmuLineCallback callback; + private int value; + + public static DanmuLineDialog create(Fragment fragment) { + return new DanmuLineDialog(fragment); + } + + public DanmuLineDialog(Fragment fragment) { + this.callback = (DanmuLineCallback) fragment; + this.binding = DialogDanmuLineBinding.inflate(LayoutInflater.from(fragment.getContext())); + } + + public void show() { + initDialog(); + initView(); + } + + private void initDialog() { + AlertDialog dialog = new MaterialAlertDialogBuilder(binding.getRoot().getContext()).setTitle(R.string.setting_danmu_line).setView(binding.getRoot()).setPositiveButton(R.string.dialog_positive, this::onPositive).setNegativeButton(R.string.dialog_negative, this::onNegative).create(); + dialog.getWindow().setDimAmount(0); + dialog.show(); + } + + private void initView() { + binding.slider.setValue(value = Setting.getDanmuLine(2)); + } + + private void onPositive(DialogInterface dialog, int which) { + callback.setDanmuLine((int) binding.slider.getValue()); + dialog.dismiss(); + } + + private void onNegative(DialogInterface dialog, int which) { + callback.setDanmuLine(value); + dialog.dismiss(); + } +} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/DanmuMaxLineDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/DanmuMaxLineDialog.java deleted file mode 100644 index b88515132..000000000 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/DanmuMaxLineDialog.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.fongmi.android.tv.ui.dialog; - -import android.content.DialogInterface; -import android.view.LayoutInflater; - -import androidx.appcompat.app.AlertDialog; -import androidx.fragment.app.Fragment; - -import com.fongmi.android.tv.R; -import com.fongmi.android.tv.Setting; -import com.fongmi.android.tv.databinding.DialogDanmuMaxlineBinding; -import com.fongmi.android.tv.impl.DanmuMaxLineCallback; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; - -public class DanmuMaxLineDialog { - - private final DialogDanmuMaxlineBinding binding; - private final DanmuMaxLineCallback callback; - private int value; - - public static DanmuMaxLineDialog create(Fragment fragment) { - return new DanmuMaxLineDialog(fragment); - } - - public DanmuMaxLineDialog(Fragment fragment) { - this.callback = (DanmuMaxLineCallback) fragment; - this.binding = DialogDanmuMaxlineBinding.inflate(LayoutInflater.from(fragment.getContext())); - } - - public void show() { - initDialog(); - initView(); - } - - private void initDialog() { - AlertDialog dialog = new MaterialAlertDialogBuilder(binding.getRoot().getContext()).setTitle(R.string.setting_danmu_maxline).setView(binding.getRoot()).setPositiveButton(R.string.dialog_positive, this::onPositive).setNegativeButton(R.string.dialog_negative, this::onNegative).create(); - dialog.getWindow().setDimAmount(0); - dialog.show(); - } - - private void initView() { - binding.slider.setValue(value = Setting.getDanmuMaxLine(2)); - } - - private void onPositive(DialogInterface dialog, int which) { - callback.setDanmuMaxLine((int) binding.slider.getValue()); - dialog.dismiss(); - } - - private void onNegative(DialogInterface dialog, int which) { - callback.setDanmuMaxLine(value); - dialog.dismiss(); - } -} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/DanmuSizeDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/DanmuSizeDialog.java new file mode 100644 index 000000000..2a1fa84cc --- /dev/null +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/DanmuSizeDialog.java @@ -0,0 +1,54 @@ +package com.fongmi.android.tv.ui.dialog; + +import android.content.DialogInterface; +import android.view.LayoutInflater; + +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.Fragment; + +import com.fongmi.android.tv.R; +import com.fongmi.android.tv.Setting; +import com.fongmi.android.tv.databinding.DialogDanmuSizeBinding; +import com.fongmi.android.tv.impl.DanmuSizeCallback; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +public class DanmuSizeDialog { + + private final DialogDanmuSizeBinding binding; + private final DanmuSizeCallback callback; + private float value; + + public static DanmuSizeDialog create(Fragment fragment) { + return new DanmuSizeDialog(fragment); + } + + public DanmuSizeDialog(Fragment fragment) { + this.callback = (DanmuSizeCallback) fragment; + this.binding = DialogDanmuSizeBinding.inflate(LayoutInflater.from(fragment.getContext())); + } + + public void show() { + initDialog(); + initView(); + } + + private void initDialog() { + AlertDialog dialog = new MaterialAlertDialogBuilder(binding.getRoot().getContext()).setTitle(R.string.setting_danmu_speed).setView(binding.getRoot()).setPositiveButton(R.string.dialog_positive, this::onPositive).setNegativeButton(R.string.dialog_negative, this::onNegative).create(); + dialog.getWindow().setDimAmount(0); + dialog.show(); + } + + private void initView() { + binding.slider.setValue(value = Setting.getDanmuSize()); + } + + private void onPositive(DialogInterface dialog, int which) { + callback.setDanmuSize(binding.slider.getValue()); + dialog.dismiss(); + } + + private void onNegative(DialogInterface dialog, int which) { + callback.setDanmuSize(value); + dialog.dismiss(); + } +} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java index 7da37b783..66706337d 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java @@ -128,7 +128,6 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit mBinding.vodHistory.setOnClickListener(this::onVodHistory); mBinding.version.setOnLongClickListener(this::onVersionDev); mBinding.liveHistory.setOnClickListener(this::onLiveHistory); - mBinding.player.setOnLongClickListener(this::onPlayerSetting); mBinding.wallDefault.setOnClickListener(this::setWallDefault); mBinding.wallRefresh.setOnClickListener(this::setWallRefresh); mBinding.player.setOnClickListener(this::onPlayerSetting); @@ -266,9 +265,8 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit HistoryDialog.create(this).type(type = 1).show(); } - private boolean onPlayerSetting(View view) { + private void onPlayerSetting(View view) { getRoot().change(2); - return true; } private void onVersion(View view) { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java index f36c95ce8..456791564 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java @@ -14,27 +14,28 @@ import com.fongmi.android.tv.R; import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.databinding.FragmentSettingPlayerBinding; import com.fongmi.android.tv.impl.BufferCallback; -import com.fongmi.android.tv.impl.DanmuMaxLineCallback; +import com.fongmi.android.tv.impl.DanmuLineCallback; +import com.fongmi.android.tv.impl.DanmuSizeCallback; import com.fongmi.android.tv.impl.SubtitleCallback; import com.fongmi.android.tv.impl.UaCallback; import com.fongmi.android.tv.player.ExoUtil; import com.fongmi.android.tv.player.Players; import com.fongmi.android.tv.ui.base.BaseFragment; import com.fongmi.android.tv.ui.dialog.BufferDialog; -import com.fongmi.android.tv.ui.dialog.DanmuMaxLineDialog; +import com.fongmi.android.tv.ui.dialog.DanmuLineDialog; +import com.fongmi.android.tv.ui.dialog.DanmuSizeDialog; import com.fongmi.android.tv.ui.dialog.SubtitleDialog; import com.fongmi.android.tv.ui.dialog.UaDialog; import com.fongmi.android.tv.utils.ResUtil; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -public class SettingPlayerFragment extends BaseFragment implements UaCallback, BufferCallback, SubtitleCallback, DanmuMaxLineCallback { +public class SettingPlayerFragment extends BaseFragment implements UaCallback, BufferCallback, SubtitleCallback, DanmuLineCallback, DanmuSizeCallback { private FragmentSettingPlayerBinding mBinding; - private String[] player; private String[] danmuSpeed; - private String[] danmuSize; private String[] background; private String[] caption; + private String[] player; private String[] http; private String[] flag; @@ -53,37 +54,37 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, B @Override protected void initView() { - mBinding.playerText.setText((player = ResUtil.getStringArray(R.array.select_player))[Setting.getPlayer()]); + setVisible(); mBinding.uaText.setText(Setting.getUa()); mBinding.tunnelText.setText(getSwitch(Setting.isTunnel())); mBinding.captionText.setText(getSwitch(Setting.isCaption())); mBinding.bufferText.setText(String.valueOf(Setting.getBuffer())); mBinding.subtitleText.setText(String.valueOf(Setting.getSubtitle())); + mBinding.danmuSizeText.setText(String.valueOf(Setting.getDanmuSize())); + mBinding.danmuLineText.setText(String.valueOf(Setting.getDanmuLine(2))); mBinding.flagText.setText((flag = ResUtil.getStringArray(R.array.select_flag))[Setting.getFlag()]); mBinding.httpText.setText((http = ResUtil.getStringArray(R.array.select_exo_http))[Setting.getHttp()]); + mBinding.playerText.setText((player = ResUtil.getStringArray(R.array.select_player))[Setting.getPlayer()]); mBinding.captionText.setText((caption = ResUtil.getStringArray(R.array.select_caption))[Setting.isCaption() ? 1 : 0]); mBinding.backgroundText.setText((background = ResUtil.getStringArray(R.array.select_background))[Setting.getBackground()]); - mBinding.danmuMaxLineText.setText(String.valueOf(Setting.getDanmuMaxLine(2))); - mBinding.danmuSizeText.setText((danmuSize = ResUtil.getStringArray(R.array.select_danmu_size))[Setting.getDanmuSize()]); mBinding.danmuSpeedText.setText((danmuSpeed = ResUtil.getStringArray(R.array.select_danmu_speed))[Setting.getDanmuSpeed()]); - setVisible(); } @Override protected void initEvent() { - mBinding.player.setOnClickListener(this::setPlayer); mBinding.ua.setOnClickListener(this::onUa); mBinding.http.setOnClickListener(this::setHttp); mBinding.flag.setOnClickListener(this::setFlag); mBinding.buffer.setOnClickListener(this::onBuffer); + mBinding.player.setOnClickListener(this::setPlayer); mBinding.tunnel.setOnClickListener(this::setTunnel); mBinding.caption.setOnClickListener(this::setCaption); mBinding.subtitle.setOnClickListener(this::onSubtitle); mBinding.caption.setOnLongClickListener(this::onCaption); + mBinding.danmuSize.setOnClickListener(this::onDanmuSize); + mBinding.danmuLine.setOnClickListener(this::onDanmuLine); + mBinding.danmuSpeed.setOnClickListener(this::onDanmuSpeed); mBinding.background.setOnClickListener(this::setBackground); - mBinding.danmuSpeed.setOnClickListener(this::setDanmuSpeed); - mBinding.danmuSize.setOnClickListener(this::setDanmuSize); - mBinding.danmuMaxLine.setOnClickListener(this::onDanmuMaxLine); } private void setVisible() { @@ -97,12 +98,6 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, B UaDialog.create(this).show(); } - private void setPlayer(View view) { - int index = Setting.getPlayer(); - Setting.putPlayer(index = index == player.length - 1 ? 0 : ++index); - mBinding.playerText.setText(player[index]); - } - @Override public void setUa(String ua) { mBinding.uaText.setText(ua); @@ -132,6 +127,13 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, B Setting.putBuffer(times); } + private void setPlayer(View view) { + int index = Setting.getPlayer(); + Setting.putPlayer(index = index == player.length - 1 ? 0 : ++index); + mBinding.playerText.setText(player[index]); + setVisible(); + } + private void setTunnel(View view) { Setting.putTunnel(!Setting.isTunnel()); mBinding.tunnelText.setText(getSwitch(Setting.isTunnel())); @@ -156,39 +158,44 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, B mBinding.subtitleText.setText(String.valueOf(size)); } - private void setBackground(View view) { - new MaterialAlertDialogBuilder(getActivity()).setTitle(R.string.setting_player_background).setNegativeButton(R.string.dialog_negative, null).setSingleChoiceItems(background, Setting.getBackground(), (dialog, which) -> { - mBinding.backgroundText.setText(background[which]); - Setting.putBackground(which); - dialog.dismiss(); - }).show(); + public void onDanmuSize(View view) { + DanmuSizeDialog.create(this).show(); } @Override - public void onHiddenChanged(boolean hidden) { - if (!hidden) setVisible(); + public void setDanmuSize(float size) { + mBinding.danmuSizeText.setText(String.valueOf(size)); + Setting.putDanmuSize(size); } - public void setDanmuSpeed(View view) { - int index = Setting.getDanmuSpeed(); - Setting.putDanmuSpeed(index = index == danmuSpeed.length - 1 ? 0 : ++index); - mBinding.danmuSpeedText.setText(danmuSpeed[index]); + public void onDanmuLine(View view) { + DanmuLineDialog.create(this).show(); } - public void setDanmuSize(View view) { - int index = Setting.getDanmuSize(); - Setting.putDanmuSize(index = index == danmuSize.length - 1 ? 0 : ++index); - mBinding.danmuSizeText.setText(danmuSize[index]); + @Override + public void setDanmuLine(int line) { + mBinding.danmuLineText.setText(String.valueOf(line)); + Setting.putDanmuLine(line); } - public void onDanmuMaxLine(View view) { - DanmuMaxLineDialog.create(this).show(); + public void onDanmuSpeed(View view) { + new MaterialAlertDialogBuilder(getActivity()).setTitle(R.string.setting_danmu_speed).setNegativeButton(R.string.dialog_negative, null).setSingleChoiceItems(danmuSpeed, Setting.getDanmuSpeed(), (dialog, which) -> { + mBinding.danmuSpeedText.setText(danmuSpeed[which]); + Setting.putDanmuSpeed(which); + dialog.dismiss(); + }).show(); } - @Override - public void setDanmuMaxLine(int maxLine) { - mBinding.danmuMaxLineText.setText(String.valueOf(maxLine)); - Setting.putDanmuMaxLine(maxLine); + private void setBackground(View view) { + new MaterialAlertDialogBuilder(getActivity()).setTitle(R.string.setting_player_background).setNegativeButton(R.string.dialog_negative, null).setSingleChoiceItems(background, Setting.getBackground(), (dialog, which) -> { + mBinding.backgroundText.setText(background[which]); + Setting.putBackground(which); + dialog.dismiss(); + }).show(); } + @Override + public void onHiddenChanged(boolean hidden) { + if (!hidden) setVisible(); + } } diff --git a/app/src/mobile/res/layout/dialog_danmu_maxline.xml b/app/src/mobile/res/layout/dialog_danmu_line.xml similarity index 100% rename from app/src/mobile/res/layout/dialog_danmu_maxline.xml rename to app/src/mobile/res/layout/dialog_danmu_line.xml diff --git a/app/src/mobile/res/layout/dialog_danmu_size.xml b/app/src/mobile/res/layout/dialog_danmu_size.xml new file mode 100644 index 000000000..bfb7ca58c --- /dev/null +++ b/app/src/mobile/res/layout/dialog_danmu_size.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/app/src/mobile/res/layout/fragment_setting_player.xml b/app/src/mobile/res/layout/fragment_setting_player.xml index 1ba5f6f55..655e3bb27 100644 --- a/app/src/mobile/res/layout/fragment_setting_player.xml +++ b/app/src/mobile/res/layout/fragment_setting_player.xml @@ -216,7 +216,7 @@ + tools:text="慢" /> + tools:text="1" /> + + + tools:text="關" /> + tools:text="OkHttp" /> + + 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 8e0bad16c..faaf890d1 100644 --- a/catvod/src/main/java/com/github/catvod/utils/Prefers.java +++ b/catvod/src/main/java/com/github/catvod/utils/Prefers.java @@ -47,6 +47,14 @@ public class Prefers { return getPrefers().getInt(key, defaultValue); } + public static float getFloat(String key) { + return getFloat(key, 0); + } + + public static float getFloat(String key, float defaultValue) { + return getPrefers().getFloat(key, defaultValue); + } + public static boolean getBoolean(String key) { return getBoolean(key, false); }