Döndürme önerileri

Android 8.0'da kullanıcılar, Hızlı Ayarlar karosunu veya Ekran ayarlarını kullanarak otomatik döndürme ve dikey döndürme modları arasında geçiş yapabiliyordu. Android 9'da, cihaz konumu değişse bile mevcut ekran döndürme ayarını sabitleyerek istenmeyen döndürmeleri ortadan kaldırmak için dikey döndürme modunu güncelledik. Kullanıcılar, gezinme çubuğundaki yeni bir düğmeye basarak gerektiğinde dönüşümü manuel olarak tetikleyebilir. Dikey modu, otomatik döndürme kapalıyken etkinleşen "döndürme kilidi" olarak yeniden adlandırdık. Otomatik döndürme modunda herhangi bir değişiklik yapılmadı.

Cihaz döndürme kilidi modundayken kullanıcılar ekranlarını, üstteki görünür Etkinlik tarafından desteklenen herhangi bir döndürme moduna kilitleyebilir (mevcut sistem kısıtlamaları göz önünde bulundurularak). Üst etkinlik, otomatik döndürme modunda birden fazla rotasyonda oluşturulabiliyorsa etkinlik screenOrientation ayarına bağlı bazı istisnalar dışında aynı seçenekler, döndürme kilitli modda da kullanılabilir.

Döndürme kilidi modu, cihaz döndürüldüğünde gezinme çubuğunda bir düğme göstererek çalışır. Bunun için cihazın yön sensörü, otomatik döndürme kapalıyken bile etkin kalmalıdır. Bu düğmeye dokunulduğunda kullanıcının döndürme tercihi (Settings.System.USER_ROTATION) etkin bir şekilde ayarlanır. WindowManager, sistemin döndürülmesini değiştirmek için bu tercihi, en üstteki etkinlik ve sistem durumuyla ilgili diğer ayrıntılarla birlikte kullanır. WindowManager, başka bir etkinliğe geçerken sistemi hangi rotasyonda oluşturacağına karar verirken kullanıcının rotasyon tercihini kullanmaya devam eder.

Bu GIF'te, ekranı dikey yönde olan bir telefon yatay yönde gösterilmektedir. Kullanıcıya ekran yönünü yatay olarak değiştirmek isteyip istemediği soruluyor.
Şekil 1. "Ana Sayfa düğmesini yukarı doğru kaydırma" hareketi etkinken öneri düğmesini döndürme

Etkinlikler arasında geçiş yaparken kullanıcı rotasyonu tercihi korunmalıdır. Ancak çoğu telefon kullanıcısı yalnızca kısa ve geçici bir süre için yatay modda olmak istediğinden doğal yönde eğilim ekledik. Sistem dönme yönü cihazın doğal yönüne değiştiğinde kullanıcı dönme tercihi de cihazın doğal yönüne sıfırlanır. Çoğu telefonda cihazın doğal yönü dikeydir (0º). Kullanıcının döndürme tercihi genellikle yalnızca dikey bir uygulama kullanırken, telefonu kilitlerken veya başlatıcı çalışma alanına dönerken sıfırlanır.

Kullanıcılar için rotasyon etkileşimleri son on yılda pek değişmedi. Kullanıcılar, gezinme çubuğunda döndürme ve düğme konumlandırmayla ilgili önceki deneyimleri nedeniyle bu özelliği keşfetmekte zorlanabilir. Bu nedenle, döndürme düğmesine, göründüğünde düğmeyi vurgulayan bir tanıtım modu ekledik. Giriş modu davranışı yalnızca ilk birkaç düğme etkileşimi için gerçekleşir. Ardından giriş modu devre dışı bırakılır.

Kaynak

Android 9'a döndürme önerileri için destek eklendi. Çoğu değişiklik aşağıdaki dosyalarda bulunur.

  • services/.../server/policy/PhoneWindowManager.java:
    • WindowOrientationListener çıkışını tüketen kancalar (MyOrientationListener, cihazın döndürülüp döndürülmediğini belirlemek için sensörleri izlemekten sorumludur)
    • Otomatik döndürme devre dışıyken bile WindowOrientationListener'ü etkin tutar (needSensorRunningLp()'e bakın)
    • Kullanıcı rotasyon tercihi, en çok kullanılan etkinlik screenOrientation ayarları ve sistem durumuna göre sistem rotasyonunu hesaplar (rotationForOrientationLw() bölümüne bakın)
    • Üst etkinliğin belirli bir rotasyona dönüp dönemeyeceğini belirleme (isRotationChoicePossible() bölümüne bakın)
  • SystemUI/.../statusbar/phone/NavigationBarFragment:
    • PhoneWindowManager kaynağından gelen döndürme önerisi geri çağrılarında gezinme çubuğu düğmesinin gösterilip gösterilmeyeceğini belirler (onRotationProposal() bölümüne bakın)
    • Döndürme gezinme çubuğu düğmesinin ne zaman gizleneceğini yönetir (setRotateSuggestionButtonState(false) çağrılarına bakın)
    • Gezinme çubuğunun gizli olduğu özel durum (genellikle tam ekranda) da dahil olmak üzere düğme zaman aşımlarını yönetir
    • Cihazın doğal yönüne (mRotationWatcher) dönüldüğünde kullanıcı tercihini sıfırlar
    • NavigationBarView bölümünde uygulanan gezinme çubuğu düğmesi animasyonuna uygun stili seçer (onRotationProposal() bölümüne bakın)
    • Özel animasyon dahil olmak üzere giriş modu mantığını ekler (Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED ile ilgili referanslara bakın)
    • disable2 rotasyon işaretini uygular (disable() bölümüne bakın)
  • SystemUI/.../statusbar/phone/NavigationBarView.java:
    • Beklemedeki rotasyonla eşleşen stiller düğmesi simgesi animasyonu (bkz. updateRotateSuggestionButtonStyle())
    • Belirli Erişilebilirlik hizmetleri etkinse döndürme düğmesini gizleme mantığı da dahil olmak üzere düğme görünürlüğü değişikliklerini yönetir (setRotateButtonVisibility() bölümüne bakın) (en sağdaki gezinme çubuğu düğme grubu sıralaması dikkate alınır)
  • SystemUI/res/layout/menu_ime.xml:
    • Döndür düğmesi için menü ve IME/klavye seçicinin üstüne, ancak erişilebilirlik düğmesinin altına yerleştirilmiş yeni bir KeyButtonView içerir
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml:
    • Gezinme menüsünü döndürme düğmesini canlandırmak için kullanılan karmaşık AnimatedVectorDrawable
    • Biçimlendirme (SystemUI/res/values/styles.xml içinde), aynı çizilebilir öğenin çeşitli başlangıç ve bitiş rotasyonlarını animasyonlu olarak göstermek için kullanılabilmesi amacıyla, rotasyonun başlangıç ve bitiş açılarını ayarlamak için kullanılır.
    • Simge tonu TintedKeyButtonDrawable üzerinden ayarlanıyor

