No Android 8.0, os usuários podiam alternar entre os modos de rotação automática e rotação 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 múltiplas 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 conseguir isso, o sensor de orientação do dispositivo deve permanecer ativo mesmo quando a rotação automática estiver desligada. Tocar neste botão define efetivamente a preferência de rotação do usuário ( Settings.System.USER_ROTATION
). O 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. O 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.
A preferência de rotação de usuários deve ser mantida ao mover-se entre 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 um 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 aparelho é retrato (0º). A redefinição da preferência de rotação do usuário geralmente ocorre ao usar um aplicativo somente retrato, bloquear o telefone ou retornar à área de trabalho do inicializador.
As interações de rotação para usuários não mudaram muito na última década. Os usuários podem achar esse recurso difícil de descobrir devido ao seu histórico anterior com rotação e posicionamento de 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 ocorre apenas nas primeiras interações com os botões, após as quais o modo de introdução é desativado.
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 girado) - Mantém o
WindowOrientationListener
ativo mesmo quando a rotação automática está desativada (consulteneedSensorRunningLp()
) - Calcula a rotação do sistema de acordo com a preferência de rotação do usuário, as principais configurações de atividade
screenOrientation
e o status do sistema (consulterotationForOrientationLw()
) - Determine se a atividade principal pode girar para uma determinada rotação (consulte
isRotationChoicePossible()
)
- Hooks consumindo a saída de
-
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
(consulteonRotationProposal()
) - Manipula quando ocultar o botão de rotação da barra de navegação (consulte as chamadas para
setRotateSuggestionButtonState(false)
) - Lida com tempos limite de botão, incluindo o caso especial quando a barra de navegação está oculta (geralmente em tela inteira)
- 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
(consulteonRotationProposal()
) - Adiciona lógica de modo de introdução, incluindo animação especializada (veja referências a
Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED
) - Implementa o sinalizador de rotação desabilitar2 (veja
disable()
)
- Determina se o botão da barra de navegação deve ser mostrado nos retornos de chamada de sugestão de rotação do
-
SystemUI/.../statusbar/phone/NavigationBarView.java
:- Estiliza a animação do ícone do botão para corresponder à rotação pendente (consulte
updateRotateSuggestionButtonStyle()
) - Lida com 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 (representando a classificação da pilha de botões da barra de navegação mais à direita)
- Estiliza a animação do ícone do botão para corresponder à rotação pendente (consulte
-
SystemUI/res/layout/menu_ime.xml
:- Inclui um novo
KeyButtonView
para o botão de rotação, empilhado acima do menu e do seletor de IME/teclado, mas abaixo do botão Acessibilidade
- Inclui um novo
-
SystemUI/res/drawable/ic_sysbar_rotate_button.xml
:- Complexo
AnimatedVectorDrawable
usado para animar o botão de rotação da barra de navegação - O estilo (em
SystemUI/res/values/styles.xml
) é usado para definir os ângulos inicial e final de rotação 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
- Complexo
Implementação
O Android 9 inclui todas as alterações necessárias para que as sugestões de rotação funcionem em dispositivos que usam teclas de navegação de software (voltar, casa, 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 sua própria interface de 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º em relação à rotação atual do sistema e seja rapidamente acessível. Por esses motivos, o uso de notificações (como é feito para o seletor 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 em StatusBarManager.disable2
para impedir temporariamente o aparecimento de sugestões de rotação. Consulte StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS
. Este 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()
).
Recomendamos fortemente 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, refletindo a uniformidade da 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 será 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 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 ativado e desativado alterando um valor de controle Settings.Secure
. Isso é mais fácil executando o seguinte comando a partir de uma instância privilegiada do adb:
adb shell settings put secure show_rotation_suggestions <x>
Defina x como 0
para desligar e 1
para ligar.
Para teste, o modo de introdução pode ser redefinido alterando o valor Settings.Secure
associado. Isso é mais fácil executando o seguinte comando a partir de uma instância privilegiada do adb:
adb shell settings put secure num_rotation_suggestions_accepted 0