From 34c12f5bd4001e8985ac9b76a16d100ff5267d4a Mon Sep 17 00:00:00 2001 From: Manuel Martin Date: Wed, 8 Jan 2020 13:41:25 +0100 Subject: [PATCH] Dialog stacking (#2573) * Use a single global connection dialog instead of per window * Dialog stacking --- .../mozilla/vrbrowser/VRBrowserActivity.java | 12 ------ .../ui/widgets/NavigationBarWidget.java | 9 ++--- .../vrbrowser/ui/widgets/TabsWidget.java | 14 +++---- .../vrbrowser/ui/widgets/WindowWidget.java | 31 --------------- .../mozilla/vrbrowser/ui/widgets/Windows.java | 31 +++++++++++++++ .../widgets/dialogs/SendTabDialogWidget.java | 34 +++------------- .../ui/widgets/dialogs/UIDialog.java | 39 ++++++++++++++++++- .../ui/widgets/dialogs/WhatsNewWidget.java | 26 +------------ .../ui/widgets/settings/SettingsWidget.java | 7 +--- 9 files changed, 85 insertions(+), 118 deletions(-) diff --git a/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java b/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java index 0427c1ac3..0ea509d58 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java @@ -338,18 +338,6 @@ public void onWindowVideoAvailabilityChanged(@NonNull WindowWidget aWindow) { final WhatsNewWidget whatsNew = new WhatsNewWidget(this); whatsNew.setLoginOrigin(Accounts.LoginOrigin.NONE); whatsNew.getPlacement().parentHandle = mWindows.getFocusedWindow().getHandle(); - whatsNew.setStartBrowsingCallback(() -> { - whatsNew.hide(UIWidget.REMOVE_WIDGET); - whatsNew.releaseWidget(); - }); - whatsNew.setSignInCallback(() -> { - whatsNew.hide(UIWidget.REMOVE_WIDGET); - whatsNew.releaseWidget(); - }); - whatsNew.setDelegate(() -> { - whatsNew.hide(UIWidget.REMOVE_WIDGET); - whatsNew.releaseWidget(); - }); whatsNew.show(UIWidget.REQUEST_FOCUS); } } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/NavigationBarWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/NavigationBarWidget.java index a6608e5a0..45173425c 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/NavigationBarWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/NavigationBarWidget.java @@ -1193,14 +1193,11 @@ private void hideMenu() { } public void showSendTabDialog() { - mSendTabDialog = new SendTabDialogWidget(getContext()); + if (mSendTabDialog == null) { + mSendTabDialog = new SendTabDialogWidget(getContext()); + } mSendTabDialog.mWidgetPlacement.parentHandle = mWidgetManager.getFocusedWindow().getHandle(); mSendTabDialog.setSessionId(mAttachedWindow.getSession().getId()); - mSendTabDialog.setDelegate(() -> { - mSendTabDialog.releaseWidget(); - mSendTabDialog = null; - NavigationBarWidget.this.show(REQUEST_FOCUS); - }); mSendTabDialog.show(UIWidget.REQUEST_FOCUS); } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TabsWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TabsWidget.java index 21161b374..008354366 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TabsWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TabsWidget.java @@ -158,7 +158,9 @@ public void show(int aShowFlags) { @Override public void hide(@HideFlags int aHideFlags) { super.hide(aHideFlags); - mRenderer.clearSurface(); + if (mRenderer != null) { + mRenderer.clearSurface(); + } } public void setTabDelegate(TabDelegate aDelegate) { @@ -269,15 +271,11 @@ public void onAdd(TabView aSender) { @Override public void onSend(TabView aSender) { - hide(KEEP_WIDGET); - mSendTabDialog = new SendTabDialogWidget(getContext()); + if (mSendTabDialog == null) { + mSendTabDialog = new SendTabDialogWidget(getContext()); + } mSendTabDialog.setSessionId(aSender.getSession().getId()); mSendTabDialog.mWidgetPlacement.parentHandle = mWidgetManager.getFocusedWindow().getHandle(); - mSendTabDialog.setDelegate(() -> { - mSendTabDialog.releaseWidget(); - mSendTabDialog = null; - TabsWidget.this.show(REQUEST_FOCUS); - }); mSendTabDialog.show(UIWidget.REQUEST_FOCUS); } }); diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java index c15999bee..fc76881d5 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java @@ -52,7 +52,6 @@ import org.mozilla.vrbrowser.ui.widgets.menus.ContextMenuWidget; import org.mozilla.vrbrowser.ui.widgets.menus.LibraryMenuWidget; import org.mozilla.vrbrowser.ui.widgets.settings.SettingsWidget; -import org.mozilla.vrbrowser.utils.ConnectivityReceiver; import org.mozilla.vrbrowser.utils.ViewUtils; import java.util.ArrayList; @@ -101,7 +100,6 @@ default void onBookmarksHidden(WindowWidget aWindow) {} private WidgetManagerDelegate mWidgetManager; private PromptDialogWidget mAlertDialog; private PromptDialogWidget mConfirmDialog; - private PromptDialogWidget mNoInternetDialog; private PromptDialogWidget mAppDialog; private ClearHistoryDialogWidget mClearHistoryDialog; private ContextMenuWidget mContextMenu; @@ -236,8 +234,6 @@ void setupListeners(Session aSession) { aSession.addProgressListener(this); aSession.setHistoryDelegate(this); aSession.addSelectionActionListener(this); - - mWidgetManager.addConnectivityListener(mConnectivityDelegate); } void cleanListeners(Session aSession) { @@ -248,8 +244,6 @@ void cleanListeners(Session aSession) { aSession.removeProgressListener(this); aSession.setHistoryDelegate(null); aSession.removeSelectionActionListener(this); - - mWidgetManager.removeConnectivityListener(mConnectivityDelegate); } @Override @@ -330,31 +324,6 @@ public void close() { mListeners.clear(); } - private ConnectivityReceiver.Delegate mConnectivityDelegate = connected -> { - if (mActive) { - if (mNoInternetDialog == null) { - mNoInternetDialog = new PromptDialogWidget(getContext()); - mNoInternetDialog.setButtons(new int[] { - R.string.ok_button - }); - mNoInternetDialog.setCheckboxVisible(false); - mNoInternetDialog.setDescriptionVisible(false); - mNoInternetDialog.setTitle(R.string.no_internet_title); - mNoInternetDialog.setBody(R.string.no_internet_message); - mNoInternetDialog.setButtonsDelegate(index -> { - mNoInternetDialog.hide(REMOVE_WIDGET); - }); - } - - if (!connected && !mNoInternetDialog.isVisible()) { - mNoInternetDialog.show(REQUEST_FOCUS); - - } else if (connected && mNoInternetDialog.isVisible()) { - mNoInternetDialog.hide(REMOVE_WIDGET); - } - } - }; - public void loadHomeIfNotRestored() { if (!mIsRestored) { loadHome(); diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java index a83369ee8..0df7d0f99 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java @@ -22,8 +22,11 @@ import org.mozilla.vrbrowser.browser.engine.SessionStore; import org.mozilla.vrbrowser.telemetry.GleanMetricsService; import org.mozilla.vrbrowser.telemetry.TelemetryWrapper; +import org.mozilla.vrbrowser.ui.widgets.dialogs.PromptDialogWidget; +import org.mozilla.vrbrowser.ui.widgets.dialogs.UIDialog; import org.mozilla.vrbrowser.ui.widgets.settings.SettingsWidget; import org.mozilla.vrbrowser.utils.BitmapCache; +import org.mozilla.vrbrowser.utils.ConnectivityReceiver; import org.mozilla.vrbrowser.utils.SystemUtils; import java.io.File; @@ -103,6 +106,7 @@ class WindowsState { private TabsWidget mTabsWidget; private Accounts mAccounts; private Services mServices; + private PromptDialogWidget mNoInternetDialog; public enum WindowPlacement{ FRONT(0), @@ -142,6 +146,8 @@ public Windows(Context aContext) { mServices = ((VRBrowserApplication)mContext.getApplicationContext()).getServices(); mServices.setTabReceivedDelegate(this); + mWidgetManager.addConnectivityListener(mConnectivityDelegate); + restoreWindows(); } @@ -435,6 +441,7 @@ public void onDestroy() { } mAccounts.removeAccountListener(mAccountObserver); mServices.setTabReceivedDelegate(null); + mWidgetManager.removeConnectivityListener(mConnectivityDelegate); } public boolean isInPrivateMode() { @@ -894,6 +901,7 @@ public void onLoggedOut() { @Override public void onAuthenticated(@NonNull OAuthAccount oAuthAccount, @NonNull AuthType authType) { if (authType == AuthType.Signin.INSTANCE || authType == AuthType.Signup.INSTANCE) { + UIDialog.closeAllDialogs(); Session session = mFocusedWindow.getSession(); addTab(mFocusedWindow, mAccounts.getConnectionSuccessURL()); onTabsClose(new ArrayList<>(Collections.singletonList(session))); @@ -1276,4 +1284,27 @@ public void onTabsReceived(@NonNull List aTabs) { mTabsWidget.refreshTabs(); } } + + private ConnectivityReceiver.Delegate mConnectivityDelegate = connected -> { + if (mNoInternetDialog == null) { + mNoInternetDialog = new PromptDialogWidget(mContext); + mNoInternetDialog.setButtons(new int[] { + R.string.ok_button + }); + mNoInternetDialog.setCheckboxVisible(false); + mNoInternetDialog.setDescriptionVisible(false); + mNoInternetDialog.setTitle(R.string.no_internet_title); + mNoInternetDialog.setBody(R.string.no_internet_message); + mNoInternetDialog.setButtonsDelegate(index -> { + mNoInternetDialog.hide(UIWidget.REMOVE_WIDGET); + }); + } + + if (!connected && !mNoInternetDialog.isVisible()) { + mNoInternetDialog.show(UIWidget.REQUEST_FOCUS); + + } else if (connected && mNoInternetDialog.isVisible()) { + mNoInternetDialog.hide(UIWidget.REMOVE_WIDGET); + } + }; } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/dialogs/SendTabDialogWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/dialogs/SendTabDialogWidget.java index f183c9de3..7ed0ca98f 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/dialogs/SendTabDialogWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/dialogs/SendTabDialogWidget.java @@ -61,8 +61,6 @@ protected void initialize(@NonNull Context aContext) { mSendTabsDialogBinding.setIsEmpty(false); mAccounts = ((VRBrowserApplication)getContext().getApplicationContext()).getAccounts(); - mAccounts.addAccountListener(this); - mAccounts.addDeviceConstellationListener(this); mBinding.headerLayout.setTitle(getResources().getString(R.string.send_tab_dialog_title)); mBinding.headerLayout.setDescription(R.string.send_tab_dialog_description); @@ -70,16 +68,11 @@ protected void initialize(@NonNull Context aContext) { mBinding.footerLayout.setFooterButtonClickListener(this::sendTabButtonClick); } - @Override - public void releaseWidget() { - mAccounts.removeAccountListener(this); - mAccounts.removeDeviceConstellationListener(this); - - super.releaseWidget(); - } - @Override public void show(int aShowFlags) { + mAccounts.addAccountListener(this); + mAccounts.addDeviceConstellationListener(this); + if (mAccounts.isSignedIn()) { mBinding.footerLayout.setFooterButtonVisibility(View.GONE); mAccounts.refreshDevicesAsync(); @@ -96,7 +89,8 @@ public void show(int aShowFlags) { public void hide(int aHideFlags) { super.hide(aHideFlags); - mWidgetManager.removeWorldClickListener(this); + mAccounts.removeAccountListener(this); + mAccounts.removeDeviceConstellationListener(this); } public void setSessionId(@Nullable String sessionId) { @@ -122,24 +116,6 @@ private void sendTabButtonClick(View v) { private void showWhatsNewDialog() { mWhatsNew = new WhatsNewWidget(getContext()); mWhatsNew.setLoginOrigin(Accounts.LoginOrigin.SEND_TABS); - mWhatsNew.setStartBrowsingCallback(() -> { - mWhatsNew.hide(REMOVE_WIDGET); - mWhatsNew.releaseWidget(); - mWhatsNew = null; - onDismiss(); - }); - mWhatsNew.setSignInCallback(() -> { - mWhatsNew.hide(REMOVE_WIDGET); - mWhatsNew.releaseWidget(); - mWhatsNew = null; - hide(KEEP_WIDGET); - }); - mWhatsNew.setDelegate(() -> { - mWhatsNew.hide(REMOVE_WIDGET); - mWhatsNew.releaseWidget(); - mWhatsNew = null; - onDismiss(); - }); mWhatsNew.show(UIWidget.REQUEST_FOCUS); } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/dialogs/UIDialog.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/dialogs/UIDialog.java index d87b1445b..2f01793ad 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/dialogs/UIDialog.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/dialogs/UIDialog.java @@ -6,7 +6,12 @@ import org.mozilla.vrbrowser.ui.widgets.UIWidget; import org.mozilla.vrbrowser.ui.widgets.WidgetManagerDelegate; +import java.util.LinkedList; + public abstract class UIDialog extends UIWidget implements WidgetManagerDelegate.WorldClickListener { + + private static LinkedList mDialogs = new LinkedList<>(); + public UIDialog(Context aContext) { super(aContext); initialize(); @@ -43,6 +48,12 @@ public void show(int aShowFlags) { super.show(aShowFlags); mWidgetManager.pushWorldBrightness(this, WidgetManagerDelegate.DEFAULT_DIM_BRIGHTNESS); + + UIDialog head = mDialogs.peek(); + if (head != null && head.isVisible()) { + head.hide(); + } + mDialogs.push(this); } } @@ -51,12 +62,36 @@ public void hide(int aHideFlags) { super.hide(aHideFlags); mWidgetManager.popWorldBrightness(this); + + mDialogs.remove(this); + UIDialog head = mDialogs.peek(); + if (head != null) { + head.show(); + } + } + + private void show() { + if (!isVisible()) { + super.show(REQUEST_FOCUS); + + mWidgetManager.pushWorldBrightness(this, WidgetManagerDelegate.DEFAULT_DIM_BRIGHTNESS); + } + } + + private void hide() { + super.hide(KEEP_WIDGET); + + mWidgetManager.popWorldBrightness(this); } @Override public void onWorldClick() { - if (this.isVisible()) { - onDismiss(); + if (isVisible()) { + post(() -> hide(REMOVE_WIDGET)); } } + + public static void closeAllDialogs() { + new LinkedList<>(mDialogs).forEach(dialog -> dialog.onDismiss()); + } } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/dialogs/WhatsNewWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/dialogs/WhatsNewWidget.java index 03aa70283..74f6de45b 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/dialogs/WhatsNewWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/dialogs/WhatsNewWidget.java @@ -8,8 +8,6 @@ import android.content.Context; import android.util.Log; -import androidx.annotation.NonNull; - import org.mozilla.geckoview.GeckoSessionSettings; import org.mozilla.vrbrowser.R; import org.mozilla.vrbrowser.VRBrowserApplication; @@ -23,8 +21,6 @@ public class WhatsNewWidget extends PromptDialogWidget { private Accounts mAccounts; - private Runnable mSignInCallback; - private Runnable mStartBrowsingCallback; private Accounts.LoginOrigin mLoginOrigin; private Executor mUIThreadExecutor; @@ -34,14 +30,6 @@ public WhatsNewWidget(Context aContext) { initialize(aContext); } - public void setSignInCallback(@NonNull Runnable callback) { - mSignInCallback = callback; - } - - public void setStartBrowsingCallback(@NonNull Runnable callback) { - mStartBrowsingCallback = callback; - } - @Override protected void initialize(Context aContext) { super.initialize(aContext); @@ -55,7 +43,7 @@ protected void initialize(Context aContext) { }); setButtonsDelegate(index -> { if (index == PromptDialogWidget.NEGATIVE) { - startBrowsing(); + onDismiss(); } else if (index == PromptDialogWidget.POSITIVE) { signIn(); @@ -86,7 +74,7 @@ private void signIn() { mAccounts.logoutAsync(); } else { - hide(REMOVE_WIDGET); + UIDialog.closeAllDialogs(); CompletableFuture result = mAccounts.authUrlAsync(); if (result != null) { @@ -102,10 +90,6 @@ private void signIn() { GleanMetricsService.Tabs.openedCounter(GleanMetricsService.Tabs.TabSource.FXA_LOGIN); } - if (mSignInCallback != null) { - mSignInCallback.run(); - } - }, mUIThreadExecutor).exceptionally(throwable -> { Log.d(LOGTAG, "Error getting the authentication URL: " + throwable.getLocalizedMessage()); throwable.printStackTrace(); @@ -115,10 +99,4 @@ private void signIn() { } } - private void startBrowsing() { - if (mStartBrowsingCallback != null) { - mStartBrowsingCallback.run(); - } - } - } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/settings/SettingsWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/settings/SettingsWidget.java index b21e1bad5..548c9e555 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/settings/SettingsWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/settings/SettingsWidget.java @@ -493,11 +493,8 @@ public void exitWholeSettings() { @Override public void showRestartDialog() { - hide(UIWidget.REMOVE_WIDGET); - if (mRestartDialog == null) { mRestartDialog = new RestartDialogWidget(getContext()); - mRestartDialog.setDelegate(() -> SettingsWidget.this.show(REQUEST_FOCUS)); } mRestartDialog.show(REQUEST_FOCUS); @@ -505,9 +502,7 @@ public void showRestartDialog() { @Override public void showAlert(String aTitle, String aMessage) { - hide(UIWidget.KEEP_WIDGET); - - mWidgetManager.getFocusedWindow().showAlert(aTitle, aMessage, index -> show(REQUEST_FOCUS)); + mWidgetManager.getFocusedWindow().showAlert(aTitle, aMessage, null); } private boolean isLanguagesSubView(View view) {