Skip to content

Commit 990677f

Browse files
Paige McAuliffecopybara-androidxtest
authored andcommitted
Move function to calculate the current width and height pixels of test device to util package
PiperOrigin-RevId: 536463504
1 parent 1aaa0b3 commit 990677f

File tree

3 files changed

+59
-62
lines changed

3 files changed

+59
-62
lines changed

espresso/device/java/androidx/test/espresso/device/action/DisplaySizeAction.kt

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import androidx.test.espresso.device.context.ActionContext
2525
import androidx.test.espresso.device.controller.DeviceControllerOperationException
2626
import androidx.test.espresso.device.sizeclass.HeightSizeClass
2727
import androidx.test.espresso.device.sizeclass.WidthSizeClass
28+
import androidx.test.espresso.device.util.calculateCurrentDisplayWidthAndHeightPx
2829
import androidx.test.espresso.device.util.executeShellCommand
2930
import androidx.test.espresso.device.util.getDeviceApiLevel
3031
import androidx.test.espresso.device.util.getResumedActivityOrNull
@@ -48,7 +49,7 @@ internal class DisplaySizeAction(
4849

4950
val currentActivity = getResumedActivityOrNull()
5051
if (currentActivity != null) {
51-
val displaySize = calculateCurrentDisplay(currentActivity)
52+
val displaySize = calculateCurrentDisplayWidthAndHeightDp(currentActivity)
5253
val startingWidth = displaySize.first
5354
val startingHeight = displaySize.second
5455
if (
@@ -61,35 +62,32 @@ internal class DisplaySizeAction(
6162

6263
val latch: CountDownLatch = CountDownLatch(1)
6364

64-
val currentActivityView: View = object : View(currentActivity) {
65-
override fun onConfigurationChanged(newConfig: Configuration?) {
66-
super.onConfigurationChanged(newConfig)
67-
val currentDisplaySize = calculateCurrentDisplay(currentActivity)
68-
if (
69-
WidthSizeClass.compute(currentDisplaySize.first) == widthDisplaySize &&
70-
HeightSizeClass.compute(currentDisplaySize.second) == heightDisplaySize
71-
) {
72-
latch.countDown()
65+
val currentActivityView: View =
66+
object : View(currentActivity) {
67+
override fun onConfigurationChanged(newConfig: Configuration?) {
68+
super.onConfigurationChanged(newConfig)
69+
val currentDisplaySize = calculateCurrentDisplayWidthAndHeightDp(currentActivity)
70+
if (
71+
WidthSizeClass.compute(currentDisplaySize.first) == widthDisplaySize &&
72+
HeightSizeClass.compute(currentDisplaySize.second) == heightDisplaySize
73+
) {
74+
latch.countDown()
75+
}
7376
}
7477
}
75-
}
7678
val container: ViewGroup =
77-
currentActivity.getWindow().findViewById(android.R.id.content) as ViewGroup
78-
currentActivity.runOnUiThread {
79-
container.addView(currentActivityView)
80-
}
79+
currentActivity.getWindow().findViewById(android.R.id.content) as ViewGroup
80+
currentActivity.runOnUiThread { container.addView(currentActivityView) }
8181

8282
val widthDp = WidthSizeClass.getWidthDpInSizeClass(widthDisplaySize)
8383
val heightDp = HeightSizeClass.getHeightDpInSizeClass(heightDisplaySize)
8484

8585
executeShellCommand("wm size ${widthDp}dpx${heightDp}dp")
8686

8787
latch.await(5, TimeUnit.SECONDS)
88-
currentActivity.runOnUiThread {
89-
container.removeView(currentActivityView)
90-
}
88+
currentActivity.runOnUiThread { container.removeView(currentActivityView) }
9189

92-
val finalSize = calculateCurrentDisplay(currentActivity)
90+
val finalSize = calculateCurrentDisplayWidthAndHeightDp(currentActivity)
9391
if (
9492
WidthSizeClass.compute(finalSize.first) != widthDisplaySize ||
9593
HeightSizeClass.compute(finalSize.second) != heightDisplaySize
@@ -108,20 +106,10 @@ internal class DisplaySizeAction(
108106
}
109107
}
110108

111-
private fun calculateCurrentDisplay(activity: Activity): Pair<Int, Int> {
112-
// "wm size" will output a string with the format
113-
// "Physical size: WxH
114-
// Override size: WxH"
115-
val output = executeShellCommand("wm size")
116-
117-
val subStringToFind = "Override size: "
118-
val displaySizes =
119-
output.substring(output.indexOf(subStringToFind) + subStringToFind.length).trim().split("x")
120-
val widthPx = displaySizes.get(0).toInt()
121-
val heightPx = displaySizes.get(1).toInt()
122-
123-
val widthDp = (widthPx / activity.getResources().displayMetrics.density).roundToInt()
124-
val heightDp = (heightPx / activity.getResources().displayMetrics.density).roundToInt()
109+
private fun calculateCurrentDisplayWidthAndHeightDp(activity: Activity): Pair<Int, Int> {
110+
val displayPx = calculateCurrentDisplayWidthAndHeightPx()
111+
val widthDp = (displayPx.first / activity.getResources().displayMetrics.density).roundToInt()
112+
val heightDp = (displayPx.second / activity.getResources().displayMetrics.density).roundToInt()
125113
return Pair(widthDp, heightDp)
126114
}
127115

espresso/device/java/androidx/test/espresso/device/rules/DisplaySizeRule.kt

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import android.view.View
2222
import android.view.ViewGroup
2323
import androidx.test.annotation.ExperimentalTestApi
2424
import androidx.test.espresso.device.controller.DeviceControllerOperationException
25+
import androidx.test.espresso.device.util.calculateCurrentDisplayWidthAndHeightPx
2526
import androidx.test.espresso.device.util.executeShellCommand
2627
import androidx.test.espresso.device.util.getDeviceApiLevel
2728
import androidx.test.espresso.device.util.getResumedActivityOrNull
@@ -46,10 +47,10 @@ class DisplaySizeRule : TestRule {
4647
)
4748
}
4849

49-
val startingDisplaySize = calculateCurrentDisplay()
50+
val startingDisplaySize = calculateCurrentDisplayWidthAndHeightPx()
5051
statement.evaluate()
5152

52-
if (startingDisplaySize != calculateCurrentDisplay()) {
53+
if (startingDisplaySize != calculateCurrentDisplayWidthAndHeightPx()) {
5354
val activity = getResumedActivityOrNull()
5455
if (activity != null) {
5556
val latch = CountDownLatch(1)
@@ -59,7 +60,7 @@ class DisplaySizeRule : TestRule {
5960
object : View(activity) {
6061
override fun onConfigurationChanged(newConfig: Configuration?) {
6162
super.onConfigurationChanged(newConfig)
62-
if (startingDisplaySize == calculateCurrentDisplay()) {
63+
if (startingDisplaySize == calculateCurrentDisplayWidthAndHeightPx()) {
6364
if (Log.isLoggable(TAG, Log.DEBUG)) {
6465
Log.d(
6566
TAG,
@@ -77,7 +78,7 @@ class DisplaySizeRule : TestRule {
7778
if (
7879
activity.getLocalClassName() == activity.getLocalClassName() &&
7980
stage == Stage.PAUSED &&
80-
startingDisplaySize == calculateCurrentDisplay()
81+
startingDisplaySize == calculateCurrentDisplayWidthAndHeightPx()
8182
) {
8283
if (Log.isLoggable(TAG, Log.DEBUG)) {
8384
Log.d(TAG, "Activity restarted. Display size restored to starting size.")
@@ -108,31 +109,6 @@ class DisplaySizeRule : TestRule {
108109
}
109110
}
110111

111-
private fun calculateCurrentDisplay(): Pair<Int, Int> {
112-
// "wm size" will output a string with the format
113-
// "Physical size: WxH
114-
// Override size: WxH"
115-
val output = executeShellCommand("wm size")
116-
117-
var subStringToFind = "Override size: "
118-
if (output.contains(subStringToFind)) {
119-
val displaySizes =
120-
output.substring(output.indexOf(subStringToFind) + subStringToFind.length).trim().split("x")
121-
val widthPx = displaySizes.get(0).toInt()
122-
val heightPx = displaySizes.get(1).toInt()
123-
return Pair(widthPx, heightPx)
124-
} else {
125-
// If the display size has not been overriden, the "wm size" output will only contain physical
126-
// size
127-
subStringToFind = "Physical size: "
128-
val displaySizes =
129-
output.substring(output.indexOf(subStringToFind) + subStringToFind.length).trim().split("x")
130-
val widthPx = displaySizes.get(0).toInt()
131-
val heightPx = displaySizes.get(1).split("\n").get(0).toInt()
132-
return Pair(widthPx, heightPx)
133-
}
134-
}
135-
136112
companion object {
137113
private val TAG = DisplaySizeRule::class.java.simpleName
138114
}

espresso/device/java/androidx/test/espresso/device/util/DeviceUtil.kt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package androidx.test.espresso.device.util
2020

2121
import android.os.Build
22+
import androidx.annotation.RequiresApi
2223
import androidx.annotation.RestrictTo
2324
import java.util.regex.Pattern
2425

@@ -111,3 +112,35 @@ fun getMapOfDeviceStateNamesToIdentifiers(): MutableMap<String, String> {
111112
}
112113
return deviceStateNameToIdentifier
113114
}
115+
116+
/**
117+
* Returns a Pair containing the current width and height of the test device in pixels
118+
*
119+
* @hide
120+
*/
121+
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
122+
@RestrictTo(RestrictTo.Scope.LIBRARY)
123+
fun calculateCurrentDisplayWidthAndHeightPx(): Pair<Int, Int> {
124+
// "wm size" will output a string with the format
125+
// "Physical size: WxH
126+
// Override size: WxH"
127+
val output = executeShellCommand("wm size")
128+
129+
var subStringToFind = "Override size: "
130+
if (output.contains(subStringToFind)) {
131+
val displaySizes =
132+
output.substring(output.indexOf(subStringToFind) + subStringToFind.length).trim().split("x")
133+
val widthPx = displaySizes.get(0).toInt()
134+
val heightPx = displaySizes.get(1).toInt()
135+
return Pair(widthPx, heightPx)
136+
} else {
137+
// If the display size has not been overriden, the "wm size" output will only contain physical
138+
// size
139+
subStringToFind = "Physical size: "
140+
val displaySizes =
141+
output.substring(output.indexOf(subStringToFind) + subStringToFind.length).trim().split("x")
142+
val widthPx = displaySizes.get(0).toInt()
143+
val heightPx = displaySizes.get(1).split("\n").get(0).toInt()
144+
return Pair(widthPx, heightPx)
145+
}
146+
}

0 commit comments

Comments
 (0)