Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Block background UI interaction for dialogs #1211

Merged
merged 1 commit into from
May 17, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
31 changes: 29 additions & 2 deletions app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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);
}
Original file line number Diff line number Diff line change
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();
}
}
}
Original file line number Diff line number Diff line change
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 {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this a typo? Since UIDialog is derived from FocusChangeListener, does PermissionWidget need to be as well?


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();
}
}
}
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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();
}
}
}
Original file line number Diff line number Diff line change
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);
}
}

}
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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