Girar sugestões

No Android 8.0, os usuários podem alternar entre os modos de rotação automática e de retrato usando um bloco de configurações rápidas ou configurações de exibição. No Android 9, atualizamos o modo de rotação retrato para eliminar rotações não intencionais fixando a rotação atual da tela, mesmo que a posição do dispositivo mude. Os usuários podem acionar a rotação manualmente quando necessário pressionando um novo botão na barra de navegação. Renomeamos o modo retrato para bloqueio de rotação e ele é ativado quando a rotação automática está desativada. Não há alterações no modo de rotação automática.

Quando o dispositivo está no modo de bloqueio de rotação, os usuários podem bloquear sua tela para qualquer rotação suportada pela atividade visível superior (dadas as restrições atuais do sistema). Se a atividade superior puder ser renderizada em várias rotações no modo de rotação automática, as mesmas opções deverão estar disponíveis no modo de rotação bloqueada, com algumas exceções baseadas na configuração screenOrientation da atividade.

O modo de bloqueio de rotação funciona mostrando um botão na barra de navegação nas alterações de rotação do dispositivo. Para fazer isso, o sensor de orientação do dispositivo deve permanecer ativo mesmo quando a rotação automática estiver desativada. Tocar neste botão efetivamente define a preferência de rotação do usuário ( Settings.System.USER_ROTATION ). WindowManager usa essa preferência, juntamente com outros detalhes sobre a atividade principal e o status do sistema, para alterar a rotação do sistema. WindowManager continua a usar a preferência de rotação do usuário ao decidir em qual rotação renderizar o sistema ao mover para outra atividade.

Este gif mostra um telefone na orientação paisagem com a tela na orientação retrato. Um ícone aparece para perguntar ao usuário se ele deseja alterar a orientação da tela para paisagem.
Figura 1 . Gire o botão de sugestão com o gesto "Deslizar para cima no botão Home" ativado

A preferência de rotação do usuário deve ser mantida ao alternar entre as atividades. No entanto, como a maioria dos usuários de telefone só deseja ficar na paisagem por um período curto e temporário, adicionamos o viés de orientação natural. A preferência de rotação do usuário é redefinida para a orientação natural do dispositivo sempre que a rotação do sistema muda para a orientação natural do dispositivo. Para a maioria dos telefones, a orientação natural do dispositivo é retrato (0º). A redefinição da preferência de rotação do usuário geralmente acontece ao usar um aplicativo somente retrato, bloquear o telefone ou retornar ao espaço de trabalho do iniciador.

As interações de rotação para usuários não mudaram muito na última década. Os usuários podem achar difícil descobrir esse recurso devido ao histórico anterior com rotação e posicionamento dos botões na barra de navegação. Por esse motivo, adicionamos um modo de introdução ao botão de rotação que o destaca quando aparece. O comportamento do modo de introdução acontece apenas nas primeiras interações de botão, após as quais o modo de introdução é desabilitado.

Fonte

