diff --git a/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/Session.java b/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/Session.java index 1f702e1bc..b33a30603 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/Session.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/Session.java @@ -91,7 +91,6 @@ public class Session implements ContentBlocking.Delegate, GeckoSession.Navigatio private transient byte[] mPrivatePage; private transient boolean mFirstContentfulPaint; private transient long mKeepAlive; - private transient boolean mSessionRemoved; public interface BitmapChangedListener { void onBitmapChanged(Session aSession, Bitmap aBitmap); @@ -110,19 +109,39 @@ public interface DrmStateChangedListener { } @IntDef(value = { SESSION_OPEN, SESSION_DO_NOT_OPEN}) - public @interface SessionOpenModeFlags {} - public static final int SESSION_OPEN = 0; - public static final int SESSION_DO_NOT_OPEN = 1; + @interface SessionOpenModeFlags {} + static final int SESSION_OPEN = 0; + static final int SESSION_DO_NOT_OPEN = 1; - protected Session(Context aContext, GeckoRuntime aRuntime, - @NonNull SessionSettings aSettings) { + @NonNull + static Session createSession(Context aContext, GeckoRuntime aRuntime, @NonNull SessionSettings aSettings, @Session.SessionOpenModeFlags int aOpenMode, @NonNull SessionChangeListener listener) { + Session session = new Session(aContext, aRuntime, aSettings); + session.addSessionChangeListener(listener); + listener.onSessionAdded(session); + if (aOpenMode == Session.SESSION_OPEN) { + session.openSession(); + session.setActive(true); + } + + return session; + } + + @NonNull + static Session createSuspendedSession(Context aContext, GeckoRuntime aRuntime, @NonNull SessionState aRestoreState, @NonNull SessionChangeListener listener) { + Session session = new Session(aContext, aRuntime, aRestoreState); + session.addSessionChangeListener(listener); + + return session; + } + + private Session(Context aContext, GeckoRuntime aRuntime, @NonNull SessionSettings aSettings) { mContext = aContext; mRuntime = aRuntime; initialize(); - mState = createSession(aSettings); + mState = createSessionState(aSettings); } - protected Session(Context aContext, GeckoRuntime aRuntime, @NonNull SessionState aRestoreState) { + private Session(Context aContext, GeckoRuntime aRuntime, @NonNull SessionState aRestoreState) { mContext = aContext; mRuntime = aRuntime; initialize(); @@ -159,8 +178,8 @@ private void initialize() { protected void shutdown() { if (mState.mSession != null) { - closeSession(mState); - mState.mSession = null; + setActive(false); + suspend(); } if (mState.mParentId != null) { @@ -170,13 +189,6 @@ protected void shutdown() { } } - if (!mSessionRemoved) { - mSessionChangeListeners.forEach(listener -> { - listener.onSessionRemoved(mState.mId); - }); - mSessionRemoved = true; - } - mQueuedCalls.clear(); mNavigationListeners.clear(); mProgressListeners.clear(); @@ -430,6 +442,8 @@ public void suspend() { return; } + mSessionChangeListeners.forEach(listener -> listener.onSessionRemoved(mState.mId)); + Log.d(LOGTAG, "Suspending Session: " + mState.mId); closeSession(mState); mState.mSession = null; @@ -470,12 +484,7 @@ private void restore() { mState.mSession = createGeckoSession(settings); - // We call restore when a session is first activated and when it's recreated. - // We only need to notify of the session creation if it's not a recreation. - if (mSessionRemoved) { - mSessionChangeListeners.forEach(listener -> listener.onSessionAdded(this)); - mSessionRemoved = false; - } + mSessionChangeListeners.forEach(listener -> listener.onSessionAdded(this)); openSession(); @@ -498,7 +507,7 @@ private void restore() { } - private SessionState createSession(@NonNull SessionSettings aSettings) { + private SessionState createSessionState(@NonNull SessionSettings aSettings) { SessionState state = new SessionState(); state.mSettings = aSettings; state.mSession = createGeckoSession(aSettings); @@ -541,6 +550,8 @@ void recreateSession() { mState = mState.recreate(); + mSessionChangeListeners.forEach(listener -> listener.onSessionRemoved(mState.mId)); + restore(); for (SessionChangeListener listener: mSessionChangeListeners) { @@ -563,9 +574,7 @@ void openSession() { mState.mSession.open(mRuntime); } - mSessionChangeListeners.forEach(listener -> { - listener.onSessionOpened(this); - }); + mSessionChangeListeners.forEach(listener -> listener.onSessionOpened(this)); } private void closeSession(@NonNull SessionState aState) { @@ -804,6 +813,7 @@ public void setActive(boolean aActive) { } else if (aActive) { restore(); + } else { Log.e(LOGTAG, "ERROR: Setting null GeckoView to inactive!"); } @@ -867,7 +877,7 @@ public void toggleServo() { .withServo(!isInstanceOfServoSession(mState.mSession)) .build(); - mState = createSession(settings); + mState = createSessionState(settings); openSession(); closeSession(previous); diff --git a/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/SessionStore.java b/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/SessionStore.java index ffb87e2fc..1f06fd75f 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/SessionStore.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/SessionStore.java @@ -2,7 +2,6 @@ import android.content.Context; import android.content.res.Configuration; -import android.os.Bundle; import android.util.Log; import android.util.Pair; @@ -149,12 +148,21 @@ public void onTrackingProtectionLevelUpdated(int level) { if (BuildConfig.DEBUG) { mStoreSubscription = ComponentsAdapter.get().getStore().observeManually(browserState -> { Log.d(LOGTAG, "Session status BEGIN"); + Log.d(LOGTAG, "[Total] BrowserStore: " + browserState.getTabs().size() + ", SessionStore: " + mSessions.size()); for (int i=0; i