회전 추천

Android 8.0에서 사용자는 Quicksettings 타일 또는 디스플레이 설정을 사용하여 자동 회전 및 세로 회전 간에 전환할 수 있습니다. Android 9에서는 기기 위치가 변경되는 경우에도 현재 화면 회전을 고정하여 의도하지 않은 회전이 없도록 세로 회전 모드를 업데이트했습니다. 사용자는 필요한 경우 탐색 메뉴의 새 버튼을 눌러 회전을 수동으로 트리거할 수 있습니다. Google은 세로 모드를 회전 잠금으로 변경했으며, 이 모드는 자동 회전을 끄면 활성화됩니다. 자동 회전 모드의 변경사항은 없습니다.

기기가 회전 잠금 모드로 전환되면 사용자는 상단에 보이는 활동(현재의 시스템 제약을 감안)에 의해 지원되는 모든 회전 모드로 화면을 잠글 수 있습니다. 상단 활동을 자동 회전 모드의 여러 회전에서 렌더링할 수 있는 경우 동일한 옵션을 회전 잠금 모드에서도 사용할 수 있어야 합니다. 단, 활동의 screenOrientation 설정에 따른 일부 예외가 적용됩니다.

회전 잠금 모드는 기기 회전 변경사항의 탐색 메뉴에 버튼을 표시하는 식으로 작동합니다. 이를 위해서는 자동 회전이 꺼진 경우에도 기기의 방향 센서가 활성 상태를 유지해야 합니다. 이 버튼을 탭하면 사용자의 회전 환경설정을 효과적으로 설정할 수 있습니다(Settings.System.USER_ROTATION). WindowManager는 이러한 환경설정과 상단 활동 및 시스템 상태에 관한 기타 세부정보를 사용하여 시스템 회전을 변경합니다. WindowManager는 또 다른 활동으로 이동하는 경우 시스템을 어떤 회전 모드로 렌더링할지 결정할 때 계속해서 사용자 회전 환경설정을 사용합니다.

이 gif는 화면이 세로 방향으로 설정된 가로 모드의 휴대전화를 보여줍니다. 사용자에게 화면 방향을 가로로 변경하고 싶은지 묻는 아이콘이 표시됩니다.
그림 1. '홈 버튼에서 위로 스와이프' 동작이 사용 설정된 회전 추천 버튼

사용자 회전 환경설정은 활동 간에 이동할 때에도 유지되어야 합니다. 하지만 대부분의 휴대전화 사용자는 단시간 동안 일시적으로만 가로 모드를 사용하고 싶어하기 때문에 Google은 자연스러운 방향 바이어스를 추가했습니다. 사용자의 회전 환경설정은 시스템 회전이 기기의 자연스러운 방향으로 변경될 때마다 기기의 자연스러운 방향으로 재설정됩니다. 대부분의 휴대전화에서는 기기의 자연스러운 방향이 세로입니다(0º). 사용자는 세로 모드 전용 앱을 사용하거나 휴대전화를 잠그거나 런처 작업 공간으로 돌아올 때 사용자 회전 환경설정을 재설정하는 경우가 많습니다.

사용자의 회전 상호작용은 지난 10년 동안 크게 변한 점이 없습니다. 사용자는 회전에 관한 이전 기록 및 탐색 메뉴 상의 버튼 위치를 감안했을 때 이 기능을 찾기가 어려울 수 있습니다. 따라서 Google은 회전 버튼에 안내 모드를 추가했습니다. 회전 버튼은 안내 모드가 나타나면 이를 강조표시합니다. 안내 모드 동작은 최초 몇 차례의 버튼 상호작용에서만 발생하며, 그 이후에는 안내 모드가 사용 중지됩니다.

소스

