From 18e279a226dfbddea78825694b12012ee45488a3 Mon Sep 17 00:00:00 2001 From: Sergio Villar Senin Date: Tue, 27 Feb 2024 19:06:08 +0100 Subject: [PATCH] [VisionGlass] Add Media Playback controls to Phone UI Media controls were added to the phone UI using the newly added PlatformActivityPlugin architecture. The media playback controls are only shown whenever the web engine detects that a media element is present and hidden as soon as the media element is gone. The controls include play/pause button, mute button, fast forward and fast backward buttons and a progress seekbar. There are some caveats though caused by limitations of the GeckoView API, for example progress information is only issued for fullscreen media. --- .../igalia/wolvic/PlatformActivityPlugin.java | 1 + .../com/igalia/wolvic/VRBrowserActivity.java | 4 + .../main/res/layout/visionglass_layout.xml | 56 +++++++++++ .../com/igalia/wolvic/PlatformActivity.java | 95 +++++++++++++++++++ 4 files changed, 156 insertions(+) diff --git a/app/src/common/shared/com/igalia/wolvic/PlatformActivityPlugin.java b/app/src/common/shared/com/igalia/wolvic/PlatformActivityPlugin.java index 8e6ab79cae..bad5291d8c 100644 --- a/app/src/common/shared/com/igalia/wolvic/PlatformActivityPlugin.java +++ b/app/src/common/shared/com/igalia/wolvic/PlatformActivityPlugin.java @@ -2,4 +2,5 @@ public interface PlatformActivityPlugin { void onKeyboardVisibilityChange(boolean isVisible); + void onVideoAvailabilityChange(); } diff --git a/app/src/common/shared/com/igalia/wolvic/VRBrowserActivity.java b/app/src/common/shared/com/igalia/wolvic/VRBrowserActivity.java index 9db705dcd9..8e55333cb3 100644 --- a/app/src/common/shared/com/igalia/wolvic/VRBrowserActivity.java +++ b/app/src/common/shared/com/igalia/wolvic/VRBrowserActivity.java @@ -440,6 +440,10 @@ public void onWindowVideoAvailabilityChanged(@NonNull WindowWidget aWindow) { WidgetManagerDelegate.CPU_LEVEL_NORMAL; queueRunnable(() -> setCPULevelNative(cpuLevel)); + + if (mPlatformPlugin != null) { + mPlatformPlugin.onVideoAvailabilityChange(); + } } }); diff --git a/app/src/main/res/layout/visionglass_layout.xml b/app/src/main/res/layout/visionglass_layout.xml index 0d9263c716..9779d62045 100644 --- a/app/src/main/res/layout/visionglass_layout.xml +++ b/app/src/main/res/layout/visionglass_layout.xml @@ -1,5 +1,6 @@ @@ -47,6 +48,61 @@ android:layout_marginTop="10dp" android:layout_marginBottom="10dp"/> + + + + + + + + + + + + + + + + + + + { @@ -441,11 +486,61 @@ private void setupPhoneUI() { mDelegate.setHeadLockEnabled(headlockButton.isChecked()); }); + findViewById(R.id.phoneUIPlayButton).setOnClickListener(v -> { + Media media = getActiveMedia(); + if (media == null) + return; + if (media.isPlaying()) { + media.pause(); + } else { + media.play(); + } + }); + + findViewById(R.id.phoneUISeekBackward10Button).setOnClickListener(v -> { + Media media = getActiveMedia(); + if (media == null) + return; + media.seek(media.getCurrentTime() - 10); + }); + + findViewById(R.id.phoneUISeekForward30Button).setOnClickListener(v -> { + Media media = getActiveMedia(); + if (media == null) + return; + media.seek(media.getCurrentTime() + 30); + }); + findViewById(R.id.phoneUIVoiceButton).setOnClickListener(v -> { // Delegate all the voice input handling in the KeyboardWidget which already handles // all the potential voice input cases. mDelegate.getKeyboard().simulateVoiceButtonClick(); }); + + findViewById(R.id.phoneUIMuteButton).setOnClickListener(v -> { + Media media = getActiveMedia(); + if (media == null) + return; + media.setMuted(!media.isMuted()); + ((ImageButton) findViewById(R.id.phoneUIMuteButton)).setImageResource(!media.isMuted() ? R.drawable.ic_icon_media_volume : R.drawable.ic_icon_media_volume_muted); + }); + + mMediaSeekbar = findViewById(R.id.phoneUIMediaSeekBar); + mMediaSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) {} + + @Override + public void onStartTrackingTouch(SeekBar seekBar) {} + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + Media media = getActiveMedia(); + if (media == null || !media.canSeek() || media.getDuration() == 0) + return; + media.seek((seekBar.getProgress() / 100.0) * media.getDuration()); + } + }); } }