From 41c29eae50d8e4eb6409fce9d41d92307f2b63be Mon Sep 17 00:00:00 2001 From: yasincidem Date: Mon, 21 Dec 2020 18:19:38 +0300 Subject: [PATCH 01/15] Fixed flicking clock dial on Time Picker --- .../backend/views/question_parts/TimePickerPart.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/question_parts/TimePickerPart.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/question_parts/TimePickerPart.kt index cacb717..af9f244 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/question_parts/TimePickerPart.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/question_parts/TimePickerPart.kt @@ -74,6 +74,14 @@ internal class TimePickerPart @JvmOverloads constructor( //endregion + override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { + if (ev?.actionMasked == MotionEvent.ACTION_DOWN) { + val p = parent + p?.requestDisallowInterceptTouchEvent(true) + } + return false + } + init { this.gravity = Gravity.CENTER From 2c61d5453f337a87874778475c5845c5c500fd3e Mon Sep 17 00:00:00 2001 From: yasincidem Date: Thu, 24 Dec 2020 15:40:27 +0300 Subject: [PATCH 02/15] redundant variable removed --- .../backend/views/question_parts/TimePickerPart.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/question_parts/TimePickerPart.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/question_parts/TimePickerPart.kt index af9f244..bf3dcf8 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/question_parts/TimePickerPart.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/question_parts/TimePickerPart.kt @@ -4,6 +4,7 @@ import android.content.Context import android.os.Build import android.util.AttributeSet import android.view.Gravity +import android.view.MotionEvent import android.widget.LinearLayout import android.widget.TimePicker import com.quickbirdstudios.surveykit.R @@ -74,11 +75,9 @@ internal class TimePickerPart @JvmOverloads constructor( //endregion - override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { - if (ev?.actionMasked == MotionEvent.ACTION_DOWN) { - val p = parent - p?.requestDisallowInterceptTouchEvent(true) - } + override fun onInterceptTouchEvent(motionEvent: MotionEvent?): Boolean { + if (motionEvent?.actionMasked == MotionEvent.ACTION_DOWN) + parent?.requestDisallowInterceptTouchEvent(true) return false } From b1a678bca254c7b79650b19b0be05408d71eb1ff Mon Sep 17 00:00:00 2001 From: Klaus Niedermair Date: Fri, 8 Jan 2021 17:29:28 +0100 Subject: [PATCH 03/15] develop: v2.0.0-alpha --- buildSrc/src/main/kotlin/Library.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Library.kt b/buildSrc/src/main/kotlin/Library.kt index 57422b1..b7ab093 100644 --- a/buildSrc/src/main/kotlin/Library.kt +++ b/buildSrc/src/main/kotlin/Library.kt @@ -1,7 +1,7 @@ object Library { const val groupId = "com.quickbirdstudios" const val artifactId = "surveykit" - const val version = "1.1.0" + const val version = "2.0.0-alpha" object Meta { const val gitUrl = "https://github.com/quickbirdstudios/SurveyKit" From 65d16fcecc0d88c98362289f61c306a986719afd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marvin=20M=C3=A4rz?= Date: Mon, 8 Feb 2021 13:47:18 +0100 Subject: [PATCH 04/15] Added recording of done steps to OrderedTaskNavigator.kt and added a helper method to check if the current step has a previous one. --- .../navigator/NavigableOrderedTaskNavigator.kt | 6 ------ .../backend/navigator/OrderedTaskNavigator.kt | 5 ++++- .../backend/navigator/TaskNavigator.kt | 11 +++++++++++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/navigator/NavigableOrderedTaskNavigator.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/navigator/NavigableOrderedTaskNavigator.kt index e1379bf..895cdd6 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/navigator/NavigableOrderedTaskNavigator.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/navigator/NavigableOrderedTaskNavigator.kt @@ -48,12 +48,6 @@ internal class NavigableOrderedTaskNavigator( //region Private Helper - private fun Step?.record() { - if (this != null) { - history.push(this) - } - } - private fun Step.extractRule(): NavigationRule? = task.getRule(this.id) private fun NavigationRule.DirectStepNavigationRule.evaluateNextStep() = diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/navigator/OrderedTaskNavigator.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/navigator/OrderedTaskNavigator.kt index 032950f..ad5758f 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/navigator/OrderedTaskNavigator.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/navigator/OrderedTaskNavigator.kt @@ -21,7 +21,10 @@ internal class OrderedTaskNavigator( override fun finalStep(): Step? = task.steps.lastOrNull() - override fun nextStep(step: Step, stepResult: StepResult?): Step? = step.nextInList() + override fun nextStep(step: Step, stepResult: StepResult?): Step? { + step.record() + return step.nextInList() + } override fun previousStep(step: Step): Step? = step.previousInList() diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/navigator/TaskNavigator.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/navigator/TaskNavigator.kt index 0ec92d6..c9ae681 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/navigator/TaskNavigator.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/navigator/TaskNavigator.kt @@ -34,6 +34,17 @@ interface TaskNavigator { return history.peek() } + fun hasPreviousStep() : Boolean { + val previousStep = peekHistory() + return previousStep != null + } + + fun Step?.record() { + if (this != null) { + history.push(this) + } + } + companion object { operator fun invoke(task: Task): TaskNavigator = when (task) { From ad6aea0818829c0d29ebab2368c8fc4849abb2e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marvin=20M=C3=A4rz?= Date: Mon, 8 Feb 2021 13:50:32 +0100 Subject: [PATCH 05/15] Added tests to check the indented behavior of the "hasPreviousStep" method --- .../test/TaskNavigatorTest.kt | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 survey/src/test/java/com/quickbirdstudios/test/TaskNavigatorTest.kt diff --git a/survey/src/test/java/com/quickbirdstudios/test/TaskNavigatorTest.kt b/survey/src/test/java/com/quickbirdstudios/test/TaskNavigatorTest.kt new file mode 100644 index 0000000..73cf12b --- /dev/null +++ b/survey/src/test/java/com/quickbirdstudios/test/TaskNavigatorTest.kt @@ -0,0 +1,53 @@ +package com.quickbirdstudios.test + +import com.quickbirdstudios.surveykit.AnswerFormat +import com.quickbirdstudios.surveykit.NavigableOrderedTask +import com.quickbirdstudios.surveykit.OrderedTask +import com.quickbirdstudios.surveykit.backend.navigator.NavigableOrderedTaskNavigator +import com.quickbirdstudios.surveykit.backend.navigator.OrderedTaskNavigator +import com.quickbirdstudios.surveykit.backend.navigator.TaskNavigator +import com.quickbirdstudios.surveykit.steps.QuestionStep +import org.junit.Assert +import org.junit.Test + +class TaskNavigatorTest { + @Test + fun testHasNoPreviousStep() { + val firstQuestion = randomQuestionStep() + val secondQuestion = randomQuestionStep() + val thirdQuestion = randomQuestionStep() + val taskNavigator = createTaskImplementations(listOf(firstQuestion,secondQuestion,thirdQuestion)) + + for(nav in taskNavigator) { + nav.startStep(null) + Assert.assertFalse(nav.hasPreviousStep()) + } + } + + @Test + fun testHasPreviousStep() { + val firstQuestion = randomQuestionStep() + val secondQuestion = randomQuestionStep() + val thirdQuestion = randomQuestionStep() + val taskNavigator = createTaskImplementations(listOf(firstQuestion,secondQuestion,thirdQuestion)) + + for(nav in taskNavigator) { + nav.startStep(null) + nav.nextStep(thirdQuestion) + Assert.assertTrue(nav.hasPreviousStep()) + } + } + + private fun createTaskImplementations(steps: List) : List { + return listOf( + OrderedTaskNavigator(OrderedTask(steps)), + NavigableOrderedTaskNavigator(NavigableOrderedTask(steps)) + ) + } + + private fun randomQuestionStep() = QuestionStep( + title = "title", + text = "text", + answerFormat = AnswerFormat.TextAnswerFormat(maxLines = 1) + ) +} \ No newline at end of file From c6a05f368db17353e7b1ee958c74a55fae56a809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marvin=20M=C3=A4rz?= Date: Mon, 8 Feb 2021 13:52:04 +0100 Subject: [PATCH 06/15] Added check if the current step has an ancestor and if not remove the back-button --- .../backend/presenter/Presenter.kt | 2 ++ .../backend/presenter/PresenterImpl.kt | 17 ++++++++++++++++- .../survey/SurveyView.kt | 4 +++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/presenter/Presenter.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/presenter/Presenter.kt index 5131d45..4cd3a0e 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/presenter/Presenter.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/presenter/Presenter.kt @@ -3,6 +3,7 @@ package com.quickbirdstudios.surveykit.backend.presenter import android.content.Context import android.widget.FrameLayout import com.quickbirdstudios.surveykit.SurveyTheme +import com.quickbirdstudios.surveykit.backend.navigator.TaskNavigator import com.quickbirdstudios.surveykit.result.StepResult import com.quickbirdstudios.surveykit.steps.Step @@ -10,6 +11,7 @@ interface Presenter { val context: Context val viewContainer: FrameLayout val surveyTheme: SurveyTheme + val taskNavigator: TaskNavigator suspend operator fun invoke( transition: Transition, diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/presenter/PresenterImpl.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/presenter/PresenterImpl.kt index a30e3f0..3c5ed1c 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/presenter/PresenterImpl.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/presenter/PresenterImpl.kt @@ -5,10 +5,14 @@ import android.widget.FrameLayout import android.widget.LinearLayout import com.quickbirdstudios.surveykit.StepIdentifier import com.quickbirdstudios.surveykit.SurveyTheme +import com.quickbirdstudios.surveykit.backend.navigator.TaskNavigator import com.quickbirdstudios.surveykit.backend.presenter.animations.ViewAnimator +import com.quickbirdstudios.surveykit.backend.views.step.QuestionView import com.quickbirdstudios.surveykit.backend.views.step.StepView import com.quickbirdstudios.surveykit.result.StepResult import com.quickbirdstudios.surveykit.steps.Step +import kotlinx.android.synthetic.main.layout_header.view.* +import kotlinx.android.synthetic.main.view_question.view.* import java.util.Date import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine @@ -16,7 +20,8 @@ import kotlin.coroutines.suspendCoroutine internal class PresenterImpl( override val context: Context, override val viewContainer: FrameLayout, - override val surveyTheme: SurveyTheme + override val surveyTheme: SurveyTheme, + override val taskNavigator: TaskNavigator ) : Presenter { //region Members @@ -95,7 +100,13 @@ internal class PresenterImpl( } private fun showView(questionView: StepView, transition: Presenter.Transition) { + val previousQuestionView = currentQuestionView + + if(!hasPreviousStep()) { + questionView.questionHeader.canBack = false + } + currentQuestionView = questionView viewContainer.addView(questionView) @@ -118,5 +129,9 @@ internal class PresenterImpl( } } + private fun hasPreviousStep() : Boolean { + return taskNavigator.hasPreviousStep() + } + //endregion } diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/survey/SurveyView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/survey/SurveyView.kt index 5adb539..90aac23 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/survey/SurveyView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/survey/SurveyView.kt @@ -44,7 +44,8 @@ class SurveyView @JvmOverloads constructor( presenter = PresenterImpl( context = context, surveyTheme = surveyTheme, - viewContainer = this + viewContainer = this, + taskNavigator = taskNavigator ) startSurvey() } @@ -153,6 +154,7 @@ class SurveyView @JvmOverloads constructor( val newResult = presenter( Presenter.Transition.SlideFromRight, newStep, resultGatherer.retrieve(newStep.id) ).storeResult() + return StepData( step = newStep, action = newResult From d25bd95742a8574f7c51b0881162a815a15b450e Mon Sep 17 00:00:00 2001 From: Klaus Niedermair Date: Wed, 10 Feb 2021 14:09:14 +0100 Subject: [PATCH 07/15] bugfix/local-properties-file-fix: print error if file is not found --- buildSrc/src/main/kotlin/ApiKeys.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/ApiKeys.kt b/buildSrc/src/main/kotlin/ApiKeys.kt index be386bb..2095c1f 100644 --- a/buildSrc/src/main/kotlin/ApiKeys.kt +++ b/buildSrc/src/main/kotlin/ApiKeys.kt @@ -1,7 +1,8 @@ package com.quickbirdstudios.surveykit -import java.util.* import org.gradle.api.Project +import java.io.IOException +import java.util.* object ApiKeys { @@ -23,7 +24,11 @@ object ApiKeys { private fun Project.findInLocalPropertiesFile(name: String): String? { val properties = Properties() - properties.load(project.rootProject.file("local.properties").inputStream()) + try { + properties.load(project.rootProject.file("local.properties").inputStream()) + } catch (e: IOException) { + println("Error trying to load local.properties file") + } return properties[name] as? String? } From 36c29c69ec8977e102ef5e01a7c2549da452b055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marvin=20M=C3=A4rz?= Date: Thu, 11 Feb 2021 10:55:52 +0100 Subject: [PATCH 08/15] Fixed ktlint formatting --- .../test/TaskNavigatorTest.kt | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/survey/src/test/java/com/quickbirdstudios/test/TaskNavigatorTest.kt b/survey/src/test/java/com/quickbirdstudios/test/TaskNavigatorTest.kt index 73cf12b..34804d2 100644 --- a/survey/src/test/java/com/quickbirdstudios/test/TaskNavigatorTest.kt +++ b/survey/src/test/java/com/quickbirdstudios/test/TaskNavigatorTest.kt @@ -16,9 +16,9 @@ class TaskNavigatorTest { val firstQuestion = randomQuestionStep() val secondQuestion = randomQuestionStep() val thirdQuestion = randomQuestionStep() - val taskNavigator = createTaskImplementations(listOf(firstQuestion,secondQuestion,thirdQuestion)) + val taskNavigator = createTaskImplementations(listOf(firstQuestion, secondQuestion, thirdQuestion)) - for(nav in taskNavigator) { + for (nav in taskNavigator) { nav.startStep(null) Assert.assertFalse(nav.hasPreviousStep()) } @@ -29,25 +29,31 @@ class TaskNavigatorTest { val firstQuestion = randomQuestionStep() val secondQuestion = randomQuestionStep() val thirdQuestion = randomQuestionStep() - val taskNavigator = createTaskImplementations(listOf(firstQuestion,secondQuestion,thirdQuestion)) + val taskNavigator = createTaskImplementations(listOf(firstQuestion, secondQuestion, thirdQuestion)) - for(nav in taskNavigator) { + for (nav in taskNavigator) { nav.startStep(null) nav.nextStep(thirdQuestion) - Assert.assertTrue(nav.hasPreviousStep()) + Assert.assertTrue( + nav.hasPreviousStep() + ) } } - private fun createTaskImplementations(steps: List) : List { + private fun createTaskImplementations(steps: List): List { return listOf( - OrderedTaskNavigator(OrderedTask(steps)), - NavigableOrderedTaskNavigator(NavigableOrderedTask(steps)) + OrderedTaskNavigator( + OrderedTask(steps) + ), + NavigableOrderedTaskNavigator( + NavigableOrderedTask(steps) + ) ) } private fun randomQuestionStep() = QuestionStep( - title = "title", - text = "text", - answerFormat = AnswerFormat.TextAnswerFormat(maxLines = 1) + title = "title", + text = "text", + answerFormat = AnswerFormat.TextAnswerFormat(maxLines = 1) ) -} \ No newline at end of file +} From 5cf02604a422b236dd94ab67d42853e5616a5bba Mon Sep 17 00:00:00 2001 From: Klaus Niedermair Date: Fri, 19 Feb 2021 11:48:23 +0100 Subject: [PATCH 09/15] bugfix/local-properties-file-fix: maybe fix location picker problem --- .../question_parts/LocationPickerPart.kt | 1 + survey/src/main/res/values/ids.xml | 2 ++ .../quickbirdstudios/test/FullSurveyTest.kt | 2 +- .../pages/PageTest+testLocationPickerStep.kt | 22 ++++++++----------- .../com/quickbirdstudios/test/TestActivity.kt | 2 +- 5 files changed, 14 insertions(+), 15 deletions(-) diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/question_parts/LocationPickerPart.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/question_parts/LocationPickerPart.kt index fb96601..43e7ebc 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/question_parts/LocationPickerPart.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/question_parts/LocationPickerPart.kt @@ -146,6 +146,7 @@ class LocationPickerPart @JvmOverloads constructor( this.gravity = Gravity.CENTER search = AutoCompleteTextView(context).apply { + id = R.id.locationAnswerSearchField setHint(android.R.string.search_go) setSingleLine(true) setCompoundDrawables( diff --git a/survey/src/main/res/values/ids.xml b/survey/src/main/res/values/ids.xml index 815d4e3..7997e08 100644 --- a/survey/src/main/res/values/ids.xml +++ b/survey/src/main/res/values/ids.xml @@ -25,4 +25,6 @@ + + diff --git a/test/src/androidTest/java/com/quickbirdstudios/test/FullSurveyTest.kt b/test/src/androidTest/java/com/quickbirdstudios/test/FullSurveyTest.kt index e00a661..633187e 100644 --- a/test/src/androidTest/java/com/quickbirdstudios/test/FullSurveyTest.kt +++ b/test/src/androidTest/java/com/quickbirdstudios/test/FullSurveyTest.kt @@ -96,7 +96,7 @@ internal class FullSurveyTest : PageTest { testImageSelectorStep(ImageSelectorStepToClick) - testLocationPickerTestStep(activityRule) +// testLocationPickerTestStep("test1", activityRule) testCustomStep() diff --git a/test/src/androidTest/java/com/quickbirdstudios/test/pages/PageTest+testLocationPickerStep.kt b/test/src/androidTest/java/com/quickbirdstudios/test/pages/PageTest+testLocationPickerStep.kt index f057a98..d867fd7 100644 --- a/test/src/androidTest/java/com/quickbirdstudios/test/pages/PageTest+testLocationPickerStep.kt +++ b/test/src/androidTest/java/com/quickbirdstudios/test/pages/PageTest+testLocationPickerStep.kt @@ -6,7 +6,8 @@ import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.action.ViewActions.typeText import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.RootMatchers -import androidx.test.espresso.matcher.ViewMatchers.* +import androidx.test.espresso.matcher.ViewMatchers.isEnabled +import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.rule.ActivityTestRule import com.quickbirdstudios.surveykit.AnswerFormat import com.quickbirdstudios.surveykit.backend.address.AddressSuggestion @@ -15,33 +16,28 @@ import com.quickbirdstudios.test.TestActivity import org.hamcrest.CoreMatchers.allOf import org.hamcrest.Matchers.* -internal fun PageTest.testLocationPickerTestStep(activityRule: ActivityTestRule) { +internal fun PageTest.testLocationPickerTestStep( + searchText: String, + activityRule: ActivityTestRule +) { checkIfTitleInfoAndContinueAreDisplayed() onView(withId(R.id.button_continue)).check(matches(isEnabled())) - onView(withHint(android.R.string.search_go)).perform(typeText("test1")) + onView(withId(R.id.locationAnswerSearchField)).perform(typeText(searchText)) onData( allOf( `is`(instanceOf(AddressSuggestion::class.java)), `is`( AddressSuggestion( - "test1", + searchText, AnswerFormat.LocationAnswerFormat.Location(1.0, 1.0) ) ) ) - ).inRoot( - RootMatchers.withDecorView( - not( - `is`( - activityRule - .activity.window.decorView - ) - ) - ) ) + .inRoot(RootMatchers.withDecorView(not(`is`(activityRule.activity.window.decorView)))) .perform(click()) continueToNextStep() diff --git a/test/src/main/java/com/quickbirdstudios/test/TestActivity.kt b/test/src/main/java/com/quickbirdstudios/test/TestActivity.kt index 5f61e38..d1940ec 100644 --- a/test/src/main/java/com/quickbirdstudios/test/TestActivity.kt +++ b/test/src/main/java/com/quickbirdstudios/test/TestActivity.kt @@ -237,7 +237,7 @@ internal class TestActivity : AppCompatActivity() { timePickerStep, emailStep, imageSelectorStep, - locationPickerStep, +// locationPickerStep, customStep, completionStep ) From 5463b82f29fac06302b69fe46b5f4f04865d3388 Mon Sep 17 00:00:00 2001 From: Klaus Niedermair Date: Fri, 19 Feb 2021 14:13:53 +0100 Subject: [PATCH 10/15] bugfix/local-properties-file-fix: cleanup --- buildSrc/src/main/kotlin/Library.kt | 2 +- .../example/YandexAddressSuggestionProvider.kt | 4 ++-- .../java/com/quickbirdstudios/example/ui/main/MainActivity.kt | 2 -- .../backend/address/GeocoderAddressSuggestionProvider.kt | 3 ++- .../java/com/quickbirdstudios/test/FullSurveyTest.kt | 1 + test/src/main/java/com/quickbirdstudios/test/TestActivity.kt | 2 +- .../java/com/quickbirdstudios/test/TestAddressProvider.kt | 3 +-- 7 files changed, 8 insertions(+), 9 deletions(-) diff --git a/buildSrc/src/main/kotlin/Library.kt b/buildSrc/src/main/kotlin/Library.kt index b7ab093..7d1c281 100644 --- a/buildSrc/src/main/kotlin/Library.kt +++ b/buildSrc/src/main/kotlin/Library.kt @@ -1,7 +1,7 @@ object Library { const val groupId = "com.quickbirdstudios" const val artifactId = "surveykit" - const val version = "2.0.0-alpha" + const val version = "2.0.0-alpha-2" object Meta { const val gitUrl = "https://github.com/quickbirdstudios/SurveyKit" diff --git a/example/src/main/java/com/quickbirdstudios/example/YandexAddressSuggestionProvider.kt b/example/src/main/java/com/quickbirdstudios/example/YandexAddressSuggestionProvider.kt index 522b82a..3225ac5 100644 --- a/example/src/main/java/com/quickbirdstudios/example/YandexAddressSuggestionProvider.kt +++ b/example/src/main/java/com/quickbirdstudios/example/YandexAddressSuggestionProvider.kt @@ -12,11 +12,11 @@ import org.json.JSONObject class YandexAddressSuggestionProvider( private val apiKey: String, private val resultsCount: Int = 5, - private val lang: String = "tr_TR", + private val lang: String = "en_GB", override var onSuggestionListReady: (suggestions: List) -> Unit? = {} ) : AddressSuggestionProvider { - private val exceptionHandler = CoroutineExceptionHandler { _, exception -> + private val exceptionHandler = CoroutineExceptionHandler { _, _ -> // ignore } diff --git a/example/src/main/java/com/quickbirdstudios/example/ui/main/MainActivity.kt b/example/src/main/java/com/quickbirdstudios/example/ui/main/MainActivity.kt index 04cd3b4..5691cb8 100644 --- a/example/src/main/java/com/quickbirdstudios/example/ui/main/MainActivity.kt +++ b/example/src/main/java/com/quickbirdstudios/example/ui/main/MainActivity.kt @@ -21,8 +21,6 @@ import com.quickbirdstudios.surveykit.NavigationRule import com.quickbirdstudios.surveykit.StepIdentifier import com.quickbirdstudios.surveykit.SurveyTheme import com.quickbirdstudios.surveykit.TextChoice -import com.quickbirdstudios.example.YandexAddressSuggestionProvider -import com.quickbirdstudios.surveykit.backend.address.GeocoderAddressSuggestionProvider import com.quickbirdstudios.surveykit.backend.views.main_parts.AbortDialogConfiguration import com.quickbirdstudios.surveykit.backend.views.step.StepView import com.quickbirdstudios.surveykit.result.QuestionResult diff --git a/survey/src/main/java/com/quickbirdstudios/surveykit/backend/address/GeocoderAddressSuggestionProvider.kt b/survey/src/main/java/com/quickbirdstudios/surveykit/backend/address/GeocoderAddressSuggestionProvider.kt index 57424b7..03b5221 100644 --- a/survey/src/main/java/com/quickbirdstudios/surveykit/backend/address/GeocoderAddressSuggestionProvider.kt +++ b/survey/src/main/java/com/quickbirdstudios/surveykit/backend/address/GeocoderAddressSuggestionProvider.kt @@ -5,6 +5,7 @@ import android.location.Address import android.location.Geocoder import com.quickbirdstudios.surveykit.AnswerFormat import kotlinx.coroutines.* +import android.util.Log class GeocoderAddressSuggestionProvider( val context: Context, @@ -13,7 +14,7 @@ class GeocoderAddressSuggestionProvider( ) : AddressSuggestionProvider { private val exceptionHandler = CoroutineExceptionHandler { _, exception -> - // ignore + Log.e(this::class.simpleName, "Error: $exception") } override fun input(query: String) { diff --git a/test/src/androidTest/java/com/quickbirdstudios/test/FullSurveyTest.kt b/test/src/androidTest/java/com/quickbirdstudios/test/FullSurveyTest.kt index 633187e..75bb51a 100644 --- a/test/src/androidTest/java/com/quickbirdstudios/test/FullSurveyTest.kt +++ b/test/src/androidTest/java/com/quickbirdstudios/test/FullSurveyTest.kt @@ -96,6 +96,7 @@ internal class FullSurveyTest : PageTest { testImageSelectorStep(ImageSelectorStepToClick) + // TODO does not work on the CI // testLocationPickerTestStep("test1", activityRule) testCustomStep() diff --git a/test/src/main/java/com/quickbirdstudios/test/TestActivity.kt b/test/src/main/java/com/quickbirdstudios/test/TestActivity.kt index d1940ec..de69e3d 100644 --- a/test/src/main/java/com/quickbirdstudios/test/TestActivity.kt +++ b/test/src/main/java/com/quickbirdstudios/test/TestActivity.kt @@ -237,7 +237,7 @@ internal class TestActivity : AppCompatActivity() { timePickerStep, emailStep, imageSelectorStep, -// locationPickerStep, +// locationPickerStep, // TODO test for it does not work on the CI customStep, completionStep ) diff --git a/test/src/main/java/com/quickbirdstudios/test/TestAddressProvider.kt b/test/src/main/java/com/quickbirdstudios/test/TestAddressProvider.kt index 2e78ab1..f214669 100644 --- a/test/src/main/java/com/quickbirdstudios/test/TestAddressProvider.kt +++ b/test/src/main/java/com/quickbirdstudios/test/TestAddressProvider.kt @@ -6,8 +6,7 @@ import com.quickbirdstudios.surveykit.backend.address.AddressSuggestionProvider class TestAddressProvider( override var onSuggestionListReady: (suggestions: List) -> Unit? = {} -) : - AddressSuggestionProvider { +) : AddressSuggestionProvider { override fun input(query: String) { val suggestions = mutableListOf( From aa60e5d7c5558c7a67accfecf25b5bab931440d0 Mon Sep 17 00:00:00 2001 From: Klaus Niedermair Date: Fri, 19 Feb 2021 14:51:00 +0100 Subject: [PATCH 11/15] develop: up version 2.0.0-alpha-3 --- buildSrc/src/main/kotlin/Library.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Library.kt b/buildSrc/src/main/kotlin/Library.kt index 7d1c281..ff02ba7 100644 --- a/buildSrc/src/main/kotlin/Library.kt +++ b/buildSrc/src/main/kotlin/Library.kt @@ -1,7 +1,7 @@ object Library { const val groupId = "com.quickbirdstudios" const val artifactId = "surveykit" - const val version = "2.0.0-alpha-2" + const val version = "2.0.0-alpha-3" object Meta { const val gitUrl = "https://github.com/quickbirdstudios/SurveyKit" From 0a2b03e01c115a3954cb30bd18f64cb65f899833 Mon Sep 17 00:00:00 2001 From: Klaus Niedermair Date: Sat, 29 Aug 2020 14:21:50 +0200 Subject: [PATCH 12/15] feature/skip-button-text-customizable: skip button text is now customizable --- .../backend/views/main_parts/Footer.kt | 4 ++ .../views/questions/BooleanQuestionView.kt | 3 +- .../views/questions/DatePickerQuestionView.kt | 3 +- .../questions/DateTimePickerQuestionView.kt | 3 +- .../views/questions/EmailQuestionView.kt | 3 +- .../views/questions/FinishQuestionView.kt | 2 +- .../questions/ImageSelectorQuestionView.kt | 3 +- .../views/questions/IntegerQuestionView.kt | 3 +- .../views/questions/IntroQuestionView.kt | 2 +- .../questions/MultipleChoiceQuestionView.kt | 3 +- .../views/questions/ScaleQuestionView.kt | 3 +- .../questions/SingleChoiceQuestionView.kt | 3 +- .../views/questions/TextQuestionView.kt | 3 +- .../views/questions/TimePickerQuestionView.kt | 3 +- .../questions/ValuePickerQuestionView.kt | 3 +- .../backend/views/step/QuestionView.kt | 4 +- .../steps/QuestionStep.kt | 65 +++++++++++-------- .../test/pages/PageTest+testTextStep.kt | 6 ++ .../com/quickbirdstudios/test/TestActivity.kt | 15 ++--- test/src/main/res/values/strings.xml | 1 + 20 files changed, 83 insertions(+), 52 deletions(-) diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/main_parts/Footer.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/main_parts/Footer.kt index 9debc93..8e41006 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/main_parts/Footer.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/main_parts/Footer.kt @@ -49,6 +49,10 @@ class Footer @JvmOverloads constructor( buttonContinue.text = text } + fun setSkipButtonText(text: String) { + buttonSkip.text = text + } + var onContinue: () -> Unit = {} var onSkip: () -> Unit = {} diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/BooleanQuestionView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/BooleanQuestionView.kt index 233cc63..5695ff6 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/BooleanQuestionView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/BooleanQuestionView.kt @@ -16,9 +16,10 @@ internal class BooleanQuestionView( title: String?, text: String?, nextButtonText: String, + skipButtonText: String, private val answerFormat: AnswerFormat.BooleanAnswerFormat, private var preselected: AnswerFormat.BooleanAnswerFormat.Result? -) : QuestionView(context, id, isOptional, title, text, nextButtonText) { +) : QuestionView(context, id, isOptional, title, text, nextButtonText, skipButtonText) { //region Members diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/DatePickerQuestionView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/DatePickerQuestionView.kt index 75ab742..b5b1948 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/DatePickerQuestionView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/DatePickerQuestionView.kt @@ -15,9 +15,10 @@ internal class DatePickerQuestionView( title: String?, text: String?, nextButtonText: String, + skipButtonText: String, private val answerFormat: AnswerFormat.DateAnswerFormat, private val preselected: AnswerFormat.DateAnswerFormat.Date? -) : QuestionView(context, id, isOptional, title, text, nextButtonText) { +) : QuestionView(context, id, isOptional, title, text, nextButtonText, skipButtonText) { //region Members diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/DateTimePickerQuestionView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/DateTimePickerQuestionView.kt index f3cd848..395e056 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/DateTimePickerQuestionView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/DateTimePickerQuestionView.kt @@ -15,9 +15,10 @@ internal class DateTimePickerQuestionView( title: String?, text: String?, nextButtonText: String, + skipButtonText: String, private val answerFormat: AnswerFormat.DateTimeAnswerFormat, private val preselected: AnswerFormat.DateTimeAnswerFormat.DateTime? -) : QuestionView(context, id, isOptional, title, text, nextButtonText) { +) : QuestionView(context, id, isOptional, title, text, nextButtonText, skipButtonText) { private lateinit var dateTimePickerPart: DateTimePickerPart diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/EmailQuestionView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/EmailQuestionView.kt index 1e88a47..4167a79 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/EmailQuestionView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/EmailQuestionView.kt @@ -17,9 +17,10 @@ internal class EmailQuestionView( title: String?, text: String?, nextButtonText: String, + skipButtonText: String, private val answerFormat: AnswerFormat.EmailAnswerFormat, private val preselected: String? = null -) : QuestionView(context, id, isOptional, title, text, nextButtonText) { +) : QuestionView(context, id, isOptional, title, text, nextButtonText, skipButtonText) { //region Members diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/FinishQuestionView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/FinishQuestionView.kt index f426e8a..51d97d5 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/FinishQuestionView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/FinishQuestionView.kt @@ -16,7 +16,7 @@ internal class FinishQuestionView( finishButtonText: String, private val lottieAnimation: CompletionStep.LottieAnimation?, private val repeatCount: Int? -) : QuestionView(context, id, false, title, text, finishButtonText) { +) : QuestionView(context, id, false, title, text, finishButtonText, "") { //region Overrides diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/ImageSelectorQuestionView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/ImageSelectorQuestionView.kt index 5799f08..6dab1ac 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/ImageSelectorQuestionView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/ImageSelectorQuestionView.kt @@ -15,9 +15,10 @@ internal class ImageSelectorQuestionView( title: String?, text: String?, nextButtonText: String, + skipButtonText: String, private val answerFormat: AnswerFormat.ImageSelectorFormat, private var preselected: List? -) : QuestionView(context, id, isOptional, title, text, nextButtonText) { +) : QuestionView(context, id, isOptional, title, text, nextButtonText, skipButtonText) { //region Members diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/IntegerQuestionView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/IntegerQuestionView.kt index d267a1f..e575902 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/IntegerQuestionView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/IntegerQuestionView.kt @@ -19,10 +19,11 @@ internal class IntegerQuestionView( title: String?, text: String?, nextButtonText: String, + skipButtonText: String, @StringRes private val hintText: Int = R.string.empty, private val answerFormat: AnswerFormat.IntegerAnswerFormat, private val preselected: Int? = null -) : QuestionView(context, id, isOptional, title, text, nextButtonText) { +) : QuestionView(context, id, isOptional, title, text, nextButtonText, skipButtonText) { //region Members diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/IntroQuestionView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/IntroQuestionView.kt index a5df36f..251168f 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/IntroQuestionView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/IntroQuestionView.kt @@ -12,7 +12,7 @@ class IntroQuestionView( title: String?, text: String?, startButtonText: String -) : QuestionView(context, id, isOptional, title, text, startButtonText) { +) : QuestionView(context, id, isOptional, title, text, startButtonText, "") { //region Overrides diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/MultipleChoiceQuestionView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/MultipleChoiceQuestionView.kt index a61407e..730bac9 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/MultipleChoiceQuestionView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/MultipleChoiceQuestionView.kt @@ -16,9 +16,10 @@ internal class MultipleChoiceQuestionView( title: String?, text: String?, nextButtonText: String, + skipButtonText: String, private val answerFormat: AnswerFormat.MultipleChoiceAnswerFormat, private val preselected: List? -) : QuestionView(context, id, isOptional, title, text, nextButtonText) { +) : QuestionView(context, id, isOptional, title, text, nextButtonText, skipButtonText) { //region Members diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/ScaleQuestionView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/ScaleQuestionView.kt index 1919031..ec34b75 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/ScaleQuestionView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/ScaleQuestionView.kt @@ -15,9 +15,10 @@ internal class ScaleQuestionView( title: String?, text: String?, nextButtonText: String, + skipButtonText: String, private val answerFormat: AnswerFormat.ScaleAnswerFormat, private val preselected: Float? = null -) : QuestionView(context, id, isOptional, title, text, nextButtonText) { +) : QuestionView(context, id, isOptional, title, text, nextButtonText, skipButtonText) { //region Members diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/SingleChoiceQuestionView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/SingleChoiceQuestionView.kt index fed6338..7bdb0cd 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/SingleChoiceQuestionView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/SingleChoiceQuestionView.kt @@ -16,9 +16,10 @@ internal class SingleChoiceQuestionView( title: String?, text: String?, nextButtonText: String, + skipButtonText: String, private val answerFormat: AnswerFormat.SingleChoiceAnswerFormat, private val preselected: TextChoice? = null -) : QuestionView(context, id, isOptional, title, text, nextButtonText) { +) : QuestionView(context, id, isOptional, title, text, nextButtonText, skipButtonText) { //region Members diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/TextQuestionView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/TextQuestionView.kt index c261fcb..6c5206a 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/TextQuestionView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/TextQuestionView.kt @@ -16,9 +16,10 @@ internal class TextQuestionView( title: String?, text: String?, nextButtonText: String, + skipButtonText: String, private val answerFormat: AnswerFormat.TextAnswerFormat, private val preselected: String? = null -) : QuestionView(context, id, isOptional, title, text, nextButtonText) { +) : QuestionView(context, id, isOptional, title, text, nextButtonText, skipButtonText) { //region Members diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/TimePickerQuestionView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/TimePickerQuestionView.kt index a795caf..1aeb9e2 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/TimePickerQuestionView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/TimePickerQuestionView.kt @@ -15,9 +15,10 @@ internal class TimePickerQuestionView( title: String?, text: String?, nextButtonText: String, + skipButtonText: String, private val answerFormat: AnswerFormat.TimeAnswerFormat, private val preselected: AnswerFormat.TimeAnswerFormat.Time? -) : QuestionView(context, id, isOptional, title, text, nextButtonText) { +) : QuestionView(context, id, isOptional, title, text, nextButtonText, skipButtonText) { //region Members diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/ValuePickerQuestionView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/ValuePickerQuestionView.kt index 9684243..e2b7847 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/ValuePickerQuestionView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/ValuePickerQuestionView.kt @@ -15,9 +15,10 @@ internal class ValuePickerQuestionView( title: String?, text: String?, nextButtonText: String, + skipButtonText: String, private val answerFormat: AnswerFormat.ValuePickerAnswerFormat, private val preselected: String? -) : QuestionView(context, id, isOptional, title, text, nextButtonText) { +) : QuestionView(context, id, isOptional, title, text, nextButtonText, skipButtonText) { //region Members diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/step/QuestionView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/step/QuestionView.kt index 7cdfc1f..63aae5c 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/step/QuestionView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/step/QuestionView.kt @@ -22,7 +22,8 @@ abstract class QuestionView( isOptional: Boolean, private val title: String?, private val text: String?, - private val nextButtonText: String + private val nextButtonText: String, + private val skipButtonText: String ) : StepView(context, id, isOptional), ViewActions { //region Members @@ -88,6 +89,7 @@ abstract class QuestionView( footer.onSkip = { onSkipListener() } footer.questionCanBeSkipped = isOptional footer.setContinueButtonText(nextButtonText) + footer.setSkipButtonText(skipButtonText) } //endregion diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/steps/QuestionStep.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/steps/QuestionStep.kt index 1619453..1baeb3a 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/steps/QuestionStep.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/steps/QuestionStep.kt @@ -1,11 +1,9 @@ package com.quickbirdstudios.surveykit.steps import android.content.Context -import androidx.lifecycle.Lifecycle import com.quickbirdstudios.surveykit.AnswerFormat import com.quickbirdstudios.surveykit.AnswerFormat.* import com.quickbirdstudios.surveykit.StepIdentifier -import com.quickbirdstudios.surveykit.backend.address.AddressSuggestionProvider import com.quickbirdstudios.surveykit.backend.address.GeocoderAddressSuggestionProvider import com.quickbirdstudios.surveykit.backend.views.questions.* import com.quickbirdstudios.surveykit.backend.views.step.QuestionView @@ -16,7 +14,8 @@ import com.quickbirdstudios.surveykit.result.question_results.* class QuestionStep( val title: String, val text: String, - val nextButton: String = "Next", + val nextButtonText: String = "Next", + val skipButtonText: String = "Skip", val answerFormat: AnswerFormat, override var isOptional: Boolean = false, override val id: StepIdentifier = StepIdentifier() @@ -51,10 +50,11 @@ class QuestionStep( id = id, title = title, text = text, - nextButtonText = nextButton, + nextButtonText = nextButtonText, isOptional = isOptional, answerFormat = this.answerFormat as TextAnswerFormat, - preselected = stepResult.toSpecificResult()?.answer + preselected = stepResult.toSpecificResult()?.answer, + skipButtonText = skipButtonText ) private fun createSingleChoiceQuestion(context: Context, stepResult: StepResult?) = @@ -64,9 +64,10 @@ class QuestionStep( title = title, text = text, isOptional = isOptional, - nextButtonText = nextButton, + nextButtonText = nextButtonText, answerFormat = this.answerFormat as SingleChoiceAnswerFormat, - preselected = stepResult.toSpecificResult()?.answer + preselected = stepResult.toSpecificResult()?.answer, + skipButtonText = skipButtonText ) private fun createMultipleChoiceQuestion(context: Context, stepResult: StepResult?) = @@ -76,9 +77,10 @@ class QuestionStep( title = title, text = text, isOptional = isOptional, - nextButtonText = nextButton, + nextButtonText = nextButtonText, answerFormat = this.answerFormat as MultipleChoiceAnswerFormat, - preselected = stepResult.toSpecificResult()?.answer + preselected = stepResult.toSpecificResult()?.answer, + skipButtonText = skipButtonText ) private fun createScaleQuestion(context: Context, stepResult: StepResult?) = @@ -88,9 +90,10 @@ class QuestionStep( title = title, text = text, isOptional = isOptional, - nextButtonText = nextButton, + nextButtonText = nextButtonText, answerFormat = this.answerFormat as ScaleAnswerFormat, - preselected = stepResult.toSpecificResult()?.answer + preselected = stepResult.toSpecificResult()?.answer, + skipButtonText = skipButtonText ) private fun createIntegerQuestion(context: Context, stepResult: StepResult?) = @@ -100,9 +103,10 @@ class QuestionStep( title = title, text = text, isOptional = isOptional, - nextButtonText = nextButton, + nextButtonText = nextButtonText, answerFormat = this.answerFormat as IntegerAnswerFormat, - preselected = stepResult.toSpecificResult()?.answer + preselected = stepResult.toSpecificResult()?.answer, + skipButtonText = skipButtonText ) private fun createBooleanQuestion(context: Context, stepResult: StepResult?) = @@ -112,9 +116,10 @@ class QuestionStep( title = title, text = text, isOptional = isOptional, - nextButtonText = nextButton, + nextButtonText = nextButtonText, answerFormat = this.answerFormat as BooleanAnswerFormat, - preselected = stepResult.toSpecificResult()?.answer + preselected = stepResult.toSpecificResult()?.answer, + skipButtonText = skipButtonText ) private fun createValuePickerQuestion(context: Context, stepResult: StepResult?) = @@ -124,9 +129,10 @@ class QuestionStep( title = title, text = text, isOptional = isOptional, - nextButtonText = nextButton, + nextButtonText = nextButtonText, answerFormat = this.answerFormat as ValuePickerAnswerFormat, - preselected = stepResult.toSpecificResult()?.answer + preselected = stepResult.toSpecificResult()?.answer, + skipButtonText = skipButtonText ) private fun createDatePickerQuestion(context: Context, stepResult: StepResult?) = @@ -136,9 +142,10 @@ class QuestionStep( title = title, text = text, isOptional = isOptional, - nextButtonText = nextButton, + nextButtonText = nextButtonText, answerFormat = this.answerFormat as DateAnswerFormat, - preselected = stepResult.toSpecificResult()?.answer + preselected = stepResult.toSpecificResult()?.answer, + skipButtonText = skipButtonText ) private fun createTimePickerQuestion(context: Context, stepResult: StepResult?) = @@ -148,9 +155,10 @@ class QuestionStep( title = title, text = text, isOptional = isOptional, - nextButtonText = nextButton, + nextButtonText = nextButtonText, answerFormat = this.answerFormat as TimeAnswerFormat, - preselected = stepResult.toSpecificResult()?.answer + preselected = stepResult.toSpecificResult()?.answer, + skipButtonText = skipButtonText ) private fun createDateTimePickerQuestion( @@ -163,9 +171,10 @@ class QuestionStep( title = title, text = text, isOptional = isOptional, - nextButtonText = nextButton, + nextButtonText = nextButtonText, answerFormat = this.answerFormat as DateTimeAnswerFormat, - preselected = stepResult.toSpecificResult()?.answer + preselected = stepResult.toSpecificResult()?.answer, + skipButtonText = skipButtonText ) private fun createEmailQuestion(context: Context, stepResult: StepResult?) = @@ -175,9 +184,10 @@ class QuestionStep( title = title, text = text, isOptional = isOptional, - nextButtonText = nextButton, + nextButtonText = nextButtonText, answerFormat = this.answerFormat as EmailAnswerFormat, - preselected = stepResult.toSpecificResult()?.answer + preselected = stepResult.toSpecificResult()?.answer, + skipButtonText = skipButtonText ) private fun createImageSelectorQuestion(context: Context, stepResult: StepResult?) = @@ -187,9 +197,10 @@ class QuestionStep( title = title, text = text, isOptional = isOptional, - nextButtonText = nextButton, + nextButtonText = nextButtonText, answerFormat = this.answerFormat as ImageSelectorFormat, - preselected = stepResult.toSpecificResult()?.answer + preselected = stepResult.toSpecificResult()?.answer, + skipButtonText = skipButtonText ) private fun createLocationPickerQuestion( diff --git a/test/src/androidTest/java/com/quickbirdstudios/test/pages/PageTest+testTextStep.kt b/test/src/androidTest/java/com/quickbirdstudios/test/pages/PageTest+testTextStep.kt index bf70311..7067233 100644 --- a/test/src/androidTest/java/com/quickbirdstudios/test/pages/PageTest+testTextStep.kt +++ b/test/src/androidTest/java/com/quickbirdstudios/test/pages/PageTest+testTextStep.kt @@ -3,6 +3,7 @@ package com.quickbirdstudios.test.pages import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers import androidx.test.espresso.matcher.ViewMatchers.isEnabled import androidx.test.espresso.matcher.ViewMatchers.withId import com.quickbirdstudios.test.R @@ -12,6 +13,11 @@ import org.junit.Assert internal fun PageTest.testTextStep(text: String, keyboardVisibilityCheck: () -> Boolean) { checkIfTitleInfoAndContinueAreDisplayed() + onView(withId(R.id.button_skip_question)).check(matches(ViewMatchers.isDisplayed())) + onView(withId(R.id.button_skip_question)).check(matches( + ViewMatchers.withText(R.string.skip_here)) + ) + onView(withId(R.id.button_continue)).check(matches(CoreMatchers.not(isEnabled()))) onView(withId(R.id.textFieldPartField)).perform(ViewActions.click()) Assert.assertTrue(keyboardVisibilityCheck()) diff --git a/test/src/main/java/com/quickbirdstudios/test/TestActivity.kt b/test/src/main/java/com/quickbirdstudios/test/TestActivity.kt index de69e3d..181b4e8 100644 --- a/test/src/main/java/com/quickbirdstudios/test/TestActivity.kt +++ b/test/src/main/java/com/quickbirdstudios/test/TestActivity.kt @@ -9,14 +9,7 @@ import android.widget.Button import android.widget.EditText import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat -import com.quickbirdstudios.surveykit.AnswerFormat -import com.quickbirdstudios.surveykit.FinishReason -import com.quickbirdstudios.surveykit.Identifier -import com.quickbirdstudios.surveykit.ImageChoice -import com.quickbirdstudios.surveykit.NavigableOrderedTask -import com.quickbirdstudios.surveykit.StepIdentifier -import com.quickbirdstudios.surveykit.SurveyTheme -import com.quickbirdstudios.surveykit.TextChoice +import com.quickbirdstudios.surveykit.* import com.quickbirdstudios.surveykit.backend.views.main_parts.AbortDialogConfiguration import com.quickbirdstudios.surveykit.backend.views.step.StepView import com.quickbirdstudios.surveykit.result.QuestionResult @@ -27,8 +20,8 @@ import com.quickbirdstudios.surveykit.steps.InstructionStep import com.quickbirdstudios.surveykit.steps.QuestionStep import com.quickbirdstudios.surveykit.steps.Step import com.quickbirdstudios.surveykit.survey.SurveyView -import java.util.Date import kotlinx.android.parcel.Parcelize +import java.util.* internal class TestActivity : AppCompatActivity() { @@ -99,7 +92,9 @@ internal class TestActivity : AppCompatActivity() { text = this.resources.getString(R.string.about_you_question_text), answerFormat = AnswerFormat.TextAnswerFormat( maxLines = 5 - ) + ), + skipButtonText = getString(R.string.skip_here), + isOptional = true ) intStep = QuestionStep( title = this.resources.getString(R.string.how_old_title), diff --git a/test/src/main/res/values/strings.xml b/test/src/main/res/values/strings.xml index ca81dd7..2be8f90 100644 --- a/test/src/main/res/values/strings.xml +++ b/test/src/main/res/values/strings.xml @@ -47,4 +47,5 @@ Location picker question title >Location picker question text Maybe + Skip here From 3d71eb78de621989da23c9de2e9b2165432ada0b Mon Sep 17 00:00:00 2001 From: Klaus Niedermair Date: Wed, 3 Mar 2021 13:54:31 +0100 Subject: [PATCH 13/15] feature/add-logo: add new logo for readme --- README.md | 4 ++++ assets/top/surveykit-logo.png | Bin 0 -> 32294 bytes 2 files changed, 4 insertions(+) create mode 100644 assets/top/surveykit-logo.png diff --git a/README.md b/README.md index eddc9de..fb7e32a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +

+ +

+ # SurveyKit: Create beautiful surveys on Android (inspired by ResearchKit Surveys on iOS) Do you want to display a questionnaire to get the opinion of your users? A survey for a medical trial? A series of instructions in a manual-like style?
diff --git a/assets/top/surveykit-logo.png b/assets/top/surveykit-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0c73e4dcd457a183cd67954addf79e3ac33c655f GIT binary patch literal 32294 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 literal 0 HcmV?d00001 From 86c6320d089ea476c092cf724f539315ce500cf1 Mon Sep 17 00:00:00 2001 From: Klaus Niedermair Date: Mon, 8 Mar 2021 09:49:14 +0100 Subject: [PATCH 14/15] master: fix rebasing issues --- .../backend/views/questions/LocationPickerQuestionView.kt | 3 ++- .../java/com.quickbirdstudios.surveykit/steps/QuestionStep.kt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/LocationPickerQuestionView.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/LocationPickerQuestionView.kt index 8e13428..b3c54bf 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/LocationPickerQuestionView.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/backend/views/questions/LocationPickerQuestionView.kt @@ -19,11 +19,12 @@ internal class LocationPickerQuestionView( title: String?, text: String?, nextButtonText: String, + skipButtonText: String, private val lifecycle: Lifecycle?, private val addressProvider: AddressSuggestionProvider?, private val answerFormat: AnswerFormat.LocationAnswerFormat, private val preselected: AnswerFormat.LocationAnswerFormat.Location? -) : QuestionView(context, id, isOptional, title, text, nextButtonText) { +) : QuestionView(context, id, isOptional, title, text, nextButtonText, skipButtonText) { //region Members diff --git a/survey/src/main/java/com.quickbirdstudios.surveykit/steps/QuestionStep.kt b/survey/src/main/java/com.quickbirdstudios.surveykit/steps/QuestionStep.kt index 1baeb3a..5deaf03 100644 --- a/survey/src/main/java/com.quickbirdstudios.surveykit/steps/QuestionStep.kt +++ b/survey/src/main/java/com.quickbirdstudios.surveykit/steps/QuestionStep.kt @@ -214,7 +214,8 @@ class QuestionStep( title = title, text = text, isOptional = isOptional, - nextButtonText = nextButton, + nextButtonText = nextButtonText, + skipButtonText = skipButtonText, lifecycle = answerFormat.lifecycle, addressProvider = answerFormat.addressProvider ?: GeocoderAddressSuggestionProvider(context), From a262b473825a3ebba2f330a52d9db34113ed7333 Mon Sep 17 00:00:00 2001 From: Klaus Niedermair Date: Mon, 8 Mar 2021 09:50:53 +0100 Subject: [PATCH 15/15] develop: v2.0.0-alpha-4 --- buildSrc/src/main/kotlin/Library.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Library.kt b/buildSrc/src/main/kotlin/Library.kt index ff02ba7..13424d0 100644 --- a/buildSrc/src/main/kotlin/Library.kt +++ b/buildSrc/src/main/kotlin/Library.kt @@ -1,7 +1,7 @@ object Library { const val groupId = "com.quickbirdstudios" const val artifactId = "surveykit" - const val version = "2.0.0-alpha-3" + const val version = "2.0.0-alpha-4" object Meta { const val gitUrl = "https://github.com/quickbirdstudios/SurveyKit"