Skip to content

Commit 3d473b8

Browse files
authored
Extract hardcoded strings into resources (duckduckgo#2130)
Task/Issue URL: https://app.asana.com/0/715106103902962/1202697459365558/f ### Description Extracts hardcoded strings used in Common module as String resources ### Steps to test this PR - Ensure unit tests are green _App TP activity list_ - [x] check activity list renders each tracking event correctly ### UI changes | Before | After | | ------ | ----- | !(Upload before screenshot)|(Upload after screenshot)|
1 parent 5c288b5 commit 3d473b8

File tree

8 files changed

+53
-35
lines changed

8 files changed

+53
-35
lines changed

common/build.gradle

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ android {
2727
lintOptions {
2828
baseline file("lint-baseline.xml")
2929
}
30+
testOptions {
31+
unitTests {
32+
includeAndroidResources = true
33+
}
34+
}
3035
}
3136

3237
dependencies {
@@ -61,5 +66,8 @@ dependencies {
6166

6267
// Testing dependencies
6368
testImplementation Testing.junit4
69+
testImplementation AndroidX.test.ext.junit
70+
testImplementation "androidx.test:runner:_"
71+
testImplementation Testing.robolectric
6472
testImplementation project(path: ':common-test')
6573
}

common/src/main/java/com/duckduckgo/app/global/formatters/time/TimeDiffFormatter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ class RealTimeDiffFormatter @Inject constructor(private val context: Context) :
110110
val timeDifferenceDate = (endDate.time - startDate.time).run { TimeUnit.DAYS.convert(this, TimeUnit.MILLISECONDS) }
111111

112112
return when (timeDifferenceDate) {
113-
0L, 1L -> TimePassed.fromMilliseconds(timeDifferenceMillis).shortFormat()
113+
0L, 1L -> TimePassed.fromMilliseconds(timeDifferenceMillis).shortFormat(context.resources)
114114
else -> context.getString(R.string.common_DaysAgo, timeDifferenceDate)
115115
}
116116
}

common/src/main/java/com/duckduckgo/app/global/formatters/time/model/TimePassed.kt

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

1717
package com.duckduckgo.app.global.formatters.time.model
1818

19+
import android.content.res.Resources
20+
import com.duckduckgo.app.global.R
1921
import com.duckduckgo.app.global.formatters.time.DatabaseDateFormatter
2022
import org.threeten.bp.LocalDateTime
2123

@@ -45,47 +47,41 @@ data class TimePassed(
4547
val seconds: Long
4648
) {
4749

48-
fun shortFormat(): String {
49-
val sb = StringBuilder()
50-
50+
fun shortFormat(resources: Resources): String {
5151
if (hours > 0) {
52-
sb.append(hours)
53-
sb.append("h ago")
54-
return sb.toString()
52+
return resources.getString(R.string.common_HoursAgo, hours)
5553
}
5654

5755
if (minutes > 2) {
58-
sb.append(minutes)
59-
sb.append("m ago")
60-
return sb.toString()
56+
return resources.getString(R.string.common_MinutesAgo, minutes)
6157
}
6258

63-
sb.append("just now")
64-
return sb.toString()
59+
return resources.getString(R.string.common_JustNow)
6560
}
6661

6762
fun format(
6863
alwaysShowHours: Boolean = true,
6964
alwaysShowMinutes: Boolean = true,
70-
alwaysShowSeconds: Boolean = true
65+
alwaysShowSeconds: Boolean = true,
66+
resources: Resources
7167
): String {
7268
val sb = StringBuilder()
7369

7470
if (hours > 0 || alwaysShowHours) {
7571
sb.append(hours)
76-
sb.append(" hr")
72+
sb.append(" ${resources.getString(R.string.common_hour_abbreviation)}")
7773
}
7874

7975
if (minutes > 0 || alwaysShowMinutes) {
8076
sb.append(" ")
8177
sb.append(minutes)
82-
sb.append(" min")
78+
sb.append(" ${resources.getString(R.string.common_min_abbreviation)}")
8379
}
8480

8581
if (alwaysShowSeconds) {
8682
sb.append(" ")
8783
sb.append(seconds)
88-
sb.append(" sec")
84+
sb.append(" ${resources.getString(R.string.common_seconds_abbreviation)}")
8985
}
9086

9187
return sb.toString()

common/src/main/res/values/strings.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,10 @@
2020
<string name="common_DaysAgo">%d days ago</string>
2121
<string name="common_PastWeek">Past Week</string>
2222
<string name="common_PastMonth">Past Month</string>
23+
<string name="common_MinutesAgo">%dm ago</string>
24+
<string name="common_HoursAgo">%dh ago</string>
25+
<string name="common_JustNow">Just Now</string>
26+
<string name="common_hour_abbreviation">hr</string>
27+
<string name="common_min_abbreviation">min</string>
28+
<string name="common_seconds_abbreviation">sec</string>
2329
</resources>

common/src/test/java/com/duckduckgo/app/global/formatters/time/model/TimePassedTest.kt

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,86 +16,93 @@
1616

1717
package com.duckduckgo.app.global.formatters.time.model
1818

19+
import android.content.Context
20+
import androidx.test.core.app.ApplicationProvider.getApplicationContext
21+
import androidx.test.ext.junit.runners.AndroidJUnit4
1922
import org.junit.Assert.assertEquals
2023
import org.junit.Test
24+
import org.junit.runner.RunWith
2125

26+
@RunWith(AndroidJUnit4::class)
2227
class TimePassedTest {
2328

29+
private val resources = getApplicationContext<Context>().resources
30+
2431
@Test
2532
fun whenOnlyHoursPassedThenFormatsProperTime() {
2633
val timePassed = TimePassed(1, 0, 0)
27-
assertEquals("1 hr 0 min 0 sec", timePassed.format())
34+
assertEquals("1 hr 0 min 0 sec", timePassed.format(resources = resources))
2835
}
2936

3037
@Test
3138
fun whenOnlyMinutesPassedThenFormatsProperTime() {
3239
val timePassed = TimePassed(0, 10, 0)
33-
assertEquals("0 hr 10 min 0 sec", timePassed.format())
40+
assertEquals("0 hr 10 min 0 sec", timePassed.format(resources = resources))
3441
}
3542

3643
@Test
3744
fun whenOnlySecondsPassedThenFormatsProperTime() {
3845
val timePassed = TimePassed(0, 0, 25)
39-
assertEquals("0 hr 0 min 25 sec", timePassed.format())
46+
assertEquals("0 hr 0 min 25 sec", timePassed.format(resources = resources))
4047
}
4148

4249
@Test
4350
fun whenHoursAndMinutesPassedThenFormatsProperTime() {
4451
val timePassed = TimePassed(1, 10, 0)
45-
assertEquals("1 hr 10 min 0 sec", timePassed.format())
52+
assertEquals("1 hr 10 min 0 sec", timePassed.format(resources = resources))
4653
}
4754

4855
@Test
4956
fun whenHoursAndSecondsPassedThenFormatsProperTime() {
5057
val timePassed = TimePassed(1, 0, 30)
51-
assertEquals("1 hr 0 min 30 sec", timePassed.format())
58+
assertEquals("1 hr 0 min 30 sec", timePassed.format(resources = resources))
5259
}
5360

5461
@Test
5562
fun whenMinutesAndSecondsPassedThenFormatsProperTime() {
5663
val timePassed = TimePassed(0, 10, 10)
57-
assertEquals("0 hr 10 min 10 sec", timePassed.format())
64+
assertEquals("0 hr 10 min 10 sec", timePassed.format(resources = resources))
5865
}
5966

6067
@Test
6168
fun whenOnlyHoursPassedThenShortFormatsProperTime() {
6269
val timePassed = TimePassed(1, 0, 0)
63-
assertEquals("1h ago", timePassed.shortFormat())
70+
assertEquals("1h ago", timePassed.shortFormat(resources))
6471
}
6572

6673
@Test
6774
fun whenOnlyMinutesPassedThenShortFormatsProperTime() {
6875
val timePassed = TimePassed(0, 10, 0)
69-
assertEquals("10m ago", timePassed.shortFormat())
76+
assertEquals("10m ago", timePassed.shortFormat(resources))
7077
}
7178

7279
@Test
7380
fun whenOnlySecondsPassedThenShortFormatsProperTime() {
7481
val timePassed = TimePassed(0, 0, 45)
75-
assertEquals("just now", timePassed.shortFormat())
82+
assertEquals("Just Now", timePassed.shortFormat(resources))
7683
}
7784

7885
@Test
7986
fun whenOnlyFewSecondsPassedThenShortFormatsProperTime() {
8087
val timePassed = TimePassed(0, 0, 25)
81-
assertEquals("just now", timePassed.shortFormat())
88+
assertEquals("Just Now", timePassed.shortFormat(resources))
8289
}
8390

8491
@Test
8592
fun whenHoursAndMinutesPassedThenShortFormatsProperTime() {
8693
val timePassed = TimePassed(1, 10, 0)
87-
assertEquals("1h ago", timePassed.shortFormat())
94+
assertEquals("1h ago", timePassed.shortFormat(resources))
8895
}
8996

9097
@Test
9198
fun whenHoursAndSecondsPassedThenShortFormatsProperTime() {
9299
val timePassed = TimePassed(1, 0, 30)
93-
assertEquals("1h ago", timePassed.shortFormat())
100+
assertEquals("1h ago", timePassed.shortFormat(resources))
94101
}
95102

96103
@Test
97104
fun whenMinutesAndSecondsPassedShortThenFormatsProperTime() {
98105
val timePassed = TimePassed(0, 10, 10)
99-
assertEquals("10m ago", timePassed.shortFormat())
106+
assertEquals("10m ago", timePassed.shortFormat(resources))
100107
}
101108
}

vpn/src/androidTest/java/com/duckduckgo/mobile/android/vpn/ui/tracker_activity/DeviceShieldActivityFeedViewModelTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ class DeviceShieldActivityFeedViewModelTest {
9797
TrackerCompanyBadge.Company(dummyTrackers[1].company, dummyTrackers[1].companyDisplayName),
9898
),
9999
timestamp = TEST_TIMESTAMP,
100-
displayTimestamp = "just now",
100+
displayTimestamp = "Just Now",
101101
trackersTotalCount = 2
102102
),
103103
TrackerFeedItem.TrackerFeedData(
@@ -108,7 +108,7 @@ class DeviceShieldActivityFeedViewModelTest {
108108
TrackerCompanyBadge.Company(dummyTrackers[2].company, dummyTrackers[2].companyDisplayName),
109109
),
110110
timestamp = TEST_TIMESTAMP,
111-
displayTimestamp = "just now",
111+
displayTimestamp = "Just Now",
112112
trackersTotalCount = 1
113113
),
114114
),

vpn/src/main/java/dummy/ui/VpnControllerActivity.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ class VpnControllerActivity : DuckDuckGoActivity(), CoroutineScope by MainScope(
246246
getString(R.string.vpnNotRunYet)
247247
} else {
248248
return getString(
249-
R.string.vpnTimeRunning, TimePassed.fromMilliseconds(timeRunningMillis).format()
249+
R.string.vpnTimeRunning, TimePassed.fromMilliseconds(timeRunningMillis).format(resources = resources)
250250
)
251251
}
252252
}
@@ -257,7 +257,7 @@ class VpnControllerActivity : DuckDuckGoActivity(), CoroutineScope by MainScope(
257257
val timestamp = LocalDateTime.parse(lastTracker.timestamp)
258258
val timeDifference = timestamp.until(OffsetDateTime.now(), ChronoUnit.MILLIS)
259259
val timeRunning = TimePassed.fromMilliseconds(timeDifference)
260-
return "Latest tracker blocked ${timeRunning.format()} ago\n${lastTracker.domain}\n(owned by ${lastTracker.company})"
260+
return "Latest tracker blocked ${timeRunning.format(resources = resources)} ago\n${lastTracker.domain}\n(owned by ${lastTracker.company})"
261261
}
262262

263263
private fun generateLastWebTrackerBlocked(lastTracker: WebTrackerBlocked?): String {
@@ -266,7 +266,8 @@ class VpnControllerActivity : DuckDuckGoActivity(), CoroutineScope by MainScope(
266266
val timestamp = LocalDateTime.parse(lastTracker.timestamp)
267267
val timeDifference = timestamp.until(OffsetDateTime.now(), ChronoUnit.MILLIS)
268268
val timeRunning = TimePassed.fromMilliseconds(timeDifference)
269-
return "Latest tracker blocked ${timeRunning.format()} ago\n${lastTracker.trackerUrl}\n(owned by ${lastTracker.trackerCompany})"
269+
return "Latest tracker blocked ${timeRunning.format(resources = resources)} ago\n" +
270+
"${lastTracker.trackerUrl}\n(owned by ${lastTracker.trackerCompany})"
270271
}
271272

272273
private fun generateTrackerCompaniesBlocked(

vpn/src/main/java/dummy/ui/VpnDiagnosticsActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ class VpnDiagnosticsActivity : DuckDuckGoActivity(), CoroutineScope by MainScope
452452
} else {
453453
return getString(
454454
R.string.vpnTimeRunning,
455-
TimePassed.fromMilliseconds(timeRunningMillis).format(),
455+
TimePassed.fromMilliseconds(timeRunningMillis).format(resources = resources),
456456
)
457457
}
458458
}

0 commit comments

Comments
 (0)