Sugestões de rotação

No Android 8.0, os usuários podiam alternar entre a rotação automática e a de retrato usando um bloco "Configurações rápidas" ou as "Configurações da tela". No Android 9, atualizamos modo de rotação retrato para eliminar rotações acidentais, fixando o a rotação atual da tela, mesmo se a posição do dispositivo mudar. Os usuários podem acionar rotação manual quando necessário pressionando um novo botão na barra de navegação. Renomeamos o modo retrato para bloqueio de rotação, que é ativado quando a rotação automática é ativada está desativado. Não há mudanças no modo de giro automático.

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

O modo de bloqueio de rotação mostra um botão na barra de navegação durante a rotação do dispositivo mudanças. Para isso, o sensor de orientação do dispositivo deve permanecer ativo mesmo quando o giro automático está desativado. Tocar nesse botão define a rotação do usuário preferência (Settings.System.USER_ROTATION). A WindowManager usa isso preferências, além de outros detalhes sobre as principais atividades e status do sistema, para mudar a rotação do sistema. A WindowManager continua usando a rotação de usuários. preferência ao decidir qual rotação deve ser usada para renderizar o sistema durante a movimentação outra atividade.

Este GIF mostra um telefone na orientação paisagem com a tela
       orientação retrato. Um ícone aparece para perguntar ao usuário se ele quer
       mudar a orientação da tela para paisagem.
Figura 1. Botão de sugestão de rotação com "Deslizar" no botão home" gesto 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 celular quer ficar no modo paisagem apenas por um curto período, temporário, adicionamos o viés de orientação natural. Rotação de usuários é redefinida para a orientação natural do dispositivo sempre que o a rotação do sistema muda para a orientação natural do dispositivo. Na maioria dos celulares, a orientação natural do dispositivo seja retrato (0o). Como redefinir a rotação de usuários preferência geralmente acontece ao usar um aplicativo somente retrato, bloquear o celular ou retornando ao espaço de trabalho do inicializador.

As interações de rotação para os usuários não mudaram muito na última década. Usuários pode achar esse recurso difícil de descobrir dado seu histórico anterior com rotação e o posicionamento dos botões na barra de navegação. Por isso, adicionamos um modo de introdução ao botão de rotação, que o destaca quando aparece. Introdução o comportamento do modo acontece apenas para as primeiras interações de botão, em seguida, o modo de introdução está desativado.

Origem

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

  • services/.../server/policy/PhoneWindowManager.java:
    • Hooks que consomem a saída de WindowOrientationListener (MyOrientationListener, responsável por monitorar sensores para determinar se o dispositivo foi girado)
    • Mantém o WindowOrientationListener ativo mesmo quando o giro automático está desativado (consulte needSensorRunningLp())
    • Calcula a rotação do sistema de acordo com a preferência de rotação do usuário. Configurações da atividade screenOrientation e 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 na rotação Callbacks de sugestão de PhoneWindowManager (consulte onRotationProposal())
    • Define quando ocultar o botão de rotação da barra de navegação (consulte as chamadas para setRotateSuggestionButtonState(false))
    • Controla os tempos limite dos botões, incluindo o caso especial quando o a barra de navegação está oculta (geralmente em tela cheia)
    • Redefine a preferência do usuário ao retornar ao modo natural do dispositivo orientação (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 do modo de introdução, incluindo animação especializada. (consulte as referências a Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED)
    • Implementa a flag de rotação "disable2" (consulte disable()).
  • SystemUI/.../statusbar/phone/NavigationBarView.java:
    • Aplica estilo à animação do ícone do botão para corresponder à rotação pendente (consulte updateRotateSuggestionButtonStyle())
    • Gerencia mudanças de visibilidade do botão (consulte setRotateButtonVisibility()), incluindo a lógica para ocultar o botão de rotação se determinados serviços de acessibilidade estiverem ativos (considerando a classificação da pilha do botão da barra de navegação mais à direita)
  • SystemUI/res/layout/menu_ime.xml:
    • Inclui um novo KeyButtonView para o botão de rotação. empilhados acima do menu e do seletor de IME/teclado, mas abaixo do Botão de acessibilidade
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml:
    • AnimatedVectorDrawable complexo usado para animar o botão girar a barra de navegação
    • O estilo (em SystemUI/res/values/styles.xml) é usado para: define os ângulos inicial e final de rotação para que o mesmo drawable possa ser usada para animar várias rotações inicial e final
    • A tonalidade do ícone é definida por TintedKeyButtonDrawable

Implementação

O Android 9 inclui todas as mudanças necessárias para obter as sugestões de rotação funcionam Aparelhos que usam teclas de navegação com software (voltar, tela inicial etc.).

Fabricantes de dispositivos que criam dispositivos com teclas de navegação de hardware que desejam para implementar esse recurso, é necessário projetar e implementar as próprias interfaces a funcionalidade ou desativar o recurso. É recomendável que todas as superfícies ser fácil de usar quando o dispositivo for mantido em 90o ou 180o em relação ao sistema atual rotativa e de fácil acesso. Por esses motivos, o uso de notificações (como é feito para o IME/seletor de teclado) não é recomendado.

Os requisitos de hardware para usar esse recurso são os mesmos que os exigidos para usar o giro automático.

Para manter a consistência da implementação, é necessário que a preferência de rotação do usuário (Settings.System.USER_ROTATION) for redefinido para o estado natural do dispositivo rotação quando o sistema muda para a rotação natural do dispositivo por qualquer motivo quando o giro automático estiver desativado. A implementação fornecida faz isso (consulte NavigationBarFragment.mRotationWatcher).

Há uma nova flag em StatusBarManager.disable2 para temporariamente impedir a exibição de sugestões de rotação. Consulte StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS: Essa sinalização deve ser respeitado em todas as implementações, já que é usado por apps críticos do sistema, incluindo Assistente de configuração. A implementação fornecida suporta isso (consulte NavigationBarFragment.disable()).

Recomendamos ativar o recurso e seguir a política do AOSP implementação, se possível. Nosso objetivo é manter a experiência de rotação entre dispositivos, espelhando a uniformidade de experiência na maioria dos smartphones hoje entre o giro automático e o bloqueio de retrato.

Personalização

Como as sugestões de rotação aparecem apenas no modo de rotação bloqueada (giro automático desativado), é possível escolher se o recurso será ativado por padrão para novas instalações escolher ter o giro automático desativado por padrão. Consulte def_accelerometer_rotation pol. SettingsProvider/res/values/defaults.xml para fazer mudanças padrão.

Os usuários podem mudar facilmente se o giro automático está ativo ou não (independentemente do padrão) pelo bloco de rotação nas Configurações rápidas ou nas Configurações de exibição.

Validação

Para testes, o recurso pode ser desativado e ativado com a alteração de um bloqueio Valor de Settings.Secure. Isso é possível com mais facilidade executando o comando seguinte comando de uma instância privilegiada do adb:

adb shell settings put secure show_rotation_suggestions <x>

Defina "x" como 0 para desativar e 1 para ativar.

Para o teste, o modo de introdução pode ser redefinido alterando o Valor de Settings.Secure. Isso é possível com mais facilidade executando o comando seguinte comando de uma instância privilegiada do adb:

adb shell settings put secure num_rotation_suggestions_accepted 0