Skip to content

Commit a0cbad5

Browse files
authored
Feature/onboarding improvements (#486)
* Remove unused activity * Suppress lint warning * Add new onboarding page implementation * Remove redundant assets * Add new assets * Reorder elements on unified welcome screen * Update set default screen to match new designs * Add tests for onboarding logic * Add landscape version of default browser * Ensure continue button retains correct text across config changes * Behavioural differences between launching onboarding from settings * Add pixels for onboarding default browser * Code tidy * Code tidy * Code tidy * Removing unused resources * Update tooling * More centered view for unified welcome screen * Tidying up UI * Rollback to earlier material design version as this one crashes webview * Rollback AGP and gradle version to make testing easier * Replace vectors with PNGs (blurry on API 21) * Make buttons the same size * Update pixel value
1 parent cddd831 commit a0cbad5

File tree

81 files changed

+915
-677
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+915
-677
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,7 @@ captures/
4646
fastlane/report.xml
4747

4848
# Bitrise configuration
49-
bitrise.yml
49+
bitrise.yml
50+
51+
# NDK files
52+
**/.cxx

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,12 @@ android {
7878

7979
ext {
8080
androidX = "1.0.2"
81-
materialDesign = "1.0.0"
81+
materialDesign = "1.1.0-alpha05"
8282
architectureComponents = "1.1.1"
8383
architectureComponentsExtensions = "1.1.1"
8484
androidKtx = "1.0.1"
8585
fragmentKtx = "1.0.0"
86-
constraintLayout = "2.0.0-alpha3"
86+
constraintLayout = "2.0.0-beta1"
8787
lifecycle = "2.1.0-alpha04"
8888
room = "2.1.0-alpha05"
8989
workManager = "2.0.0"

app/src/androidTest/java/com/duckduckgo/app/onboarding/ui/OnboardingViewModelTest.kt

Lines changed: 64 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717
package com.duckduckgo.app.onboarding.ui
1818

1919
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
20+
import com.duckduckgo.app.browser.R
2021
import com.duckduckgo.app.browser.defaultbrowsing.DefaultBrowserDetector
2122
import com.duckduckgo.app.onboarding.store.OnboardingStore
2223
import com.nhaarman.mockitokotlin2.mock
2324
import com.nhaarman.mockitokotlin2.never
2425
import com.nhaarman.mockitokotlin2.verify
2526
import com.nhaarman.mockitokotlin2.whenever
26-
import org.junit.Assert.assertNull
27-
import org.junit.Assert.assertTrue
27+
import org.junit.Assert.*
2828
import org.junit.Rule
2929
import org.junit.Test
3030

@@ -50,29 +50,79 @@ class OnboardingViewModelTest {
5050
}
5151

5252
@Test
53-
fun whenFirstPageRequestedThenProtectDataReturned() {
54-
val page = testee.getItem(0)
55-
assertTrue(page is OnboardingPageFragment.ProtectDataPage)
53+
fun whenFreshInstallFirstPageRequestedThenUnifiedWelcomePageReturned() {
54+
val page = testee.getItem(0, isFreshAppInstall = true)
55+
assertTrue(page is OnboardingPageFragment.UnifiedWelcomePage)
5656
}
5757

5858
@Test
59-
fun whenSecondPageRequestedThenNoTracePageReturned() {
60-
val page = testee.getItem(1)
61-
assertTrue(page is OnboardingPageFragment.NoTracePage)
59+
fun whenNotFreshInstallFirstPageRequestedThenUnifiedWelcomePageReturned() {
60+
val page = testee.getItem(0, isFreshAppInstall = false)
61+
assertTrue(page is OnboardingPageFragment.UnifiedWelcomePage)
6262
}
6363

6464
@Test
65-
fun whenThirdPageRequestedWithDefaultBrowserCapableThenDefaultBrowserPageReturned() {
66-
whenever(mockDefaultBrowserDetector.deviceSupportsDefaultBrowserConfiguration()).thenReturn(true)
67-
val page = testee.getItem(2)
65+
fun whenFreshInstallSecondPageRequestedWithDefaultBrowserCapableThenDefaultBrowserPageReturned() {
66+
configureDeviceSupportsDefaultBrowser()
67+
val page = testee.getItem(1, isFreshAppInstall = true)
6868
assertTrue(page is OnboardingPageFragment.DefaultBrowserPage)
6969
}
7070

7171
@Test
72-
fun whenThirdPageRequestedButDefaultBrowserNotCapableThenNoPageReturned() {
73-
whenever(mockDefaultBrowserDetector.deviceSupportsDefaultBrowserConfiguration()).thenReturn(false)
74-
val page = testee.getItem(2)
72+
fun whenNotFreshInstallSecondPageRequestedWithDefaultBrowserCapableThenNoPageReturned() {
73+
configureDeviceSupportsDefaultBrowser()
74+
val page = testee.getItem(1, isFreshAppInstall = false)
75+
assertNull(page)
76+
}
77+
78+
@Test
79+
fun whenFreshInstallSecondPageRequestedButDefaultBrowserNotCapableThenNoPageReturned() {
80+
configureDeviceDoesNotSupportDefaultBrowser()
81+
val page = testee.getItem(1, isFreshAppInstall = true)
82+
assertNull(page)
83+
}
84+
85+
@Test
86+
fun whenNotFreshInstallSecondPageRequestedButDefaultBrowserNotCapableThenNoPageReturned() {
87+
configureDeviceDoesNotSupportDefaultBrowser()
88+
val page = testee.getItem(1, isFreshAppInstall = false)
7589
assertNull(page)
7690
}
7791

92+
@Test
93+
fun whenDefaultBrowserSupportedThenFirstPageShowsContinueTextOnButton() {
94+
configureDeviceSupportsDefaultBrowser()
95+
val resourceId = testee.getContinueButtonTextResourceId(0, isFreshAppInstall = true)
96+
assertEquals(R.string.onboardingContinue, resourceId)
97+
}
98+
99+
@Test
100+
fun whenFreshInstallDefaultBrowserNotSupportedThenFirstPageShowsFinalTextOnButton() {
101+
configureDeviceDoesNotSupportDefaultBrowser()
102+
val resourceId = testee.getContinueButtonTextResourceId(0, isFreshAppInstall = true)
103+
assertEquals(R.string.onboardingContinueFinalPage, resourceId)
104+
}
105+
106+
@Test
107+
fun whenNotFreshInstallDefaultBrowserSupportedThenFirstPageShowsBackTextOnButton() {
108+
configureDeviceSupportsDefaultBrowser()
109+
val resourceId = testee.getContinueButtonTextResourceId(0, isFreshAppInstall = false)
110+
assertEquals(R.string.onboardingBackButton, resourceId)
111+
}
112+
113+
@Test
114+
fun whenNotFreshInstallDefaultBrowserNotSupportedThenFirstPageShowsBackTextOnButton() {
115+
configureDeviceDoesNotSupportDefaultBrowser()
116+
val resourceId = testee.getContinueButtonTextResourceId(0, isFreshAppInstall = false)
117+
assertEquals(R.string.onboardingBackButton, resourceId)
118+
}
119+
120+
private fun configureDeviceSupportsDefaultBrowser() {
121+
whenever(mockDefaultBrowserDetector.deviceSupportsDefaultBrowserConfiguration()).thenReturn(true)
122+
}
123+
124+
private fun configureDeviceDoesNotSupportDefaultBrowser() {
125+
whenever(mockDefaultBrowserDetector.deviceSupportsDefaultBrowserConfiguration()).thenReturn(false)
126+
}
127+
78128
}

app/src/main/AndroidManifest.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,6 @@
132132
<activity
133133
android:name="com.duckduckgo.app.bookmarks.ui.BookmarksActivity"
134134
android:label="@string/bookmarksActivityTitle" />
135-
<activity
136-
android:name=".defaultbrowsing.DefaultBrowserInfoActivity"
137-
android:theme="@style/ModalCardTheme" />
138135
<activity
139136
android:name="com.duckduckgo.app.fire.FireActivity"
140137
android:process="@string/fireProcessName" />

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -503,11 +503,12 @@ class BrowserTabFragment : Fragment(), FindListener, CoroutineScope {
503503
}
504504

505505
private fun showAuthenticationDialog(request: BasicAuthenticationRequest) {
506-
val dialog = HttpAuthenticationDialogFragment.createHttpAuthenticationDialog(request.site)
507-
508-
dialog.show(activity?.supportFragmentManager, AUTHENTICATION_DIALOG_TAG)
509-
dialog.listener = viewModel
510-
dialog.request = request
506+
activity?.supportFragmentManager?.let { fragmentManager ->
507+
val dialog = HttpAuthenticationDialogFragment.createHttpAuthenticationDialog(request.site)
508+
dialog.show(fragmentManager, AUTHENTICATION_DIALOG_TAG)
509+
dialog.listener = viewModel
510+
dialog.request = request
511+
}
511512
}
512513

513514
private fun saveBasicAuthCredentials(request: BasicAuthenticationRequest, credentials: BasicAuthenticationCredentials) {

app/src/main/java/com/duckduckgo/app/browser/defaultbrowsing/DefaultBrowserInfoActivity.kt

Lines changed: 0 additions & 99 deletions
This file was deleted.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import android.webkit.CookieManager
2222
import com.duckduckgo.app.browser.*
2323
import com.duckduckgo.app.browser.addtohome.AddToHomeCapabilityDetector
2424
import com.duckduckgo.app.browser.addtohome.AddToHomeSystemCapabilityDetector
25-
import com.duckduckgo.app.browser.defaultbrowsing.DefaultBrowserObserver
2625
import com.duckduckgo.app.browser.defaultbrowsing.AndroidDefaultBrowserDetector
2726
import com.duckduckgo.app.browser.defaultbrowsing.DefaultBrowserDetector
27+
import com.duckduckgo.app.browser.defaultbrowsing.DefaultBrowserObserver
2828
import com.duckduckgo.app.browser.session.WebViewSessionInMemoryStorage
2929
import com.duckduckgo.app.browser.session.WebViewSessionStorage
3030
import com.duckduckgo.app.fire.DuckDuckGoCookieManager

app/src/main/java/com/duckduckgo/app/di/AndroidBindingModule.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import com.duckduckgo.app.bookmarks.ui.BookmarksActivity
2121
import com.duckduckgo.app.brokensite.BrokenSiteActivity
2222
import com.duckduckgo.app.browser.BrowserActivity
2323
import com.duckduckgo.app.browser.BrowserTabFragment
24-
import com.duckduckgo.app.browser.defaultbrowsing.DefaultBrowserInfoActivity
2524
import com.duckduckgo.app.browser.rating.ui.AppEnjoymentDialogFragment
2625
import com.duckduckgo.app.browser.rating.ui.GiveFeedbackDialogFragment
2726
import com.duckduckgo.app.browser.rating.ui.RateAppDialogFragment
@@ -111,10 +110,6 @@ abstract class AndroidBindingModule {
111110
@ContributesAndroidInjector
112111
abstract fun bookmarksActivity(): BookmarksActivity
113112

114-
@ActivityScoped
115-
@ContributesAndroidInjector
116-
abstract fun defaultBrowserInfoActivity(): DefaultBrowserInfoActivity
117-
118113
@ActivityScoped
119114
@ContributesAndroidInjector
120115
abstract fun fireActivity(): FireActivity

app/src/main/java/com/duckduckgo/app/launch/LaunchActivity.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616

1717
package com.duckduckgo.app.launch
1818

19-
import androidx.lifecycle.Observer
2019
import android.os.Bundle
20+
import androidx.lifecycle.Observer
2121
import com.duckduckgo.app.browser.BrowserActivity
2222
import com.duckduckgo.app.browser.R
2323
import com.duckduckgo.app.global.DuckDuckGoActivity
@@ -55,7 +55,7 @@ class LaunchActivity : DuckDuckGoActivity() {
5555
startActivity(BrowserActivity.intent(this))
5656

5757
if (showOnboarding) {
58-
startActivity(OnboardingActivity.intent(this))
58+
startActivity(OnboardingActivity.intent(this, isFreshAppInstall = true))
5959
}
6060

6161
finish()

app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingActivity.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package com.duckduckgo.app.onboarding.ui
1919
import android.content.Context
2020
import android.content.Intent
2121
import android.os.Bundle
22-
import android.view.View
2322
import androidx.annotation.ColorInt
2423
import androidx.core.content.ContextCompat
2524
import com.duckduckgo.app.browser.R
@@ -42,15 +41,15 @@ class OnboardingActivity : DuckDuckGoActivity() {
4241
override fun onCreate(savedInstanceState: Bundle?) {
4342
super.onCreate(savedInstanceState)
4443
setContentView(R.layout.activity_onboarding)
45-
configurePager()
44+
configurePager(intent.getBooleanExtra(IS_FRESH_INSTALL_EXTRA, true))
4645
}
4746

4847
override fun onResume() {
4948
updateColor(viewPageAdapter.color(this, viewPager.currentItem))
5049
super.onResume()
5150
}
5251

53-
fun onContinueClicked(view: View) {
52+
fun onContinueClicked() {
5453
val next = viewPager.currentItem + 1
5554
if (next < viewPager.adapter!!.count) {
5655
viewPager.setCurrentItem(next, true)
@@ -60,9 +59,9 @@ class OnboardingActivity : DuckDuckGoActivity() {
6059
}
6160
}
6261

63-
private fun configurePager() {
62+
private fun configurePager(isFreshAppInstall: Boolean) {
6463

65-
viewPageAdapter = PagerAdapter(supportFragmentManager, viewModel)
64+
viewPageAdapter = PagerAdapter(supportFragmentManager, viewModel, isFreshAppInstall)
6665
viewPager.adapter = viewPageAdapter
6766
val pageListener = ColorChangingPageListener(colorCombiner, object : NewColorListener {
6867
override fun update(@ColorInt color: Int) = updateColor(color)
@@ -80,8 +79,13 @@ class OnboardingActivity : DuckDuckGoActivity() {
8079
}
8180

8281
companion object {
83-
fun intent(context: Context): Intent {
84-
return Intent(context, OnboardingActivity::class.java)
82+
83+
private const val IS_FRESH_INSTALL_EXTRA = "IS_FRESH_INSTALL_EXTRA"
84+
85+
fun intent(context: Context, isFreshAppInstall: Boolean): Intent {
86+
val intent = Intent(context, OnboardingActivity::class.java)
87+
intent.putExtra(IS_FRESH_INSTALL_EXTRA, isFreshAppInstall)
88+
return intent
8589
}
8690
}
8791
}

0 commit comments

Comments
 (0)