Skip to content

Commit e844911

Browse files
committed
Replace StringDecoder injection with simpler API
The initial reason for this `StringDecoder` was to make sure the AndroidX navigation route would not use incompatible chars in the resulting String. For that, `Uri.encode(String)` was used, but this is an Android API (`android.net.Uri`). Unit tests would fail because Uri is not mocked (since we are not using Robolectric). Therefore, a `StringDecoder` interface was introduced with 2 implementations: `UriDecoder` and `FakeStringDecoder`, Hilt modules were added, etc. FWIW, the naming of the API was misleading: `StringDecoder.decodeString(encodedString: String)` does not inform how encoded the input is, so `UriDecoder` could "decode" something that was not necessarily uri "encoded". The solution to this problem was to simply use regular Java APIs: - `URLDecoder.decode(urlEncodedTopicId, "UTF-8")` - `URLEncoder.encode(topicId, "UTF-8")`
1 parent a3ee09e commit e844911

File tree

8 files changed

+6
-145
lines changed

8 files changed

+6
-145
lines changed

core/common/src/main/java/com/google/samples/apps/nowinandroid/core/decoder/StringDecoder.kt

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

core/common/src/main/java/com/google/samples/apps/nowinandroid/core/decoder/UriDecoder.kt

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

core/common/src/main/java/com/google/samples/apps/nowinandroid/core/decoder/di/StringDecoderModule.kt

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

core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/decoder/FakeStringDecoder.kt

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

core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/di/TestStringDecoderModule.kt

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

feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModel.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import com.google.samples.apps.nowinandroid.core.data.repository.NewsResourceQue
2323
import com.google.samples.apps.nowinandroid.core.data.repository.TopicsRepository
2424
import com.google.samples.apps.nowinandroid.core.data.repository.UserDataRepository
2525
import com.google.samples.apps.nowinandroid.core.data.repository.UserNewsResourceRepository
26-
import com.google.samples.apps.nowinandroid.core.decoder.StringDecoder
2726
import com.google.samples.apps.nowinandroid.core.model.data.FollowableTopic
2827
import com.google.samples.apps.nowinandroid.core.model.data.Topic
2928
import com.google.samples.apps.nowinandroid.core.model.data.UserNewsResource
@@ -43,13 +42,12 @@ import javax.inject.Inject
4342
@HiltViewModel
4443
class TopicViewModel @Inject constructor(
4544
savedStateHandle: SavedStateHandle,
46-
stringDecoder: StringDecoder,
4745
private val userDataRepository: UserDataRepository,
4846
topicsRepository: TopicsRepository,
4947
userNewsResourceRepository: UserNewsResourceRepository,
5048
) : ViewModel() {
5149

52-
private val topicArgs: TopicArgs = TopicArgs(savedStateHandle, stringDecoder)
50+
private val topicArgs: TopicArgs = TopicArgs(savedStateHandle)
5351

5452
val topicId = topicArgs.topicId
5553

feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt

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

1717
package com.google.samples.apps.nowinandroid.feature.topic.navigation
1818

19-
import android.net.Uri
2019
import androidx.annotation.VisibleForTesting
2120
import androidx.lifecycle.SavedStateHandle
2221
import androidx.navigation.NavController
2322
import androidx.navigation.NavGraphBuilder
2423
import androidx.navigation.NavType
2524
import androidx.navigation.compose.composable
2625
import androidx.navigation.navArgument
27-
import com.google.samples.apps.nowinandroid.core.decoder.StringDecoder
2826
import com.google.samples.apps.nowinandroid.feature.topic.TopicRoute
27+
import java.net.URLDecoder
28+
import java.net.URLEncoder
2929

3030
@VisibleForTesting
3131
internal const val topicIdArg = "topicId"
3232

3333
internal class TopicArgs(val topicId: String) {
34-
constructor(savedStateHandle: SavedStateHandle, stringDecoder: StringDecoder) :
35-
this(stringDecoder.decodeString(checkNotNull(savedStateHandle[topicIdArg])))
34+
constructor(savedStateHandle: SavedStateHandle) :
35+
this(URLDecoder.decode(checkNotNull(savedStateHandle[topicIdArg]), "UTF-8"))
3636
}
3737

3838
fun NavController.navigateToTopic(topicId: String) {
39-
val encodedId = Uri.encode(topicId)
39+
val encodedId = URLEncoder.encode(topicId, "UTF-8")
4040
this.navigate("topic_route/$encodedId") {
4141
launchSingleTop = true
4242
}

feature/topic/src/test/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModelTest.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import com.google.samples.apps.nowinandroid.core.model.data.FollowableTopic
2222
import com.google.samples.apps.nowinandroid.core.model.data.NewsResource
2323
import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Video
2424
import com.google.samples.apps.nowinandroid.core.model.data.Topic
25-
import com.google.samples.apps.nowinandroid.core.testing.decoder.FakeStringDecoder
2625
import com.google.samples.apps.nowinandroid.core.testing.repository.TestNewsRepository
2726
import com.google.samples.apps.nowinandroid.core.testing.repository.TestTopicsRepository
2827
import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository
@@ -63,7 +62,6 @@ class TopicViewModelTest {
6362
fun setup() {
6463
viewModel = TopicViewModel(
6564
savedStateHandle = SavedStateHandle(mapOf(topicIdArg to testInputTopics[0].topic.id)),
66-
stringDecoder = FakeStringDecoder(),
6765
userDataRepository = userDataRepository,
6866
topicsRepository = topicsRepository,
6967
userNewsResourceRepository = userNewsResourceRepository,

0 commit comments

Comments
 (0)