From 77a795046616610655705505c3748836b384cc63 Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 21 Mar 2023 15:30:09 +0800 Subject: [PATCH] [leanback] support volume and bright slide --- .../tv/ui/activity/DetailActivity.java | 34 +++++- .../tv/ui/custom/CustomKeyDownVod.java | 100 +++++++++++++++++- .../leanback/res/layout/view_widget_vod.xml | 57 ++++++++++ .../res/drawable/ic_widget_bright_high.xml | 0 .../res/drawable/ic_widget_bright_low.xml | 0 .../res/drawable/ic_widget_bright_medium.xml | 0 .../res/drawable/ic_widget_volume_high.xml | 0 .../res/drawable/ic_widget_volume_low.xml | 0 .../res/drawable/ic_widget_volume_medium.xml | 0 9 files changed, 184 insertions(+), 7 deletions(-) rename app/src/{mobile => main}/res/drawable/ic_widget_bright_high.xml (100%) rename app/src/{mobile => main}/res/drawable/ic_widget_bright_low.xml (100%) rename app/src/{mobile => main}/res/drawable/ic_widget_bright_medium.xml (100%) rename app/src/{mobile => main}/res/drawable/ic_widget_volume_high.xml (100%) rename app/src/{mobile => main}/res/drawable/ic_widget_volume_low.xml (100%) rename app/src/{mobile => main}/res/drawable/ic_widget_volume_medium.xml (100%) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index 2cc4623e2..a6967c570 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -190,7 +190,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis @Override protected void initView() { - mKeyDown = CustomKeyDownVod.create(this); + mKeyDown = CustomKeyDownVod.create(this, mBinding.video); mFrameParams = mBinding.video.getLayoutParams(); mBinding.progressLayout.showProgress(); mPlayers = new Players().init(); @@ -458,7 +458,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis getIjk().getSubtitleView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 24); mBinding.video.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)); mBinding.flag.setSelectedPosition(mCurrent); - App.post(() -> setFullscreen(true), 250); + mKeyDown.setFull(true); + setFullscreen(true); onPlay(); } @@ -466,6 +467,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mBinding.video.setForeground(ResUtil.getDrawable(R.drawable.selector_video)); getIjk().getSubtitleView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); mBinding.video.setLayoutParams(mFrameParams); + mKeyDown.setFull(false); setFullscreen(false); hideInfo(); } @@ -979,6 +981,34 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis return super.dispatchKeyEvent(event); } + @Override + public void onBright(int progress) { + mBinding.widget.bright.setVisibility(View.VISIBLE); + mBinding.widget.brightProgress.setProgress(progress); + if (progress < 35) mBinding.widget.brightIcon.setImageResource(R.drawable.ic_widget_bright_low); + else if (progress < 70) mBinding.widget.brightIcon.setImageResource(R.drawable.ic_widget_bright_medium); + else mBinding.widget.brightIcon.setImageResource(R.drawable.ic_widget_bright_high); + } + + @Override + public void onBrightEnd() { + mBinding.widget.bright.setVisibility(View.GONE); + } + + @Override + public void onVolume(int progress) { + mBinding.widget.volume.setVisibility(View.VISIBLE); + mBinding.widget.volumeProgress.setProgress(progress); + if (progress < 35) mBinding.widget.volumeIcon.setImageResource(R.drawable.ic_widget_volume_low); + else if (progress < 70) mBinding.widget.volumeIcon.setImageResource(R.drawable.ic_widget_volume_medium); + else mBinding.widget.volumeIcon.setImageResource(R.drawable.ic_widget_volume_high); + } + + @Override + public void onVolumeEnd() { + mBinding.widget.volume.setVisibility(View.GONE); + } + @Override public void onSeeking(int time) { mBinding.widget.exoDuration.setText(mPlayers.getDurationTime()); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java index 1e91e98d2..5260afc0d 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java @@ -1,35 +1,59 @@ package com.fongmi.android.tv.ui.custom; +import android.app.Activity; import android.content.Context; +import android.media.AudioManager; import android.view.GestureDetector; import android.view.KeyEvent; import android.view.MotionEvent; +import android.view.View; +import android.view.WindowManager; import androidx.annotation.NonNull; import com.fongmi.android.tv.App; import com.fongmi.android.tv.Constant; +import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.Utils; public class CustomKeyDownVod extends GestureDetector.SimpleOnGestureListener { private final GestureDetector detector; + private final AudioManager manager; private final Listener listener; + private final Activity activity; + private final View videoView; + private boolean changeBright; + private boolean changeVolume; + private boolean touch; + private boolean full; + private float bright; + private float volume; private int holdTime; - public static CustomKeyDownVod create(Context context) { - return new CustomKeyDownVod(context); + public static CustomKeyDownVod create(Activity activity, View videoView) { + return new CustomKeyDownVod(activity, videoView); } - private CustomKeyDownVod(Context context) { - this.listener = (Listener) context; - this.detector = new GestureDetector(context, this); + private CustomKeyDownVod(Activity activity, View videoView) { + this.manager = (AudioManager) App.get().getSystemService(Context.AUDIO_SERVICE); + this.detector = new GestureDetector(activity, this); + this.listener = (Listener) activity; + this.videoView = videoView; + this.activity = activity; } public boolean onTouchEvent(MotionEvent e) { + if (!full) return false; + if (changeBright && e.getAction() == MotionEvent.ACTION_UP) listener.onBrightEnd(); + if (changeVolume && e.getAction() == MotionEvent.ACTION_UP) listener.onVolumeEnd(); return detector.onTouchEvent(e); } + public void setFull(boolean full) { + this.full = full; + } + public boolean hasEvent(KeyEvent event) { return Utils.isEnterKey(event) || Utils.isUpKey(event) || Utils.isDownKey(event) || Utils.isLeftKey(event) || Utils.isRightKey(event); } @@ -55,6 +79,27 @@ public class CustomKeyDownVod extends GestureDetector.SimpleOnGestureListener { } } + @Override + public boolean onDown(@NonNull MotionEvent e) { + if (!full) return false; + volume = manager.getStreamVolume(AudioManager.STREAM_MUSIC); + bright = activity.getWindow().getAttributes().screenBrightness; + changeBright = false; + changeVolume = false; + touch = true; + return true; + } + + @Override + public boolean onScroll(@NonNull MotionEvent e1, @NonNull MotionEvent e2, float distanceX, float distanceY) { + if (!full) return false; + float deltaY = e1.getY() - e2.getY(); + if (touch) checkFunc(distanceX, distanceY, e2); + if (changeBright) setBright(deltaY); + if (changeVolume) setVolume(deltaY); + return true; + } + @Override public boolean onDoubleTap(@NonNull MotionEvent e) { listener.onDoubleTap(); @@ -79,8 +124,53 @@ public class CustomKeyDownVod extends GestureDetector.SimpleOnGestureListener { holdTime = 0; } + private void checkFunc(float distanceX, float distanceY, MotionEvent e2) { + if (Math.abs(distanceX) < Math.abs(distanceY)) checkSide(e2); + touch = false; + } + + private void checkSide(MotionEvent e2) { + int half = ResUtil.getScreenWidthNav() / 2; + if (e2.getX() > half) { + changeVolume = true; + } else { + changeBright = true; + } + } + + private void setBright(float deltaY) { + int height = videoView.getMeasuredHeight(); + if (bright == -1.0f) bright = 0.5f; + float brightness = deltaY * 2 / height + bright; + if (brightness < 0) brightness = 0f; + if (brightness > 1.0f) brightness = 1.0f; + WindowManager.LayoutParams attributes = activity.getWindow().getAttributes(); + attributes.screenBrightness = brightness; + activity.getWindow().setAttributes(attributes); + listener.onBright((int) (brightness * 100)); + } + + private void setVolume(float deltaY) { + int height = videoView.getMeasuredHeight(); + int maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); + float deltaV = deltaY * 2 / height * maxVolume; + float index = volume + deltaV; + if (index > maxVolume) index = maxVolume; + if (index < 0) index = 0; + manager.setStreamVolume(AudioManager.STREAM_MUSIC, (int) index, 0); + listener.onVolume((int) (index / maxVolume * 100)); + } + public interface Listener { + void onBright(int progress); + + void onBrightEnd(); + + void onVolume(int progress); + + void onVolumeEnd(); + void onSeeking(int time); void onSeekTo(int time); diff --git a/app/src/leanback/res/layout/view_widget_vod.xml b/app/src/leanback/res/layout/view_widget_vod.xml index cae301f94..df4776d6f 100644 --- a/app/src/leanback/res/layout/view_widget_vod.xml +++ b/app/src/leanback/res/layout/view_widget_vod.xml @@ -1,5 +1,6 @@ @@ -161,4 +162,60 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/mobile/res/drawable/ic_widget_bright_high.xml b/app/src/main/res/drawable/ic_widget_bright_high.xml similarity index 100% rename from app/src/mobile/res/drawable/ic_widget_bright_high.xml rename to app/src/main/res/drawable/ic_widget_bright_high.xml diff --git a/app/src/mobile/res/drawable/ic_widget_bright_low.xml b/app/src/main/res/drawable/ic_widget_bright_low.xml similarity index 100% rename from app/src/mobile/res/drawable/ic_widget_bright_low.xml rename to app/src/main/res/drawable/ic_widget_bright_low.xml diff --git a/app/src/mobile/res/drawable/ic_widget_bright_medium.xml b/app/src/main/res/drawable/ic_widget_bright_medium.xml similarity index 100% rename from app/src/mobile/res/drawable/ic_widget_bright_medium.xml rename to app/src/main/res/drawable/ic_widget_bright_medium.xml diff --git a/app/src/mobile/res/drawable/ic_widget_volume_high.xml b/app/src/main/res/drawable/ic_widget_volume_high.xml similarity index 100% rename from app/src/mobile/res/drawable/ic_widget_volume_high.xml rename to app/src/main/res/drawable/ic_widget_volume_high.xml diff --git a/app/src/mobile/res/drawable/ic_widget_volume_low.xml b/app/src/main/res/drawable/ic_widget_volume_low.xml similarity index 100% rename from app/src/mobile/res/drawable/ic_widget_volume_low.xml rename to app/src/main/res/drawable/ic_widget_volume_low.xml diff --git a/app/src/mobile/res/drawable/ic_widget_volume_medium.xml b/app/src/main/res/drawable/ic_widget_volume_medium.xml similarity index 100% rename from app/src/mobile/res/drawable/ic_widget_volume_medium.xml rename to app/src/main/res/drawable/ic_widget_volume_medium.xml