Cihaz durumuna göre otomatik döndürme ayarı

Katlanabilir cihazlarda, ekran döndürme davranışını cihazın fiziksel durumuna göre uyarlayarak kullanıcı deneyimi optimize edilebilir. Örneğin, cihaz tablet gibi bir duruşta açıldığında ekranın otomatik olarak döndürülmesini, cihaz katlandığında ise dikey yönde kilitlenmesini sağlayabilirsiniz.

Android 13'ten itibaren Android, katlanmış, açılmış veya yarı katlanmış (masaüstü modu) gibi cihaz durumlarına göre otomatik döndürme ayarlarını özelleştirebilir.

Cihaz durumuna göre otomatik döndürme ayarları sayfası

Şekil 1: Kullanıcının gördüğü, cihaz durumuna dayalı otomatik döndürme ayarları.

Cihaz durumuna dayalı otomatik döndürme ayarını etkinleştirme

Cihaz durumuna dayalı otomatik döndürmeyi etkinleştirmek ve yapılandırmak için, çerçeveye ait config.xml dosyası için aşağıdaki gibi bir cihaz yerleşimi oluşturun:

  1. Cihazınızın yer paylaşımında config.xml config_perDeviceStateRotationLockDefaults tamsayı dizisini doldurarak farklı cihaz duruşları için varsayılan otomatik döndürme davranışını yapılandırın:

    <!-- In your device overlay, for example,
        device/generic/goldfish/phone/overlay/frameworks/base/core/res/res/values/config.xml -->
    <resources>
        <!-- Map of device posture to rotation lock setting. Each entry must be
            in the format "key:value", or "key:value:fallback_key" for example:
            "0:1" or "2:0:1". The keys are one of
            Settings.Secure.DeviceStateRotationLockKey, and the values are one of
            Settings.Secure.DeviceStateRotationLockSetting. -->
        <integer-array name="config_perDeviceStateRotationLockDefaults">
            <item>0:1</item> <!-- CLOSED -> LOCKED -->
            <item>1:0:2</item> <!-- HALF_OPENED -> IGNORED and fallback to
                device posture OPENED -->
            <item>2:2</item> <!-- OPENED -> UNLOCKED -->
            <item>3:0:0</item> <!-- REAR_DISPLAY -> IGNORED and fallback to
                device posture CLOSED -->
        </integer-array>
    </resources>
    

    fallback-key, başka bir cihaz duruşuna referanstır ve bir duruşun değeri Settings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED olduğunda belirtmeniz gerekir. Bir duruş bu şekilde yapılandırıldığında, otomatik döndürme tercihini alma veya ayarlama istekleri yedek duruşa yönlendirilir.

    Örneğin, HALF_OPENED duruşu OPENED duruşuna geri dönerse:

    • HALF_OPENED için otomatik döndürme ayarını okumak, OPENED için geçerli ayarı döndürür.
    • Cihaz HALF_OPENED durumundayken yeni bir otomatik döndürme tercihi yazmak, OPENED duruşu için tercihi günceller.
  2. Kullanıcı tarafından ayarlanabilen her cihaz duruşu için açıklamaları yapılandırın. Cihazınızın Ayarlar uygulaması yer paylaşımında config_settableAutoRotationDeviceStatesDescriptions dize dizisini doldurun:

    <!-- In your device's Settings app overlay -->
    <resources>
        <!-- The settings/preference description for each settable device
            posture defined in the array
            "config_perDeviceStateRotationLockDefaults".
            The item in position "i" describes the auto-rotation setting for the
            device posture also in position "i" in the array
            "config_perDeviceStateRotationLockDefaults". -->
        <string-array name="config_settableAutoRotationDeviceStatesDescriptions">
            <item>Auto-rotate when folded</item>
            <item>@null</item> <!-- No description for state in position 1 (it
            is not settable by the user) -->
            <item>Auto-rotate when unfolded</item>
        </string-array>
    </resources>
    
  3. Tutarsız davranışları önlemek için bu ayarları doğrudan ayar sağlayıcılarına yazmak yerine programatik olarak değiştirmek üzere doğru API'leri kullanmanız gerekir:

    • Mevcut döndürme kilidi durumunu değiştirmek için (ACCELEROMETER_ROTATION değiştirir):

      • SystemUI veya Başlatıcı'dan RotationPolicy#setRotationLock(...) simgesini kullanın.
      • Pencere Yöneticisi'nde DisplayRotation#freezeRotation() veya thawRotation() tuşunu kullanın.
    • Belirli bir cihaz durumu için döndürme kilidi tercihini değiştirmek üzere (DEVICE_STATE_ROTATION_LOCK değiştirir):

