Skip to content

Commit 4251252

Browse files
author
Paulina Strychacz
committed
Check language task and set language (requires additional app) feature.
1 parent 47d8be2 commit 4251252

File tree

7 files changed

+140
-19
lines changed

7 files changed

+140
-19
lines changed

src/main/kotlin/TestDeviceManagerExtension.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ open class TestDeviceManagerExtension {
55
var pin: String = ""
66
var password: String = ""
77
var wifi: String = ""
8+
var language: String = ""
89
}
910

src/main/kotlin/internal/Constants.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package internal
22

3+
import internal.External.CHANGE_LANGUAGE_APP
34
import org.gradle.api.GradleException
45

56
object ShellCommands {
@@ -16,6 +17,15 @@ object ShellCommands {
1617
const val SETTINGS_GET_STAY_ON = "settings get global stay_on_while_plugged_in"
1718
const val SETTINGS_PUT_GLOBAL = "settings put global"
1819
const val SETTINGS_GET_GLOBAL = "settings get global"
20+
const val CHANGE_LANGUAGE_VIA_APP ="am start -n $CHANGE_LANGUAGE_APP/.AdbChangeLanguage -e language "
21+
}
22+
23+
object SystemProperties {
24+
const val LOCALE = "persist.sys.locale"
25+
}
26+
27+
object External {
28+
const val CHANGE_LANGUAGE_APP= "net.sanapeli.adbchangelanguage"
1929
}
2030

2131
object TaskInfo {

src/main/kotlin/internal/DeviceWrapper.kt

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package internal
22

33
import com.android.ddmlib.IDevice
4+
import com.android.ddmlib.IDevice.*
5+
import internal.External.CHANGE_LANGUAGE_APP
46
import internal.GradleException.noDevicesConnected
7+
import internal.ShellCommands.CHANGE_LANGUAGE_VIA_APP
58
import internal.ShellCommands.DUMPSYS_INPUT_METHOD
69
import internal.ShellCommands.DUMPSYS_WIFI
710
import internal.ShellCommands.DUMPSYS_WINDOW
@@ -11,6 +14,7 @@ import internal.ShellCommands.SETTINGS_GET_STAY_ON
1114
import internal.ShellCommands.SETTINGS_PUT_GLOBAL
1215
import internal.ShellCommands.SETTINGS_PUT_STAY_ON
1316
import internal.ShellOutput.noDeviceError
17+
import internal.SystemProperties.LOCALE
1418
import org.gradle.api.GradleException
1519
import java.util.regex.Matcher
1620

@@ -22,9 +26,9 @@ class DeviceWrapper(val device: IDevice, val outputReceiverProvider: OutputRecei
2226
}
2327

2428
fun getDetails(): String {
25-
return "${device.getProperty("ro.product.model")} " +
26-
"- Android ${device.getProperty("ro.build.version.release")} " +
27-
"(API level: ${device.getProperty("ro.build.version.sdk")})"
29+
return "${device.getProperty(PROP_DEVICE_MODEL)} " +
30+
"- Android ${device.getProperty(PROP_BUILD_VERSION)} " +
31+
"(API level: ${device.getProperty(PROP_BUILD_API_LEVEL)})"
2832
}
2933

3034
fun getDeviceScreenResolution(): ScreenResolution {
@@ -56,6 +60,26 @@ class DeviceWrapper(val device: IDevice, val outputReceiverProvider: OutputRecei
5660
executeShellCommandWithOutput("$SETTINGS_PUT_STAY_ON ${status.value}")
5761
}
5862

63+
fun getLanguage(): String {
64+
return device.getProperty(LOCALE)
65+
}
66+
67+
fun setLanguage(locale: String) {
68+
if (checkChangeLanguageAppIsInstalled() ) {
69+
executeShellCommandWithOutput("pm grant $CHANGE_LANGUAGE_APP android.permission.CHANGE_CONFIGURATION ")
70+
executeShellCommandWithOutput("$CHANGE_LANGUAGE_VIA_APP $locale")
71+
}
72+
else {
73+
throw GradleException("missing the external app ADB Change Language ($CHANGE_LANGUAGE_APP) " +
74+
"- you can install it from the Play Store")
75+
}
76+
}
77+
78+
private fun checkChangeLanguageAppIsInstalled(): Boolean {
79+
val output = executeShellCommandWithOutput("pm list packages $CHANGE_LANGUAGE_APP")
80+
return output.trim() == "package:$CHANGE_LANGUAGE_APP"
81+
}
82+
5983
fun getAndroidId(): String {
6084
val output = executeShellCommandWithOutput(SETTINGS_GET_ANDROID_ID)
6185
return output.trim()

src/main/kotlin/internal/TaskCreator.kt

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ package internal
33
import TestDeviceManagerExtension
44
import internal.TaskNames.ANIMATIONS_DISABLE_TASK_NAME
55
import internal.TaskNames.ANIMATIONS_ENABLE_TASK_NAME
6+
import internal.TaskNames.CHECK_LANGUAGE_TASK_NAME
67
import internal.TaskNames.CHECK_WIFI_TASK_NAME
78
import internal.TaskNames.LOCK_TASK_NAME
9+
import internal.TaskNames.SET_LANGUAGE_TASK_NAME
810
import internal.TaskNames.STAY_AWAKE_DISABLE_TASK_NAME
911
import internal.TaskNames.STAY_AWAKE_ENABLE_TASK_NAME
1012
import internal.TaskNames.UNLOCK_TASK_NAME
@@ -13,6 +15,7 @@ import org.gradle.api.Project
1315
import org.gradle.api.Task
1416
import tasks.*
1517
import tasks.internal.AnimationScalesSwitch
18+
import tasks.internal.DefaultPluginTask
1619

1720
object TaskNames {
1821
const val UNLOCK_TASK_NAME = "connectedDeviceUnlock"
@@ -22,6 +25,8 @@ object TaskNames {
2225
const val STAY_AWAKE_ENABLE_TASK_NAME = "connectedStayAwakeEnable"
2326
const val STAY_AWAKE_DISABLE_TASK_NAME = "connectedStayAwakeDisable"
2427
const val CHECK_WIFI_TASK_NAME = "connectedCheckWifi"
28+
const val CHECK_LANGUAGE_TASK_NAME = "connectedCheckLanguage"
29+
const val SET_LANGUAGE_TASK_NAME = "connectedSetLanguage"
2530
}
2631

2732
sealed class Tasks<T : Task>(var name: String, var type: Class<T>) {
@@ -36,6 +41,8 @@ sealed class Tasks<T : Task>(var name: String, var type: Class<T>) {
3641
DisableStayAwakeTask::class.java)
3742

3843
object CHECK_WIFI_CONNECTION : Tasks<CheckWifiTask>(CHECK_WIFI_TASK_NAME, CheckWifiTask::class.java)
44+
object CHECK_LANGUAGE : Tasks<CheckLanguageTask>(CHECK_LANGUAGE_TASK_NAME, CheckLanguageTask::class.java)
45+
object SET_LANGUAGE : Tasks<SetLanguageTask>(SET_LANGUAGE_TASK_NAME, SetLanguageTask::class.java)
3946
}
4047

4148
class TaskCreator(
@@ -47,40 +54,41 @@ class TaskCreator(
4754
) {
4855

4956
fun createTasks() {
50-
project.tasks.create(UNLOCK.name, UNLOCK.type) {
51-
it.communicator = communicator
57+
createTask(UNLOCK) {
5258
it.unlockBy = extension.unlockBy
5359
it.pin = extension.pin
5460
it.password = extension.password
5561
}
5662

57-
project.tasks.create(LOCK.name, LOCK.type) {
58-
it.communicator = communicator
59-
}
60-
61-
project.tasks.create(ANIMATION_DISABLE.name, ANIMATION_DISABLE.type) {
62-
it.communicator = communicator
63+
createTask(LOCK)
64+
createTask(ANIMATION_DISABLE) {
6365
it.persistenceHelper = animationScalesPersistenceHelper
6466
it.animationScalesSwitch = animationScalesSwitch
6567
}
6668

67-
project.tasks.create(ANIMATION_ENABLE.name, ANIMATION_ENABLE.type) {
68-
it.communicator = communicator
69+
createTask(ANIMATION_ENABLE) {
6970
it.persistenceHelper = animationScalesPersistenceHelper
7071
it.animationScalesSwitch = animationScalesSwitch
7172
}
7273

73-
project.tasks.create(STAY_AWAKE_ENABLE.name, STAY_AWAKE_ENABLE.type) {
74-
it.communicator = communicator
74+
createTask(STAY_AWAKE_ENABLE)
75+
createTask(STAY_AWAKE_DISABLE)
76+
createTask(CHECK_WIFI_CONNECTION) {
77+
it.wifi = extension.wifi
7578
}
7679

77-
project.tasks.create(STAY_AWAKE_DISABLE.name, STAY_AWAKE_DISABLE.type) {
78-
it.communicator = communicator
80+
createTask(CHECK_LANGUAGE) {
81+
it.language = extension.language
7982
}
83+
createTask(SET_LANGUAGE) {
84+
it.language = extension.language
85+
}
86+
}
8087

81-
project.tasks.create(CHECK_WIFI_CONNECTION.name, CHECK_WIFI_CONNECTION.type) {
88+
private fun <T : DefaultPluginTask> createTask(task: Tasks<T>, configuration: ((T) -> Unit)? = null) {
89+
project.tasks.create(task.name, task.type) {
8290
it.communicator = communicator
83-
it.wifi = extension.wifi
91+
configuration?.invoke(it as T)
8492
}
8593
}
8694
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package tasks
2+
3+
import tasks.internal.LanguageTask
4+
5+
6+
open class CheckLanguageTask : LanguageTask() {
7+
8+
init {
9+
description = "check if specific locale is set as current language"
10+
}
11+
12+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package tasks
2+
3+
import com.android.ddmlib.IDevice
4+
import internal.DeviceWrapper
5+
import org.gradle.api.GradleException
6+
import tasks.internal.LanguageCheckException
7+
import tasks.internal.LanguageTask
8+
9+
10+
open class SetLanguageTask : LanguageTask() {
11+
12+
init {
13+
description = "check if specific locale is set. if not tries to set it using the external app"
14+
}
15+
16+
override fun runTask2(device: IDevice) {
17+
try {
18+
super.runTask2(device)
19+
}
20+
catch (e: LanguageCheckException) {
21+
val deviceWrapper = DeviceWrapper(device, outputReceiverProvider)
22+
println("Device ${deviceWrapper.getDetails()} setting language to $language.")
23+
deviceWrapper.setLanguage(language)
24+
25+
Thread.sleep(1000) //external app changes language via UI, so we need to wait for it
26+
27+
val languageAfterChange = deviceWrapper.getLanguage()
28+
if (languageAfterChange != language) {
29+
throw GradleException("Different language set on ${deviceWrapper.getDetails()}. " +
30+
"It's $languageAfterChange, while $language was expected.")
31+
}
32+
println("Device ${deviceWrapper.getDetails()} has locale set to $language.")
33+
}
34+
}
35+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package tasks.internal
2+
3+
import com.android.ddmlib.IDevice
4+
import internal.DeviceWrapper
5+
import org.gradle.api.GradleException
6+
import org.gradle.api.tasks.Input
7+
8+
open class LanguageTask : DefaultPluginTask() {
9+
@Input
10+
lateinit var language: String
11+
12+
override fun runTask1() {
13+
if (language.isBlank()) {
14+
throw GradleException("No language provided in build script.")
15+
}
16+
}
17+
18+
override fun runTask2(device: IDevice) {
19+
val deviceWrapper = DeviceWrapper(device, outputReceiverProvider)
20+
val currentLanguage = deviceWrapper.getLanguage()
21+
if (currentLanguage != language) {
22+
throw LanguageCheckException("Different language set on ${deviceWrapper.getDetails()}. " +
23+
"It's $currentLanguage, while $language was expected.")
24+
}
25+
println("Device ${deviceWrapper.getDetails()} has locale set to $currentLanguage.")
26+
}
27+
28+
override fun runTask3() {}
29+
}
30+
31+
class LanguageCheckException(msg: String) : GradleException(msg)

0 commit comments

Comments
 (0)