From 65b1a594cf9a10586d05cb79683cacf2d6862f14 Mon Sep 17 00:00:00 2001 From: Manuel Martin Date: Mon, 6 Jul 2020 20:40:28 +0200 Subject: [PATCH] Link FxA login flow to the originating session (#3618) --- .../org/mozilla/vrbrowser/browser/Accounts.kt | 17 +++++++++++++++-- .../ui/views/library/BookmarksView.java | 12 ++++++------ .../vrbrowser/ui/views/library/HistoryView.java | 8 +++++--- .../mozilla/vrbrowser/ui/widgets/Windows.java | 9 +++++---- .../ui/widgets/dialogs/WhatsNewWidget.java | 10 ++++++---- .../ui/widgets/settings/SettingsWidget.java | 6 +++++- 6 files changed, 42 insertions(+), 20 deletions(-) diff --git a/app/src/common/shared/org/mozilla/vrbrowser/browser/Accounts.kt b/app/src/common/shared/org/mozilla/vrbrowser/browser/Accounts.kt index 5da8a4894..ca04bc9d4 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/browser/Accounts.kt +++ b/app/src/common/shared/org/mozilla/vrbrowser/browser/Accounts.kt @@ -54,6 +54,9 @@ class Accounts constructor(val context: Context) { var profilePicture: BitmapDrawable? = loadDefaultProfilePicture() var loginOrigin: LoginOrigin = LoginOrigin.NONE + private set + var originSessionId: String? = null + private set var accountStatus = AccountStatus.SIGNED_OUT private val accountListeners = ArrayList() private val syncListeners = ArrayList() @@ -137,10 +140,11 @@ class Accounts constructor(val context: Context) { ) account.deviceConstellation().refreshDevicesAsync() - accountListeners.toMutableList().forEach { - Handler(Looper.getMainLooper()).post { + Handler(Looper.getMainLooper()).post { + accountListeners.toMutableList().forEach { it.onAuthenticated(account, authType) } + originSessionId = null } } @@ -149,6 +153,8 @@ class Accounts constructor(val context: Context) { GleanMetricsService.FxA.signInResult(false) + originSessionId = null + accountStatus = AccountStatus.NEEDS_RECONNECT accountListeners.toMutableList().forEach { Handler(Looper.getMainLooper()).post { @@ -160,6 +166,8 @@ class Accounts constructor(val context: Context) { override fun onLoggedOut() { Log.d(LOGTAG, "The user has been logged out") + originSessionId = null + accountStatus = AccountStatus.SIGNED_OUT accountListeners.toMutableList().forEach { Handler(Looper.getMainLooper()).post { @@ -380,4 +388,9 @@ class Accounts constructor(val context: Context) { return (services.accountManager.authenticatedAccount() as FirefoxAccount).getConnectionSuccessURL() } + fun setOrigin(origin: LoginOrigin, sessionId: String?) { + loginOrigin = origin + originSessionId = sessionId + } + } \ No newline at end of file diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/views/library/BookmarksView.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/views/library/BookmarksView.java index 215d57265..a3057a71a 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/views/library/BookmarksView.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/views/library/BookmarksView.java @@ -19,7 +19,6 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import org.mozilla.geckoview.GeckoSessionSettings; import org.mozilla.vrbrowser.R; import org.mozilla.vrbrowser.VRBrowserActivity; import org.mozilla.vrbrowser.VRBrowserApplication; @@ -37,7 +36,6 @@ import org.mozilla.vrbrowser.ui.callbacks.BookmarksCallback; import org.mozilla.vrbrowser.ui.callbacks.LibraryContextMenuCallback; import org.mozilla.vrbrowser.ui.viewmodel.BookmarksViewModel; -import org.mozilla.vrbrowser.ui.widgets.WidgetManagerDelegate; import org.mozilla.vrbrowser.ui.widgets.WindowWidget; import org.mozilla.vrbrowser.ui.widgets.Windows; import org.mozilla.vrbrowser.ui.widgets.menus.library.BookmarksContextMenuWidget; @@ -240,10 +238,12 @@ public void onFxALogin(@NonNull View view) { mAccounts.logoutAsync(); } else { - mAccounts.setLoginOrigin(Accounts.LoginOrigin.BOOKMARKS); - WidgetManagerDelegate widgetManager = ((VRBrowserActivity) getContext()); - widgetManager.openNewTabForeground(url); - widgetManager.getFocusedWindow().getSession().setUaMode(GeckoSessionSettings.USER_AGENT_MODE_MOBILE); + mWidgetManager.openNewTabForeground(url); + Session currentSession = mWidgetManager.getFocusedWindow().getSession(); + String sessionId = currentSession != null ? currentSession.getId() : null; + + mAccounts.setOrigin(Accounts.LoginOrigin.BOOKMARKS, sessionId); + GleanMetricsService.Tabs.openedCounter(GleanMetricsService.Tabs.TabSource.FXA_LOGIN); WindowWidget window = mWidgetManager.getFocusedWindow(); diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/views/library/HistoryView.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/views/library/HistoryView.java index e4de81be6..2f56d06f6 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/views/library/HistoryView.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/views/library/HistoryView.java @@ -19,7 +19,6 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import org.mozilla.geckoview.GeckoSessionSettings; import org.mozilla.vrbrowser.R; import org.mozilla.vrbrowser.VRBrowserActivity; import org.mozilla.vrbrowser.VRBrowserApplication; @@ -246,9 +245,12 @@ public void onFxALogin(@NonNull View view) { mAccounts.logoutAsync(); } else { - mAccounts.setLoginOrigin(Accounts.LoginOrigin.HISTORY); mWidgetManager.openNewTabForeground(url); - mWidgetManager.getFocusedWindow().getSession().setUaMode(GeckoSessionSettings.USER_AGENT_MODE_MOBILE); + Session currentSession = mWidgetManager.getFocusedWindow().getSession(); + String sessionId = currentSession != null ? currentSession.getId() : null; + + mAccounts.setOrigin(Accounts.LoginOrigin.HISTORY, sessionId); + GleanMetricsService.Tabs.openedCounter(GleanMetricsService.Tabs.TabSource.FXA_LOGIN); WindowWidget window = mWidgetManager.getFocusedWindow(); 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 00301a747..4209be77b 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 @@ -39,7 +39,6 @@ import java.io.Writer; import java.lang.reflect.Type; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -991,9 +990,11 @@ public void onLoggedOut() { 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))); + + Session fxaSession = SessionStore.get().getSession(mAccounts.getOriginSessionId()); + if (fxaSession != null) { + fxaSession.loadUri(mAccounts.getConnectionSuccessURL(), GeckoSession.LOAD_FLAGS_REPLACE_HISTORY); + } switch (mAccounts.getLoginOrigin()) { case BOOKMARKS: 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 5bdb74860..d820cdb85 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,11 +8,11 @@ import android.content.Context; import android.util.Log; -import org.mozilla.geckoview.GeckoSessionSettings; import org.mozilla.vrbrowser.R; import org.mozilla.vrbrowser.VRBrowserApplication; import org.mozilla.vrbrowser.browser.Accounts; import org.mozilla.vrbrowser.browser.SettingsStore; +import org.mozilla.vrbrowser.browser.engine.Session; import org.mozilla.vrbrowser.telemetry.GleanMetricsService; import java.util.concurrent.CompletableFuture; @@ -88,10 +88,12 @@ private void signIn() { mAccounts.logoutAsync(); } else { - mAccounts.setLoginOrigin(mLoginOrigin); mWidgetManager.openNewTabForeground(url); - mWidgetManager.getFocusedWindow().getSession().loadUri(url); - mWidgetManager.getFocusedWindow().getSession().setUaMode(GeckoSessionSettings.USER_AGENT_MODE_VR); + Session currentSession = mWidgetManager.getFocusedWindow().getSession(); + String sessionId = currentSession != null ? currentSession.getId() : null; + + mAccounts.setOrigin(mLoginOrigin, sessionId); + GleanMetricsService.Tabs.openedCounter(GleanMetricsService.Tabs.TabSource.FXA_LOGIN); } 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 a79ffbacc..3336e9169 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 @@ -330,8 +330,12 @@ private void manageAccount() { mAccounts.logoutAsync(); } else { - mAccounts.setLoginOrigin(Accounts.LoginOrigin.SETTINGS); mWidgetManager.openNewTabForeground(url); + Session currentSession = mWidgetManager.getFocusedWindow().getSession(); + String sessionId = currentSession != null ? currentSession.getId() : null; + + mAccounts.setOrigin(Accounts.LoginOrigin.SETTINGS, sessionId); + GleanMetricsService.Tabs.openedCounter(GleanMetricsService.Tabs.TabSource.FXA_LOGIN); }