Uygulama ayrıntıları

Katlanabilir cihazlarda otomatik döndürme davranışını kontrol eden ayarlar ve temel anahtar sınıfları aşağıdaki bölümlerde açıklanmıştır.

Ayarlar

Sistem, otomatik döndürmeyi yönetmek için aşağıdaki iki ayarı kullanır:

  • Settings.System.ACCELEROMETER_ROTATION: Bu, birincil otomatik döndürme ayarıdır. Katlanabilir cihazlarda bu değer, cihazın mevcut duruşu için otomatik döndürmenin etkin olup olmadığını yansıtır.

  • Settings.Secure.DEVICE_STATE_ROTATION_LOCK: Bu ayar, kullanıcının her cihaz duruşu (ör. katlanmış veya açılmış) için otomatik döndürme tercihini saklar. Bu sayede, cihazın duruşu değiştiğinde sistem doğru tercihi uygulayabilir.

    Ayar, iki nokta üst üste ile ayrılmış bir dize olarak saklanır. Her değer çifti, cihaz duruşunu ve buna karşılık gelen döndürme ayarını temsil eder. Biçim şöyledir:

    <device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...

    Dönüş değerleri şunlardır:

    • 0: Yoksayıldı (yedek duruş ayarı kullanılır)
    • 1: Kilitli (otomatik döndürme kapalı)
    • 2: Kilidi açık (otomatik döndürme açık)

    Örneğin, "0:2:2:1" dizesi şu anlama gelir:

    • Katlı durumdayken (duruş 0) otomatik döndürme açıktır (2).
    • Açık durumdayken (duruş 2) otomatik döndürme kilitlenir (1).

Anahtar sınıflar

Cihaz durumuna dayalı otomatik döndürme ayarlarını yönetme mantığı aşağıdaki sınıflar tarafından işlenir:

  • DeviceStateAutoRotateSettingManagerImpl: DEVICE_STATE_ROTATION_LOCK ayarını yönetir. Bu API, ayarı güncellemek, değerini almak ve değişiklikler için dinleyicileri kaydetmek üzere yöntemler sağlar.

  • DeviceStateAutoRotateSettingController (Pencere Yöneticisi): ACCELEROMETER_ROTATION ve DEVICE_STATE_ROTATION_LOCK öğelerini senkronize eder. Cihazın duruşu değiştiğinde, yeni durumdaki kullanıcı tercihine göre ACCELEROMETER_ROTATION güncellenir. ACCELEROMETER_ROTATION'da yapılan değişikliklerin, mevcut cihaz duruşu için DEVICE_STATE_ROTATION_LOCK'a geri kaydedilmesini sağlar. Benzer şekilde, mevcut duruş için DEVICE_STATE_ROTATION_LOCK'da yapılan değişiklikler ACCELEROMETER_ROTATION'a yansıtılır.

  • DeviceStateAutoRotateSettingController (Ayarlar uygulaması): Cihaz durumuna dayalı otomatik döndürme ayarları sayfasında kullanıcı arayüzünü kontrol edin.

  • PostureDeviceStateConverter: Genel cihaz durumu tanımlayıcıları ile bu özellik tarafından kullanılan cihaz duruşu tanımlayıcıları arasında dönüşüm yapar.

Doğrulama

Bu özelliğin davranışı OEM'nin yapılandırmasına büyük ölçüde bağlı olduğundan, bu özellik için belirli CTS testleri yoktur. Cihaz, yapılandırdığınız farklı fiziksel durumlar arasında geçiş yaptığında otomatik döndürme ayarlarının beklendiği gibi değiştiğini doğrulamak için manuel test yapmanız gerekir.