8
8
import android .content .Context ;
9
9
import android .graphics .Rect ;
10
10
import android .graphics .drawable .Drawable ;
11
+ import android .os .Handler ;
11
12
import android .util .AttributeSet ;
12
13
import android .view .MotionEvent ;
13
14
import android .view .View ;
14
15
import android .widget .FrameLayout ;
15
16
import android .widget .TextView ;
16
17
18
+ import org .mozilla .telemetry .schedule .jobscheduler .TelemetryJobService ;
17
19
import org .mozilla .vrbrowser .R ;
18
20
import org .mozilla .geckoview .MediaElement ;
19
21
import org .mozilla .vrbrowser .browser .Media ;
@@ -42,6 +44,10 @@ public class MediaControlsWidget extends UIWidget implements MediaElement.Delega
42
44
private boolean mPlayOnSeekEnd ;
43
45
private Rect mOffsetViewBounds ;
44
46
private VideoProjectionMenuWidget mProjectionMenu ;
47
+ static long VOLUME_SLIDER_CHECK_DELAY = 1000 ;
48
+ private Handler mVolumeCtrlHandler = new Handler ();
49
+ private boolean mHideVolumeSlider = false ;
50
+ private Runnable mVolumeCtrlRunnable ;
45
51
46
52
public MediaControlsWidget (Context aContext ) {
47
53
super (aContext );
@@ -76,6 +82,13 @@ private void initialize(Context aContext) {
76
82
mVolumeIcon = aContext .getDrawable (R .drawable .ic_icon_media_volume );
77
83
mOffsetViewBounds = new Rect ();
78
84
85
+ mVolumeCtrlRunnable = () -> {
86
+ if ((mHideVolumeSlider ) && (mVolumeControl .getVisibility () == View .VISIBLE )) {
87
+ mVolumeControl .setVisibility (View .INVISIBLE );
88
+ stopVolumeCtrlHandler ();
89
+ }
90
+ };
91
+
79
92
mMediaPlayButton .setOnClickListener (v -> {
80
93
if (mMedia .isEnded ()) {
81
94
mMedia .seek (0 );
@@ -179,8 +192,8 @@ public void onSeekPreview(String aText, double aRatio) {
179
192
childView .getDrawingRect (mOffsetViewBounds );
180
193
MediaControlsWidget .this .offsetDescendantRectToMyCoords (childView , mOffsetViewBounds );
181
194
182
- FrameLayout .LayoutParams params = (FrameLayout .LayoutParams )mMediaSeekLabel .getLayoutParams ();
183
- params .setMarginStart (mOffsetViewBounds .left + (int )(aRatio * mOffsetViewBounds .width ()) - mMediaSeekLabel .getMeasuredWidth () / 2 );
195
+ FrameLayout .LayoutParams params = (FrameLayout .LayoutParams ) mMediaSeekLabel .getLayoutParams ();
196
+ params .setMarginStart (mOffsetViewBounds .left + (int ) (aRatio * mOffsetViewBounds .width ()) - mMediaSeekLabel .getMeasuredWidth () / 2 );
184
197
mMediaSeekLabel .setLayoutParams (params );
185
198
}
186
199
});
@@ -192,37 +205,38 @@ public void onSeekPreview(String aText, double aRatio) {
192
205
}
193
206
mVolumeControl .requestFocusFromTouch ();
194
207
});
195
-
196
- this .setOnHoverListener ((v , event ) -> {
197
- if (mMedia == null ) {
198
- return false ;
199
- }
200
- if (event .getAction () == MotionEvent .ACTION_HOVER_MOVE || event .getAction () == MotionEvent .ACTION_HOVER_ENTER ) {
201
- float threshold = (float )MediaControlsWidget .this .getMeasuredWidth () * 0.65f ;
202
- boolean isVisible = mVolumeControl .getVisibility () == View .VISIBLE ;
203
- boolean makeVisible = event .getX () >= threshold ;
204
- if (isVisible != makeVisible ) {
205
- mVolumeControl .setVisibility (makeVisible ? View .VISIBLE : View .GONE );
206
- }
207
- } else if (event .getAction () == MotionEvent .ACTION_HOVER_EXIT && !mMediaVolumeButton .isHovered () && this .isInTouchMode ()) {
208
- mVolumeControl .setVisibility (View .INVISIBLE );
209
- }
210
- return false ;
211
- });
212
-
213
208
mMediaVolumeButton .setOnHoverListener ((v , event ) -> {
214
- if (event .getAction () == MotionEvent .ACTION_HOVER_ENTER || event .getAction () == MotionEvent .ACTION_HOVER_MOVE ) {
209
+ float startY = v .getY ();
210
+ float maxY = startY + v .getHeight ();
211
+ //for this we only hide on the left side of volume button or outside y area of button
212
+ if ((event .getX () <= 0 ) || (event .getX () >= v .getWidth ()) || (!(event .getY () > startY && event .getY () < maxY ))) {
213
+ mHideVolumeSlider = true ;
214
+ startVolumeCtrlHandler ();
215
+
216
+ } else {
215
217
mVolumeControl .setVisibility (View .VISIBLE );
218
+ mHideVolumeSlider = false ;
219
+ stopVolumeCtrlHandler ();
216
220
}
217
221
return false ;
218
222
});
219
223
220
- mMediaProjectionButton .setOnHoverListener ((v , event ) -> {
221
- if (event .getAction () == MotionEvent .ACTION_HOVER_ENTER || event .getAction () == MotionEvent .ACTION_HOVER_MOVE ) {
222
- mVolumeControl .setVisibility (View .INVISIBLE );
224
+ mVolumeControl .setOnHoverListener ((v , event ) -> {
225
+ float startY = 0 ;
226
+ float maxY = startY + v .getHeight ();
227
+ if ((event .getX () > 0 && event .getX () < v .getWidth ()) && (event .getY () > startY && event .getY () < maxY )) {
228
+ mHideVolumeSlider = false ;
229
+ stopVolumeCtrlHandler ();
230
+ }
231
+ //for this we only hide on the right side of volume button or outside y area of button
232
+ else if ((event .getX () <= 0 ) || (event .getX () >= v .getWidth ()) || (!(event .getY () > startY && event .getY () < maxY ))) {
233
+ mHideVolumeSlider = true ;
234
+ startVolumeCtrlHandler ();
223
235
}
224
236
return false ;
225
237
});
238
+
239
+
226
240
}
227
241
228
242
@ Override
@@ -322,7 +336,7 @@ public void onMetadataChange(MediaElement mediaElement, MediaElement.Metadata me
322
336
@ Override
323
337
public void onLoadProgress (MediaElement mediaElement , MediaElement .LoadProgressInfo progressInfo ) {
324
338
if (progressInfo .buffered != null ) {
325
- mSeekBar .setBuffered (progressInfo .buffered [progressInfo .buffered .length -1 ].end );
339
+ mSeekBar .setBuffered (progressInfo .buffered [progressInfo .buffered .length - 1 ].end );
326
340
}
327
341
}
328
342
@@ -353,4 +367,11 @@ public void onFullscreenChange(MediaElement mediaElement, boolean fullscreen) {
353
367
public void onError (MediaElement mediaElement , int code ) {
354
368
}
355
369
370
+ private void startVolumeCtrlHandler () {
371
+ mVolumeCtrlHandler .postDelayed (mVolumeCtrlRunnable , VOLUME_SLIDER_CHECK_DELAY );
372
+ }
373
+
374
+ public void stopVolumeCtrlHandler () {
375
+ mVolumeCtrlHandler .removeCallbacks (mVolumeCtrlRunnable );
376
+ }
356
377
}
0 commit comments