Проверка отображения на двух экранах

В режиме растягивания одно приложение заполняет два экрана. По умолчанию приложение, не подготовленное специально для этого режима, получает от системы оповещение о том, что оно теперь занимает экран с большей шириной или высотой, а подсистема пользовательского интерфейса приложения выполняет изменение размеров с учетом новых характеристик экрана.

Дополнительные сведения см. в разделе Как правильно учитывать шов статьи Общие сведения о двухэкранных устройствах.

Используйте этот код для определения того, отображается ли приложение на двух экранах.

Важно!

Интерфейсы API в пакете SDK для Surface Duo взаимодействуют только с устройством Surface Duo и не должны вызываться, когда приложение выполняется на других устройствах. Прежде, чем обращаться к этим API, убедитесь, что приложение выполняется именно на устройстве Surface Duo. Для такой проверки используйте фрагмент кода isDeviceSurfaceDuo.

Это сочетание методов позволяет создать проверку isAppSpanned:

fun getCurrentRotation(activity: Activity): Int {
    return try {
        val wm = activity.getSystemService(Context.WINDOW_SERVICE) as WindowManager
        wm.defaultDisplay.rotation
    } catch (e: IllegalStateException) { Surface.ROTATION_0 }
}
fun getHinge(activity: Activity): Rect? {
    // Hinge's coordinates of its 4 edges in different mode
    // Double Landscape Rect(0, 1350 - 1800, 1434)
    // Double Portrait  Rect(1350, 0 - 1434, 1800)
    return if (isDeviceSurfaceDuo()) {
        val displayMask = DisplayMask.fromResourcesRectApproximation(activity)
        if (displayMask != null) {
            val screensBounding = displayMask.getBoundingRectsForRotation(
                    getCurrentRotation(activity)
            )
            if (screensBounding.size == 0) {
                Rect(0, 0, 0, 0)
            } else {
                screensBounding[0]
            }
        } else { null }
    } else { null }
}
fun getWindowRect(activity: Activity): Rect {
    val windowRect = Rect()
    activity.windowManager.defaultDisplay.getRectSize(windowRect)
    return windowRect
}
fun isAppSpanned(activity: Activity): Boolean {
    val hinge = getHinge(activity)
    val windowRect = getWindowRect(activity)

    return if (hinge != null && windowRect.width() > 0 && windowRect.height() > 0) {
        // The windowRect doesn't intersect hinge
        hinge.intersect(windowRect)
    } else {
        false
    }
}

С помощью метода getHinge можно получить границы расположения для петли.

См. также