O suporte para sugestões de rotação foi adicionado ao Android 9. A maioria das alterações está contida nos arquivos a seguir.

  • services/.../server/policy/PhoneWindowManager.java :
    • Hooks consumindo a saída de WindowOrientationListener ( MyOrientationListener , responsável por monitorar sensores para determinar se o dispositivo foi rotacionado)
    • Mantém o WindowOrientationListener ativo mesmo quando a rotação automática está desabilitada (consulte needSensorRunningLp() )
    • Calcula a rotação do sistema de acordo com a preferência de rotação do usuário, as configurações de screenOrientation da tela de atividade superior e o status do sistema (consulte rotationForOrientationLw() )
    • Determine se a atividade superior pode girar para uma determinada rotação (consulte isRotationChoicePossible() )
  • SystemUI/.../statusbar/phone/NavigationBarFragment :
    • Determina se o botão da barra de navegação deve ser mostrado nos retornos de chamada de sugestão de rotação do PhoneWindowManager (consulte onRotationProposal() )
    • Manipula quando ocultar o botão de rotação da barra de navegação (consulte as chamadas para setRotateSuggestionButtonState(false) )
    • Lida com os tempos limite dos botões, incluindo o caso especial quando a barra de navegação está oculta (geralmente em tela cheia)
    • Redefine a preferência do usuário ao retornar à orientação natural do dispositivo ( mRotationWatcher )
    • Escolhe o estilo apropriado para a animação do botão da barra de navegação, aplicado em NavigationBarView (consulte onRotationProposal() )
    • Adiciona lógica de modo de introdução, incluindo animação especializada (consulte as referências a Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED )
    • Implementa o sinalizador de rotação disable2 (consulte disable() )
  • SystemUI/.../statusbar/phone/NavigationBarView.java :
    • Animação do ícone do botão de estilos para corresponder à rotação pendente (consulte updateRotateSuggestionButtonStyle() )
    • Lida com as alterações de visibilidade do botão (consulte setRotateButtonVisibility() ), incluindo lógica para ocultar o botão de rotação se determinados serviços de acessibilidade estiverem ativos (considerando a classificação da pilha de botões da barra de navegação mais à direita)
  • SystemUI/res/layout/menu_ime.xml :
    • Inclui um novo KeyButtonView para o botão de rotação, empilhado acima do menu e seletor de IME/teclado, mas abaixo do botão Acessibilidade
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml :
    • Complex AnimatedVectorDrawable usado para animar o botão de rotação da barra de navegação
    • Styling (em SystemUI/res/values/styles.xml ) é usado para definir os ângulos de rotação inicial e final para que o mesmo drawable possa ser usado para animar várias rotações iniciais e finais
    • A coloração do ícone é definida via TintedKeyButtonDrawable

Implementação

O Android 9 inclui todas as alterações necessárias para que as sugestões de rotação funcionem para dispositivos que usam teclas de navegação de software (voltar, home, etc).

Os fabricantes de dispositivos que criam dispositivos com teclas de navegação de hardware que desejam implementar esse recurso precisarão projetar e implementar seu próprio recurso de interface do usuário do sistema ou desabilitar o recurso. Recomenda-se que qualquer superfície introduzida seja fácil de usar quando o dispositivo for mantido a 90º ou 180º da rotação atual do sistema e seja rapidamente acessível. Por esses motivos, o uso de notificações (como é feito para o selecionador de IME/teclado) não é recomendado.

Os requisitos de hardware para usar esse recurso são os mesmos para usar a rotação automática.

É necessário para a consistência da implementação que a preferência de rotação do usuário ( Settings.System.USER_ROTATION ) seja redefinida para a rotação natural do dispositivo quando o sistema mudar para a rotação natural do dispositivo por qualquer motivo quando a rotação automática estiver desativada. A implementação fornecida faz isso (consulte NavigationBarFragment.mRotationWatcher ).

Há um novo sinalizador no StatusBarManager.disable2 para impedir temporariamente que as sugestões de rotação apareçam. Consulte StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS . Esse sinalizador deve ser respeitado em todas as implementações, pois é usado por aplicativos críticos do sistema, incluindo o Assistente de Configuração. A implementação fornecida suporta isso (consulte NavigationBarFragment.disable() ).

É altamente recomendável ativar o recurso e seguir a implementação do AOSP, se possível. Nosso objetivo é manter a experiência de rotação semelhante entre os dispositivos, espelhando a uniformidade na experiência na maioria dos telefones atuais entre a rotação automática e o bloqueio de retrato.

Costumização

Como as sugestões de rotação aparecem apenas no modo de rotação bloqueada (rotação automática desativada), é possível escolher se o recurso está ativado por padrão para novas instalações optando por desativar a rotação automática por padrão. Consulte def_accelerometer_rotation em SettingsProvider/res/values/defaults.xml para fazer as alterações padrão.

Os usuários podem alterar facilmente se a rotação automática está ativa ou não (independentemente do padrão) por meio do bloco de rotação nas configurações rápidas ou nas configurações de exibição.

Validação

Para teste, o recurso pode ser desativado e ativado alterando um valor de Settings.Secure de fechamento. Isso é feito mais facilmente executando o seguinte comando de uma instância adb privilegiada:

adb shell settings put secure show_rotation_suggestions <x>

Defina x para 0 para desligado e 1 para ligado.

Para teste, o modo de introdução pode ser redefinido alterando o valor Settings.Secure associado. Isso é feito mais facilmente executando o seguinte comando de uma instância adb privilegiada:

adb shell settings put secure num_rotation_suggestions_accepted 0