Skip to content

Commit 7e1d2f8

Browse files
committed
Extract duplicate code to ArbitraryFileWidgetDelegate
1 parent 711a7be commit 7e1d2f8

File tree

3 files changed

+60
-57
lines changed

3 files changed

+60
-57
lines changed

collect_app/src/main/java/org/odk/collect/android/widgets/arbitraryfile/ArbitraryFileWidget.kt

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ import androidx.compose.ui.platform.ComposeView
1414
import androidx.compose.ui.res.dimensionResource
1515
import androidx.lifecycle.ViewModelProvider
1616
import androidx.lifecycle.viewmodel.viewModelFactory
17-
import org.javarosa.core.model.data.IAnswerData
18-
import org.javarosa.core.model.data.StringData
1917
import org.javarosa.form.api.FormEntryPrompt
2018
import org.odk.collect.android.formentry.questions.QuestionDetails
2119
import org.odk.collect.android.utilities.ApplicationConstants
@@ -28,8 +26,6 @@ import org.odk.collect.android.widgets.utilities.QuestionFontSizeUtils
2826
import org.odk.collect.android.widgets.utilities.WaitingForDataRegistry
2927
import org.odk.collect.androidshared.R.dimen
3028
import org.odk.collect.androidshared.ui.ComposeThemeProvider.Companion.setContextThemedContent
31-
import timber.log.Timber
32-
import java.io.File
3329

