Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

회전 추천

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

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

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

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

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

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

소스

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

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

구현

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

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

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

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

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

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

맞춤설정

회전 추천은 회전 잠금 모드(자동 회전 off)로만 표시됩니다. 따라서 자동 회전이 기본으로 꺼지도록 선택하면 새로 설치 시 기능을 기본으로 켤지 선택할 수 있습니다. 기본적인 변경사항을 적용하는 내용은 SettingsProvider/res/values/defaults.xml에서 def_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