회전 추천 지원이 Android 9에 추가되었습니다. 대부분의 변경사항은 다음 파일에 포함되어 있습니다.

  • services/.../server/policy/PhoneWindowManager.java:
    • WindowOrientationListener의 출력을 소비하는 후크(센서를 모니터링하여 기기가 회전되었는지 파악하는 MyOrientationListener)
    • 자동 회전이 비활성화된 경우에도 WindowOrientationListener의 활성 상태를 유지합니다(needSensorRunningLp() 참고).
    • 사용자 회전 환경설정, 상단 활동 screenOrientation 설정 및 시스템 상태를 감안하여 시스템 회전을 계산합니다(rotationForOrientationLw() 참고).
    • 상단 활동이 지정된 회전을 실행할 수 있는지 파악합니다(isRotationChoicePossible() 참고).
  • SystemUI/.../statusbar/phone/NavigationBarFragment:
    • 탐색 메뉴 버튼을 PhoneWindowManager의 회전 추천 콜백에 표시해야 하는지 파악합니다(onRotationProposal() 참고).
    • 탐색 메뉴 회전 버튼을 숨기는 시기를 처리합니다(setRotateSuggestionButtonState(false) 호출 참고).
    • 버튼 시간 제한을 처리합니다. 탐색 메뉴가 숨겨진 특별한 경우도 포함됩니다(보통은 전체 화면).
    • 기기의 자연스러운 방향으로 돌아오면 사용자 환경설정을 재설정합니다(mRotationWatcher).
    • NavigationBarView에 적용되는 탐색 메뉴 버튼 애니메이션의 적절한 스타일을 선택합니다(onRotationProposal() 참고).
    • 특수 애니메이션을 비롯한 안내 모드 논리를 추가합니다(Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED 참고).
    • disable2 회전 플래그를 구현합니다(disable() 참고).
  • SystemUI/.../statusbar/phone/NavigationBarView.java:
    • 대기 중인 회전과 일치하도록 버튼 아이콘 애니메이션의 스타일을 지정합니다(updateRotateSuggestionButtonStyle() 참고).
    • 특정 접근성 서비스가 활성화된 경우 회전 버튼을 숨기는 로직(맨 오른쪽 탐색 메뉴 버튼의 스택 순위 감안) 등 버튼 표시 여부의 변경사항을 처리합니다(setRotateButtonVisibility() 참고).
  • SystemUI/res/layout/menu_ime.xml:
    • 메뉴 및 IME/키보드 선택기 위에 스택되었지만 접근성 버튼 아래에 위치한 회전 버튼의 새로운 KeyButtonView를 포함합니다.
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml:
    • 탐색 메뉴 회전 버튼에 애니메이션을 적용하는 데 사용되는 복잡한 AnimatedVectorDrawable
    • SystemUI/res/values/styles.xml의 스타일 지정은 같은 드로어블을 사용하여 다양한 시작 및 종료 회전에 애니메이션을 적용할 수 있도록 회전의 시작 및 종료 각도를 설정하는 데 사용됩니다.
    • 아이콘 색조는 TintedKeyButtonDrawable을 통해 설정됩니다.

구현

Android 9에는 소프트웨어 탐색 키(뒤로, 홈 등)를 사용하는 기기에 작동하는 회전 추천을 가져오는 데 필요한 모든 변경사항이 포함됩니다.

이러한 기능을 구현하고 싶어하는 하드웨어 탐색 키로 기기를 제작하는 기기 제조업체는 자체 시스템 UI 어포던스를 설계하고 구현하거나 기능을 사용 중지해야 합니다. 도입된 모든 노출 영역은 기기를 현재 시스템 회전의 90º 또는 180º로 들었을 때 쉽게 사용할 수 있어야 하며 접근성이 빠른 것이 좋습니다. 따라서 IME/키보드 선택기처럼 알림을 사용하는 것은 좋지 않습니다.

이 기능의 사용을 위한 하드웨어 요구사항은 자동 회전 사용을 위한 요구사항과 동일합니다.

구현의 일관성이 중요합니다. 즉, 사용자 회전 환경설정(Settings.System.USER_ROTATION)은 자동 회전이 꺼지고 어떤 이유로든 시스템이 기기의 자연스러운 방향으로 변경될 때 기기의 자연스러운 방향으로 재설정되어야 합니다. 제공된 구현은 이를 실행합니다(NavigationBarFragment.mRotationWatcher 참고).

StatusBarManager.disable2에는 회전 추천이 일시적으로 표시되지 않도록 하는 새로운 플래그가 있습니다. StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS을 참고하세요. 이 플래그는 모든 구현에서 존중되어야 하며, 이는 플래그가 설정 마법사를 비롯한 중요한 시스템 앱에 의해 사용되기 때문입니다. 제공된 구현은 이를 지원합니다(NavigationBarFragment.disable() 참고).

가능한 경우 기능을 사용하고 AOSP 구현을 따르는 것이 좋습니다. Google은 회전 환경을 기기 간에 유사하게 유지하여 오늘날 대부분의 휴대전화에서 볼 수 있는 자동 회전 및 세로 모드로 잠금 간의 일관된 환경을 반영하는 데 목표를 두고 있습니다.

맞춤설정

회전 추천은 회전 잠금 모드(자동 회전 꺼짐)로만 표시됩니다. 따라서 자동 회전이 기본으로 꺼지도록 선택하면 새로 설치 시 기능을 기본으로 켤지 선택할 수 있습니다. 기본적인 변경사항을 적용하는 내용은 SettingsProvider/res/values/defaults.xmldef_accelerometer_rotation을 참고하세요.

사용자는 빠른 설정 또는 디스플레이 설정의 회전 타일을 통해 기본값과 상관없이 자동 회전의 활성 여부를 쉽게 변경할 수 있습니다.

유효성 검사

테스트의 경우 Settings.Secure 값 게이팅을 변경하여 기능을 켜고 끌 수 있습니다. 가장 쉬운 방법은 권한 있는 adb 인스턴스에서 다음 명령어를 실행하는 것입니다.

adb shell settings put secure show_rotation_suggestions <x>

끄려면 x를 0으로, 켜려면 1로 설정합니다.

테스트의 경우 관련 Settings.Secure 값을 변경하여 안내 모드를 재설정할 수 있습니다. 가장 쉬운 방법은 권한 있는 adb 인스턴스에서 다음 명령어를 실행하는 것입니다.

adb shell settings put secure num_rotation_suggestions_accepted 0