Uygulama

Android 9, yazılım gezinme tuşlarını (geri, ana sayfa vb.) kullanan cihazlarda döndürme önerilerinin çalışması için gerekli tüm değişiklikleri içerir.

Donanım gezinme tuşlarına sahip cihazlar üreten ve bu özelliği uygulamak isteyen cihaz üreticilerinin kendi sistem kullanıcı arayüzü kolaylaştırmalarını tasarlayıp uygulamaları veya özelliği devre dışı bırakmaları gerekir. Eklenecek yüzeylerin, cihaz mevcut sistem dönüşümüne göre 90º veya 180º açıyla tutulduğunda kolayca kullanılabilmesi ve hızlıca erişilebilmesi önerilir. Bu nedenlerle, bildirimlerin kullanılması (IME/klavye seçici için yapıldığı gibi) önerilmez.

Bu özelliği kullanmak için gereken donanım koşulları, otomatik döndürme özelliğini kullanma koşullarıyla aynıdır.

Otomatik döndürme kapalıyken sistem herhangi bir nedenle cihazın doğal dönme ayarına geçtiğinde kullanıcının döndürme tercihinin (Settings.System.USER_ROTATION) cihazın doğal dönme ayarına sıfırlanması, uygulama tutarlılığı için gereklidir. Sağlanan uygulama bunu yapar (NavigationBarFragment.mRotationWatcher bölümüne bakın).

Döndürme önerilerinin geçici olarak gösterilmesini engellemek için StatusBarManager.disable2'te yeni bir işaret var. StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS sayfasına göz atın. Kurulum Sihirbazı da dahil olmak üzere kritik sistem uygulamaları tarafından kullanıldığı için bu işarete tüm uygulamalarda uyulmalıdır. Sağlanan uygulama bunu destekler (NavigationBarFragment.disable() bölümüne bakın).

Mümkünse özelliği etkinleştirmenizi ve AOSP uygulamasını izlemenizi önemle tavsiye ederiz. Döndürme deneyimini cihazlar arasında benzer tutmayı amaçlıyoruz. Bu, günümüzde çoğu telefonda otomatik döndürme ve dikey kilit arasında bulunan deneyimdeki tekdüzeliği yansıtır.

Özelleştirme

Rotasyon önerileri yalnızca rotasyon kilitli modda (otomatik rotasyon kapalı) göründüğü için, otomatik rotasyonu varsayılan olarak kapalı tutarak özelliğin yeni yüklemeler için varsayılan olarak etkin olup olmayacağını seçebilirsiniz. Varsayılan değişiklikler yapmak için SettingsProvider/res/values/defaults.xml bölümündeki def_accelerometer_rotation bölümüne bakın.

Kullanıcılar, Hızlı Ayarlar veya Ekran ayarları'ndaki döndürme kutusu aracılığıyla otomatik döndürmenin etkin olup olmadığını (varsayılan ayardan bağımsız olarak) kolayca değiştirebilir.

Doğrulama

Test için, bir Settings.Secure değerini değiştirerek özellik devre dışı bırakılabilir ve etkinleştirilebilir. Bu işlem, ayrıcalıklı bir adb örneğinden aşağıdaki komutu çalıştırarak en kolay şekilde gerçekleştirilebilir:

adb shell settings put secure show_rotation_suggestions <x>

x değerini kapalı için 0, açık için 1 olarak ayarlayın.

Test için, ilişkili Settings.Secure değeri değiştirilerek tanıtım modu sıfırlanabilir. Bu işlem, ayrıcalıklı bir adb örneğinden aşağıdaki komutu çalıştırarak en kolay şekilde gerçekleştirilebilir:

adb shell settings put secure num_rotation_suggestions_accepted 0