Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
321a213
WIP feedback disambiguation redesign
CDRussell Feb 14, 2019
1e2dd84
WIP updates to feedback UI
CDRussell Feb 15, 2019
80897a2
WIP build feedback disambiguation screens
CDRussell Mar 11, 2019
e4a8222
Further work to add feedback disambiguation
CDRussell Mar 13, 2019
4b7d47f
All copy in working order across the screens
CDRussell Mar 13, 2019
4a69c2d
Add broken site feedback flow
CDRussell Mar 14, 2019
3789943
Tidy up of feedback fragment code
CDRussell Mar 14, 2019
46eb96e
Simplify feedback list decorator
CDRussell Mar 14, 2019
df52c2d
Merge branch 'develop' of github.com:duckduckgo/Android into feature/…
CDRussell Mar 15, 2019
dd05a58
Fix tests
CDRussell Mar 15, 2019
b59f3e6
Add dark theme
CDRussell Mar 18, 2019
42fe3db
Skip the positive landing screen if can't rate; add dark theme buttons
CDRussell Mar 18, 2019
7bd28f6
UI polish after design review
CDRussell Mar 19, 2019
312525e
Tweaking layout
CDRussell Mar 20, 2019
7d1ce57
Add scroll hack to ensure submit button visible if possible
CDRussell Mar 20, 2019
38a1783
Start integration with server for submitting feedback
CDRussell Mar 20, 2019
e0efb7e
Send feedback and broken site reports, along with pixel for some cases
CDRussell Mar 21, 2019
6dc76c2
Consolidated broken site and feedback services
CDRussell Mar 21, 2019
d1132b9
Add missing subreason for autocomplete
CDRussell Mar 21, 2019
e5e25cf
Merge branch 'develop' of github.com:duckduckgo/Android into feature/…
CDRussell Mar 21, 2019
25f5f7e
Remove experiment inline class usage
CDRussell Mar 21, 2019
a855a03
Adding tests for the navigation flow
CDRussell Mar 22, 2019
1805709
Remove ATB variant from version param
CDRussell Mar 22, 2019
0d02230
Code tidy
CDRussell Mar 22, 2019
b868bac
Only submit reason "broken_site" for legacy broken site dialog
CDRussell Mar 22, 2019
ef45bc3
Merge branch 'develop' of github.com:duckduckgo/Android into feature/…
CDRussell Mar 22, 2019
d65e996
Add adjustResize param to allow submit button to appear above keyboard
CDRussell Mar 22, 2019
2a36a96
Fix case of string
CDRussell Mar 22, 2019
950f390
Cody tidy
CDRussell Mar 22, 2019
bc1548e
Code tidy
CDRussell Mar 22, 2019
5821d19
code tidy
CDRussell Mar 22, 2019
e6842b3
Remove dispatcher provider attempt (hard to reason about)
CDRussell Mar 25, 2019
524cda2
Upgrade to latest stable WorkManager
CDRussell Mar 25, 2019
00e0806
Remove empty string check to make inline with iOS
CDRussell Mar 25, 2019
23d417f
Code tidy
CDRussell Mar 25, 2019
87b77a8
Code tidy
CDRussell Mar 25, 2019
9faa689
Fix memory leak
CDRussell Mar 25, 2019
581d7d9
Update api call to include broken site reason
CDRussell Mar 25, 2019
c11c073
Update legacy broken site dialog to be only about broken sites
CDRussell Mar 27, 2019
d9b118b
Code tidy from PR feedback
CDRussell Mar 27, 2019
44fd81a
Remove unused assets
CDRussell Mar 27, 2019
636c564
Move all survey-related classes to the survey package
CDRussell Mar 27, 2019
ff7ec32
Change from doOnPreDraw to doOnNextLayout to fix multi-window crash
CDRussell Mar 27, 2019
4cb7303
Switch to if statement instead of a when with a single item in it
CDRussell Mar 27, 2019
e06a3d3
Add intent flag required to launch Play Store from non-activity context
CDRussell Mar 27, 2019
20183e1
Make cornflower blue the default accent color for the whole app
CDRussell Mar 27, 2019
02fe291
Merge branch 'develop' of github.com:duckduckgo/Android into feature/…
CDRussell Mar 27, 2019
9832d5d
Fixing lint warnings
CDRussell Mar 28, 2019
2874ca2
Dismiss keyboard when transitioning away from a keyboard-using fragment
CDRussell Mar 28, 2019
000a899
Switch from postValue to set value to try fix flakey test
CDRussell Mar 28, 2019
9af7afe
Ensure UI methods are called from the Main thread
CDRussell Mar 28, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -78,14 +78,15 @@ android {

ext {
androidX = "1.0.2"
materialDesign = "1.1.0-alpha02"
materialDesign = "1.0.0"
architectureComponents = "1.1.1"
architectureComponentsExtensions = "1.1.1"
androidKtx = "1.0.1"
fragmentKtx = "1.0.0"
constraintLayout = "2.0.0-alpha3"
lifecycle = "2.0.0"
room = "2.1.0-alpha04"
workManager = "1.0.0-beta03"
room = "2.1.0-alpha05"
workManager = "2.0.0"
legacySupport = "1.0.0"
espressoCore = "3.1.1"
coreTesting = "2.0.0"
Expand All @@ -101,7 +102,7 @@ ext {
okHttp = "3.10.0"
rxJava = "2.1.10"
rxAndroid = "2.0.2"
timber = "4.6.1"
timber = "4.7.1"
rxRelay = "2.0.0"
leakCanary = "1.6.2"
mockito = "2.18.3"
Expand All @@ -112,6 +113,8 @@ ext {

dependencies {
implementation "androidx.legacy:legacy-support-v4:$legacySupport"
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0-beta01'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.0.0'
debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakCanary"
releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:$leakCanary"

Expand All @@ -124,6 +127,7 @@ dependencies {
implementation "com.squareup.retrofit2:retrofit:$retrofit"
implementation "com.squareup.retrofit2:converter-moshi:$retrofit"
implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofit"
implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
implementation "io.reactivex.rxjava2:rxjava:$rxJava"
implementation "io.reactivex.rxjava2:rxandroid:$rxAndroid"
implementation "com.jakewharton.timber:timber:$timber"
Expand All @@ -139,6 +143,7 @@ dependencies {

// Android KTX
implementation "androidx.core:core-ktx:$androidKtx"
implementation "androidx.fragment:fragment-ktx:$fragmentKtx"

// ViewModel and LiveData
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle"
Expand All @@ -153,7 +158,7 @@ dependencies {
androidTestImplementation "androidx.room:room-testing:$room"

// WorkManager
implementation "android.arch.work:work-runtime-ktx:$workManager"
implementation "androidx.work:work-runtime-ktx:$workManager"

// Dagger
kapt "com.google.dagger:dagger-android-processor:$dagger"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import com.duckduckgo.app.browser.omnibar.OmnibarEntryConverter
import com.duckduckgo.app.browser.session.WebViewSessionStorage
import com.duckduckgo.app.cta.db.DismissedCtaDao
import com.duckduckgo.app.cta.ui.CtaViewModel
import com.duckduckgo.app.feedback.db.SurveyDao
import com.duckduckgo.app.survey.db.SurveyDao
import com.duckduckgo.app.global.db.AppConfigurationDao
import com.duckduckgo.app.global.db.AppConfigurationEntity
import com.duckduckgo.app.global.db.AppDatabase
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ import com.duckduckgo.app.InstantSchedulersRule
import com.duckduckgo.app.cta.db.DismissedCtaDao
import com.duckduckgo.app.cta.model.CtaId
import com.duckduckgo.app.cta.model.DismissedCta
import com.duckduckgo.app.feedback.db.SurveyDao
import com.duckduckgo.app.feedback.model.Survey
import com.duckduckgo.app.feedback.model.Survey.Status.SCHEDULED
import com.duckduckgo.app.global.db.AppDatabase
import com.duckduckgo.app.global.install.AppInstallStore
import com.duckduckgo.app.statistics.pixels.Pixel
import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.*
import com.duckduckgo.app.survey.db.SurveyDao
import com.duckduckgo.app.survey.model.Survey
import com.duckduckgo.app.survey.model.Survey.Status.SCHEDULED
import com.duckduckgo.app.widget.ui.WidgetCapabilities
import com.nhaarman.mockitokotlin2.any
import com.nhaarman.mockitokotlin2.eq
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
package com.duckduckgo.app.feedback.ui

import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.lifecycle.Observer
import com.duckduckgo.app.InstantSchedulersRule
import com.duckduckgo.app.brokensite.BrokenSiteViewModel
import com.duckduckgo.app.brokensite.BrokenSiteViewModel.Command
import com.duckduckgo.app.brokensite.api.BrokenSiteSender
import com.nhaarman.mockitokotlin2.any
import com.nhaarman.mockitokotlin2.never
import com.nhaarman.mockitokotlin2.verify
import org.junit.After
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mockito.Mock
import org.mockito.MockitoAnnotations

class BrokenSiteViewModelTest {

@get:Rule
@Suppress("unused")
var instantTaskExecutorRule = InstantTaskExecutorRule()

@get:Rule
@Suppress("unused")
val schedulers = InstantSchedulersRule()

@Mock
private lateinit var mockBrokenSiteSender: BrokenSiteSender

@Mock
private lateinit var mockCommandObserver: Observer<BrokenSiteViewModel.Command>

private lateinit var testee: BrokenSiteViewModel

private val viewState: BrokenSiteViewModel.ViewState
get() = testee.viewState.value!!

@Before
fun before() {
MockitoAnnotations.initMocks(this)
testee = BrokenSiteViewModel(mockBrokenSiteSender)
testee.command.observeForever(mockCommandObserver)
}

@After
fun after() {
testee.command.removeObserver(mockCommandObserver)
}

@Test
fun whenInitializedThenCannotSubmit() {
assertFalse(viewState.submitAllowed)
}

@Test
fun whenNoUrlProvidedThenUrlFocused() {
testee.setInitialBrokenSite(null)
verify(mockCommandObserver).onChanged(Command.FocusUrl)
}

@Test
fun whenUrlProvidedThenMessageFocused() {
testee.setInitialBrokenSite(url)
verify(mockCommandObserver).onChanged(Command.FocusMessage)
}

@Test
fun whenUrlAndMessageNotEmptyThenCanSubmit() {
testee.onBrokenSiteUrlChanged(url)
testee.onFeedbackMessageChanged(message)
assertTrue(viewState.submitAllowed)
}

@Test
fun whenNullUrlThenCannotSubmit() {
testee.onBrokenSiteUrlChanged(null)
testee.onFeedbackMessageChanged(message)
assertFalse(viewState.submitAllowed)
}

@Test
fun whenEmptyUrlThenCannotSubmit() {
testee.onBrokenSiteUrlChanged(" ")
testee.onFeedbackMessageChanged(message)
assertFalse(viewState.submitAllowed)
}

@Test
fun whenNullMessageThenCannotSubmit() {
testee.onBrokenSiteUrlChanged(url)
testee.onFeedbackMessageChanged(null)
assertFalse(viewState.submitAllowed)
}

@Test
fun whenEmptyMessageThenCannotSubmit() {
testee.onBrokenSiteUrlChanged(url)
testee.onFeedbackMessageChanged(" ")
assertFalse(viewState.submitAllowed)
}

@Test
fun whenCanSubmitBrokenSiteAndSubmitPressedThenFeedbackSubmitted() {
testee.onBrokenSiteUrlChanged(url)
testee.onFeedbackMessageChanged(message)
testee.onSubmitPressed()

verify(mockBrokenSiteSender).submitBrokenSiteFeedback(message, url)
verify(mockCommandObserver).onChanged(Command.ConfirmAndFinish)
}

@Test
fun whenCannotSubmitBrokenSiteAndSubmitPressedThenFeedbackNotSubmitted() {
testee.onSubmitPressed()
verify(mockBrokenSiteSender, never()).submitBrokenSiteFeedback(any(), any())
verify(mockCommandObserver, never()).onChanged(Command.ConfirmAndFinish)
}

companion object Constants {
private const val url = "http://example.com"
private const val message = "Feedback message"
}

}

This file was deleted.

Loading