Skip to content

Commit e083bad

Browse files
authored
Merge pull request #9 from spring-media/feature/check_and_set_language_task
Check language task and set language (requires additional app) feature.
2 parents 9c5b22c + a8eefd0 commit e083bad

File tree

10 files changed

+160
-25
lines changed

10 files changed

+160
-25
lines changed

README.md

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,16 @@ The following things are handled by the plugin:
2121

2222
- Checking for connection to a specific WLAN - A check for a connection to a specific WLAN will be performed
2323

24+
- checking language set on the device
25+
26+
- setting language on the device - possible only when additional app is installed: AdbChangeLanguage available in Google Play: https://play.google.com/store/apps/details?id=net.sanapeli.adbchangelanguage
27+
2428
# Integration into the project
2529
## Groovy
2630
### Plugins DSL
2731
```
2832
plugins {
29-
id "de.welt.apps.testdevicemanager" version "1.1"
33+
id "de.welt.apps.testdevicemanager" version "1.2"
3034
}
3135
```
3236
### Legacy plugin application
@@ -38,7 +42,7 @@ buildscript {
3842
}
3943
}
4044
dependencies {
41-
classpath "de.welt.apps:testdevicemanager:1.1"
45+
classpath "de.welt.apps:testdevicemanager:1.2"
4246
}
4347
}
4448
@@ -48,7 +52,7 @@ apply plugin: "de.welt.apps.testdevicemanager"
4852
### Plugins DSL
4953
```
5054
plugins {
51-
id("de.welt.apps.testdevicemanager") version "1.1"
55+
id("de.welt.apps.testdevicemanager") version "1.2"
5256
}
5357
```
5458
### Legacy plugin application
@@ -74,6 +78,7 @@ testDeviceManager {
7478
pin = "9999"
7579
password = "password"
7680
wifi = "wifi-name"
81+
language = "en-US"
7782
}
7883
```
7984
# Compatibility
@@ -93,9 +98,11 @@ The following tasks will be added to the ```device setup``` section of the gradl
9398
```
9499
-connectedAnimationsDisable
95100
-connectedAnimationsEnable
101+
-connectedCheckLanguage
96102
-connectedCheckWifi
97103
-connectedDeviceLock
98104
-connectedDeviceUnlock
105+
-connectedSetLanguage
99106
-connectedStayAwakeDisable
100107
-connectedStayAwakeEnable
101108
```

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ plugins {
1010
apply from: 'properties-loader.gradle'
1111

1212
group 'de.welt.apps'
13-
version '1.1'
13+
version '1.2'
1414

1515
repositories {
1616
mavenCentral()
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
#Wed Sep 19 10:24:55 CEST 2018
21
distributionBase=GRADLE_USER_HOME
32
distributionPath=wrapper/dists
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-4.8-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-4.8-all.zip

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: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package tasks
2+
3+
import com.android.ddmlib.IDevice
4+
import tasks.internal.LanguageCheckException
5+
import tasks.internal.LanguageTask
6+
7+
8+
open class CheckLanguageTask : LanguageTask() {
9+
10+
init {
11+
description = "check if specific locale is set as current language"
12+
}
13+
14+
override fun runTask2(device: IDevice) {
15+
if (hasLocaleDifferentThanExpected(device)) {
16+
throw LanguageCheckException("Different language set on ${deviceWrapper.getDetails()}. " +
17+
"It's $currentLanguage, while $language was expected.")
18+
}
19+
println("Device ${deviceWrapper.getDetails()} has locale set to $currentLanguage.")
20+
}
21+
22+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package tasks
2+
3+
import com.android.ddmlib.IDevice
4+
import org.gradle.api.GradleException
5+
import tasks.internal.LanguageTask
6+
7+
open class SetLanguageTask : LanguageTask() {
8+
9+
init {
10+
description = "check if specific locale is set. if not tries to set it using the external app"
11+
}
12+
13+
override fun runTask2(device: IDevice) {
14+
if (!hasLocaleDifferentThanExpected(device)) return
15+
16+
val deviceDetails = deviceWrapper.getDetails()
17+
println("Device $deviceDetails setting language to $language.")
18+
deviceWrapper.setLanguage(language)
19+
20+
Thread.sleep(1000) //external app changes language via UI, so we need to wait for it
21+
22+
val languageAfterChange = deviceWrapper.getLanguage()
23+
if (languageAfterChange != language) {
24+
throw GradleException("Different language set on $deviceDetails. " +
25+
"It's $languageAfterChange, while $language was expected.")
26+
}
27+
println("Device $deviceDetails has locale set to $language.")
28+
}
29+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
protected lateinit var deviceWrapper: DeviceWrapper
10+
protected lateinit var currentLanguage: String
11+
12+
@Input
13+
lateinit var language: String
14+
15+
override fun runTask1() {
16+
if (language.isBlank()) {
17+
throw GradleException("No language provided in build script.")
18+
}
19+
}
20+
21+
override fun runTask2(device: IDevice) {
22+
hasLocaleDifferentThanExpected(device)
23+
}
24+
25+
protected fun hasLocaleDifferentThanExpected(device: IDevice) :Boolean {
26+
deviceWrapper = DeviceWrapper(device, outputReceiverProvider)
27+
currentLanguage = deviceWrapper.getLanguage()
28+
29+
return currentLanguage != language
30+
}
31+
32+
override fun runTask3() {}
33+
}
34+
35+
class LanguageCheckException(msg: String) : GradleException(msg)

0 commit comments

Comments
 (0)