Skip to content

Commit

Permalink
Block background UI interaction for dialogs (#1211)
Browse files Browse the repository at this point in the history
  • Loading branch information
MortimerGoro committed May 17, 2019
1 parent e64f6d1 commit 5e216bb
Show file tree
Hide file tree
Showing 15 changed files with 92 additions and 73 deletions.
31 changes: 29 additions & 2 deletions app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java
Expand Up @@ -141,6 +141,7 @@ public void run() {
private ConnectivityReceiver mConnectivityReceiver;
private boolean mConnectionAvailable = true;
private AudioManager mAudioManager;
private Widget mActiveDialog;

private boolean callOnAudioManager(Consumer<AudioManager> fn) {
if (mAudioManager == null) {
Expand Down Expand Up @@ -588,6 +589,9 @@ void dispatchCreateWidgetLayer(final int aHandle, final Surface aSurface, final
void handleMotionEvent(final int aHandle, final int aDevice, final boolean aPressed, final float aX, final float aY) {
runOnUiThread(() -> {
Widget widget = mWidgets.get(aHandle);
if (!isWidgetInputEnabled(widget)) {
widget = null; // Fallback to mRootWidget in order to allow world clicks to dismiss UI.
}
float scale = widget != null ? widget.getPlacement().textureScale : 1.0f;
final float x = aX / scale;
final float y = aY / scale;
Expand All @@ -608,6 +612,9 @@ void handleMotionEvent(final int aHandle, final int aDevice, final boolean aPres
void handleScrollEvent(final int aHandle, final int aDevice, final float aX, final float aY) {
runOnUiThread(() -> {
Widget widget = mWidgets.get(aHandle);
if (!isWidgetInputEnabled(widget)) {
return;
}
if (widget != null) {
float scrollDirection = mSettings.getScrollDirection() == 0 ? 1.0f : -1.0f;
MotionEventGenerator.dispatchScroll(widget, aDevice, aX * scrollDirection, aY * scrollDirection);
Expand Down Expand Up @@ -842,6 +849,22 @@ public void addWidgets(final Iterable<Widget> aWidgets) {
});
}

private void updateActiveDialog(final Widget aWidget) {
if (!aWidget.isDialog()) {
return;
}

if (aWidget.isVisible()) {
mActiveDialog = aWidget;
} else if (aWidget == mActiveDialog && !aWidget.isVisible()) {
mActiveDialog = null;
}
}

private boolean isWidgetInputEnabled(Widget aWidget) {
return mActiveDialog == null || aWidget == null || mActiveDialog == aWidget || aWidget instanceof KeyboardWidget;
}

// VideoAvailabilityListener
@Override
public void onVideoAvailabilityChanged(boolean aVideosAvailable) {
Expand All @@ -850,10 +873,11 @@ public void onVideoAvailabilityChanged(boolean aVideosAvailable) {

// WidgetManagerDelegate
@Override
public void addWidget(final Widget aWidget) {
public void addWidget(Widget aWidget) {
mWidgets.put(aWidget.getHandle(), aWidget);
((View)aWidget).setVisibility(aWidget.getPlacement().visible ? View.VISIBLE : View.GONE);
queueRunnable(() -> addWidgetNative(aWidget.getHandle(), aWidget.getPlacement()));
updateActiveDialog(aWidget);
}

@Override
Expand Down Expand Up @@ -886,7 +910,7 @@ public void updateWidget(final Widget aWidget) {
for (UpdateListener listener: mWidgetUpdateListeners) {
listener.onWidgetUpdate(aWidget);
}

updateActiveDialog(aWidget);
}

@Override
Expand All @@ -895,6 +919,9 @@ public void removeWidget(final Widget aWidget) {
mWidgetContainer.removeView((View) aWidget);
aWidget.setFirstDraw(false);
queueRunnable(() -> removeWidgetNative(aWidget.getHandle()));
if (aWidget == mActiveDialog) {
mActiveDialog = null;
}
}

@Override
Expand Down
Expand Up @@ -182,6 +182,11 @@ public void releaseWidget() {
mWidgetManager = null;
}

@Override
public boolean isDialog() {
return false;
}

@Override
public void setFirstDraw(final boolean aIsFirstDraw) {
mWidgetPlacement.firstDraw = aIsFirstDraw;
Expand Down
Expand Up @@ -24,6 +24,7 @@ public interface Widget {
void setFirstDraw(boolean aIsFirstDraw);
boolean getFirstDraw();
boolean isVisible();
boolean isDialog();
void setVisible(boolean aVisible);
void resizeByMultiplier(float aspect, float multiplier);
}
Expand Up @@ -21,7 +21,7 @@
import org.mozilla.vrbrowser.ui.widgets.WidgetManagerDelegate;
import org.mozilla.vrbrowser.ui.widgets.WidgetPlacement;

public class CrashDialogWidget extends UIWidget implements WidgetManagerDelegate.FocusChangeListener {
public class CrashDialogWidget extends UIDialog {

private static final String LOGTAG = "VRB";

Expand Down Expand Up @@ -150,12 +150,4 @@ public void hide(@HideFlags int aHideFlags) {
public void setCrashDialogDelegate(CrashDialogDelegate aDelegate) {
mCrashDialogDelegate = aDelegate;
}

// WidgetManagerDelegate.FocusChangeListener
@Override
public void onGlobalFocusChanged(View oldFocus, View newFocus) {
if (oldFocus == this && isVisible()) {
onDismiss();
}
}
}
Expand Up @@ -23,7 +23,7 @@

import java.net.URI;

public class PermissionWidget extends UIWidget implements WidgetManagerDelegate.FocusChangeListener {
public class PermissionWidget extends UIDialog implements WidgetManagerDelegate.FocusChangeListener {

private static final String LOGTAG = "VRB";

Expand Down Expand Up @@ -58,8 +58,6 @@ public PermissionWidget(Context aContext, AttributeSet aAttrs, int aDefStyle) {
private void initialize(Context aContext) {
inflate(aContext, R.layout.permission, this);

mWidgetManager.addFocusChangeListener(this);

mPermissionIcon = findViewById(R.id.permissionIcon);
mPermissionMessage = findViewById(R.id.permissionText);

Expand All @@ -70,13 +68,6 @@ private void initialize(Context aContext) {
allowButton.setOnClickListener(v -> handlePermissionResult(true));
}

@Override
public void releaseWidget() {
mWidgetManager.removeFocusChangeListener(this);

super.releaseWidget();
}

@Override
protected void initializeWidgetPlacement(WidgetPlacement aPlacement) {
Context context = getContext();
Expand Down Expand Up @@ -177,13 +168,4 @@ private void handlePermissionResult(boolean aGranted) {

onDismiss();
}

// WidgetManagerDelegate.FocusChangeListener

@Override
public void onGlobalFocusChanged(View oldFocus, View newFocus) {
if (oldFocus == this && isVisible()) {
onDismiss();
}
}
}
Expand Up @@ -19,7 +19,7 @@
import org.mozilla.vrbrowser.ui.widgets.UIWidget;
import org.mozilla.vrbrowser.ui.widgets.WidgetPlacement;

public class RestartDialogWidget extends UIWidget {
public class RestartDialogWidget extends UIDialog {

private static final String LOGTAG = "VRB";

Expand Down
@@ -0,0 +1,48 @@
package org.mozilla.vrbrowser.ui.widgets.dialogs;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;

import org.mozilla.vrbrowser.ui.widgets.UIWidget;
import org.mozilla.vrbrowser.ui.widgets.WidgetManagerDelegate;

public abstract class UIDialog extends UIWidget implements WidgetManagerDelegate.FocusChangeListener {
public UIDialog(Context aContext) {
super(aContext);
initialize();
}

public UIDialog(Context aContext, AttributeSet aAttrs) {
super(aContext, aAttrs);
initialize();
}

public UIDialog(Context aContext, AttributeSet aAttrs, int aDefStyle) {
super(aContext, aAttrs, aDefStyle);
initialize();
}

private void initialize() {
mWidgetManager.addFocusChangeListener(this);
}

@Override
public void releaseWidget() {
super.releaseWidget();
mWidgetManager.removeFocusChangeListener(this);
}

@Override
public boolean isDialog() {
return true;
}

// WidgetManagerDelegate.FocusChangeListener
@Override
public void onGlobalFocusChanged(View oldFocus, View newFocus) {
if (oldFocus == this && isVisible()) {
onDismiss();
}
}
}
Expand Up @@ -35,8 +35,8 @@
import androidx.annotation.IdRes;
import androidx.core.app.ActivityCompat;

public class VoiceSearchWidget extends UIWidget implements WidgetManagerDelegate.PermissionListener,
Application.ActivityLifecycleCallbacks, WidgetManagerDelegate.FocusChangeListener {
public class VoiceSearchWidget extends UIDialog implements WidgetManagerDelegate.PermissionListener,
Application.ActivityLifecycleCallbacks {

private static final String LOGTAG = "VRB";
private static final int VOICESEARCH_AUDIO_REQUEST_CODE = 7455;
Expand Down Expand Up @@ -87,7 +87,6 @@ private void initialize(Context aContext) {

mAudio = AudioEngine.fromContext(aContext);

mWidgetManager.addFocusChangeListener(this);
mWidgetManager.addPermissionListener(this);

mMozillaSpeechService = MozillaSpeechService.getInstance();
Expand Down Expand Up @@ -135,7 +134,6 @@ public void setDelegate(VoiceSearchDelegate delegate) {

@Override
public void releaseWidget() {
mWidgetManager.removeFocusChangeListener(this);
mWidgetManager.removePermissionListener(this);
mMozillaSpeechService.removeListener(mVoiceSearchListener);
((Application)getContext().getApplicationContext()).unregisterActivityLifecycleCallbacks(this);
Expand Down Expand Up @@ -370,13 +368,4 @@ public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
public void onActivityDestroyed(Activity activity) {

}

// WidgetManagerDelegate.FocusChangeListener
@Override
public void onGlobalFocusChanged(View oldFocus, View newFocus) {
if (isVisible()) {
hide(REMOVE_WIDGET);
}
}

}
Expand Up @@ -30,10 +30,7 @@ public AlertPromptWidget(Context aContext, AttributeSet aAttrs, int aDefStyle) {
initialize(aContext);
}

@Override
protected void initialize(Context aContext) {
super.initialize(aContext);

inflate(aContext, R.layout.prompt_alert, this);

mAudio = AudioEngine.fromContext(aContext);
Expand Down
Expand Up @@ -42,10 +42,7 @@ public AuthPromptWidget(Context aContext, AttributeSet aAttrs, int aDefStyle) {
initialize(aContext);
}

@Override
protected void initialize(Context aContext) {
super.initialize(aContext);

inflate(aContext, R.layout.prompt_auth, this);

mAudio = AudioEngine.fromContext(aContext);
Expand Down
Expand Up @@ -57,10 +57,7 @@ public ChoicePromptWidget(Context aContext, AttributeSet aAttrs, int aDefStyle)
initialize(aContext);
}

@Override
protected void initialize(Context aContext) {
super.initialize(aContext);

inflate(aContext, R.layout.prompt_choice, this);

mWidgetManager.addFocusChangeListener(this);
Expand Down
Expand Up @@ -35,10 +35,7 @@ public ConfirmPromptWidget(Context aContext, AttributeSet aAttrs, int aDefStyle)
initialize(aContext);
}

@Override
protected void initialize(Context aContext) {
super.initialize(aContext);

inflate(aContext, R.layout.prompt_confirm, this);

mWidgetManager.addFocusChangeListener(this);
Expand Down
Expand Up @@ -11,8 +11,9 @@
import org.mozilla.vrbrowser.ui.widgets.UIWidget;
import org.mozilla.vrbrowser.ui.widgets.WidgetManagerDelegate;
import org.mozilla.vrbrowser.ui.widgets.WidgetPlacement;
import org.mozilla.vrbrowser.ui.widgets.dialogs.UIDialog;

public class PromptWidget extends UIWidget implements WidgetManagerDelegate.FocusChangeListener {
public class PromptWidget extends UIDialog {

protected TextView mTitle;
protected TextView mMessage;
Expand All @@ -31,10 +32,6 @@ public PromptWidget(Context aContext, AttributeSet aAttrs, int aDefStyle) {
super(aContext, aAttrs, aDefStyle);
}

protected void initialize(Context aContext) {
mWidgetManager.addFocusChangeListener(this);
}

public void setTitle(String title) {
if (title == null || title.isEmpty()) {
mTitle.setVisibility(View.GONE);
Expand Down Expand Up @@ -66,12 +63,6 @@ protected void initializeWidgetPlacement(WidgetPlacement aPlacement) {
aPlacement.translationZ = WidgetPlacement.unitFromMeters(getContext(), R.dimen.browser_children_z_distance);
}

@Override
public void releaseWidget() {
mWidgetManager.removeFocusChangeListener(this);

super.releaseWidget();
}

@Override
public void show() {
Expand Down
Expand Up @@ -33,10 +33,7 @@ public TextPromptWidget(Context aContext, AttributeSet aAttrs, int aDefStyle) {
initialize(aContext);
}

@Override
protected void initialize(Context aContext) {
super.initialize(aContext);

inflate(aContext, R.layout.prompt_text, this);

mAudio = AudioEngine.fromContext(aContext);
Expand Down
Expand Up @@ -31,6 +31,7 @@
import org.mozilla.vrbrowser.ui.widgets.WidgetManagerDelegate;
import org.mozilla.vrbrowser.ui.widgets.WidgetPlacement;
import org.mozilla.vrbrowser.ui.widgets.dialogs.RestartDialogWidget;
import org.mozilla.vrbrowser.ui.widgets.dialogs.UIDialog;
import org.mozilla.vrbrowser.ui.widgets.prompts.AlertPromptWidget;

import java.io.UnsupportedEncodingException;
Expand All @@ -39,7 +40,7 @@
import java.util.Calendar;
import java.util.GregorianCalendar;

public class SettingsWidget extends UIWidget implements WidgetManagerDelegate.FocusChangeListener, WidgetManagerDelegate.WorldClickListener, SettingsView.Delegate {
public class SettingsWidget extends UIDialog implements WidgetManagerDelegate.WorldClickListener, SettingsView.Delegate {
private static final String LOGTAG = "VRB";
private AudioEngine mAudio;
private SettingsView mCurrentView;
Expand Down Expand Up @@ -82,7 +83,6 @@ public SettingsWidget(Context aContext, AttributeSet aAttrs, int aDefStyle) {
private void initialize(Context aContext) {
inflate(aContext, R.layout.settings, this);

mWidgetManager.addFocusChangeListener(this);
mWidgetManager.addWorldClickListener(this);
mMainLayout = findViewById(R.id.optionsLayout);

Expand Down Expand Up @@ -211,7 +211,6 @@ private void initialize(Context aContext) {
@Override
public void releaseWidget() {
mWidgetManager.removeWorldClickListener(this);
mWidgetManager.removeFocusChangeListener(this);

super.releaseWidget();
}
Expand Down

0 comments on commit 5e216bb

Please sign in to comment.