8000 Merge branch 'release/5.7.5' · ArielOSProject/Android@685362a · GitHub
[go: up one dir, main page]

Skip to content

Commit 685362a

Browse files
committed
Merge branch 'release/5.7.5'
2 parents 6a30f4e + 95f12de commit 685362a

File tree

14 files changed

+261
-26
lines changed

14 files changed

+261
-26
lines changed

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ apply plugin: 'kotlin-kapt'
66
apply from: '../versioning.gradle'
77

88
ext {
9-
VERSION_NAME = "5.7.4"
9+
VERSION_NAME = "5.7.5"
1010
USE_ORCHESTRATOR = project.hasProperty('orchestrator') ? project.property('orchestrator') : false
1111
}
1212

app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import com.duckduckgo.app.browser.LongPressHandler.RequiredAction.OpenInNewTab
3434
import com.duckduckgo.app.browser.defaultBrowsing.DefaultBrowserDetector
3535
import com.duckduckgo.app.browser.defaultBrowsing.DefaultBrowserNotification
3636
import com.duckduckgo.app.browser.omnibar.OmnibarEntryConverter
37+
import com.duckduckgo.app.browser.session.WebViewSessionStorage
3738
import com.duckduckgo.app.global.db.AppConfigurationDao
3839
import com.duckduckgo.app.global.db.AppConfigurationEntity
3940
import com.duckduckgo.app.global.db.AppDatabase
@@ -110,6 +111,9 @@ class BrowserTabViewModelTest {
110111
@Mock
111112
private lateinit var tabsDao: TabsDao
112113

114+
@Mock
115+
private lateinit var webViewSessionStorage: WebViewSessionStorage
116+
113117
@Captor
114118
private lateinit var commandCaptor: ArgumentCaptor<Command>
115119

@@ -143,7 +147,8 @@ class BrowserTabViewModelTest {
143147
defaultBrowserNotification = mockDefaultBrowserNotification,
144148
defaultBrowserDetector = mockDefaultBrowserDetector,
145149
longPressHandler = mockLongPressHandler,
146-
appConfigurationDao = appConfigurationDao
150+
appConfigurationDao = appConfigurationDao,
151+
webViewSessionStorage = webViewSessionStorage
147152
)
148153

149154
testee.loadData("abc", null)
@@ -684,6 +689,40 @@ class BrowserTabViewModelTest {
684689
verify(mockCommandObserver, never()).onChanged(any())
685690
}
686691

692+
@Test
693+
fun whenWebSessionRestoredThenGlobalLayoutSwitchedToShowingBrowser() {
694+
testee.onWebSessionRestored()
695+
assertFalse(globalLayoutViewState().isNewTabState)
696+
}
697+
698+
@Test
699+
fun whenWebViewSessionIsToBeSavedThenUnderlyingSessionStoredCalled() {
700+
testee.saveWebViewState(null, "")
701+
verify(webViewSessionStorage).saveSession(anyOrNull(), anyString())
702+
}
703+
704+
@Test
705+
fun whenRestoringWebViewSessionNotRestorableThenPreviousUrlLoaded() {
706+
whenever(mockOmnibarConverter.convertQueryToUrl("foo.com")).thenReturn("foo.com")
707+
whenever(webViewSessionStorage.restoreSession(anyOrNull(), anyString())).thenReturn(false)
708+
testee.restoreWebViewState(null, "foo.com")
709+
assertEquals("foo.com", testee.url.value)
710+
}
711+
712+
@Test
713+
fun whenRestoringWebViewSessionNotRestorableAndNoPreviousUrlThenNoUrlLoaded() {
714+
whenever(webViewSessionStorage.restoreSession(anyOrNull(), anyString())).thenReturn(false)
715+
testee.restoreWebViewState(null, "")
716+
assertNull(testee.url.value)
717+
}
718+
719+
@Test
720+
fun whenWebViewSessionRestorableThenSessionRestored() {
721+
whenever(webViewSessionStorage.restoreSession(anyOrNull(), anyString())).thenReturn(true)
722+
testee.restoreWebViewState(null, "")
723+
assertFalse(globalLayoutViewState().isNewTabState)
724+
}
725+
687726
private fun captureCommands(): ArgumentCaptor<Command> {
688727
verify(mockCommandObserver, Mockito.atLeastOnce()).onChanged(commandCaptor.capture())
689728
return commandCaptor
@@ -694,4 +733,5 @@ class BrowserTabViewModelTest {
694733
private fun loadingViewState() = testee.loadingViewState.value!!
695734
private fun autoCompleteViewState() = testee.autoCompleteViewState.value!!
696735
private fun findInPageViewState() = testee.findInPageViewState.value!!
736+
private fun globalLayoutViewState() = testee.globalLayoutState.value!!
697737
}

app/src/androidTest/java/com/duckduckgo/app/browser/WebDataManagerTest.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import android.webkit.CookieManager
2323
import android.webkit.ValueCallback
2424
import android.webkit.WebStorage
2525
import android.webkit.WebView
26+
import com.duckduckgo.app.browser.session.WebViewSessionInMemoryStorage
2627
import com.nhaarman.mockito_kotlin.*
2728
import org.junit.Assert.assertTrue
2829
import org.junit.Test
@@ -36,7 +37,7 @@ class WebDataManagerTest {
3637

3738
private val mockStorage: WebStorage = mock()
3839

39-
private val testee = WebDataManager(host)
40+
private val testee = WebDataManager(host, WebViewSessionInMemoryStorage())
4041

4142
@UiThreadTest
4243
@Test
@@ -60,7 +61,7 @@ class WebDataManagerTest {
6061

6162
whenever(mockCookieManager.getCookie(host)).thenReturn("da=abc; dz=zyx")
6263
whenever(mockCookieManager.getCookie(externalHost)).thenReturn("ea=abc; ez=zyx")
63-
testee.clearExternalCookies(mockCookieManager, {})
64+
testee.clearExternalCookies(mockCookieManager) {}
6465

6566
val captor = argumentCaptor<ValueCallback<Boolean>>()
6667
verify(mockCookieManager).removeAllCookies(captor.capture())

app/src/androidTest/java/com/duckduckgo/app/tabs/ui/TabSwitcherViewModelTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package com.duckduckgo.app.tabs.ui
1919
import android.arch.core.executor.testing.InstantTaskExecutorRule
2020
import android.arch.lifecycle.Observer
2121
import com.duckduckgo.app.browser.R
22+
import com.duckduckgo.app.browser.session.WebViewSessionInMemoryStorage
2223
import com.duckduckgo.app.tabs.model.TabEntity
2324
import com.duckduckgo.app.tabs.model.TabRepository
2425
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command
@@ -53,7 +54,7 @@ class TabSwitcherViewModelTest {
5354
fun before() {
5455
MockitoAnnotations.initMocks(this)
5556
whenever(mockTabRepository.add()).thenReturn("TAB_ID")
56-
testee = TabSwitcherViewModel(mockTabRepository)
57+
testee = TabSwitcherViewModel(mockTabRepository, WebViewSessionInMemoryStorage())
5758
testee.command.observeForever(mockCommandObserver)
5859
}
5960

app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ class BrowserActivity : DuckDuckGoActivity() {
4545
@Inject
4646
lateinit var viewModelFactory: ViewModelFactory
4747

48+
@Inject
49+
lateinit var webDataManager: WebDataManager
50+
4851
private var currentTab: BrowserTabFragment? = null
4952

5053
private val viewModel: BrowserViewModel by lazy {
@@ -168,6 +171,7 @@ class BrowserActivity : DuckDuckGoActivity() {
168171

169172
fun launchFire() {
170173
FireDialog(context = this,
174+
webDataManager = webDataManager,
171175
clearStarted = { viewModel.onClearRequested() },
172176
clearComplete = { viewModel.onClearComplete() }
173177
).show()

app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import com.duckduckgo.app.browser.downloader.FileDownloader
6060
import com.duckduckgo.app.browser.downloader.FileDownloader.PendingFileDownload
6161
import com.duckduckgo.app.browser.filechooser.FileChooserIntentBuilder
6262
import com.duckduckgo.app.browser.omnibar.KeyboardAwareEditText
63+
import com.duckduckgo.app.browser.session.WebViewSessionStorage
6364
import com.duckduckgo.app.browser.useragent.UserAgentProvider
6465
import com.duckduckgo.app.global.ViewModelFactory
6566
import com.duckduckgo.app.global.view.*
@@ -104,6 +105,9 @@ class BrowserTabFragment : Fragment(), FindListener {
104105
@Inject
105106
lateinit var fileDownloadNotificationManager: FileDownloadNotificationManager
106107

108+
@Inject
109+
lateinit var webViewSessionStorage: WebViewSessionStorage
110+
107111
val tabId get() = arguments!![TAB_ID_ARG] as String
108112

109113
private val initialUrl get() = arguments!![URL_EXTRA_ARG] as String?
@@ -591,14 +595,19 @@ class BrowserTabFragment : Fragment(), FindListener {
591595
}
592596
}
593597

598+
/**
599+
* Attempting to save the WebView's state can result in a TransactionTooLargeException being thrown.
600+
* This will only happen if the bundle size is too large - but the exact size is undefined.
601+
* Instead of saving using normal Android state mechanism - use our own implementation instead.
602+
*/
594603
override fun onSaveInstanceState(bundle: Bundle) {
595-
webView?.saveState(bundle)
604+
viewModel.saveWebViewState(webView, tabId)
596605
super.onSaveInstanceState(bundle)
597606
}
598607

599608
override fun onViewStateRestored(bundle: Bundle?) {
609+
viewModel.restoreWebViewState(webView, omnibarTextInput.text.toString())
600610
super.onViewStateRestored(bundle)
601-
webView?.restoreState(bundle)
602611
}
603612

604613
override fun onHiddenChanged(hidden: Boolean) {
@@ -827,6 +836,8 @@ class BrowserTabFragment : Fragment(), FindListener {
827836

828837
fun renderGlobalViewState(viewState: GlobalLayoutViewState) {
829838
renderIfChanged(viewState, lastSeenGlobalViewState) {
839+
lastSeenGlobalViewState = viewState
840+
830841
if (viewState.isNewTabState) {
831842
newTabLayout.show()
832843
browserLayout.hide()

app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import com.duckduckgo.app.browser.LongPressHandler.RequiredAction
4141
import com.duckduckgo.app.browser.defaultBrowsing.DefaultBrowserDetector
4242
import com.duckduckgo.app.browser.defaultBrowsing.DefaultBrowserNotification
4343
import com.duckduckgo.app.browser.omnibar.OmnibarEntryConverter
44+
import com.duckduckgo.app.browser.session.WebViewSessionStorage
4445
import com.duckduckgo.app.global.SingleLiveEvent
4546
import com.duckduckgo.app.global.db.AppConfigurationDao
4647
import com.duckduckgo.app.global.db.AppConfigurationEntity
@@ -77,6 +78,7 @@ class BrowserTabViewModel(
7778
private val defaultBrowserDetector: DefaultBrowserDetector,
7879
private val defaultBrowserNotification: DefaultBrowserNotification,
7980
private val longPressHandler: LongPressHandler,
81+
private val webViewSessionStorage: WebViewSessionStorage,
8082
appConfigurationDao: AppConfigurationDao
8183
) : WebViewClientListener, SaveBookmarkListener, ViewModel() {
8284

@@ -508,6 +510,10 @@ class BrowserTabViewModel(
508510
numberMatches = numberOfMatches)
509511
}
510512

513+
fun onWebSessionRestored() {
514+
globalLayoutState.value = GlobalLayoutViewState(isNewTabState = false)
515+
}
516+
511517
fun desktopSiteModeToggled(urlString: String?, desktopSiteRequested: Boolean) {
512518
val currentBrowserViewState = currentBrowserViewState()
513519
browserViewState.value = currentBrowserViewState.copy(isDesktopBrowsingMode = desktopSiteRequested)
@@ -559,6 +565,23 @@ class BrowserTabViewModel(
559565
val currentDefaultBrowserViewState = currentDefaultBrowserViewState()
560566
defaultBrowserViewState.value = currentDefaultBrowserViewState.copy(showHomeScreenCallToActionButton = false)
561567
}
568+
569+
fun saveWebViewState(webView: WebView?, tabId: String) {
570+
webViewSessionStorage.saveSession(webView, tabId)
571+
}
572+
573+
fun restoreWebViewState(webView: WebView?, lastUrl: String) {
574+
val sessionRestored = webViewSessionStorage.restoreSession(webView, tabId)
575+
if (sessionRestored) {
576+
Timber.v("Successfully restored session")
577+
onWebSessionRestored()
578+
} else {
579+
if (lastUrl.isNotBlank()) {
580+
Timber.w("Restoring last url but page history has been lost - url=[$lastUrl]")
581+
onUserSubmittedQuery(lastUrl)
582+
}
583+
}
584+
}
562585
}
563586

564587

app/src/main/java/com/duckduckgo/app/browser/WebDataManager.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ import android.webkit.CookieManager
2222
import android.webkit.WebStorage
2323
import android.webkit.WebView
2424
import android.webkit.WebViewDatabase
25+
import com.duckduckgo.app.browser.session.WebViewSessionStorage
2526

26-
class WebDataManager(private val host: String) {
27+
class WebDataManager(private val host: String, private val webViewSessionStorage: WebViewSessionStorage) {
2728

2829
fun clearData(webView: WebView, webStorage: WebStorage, context: Context) {
2930
webView.clearCache(true)
@@ -53,4 +54,8 @@ class WebDataManager(private val host: String) {
5354
clearAllCallback()
5455
}
5556
}
57+
58+
fun clearWebViewSessions() {
59+
webViewSessionStorage.deleteAllSessions()
60+
}
5661
}

app/src/main/java/com/duckduckgo/app/browser/di/BrowserModule.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,15 @@ import android.content.Context
2020
import com.duckduckgo.app.browser.*
2121
import com.duckduckgo.app.browser.defaultBrowsing.AndroidDefaultBrowserDetector
2222
import com.duckduckgo.app.browser.defaultBrowsing.DefaultBrowserDetector
23+
import com.duckduckgo.app.browser.session.WebViewSessionInMemoryStorage
24+
import com.duckduckgo.app.browser.session.WebViewSessionStorage
25+
import com.duckduckgo.app.global.AppUrl
2326
import com.duckduckgo.app.global.install.AppInstallStore
2427
import com.duckduckgo.app.statistics.VariantManager
2528
import com.duckduckgo.app.statistics.store.StatisticsDataStore
2629
import dagger.Module
2730
import dagger.Provides
31+
import javax.inject.Singleton
2832

2933
@Module
3034
class BrowserModule {
@@ -47,4 +51,12 @@ class BrowserModule {
4751
fun defaultWebBrowserCapability(context: Context, appInstallStore: AppInstallStore): DefaultBrowserDetector {
4852
return AndroidDefaultBrowserDetector(context, appInstallStore)
4953
}
54+
55+
@Singleton
56+
@Provides
57+
fun webViewSessionStorage(): WebViewSessionStorage = WebViewSessionInMemoryStorage()
58+
59+
@Singleton
60+
@Provides
61+
fun webDataManager(webViewSessionStorage: WebViewSessionStorage) = WebDataManager(AppUrl.Url.HOST, webViewSessionStorage)
5062
}

0 commit comments

Comments
 (0)
0