3430
@SuppressLint("ViewConstructor")
3531
class ArbitraryFileWidget(
@@ -39,6 +35,7 @@ class ArbitraryFileWidget(
3935
private val questionMediaManager: QuestionMediaManager,
4036
private val waitingForDataRegistry: WaitingForDataRegistry
4137
) : QuestionWidget(context, dependencies, questionDetails), FileWidget, WidgetDataReceiver {
38+
private val arbitraryFileWidgetDelegate = ArbitraryFileWidgetDelegate(questionMediaManager)
4239
private var answer by mutableStateOf<String?>(formEntryPrompt.answerText)
4340

4441
init {
@@ -79,36 +76,17 @@ class ArbitraryFileWidget(
7976
}
8077
}
8178

82-
override fun getAnswer(): IAnswerData? {
83-
return if (answer.isNullOrEmpty()) null else StringData(answer!!)
84-
}
79+
override fun getAnswer() = arbitraryFileWidgetDelegate.getAnswer(answer)
8580

8681
override fun deleteFile() {
87-
questionMediaManager.deleteAnswerFile(
88-
formEntryPrompt.index.toString(),
89-
questionMediaManager.getAnswerFile(answer)!!.absolutePath
90-
)
82+
arbitraryFileWidgetDelegate.deleteFile(formEntryPrompt.index.toString(), answer)
9183
answer = null
9284
}
9385

9486
override fun setData(answer: Any) {
95-
if (this.answer != null) {
96-
deleteFile()
97-
}
98-
99-
if (answer is File) {
100-
if (answer.exists()) {
101-
questionMediaManager.replaceAnswerFile(
102-
formEntryPrompt.index.toString(),
103-
answer.absolutePath
104-
)
105-
this.answer = answer.name
106-
widgetValueChanged()
107-
} else {
108-
Timber.e(Error("Inserting Arbitrary file FAILED"))
109-
}
110-
} else {
111-
Timber.e(Error("FileWidget's setBinaryData must receive a File but received: " + answer.javaClass))
87+
arbitraryFileWidgetDelegate.setData(formEntryPrompt.index.toString(), this.answer, answer) {
88+
this.answer = it
89+
widgetValueChanged()
11290
}
11391
}
11492

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.odk.collect.android.widgets.arbitraryfile
2+
3+
import org.javarosa.core.model.data.IAnswerData
4+
import org.javarosa.core.model.data.StringData
5+
import org.odk.collect.android.utilities.QuestionMediaManager
6+
import timber.log.Timber
7+
import java.io.File
8+
9+
class ArbitraryFileWidgetDelegate(
10+
private val questionMediaManager: QuestionMediaManager
11+
) {
12+
fun getAnswer(answer: String?): IAnswerData? {
13+
return if (answer.isNullOrEmpty()) null else StringData(answer)
14+
}
15+
16+
fun deleteFile(formEntryPromptIndex: String, answer: String?) {
17+
questionMediaManager.deleteAnswerFile(
18+
formEntryPromptIndex,
19+
questionMediaManager.getAnswerFile(answer)!!.absolutePath
20+
)
21+
}
22+
23+
fun setData(
24+
formEntryPromptIndex: String,
25+
previousAnswer: String?,
26+
newAnswer: Any,
27+
onSuccess: (String) -> Unit
28+
) {
29+
if (previousAnswer != null) {
30+
deleteFile(formEntryPromptIndex, previousAnswer)
31+
}
32+
33+
if (newAnswer is File) {
34+
if (newAnswer.exists()) {
35+
questionMediaManager.replaceAnswerFile(
36+
formEntryPromptIndex,
37+
newAnswer.absolutePath
38+
)
39+
onSuccess(newAnswer.name)
40+
} else {
41+
Timber.e(Error("Inserting Arbitrary file FAILED"))
42+
}
43+
} else {
44+
Timber.e(Error("FileWidget's setBinaryData must receive a File but received: " + newAnswer.javaClass))
45+
}
46+
}
47+
}

collect_app/src/main/java/org/odk/collect/android/widgets/arbitraryfile/ExArbitraryFileWidget.kt

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ import androidx.compose.ui.platform.ComposeView
1414
import androidx.compose.ui.res.dimensionResource
1515
import androidx.lifecycle.ViewModelProvider
1616
import androidx.lifecycle.viewmodel.viewModelFactory
17-
import org.javarosa.core.model.data.IAnswerData
18-
import org.javarosa.core.model.data.StringData
1917
import org.javarosa.form.api.FormEntryPrompt
2018
import org.odk.collect.android.formentry.questions.QuestionDetails
2119
import org.odk.collect.android.utilities.ApplicationConstants
@@ -29,8 +27,6 @@ import org.odk.collect.android.widgets.utilities.QuestionFontSizeUtils
2927
import org.odk.collect.android.widgets.utilities.WaitingForDataRegistry
3028
import org.odk.collect.androidshared.R.dimen
3129
import org.odk.collect.androidshared.ui.ComposeThemeProvider.Companion.setContextThemedContent
32-
import timber.log.Timber
33-
import java.io.File
3430

3531
@SuppressLint("ViewConstructor")
3632
class ExArbitraryFileWidget(
@@ -39,8 +35,9 @@ class ExArbitraryFileWidget(
3935
dependencies: Dependencies,
4036
private val questionMediaManager: QuestionMediaManager,
4137
private val waitingForDataRegistry: WaitingForDataRegistry,
42-
private val fileRequester: FileRequester
38+
private val fileRequester: FileRequester,
4339
) : QuestionWidget(context, dependencies, questionDetails), FileWidget, WidgetDataReceiver {
40+
private val arbitraryFileWidgetDelegate = ArbitraryFileWidgetDelegate(questionMediaManager)
4441
private var answer by mutableStateOf<String?>(formEntryPrompt.answerText)
4542

4643
init {
@@ -81,36 +78,17 @@ class ExArbitraryFileWidget(
8178
}
8279
}
8380

84-
override fun getAnswer(): IAnswerData? {
85-
return if (answer.isNullOrEmpty()) null else StringData(answer!!)
86-
}
81+
override fun getAnswer() = arbitraryFileWidgetDelegate.getAnswer(answer)
8782

8883
override fun deleteFile() {
89-
questionMediaManager.deleteAnswerFile(
90-
formEntryPrompt.index.toString(),
91-
questionMediaManager.getAnswerFile(answer)!!.absolutePath
92-
)
84+
arbitraryFileWidgetDelegate.deleteFile(formEntryPrompt.index.toString(), answer)
9385
answer = null
9486
}
9587

9688
override fun setData(answer: Any) {
97-
if (this.answer != null) {
98-
deleteFile()
99-
}
100-
101-
if (answer is File) {
102-
if (answer.exists()) {
103-
questionMediaManager.replaceAnswerFile(
104-
formEntryPrompt.index.toString(),
105-
answer.absolutePath
106-
)
107-
this.answer = answer.name
108-
widgetValueChanged()
109-
} else {
110-
Timber.e(Error("Inserting Arbitrary file FAILED"))
111-
}
112-
} else {
113-
Timber.e(Error("FileWidget's setBinaryData must receive a File but received: " + answer.javaClass))
89+
arbitraryFileWidgetDelegate.setData(formEntryPrompt.index.toString(), this.answer, answer) {
90+
this.answer = it
91+
widgetValueChanged()
11492
}
11593
}
11694

0 commit comments

Comments
 (0)