Pencere içinde pencere

Android el cihazları için resim içinde resim (PIP) özelliği, kullanıcıların devam eden bir etkinliğe sahip bir uygulamayı küçük bir pencerede yeniden boyutlandırmasına olanak tanır. PIP, özellikle video uygulamaları için kullanışlıdır çünkü kullanıcı diğer eylemleri gerçekleştirmekte özgürken içerik oynamaya devam eder. Kullanıcılar, SystemUI aracılığıyla bu pencerenin konumunu değiştirebilir ve uygulama tarafından sağlanan (üç adede kadar) eylemle şu anda resim içinde resim olan uygulamayla etkileşim kurabilir.

PIP, kendisini destekleyen uygulamalardan açıkça onay almayı gerektirir ve etkinlik bazında çalışır. (Tek bir uygulama, yalnızca biri PIP'de olan birden çok etkinliğe sahip olabilir.) Etkinlikler, enterPictureInPictureMode() öğesini çağırarak resim içinde resim girmeyi talep eder ve onPictureInPictureModeChanged() biçiminde etkinlik geri aramaları alır.

setPictureInPictureParams() yöntemi, etkinliklerin PIP'deyken en boy oranlarını kontrol etmelerini ve kullanıcıların etkinlikle genişletmek zorunda kalmadan etkileşim kurmasına olanak tanıyan özel eylemleri kontrol etmelerini sağlar. PIP'de etkinlik duraklatılmış, ancak işleme durumundadır ve doğrudan dokunmatik girişi veya pencere odağını almaz. PIP'de aynı anda yalnızca tek bir görev olabilir.

Android Developer Picture-in-picture belgelerinde daha fazla bilgi mevcuttur.

Cihaz gereksinimleri

PIP'yi desteklemek için /android/frameworks/base/core/java/android/content/pm/PackageManager.java PackageManager#FEATURE_PICTURE_IN_PICTURE sistem özelliğini etkinleştirin. PIP'yi destekleyen cihazların en küçük genişliği 220 dp'den büyük olan bir ekranı olmalıdır. Bölünmüş ekranlı çoklu pencereye benzer şekilde, PIP ekranda aynı anda birden fazla etkinliğin çalışmasına izin verir. Bu nedenle, cihazların bu kullanım durumunu desteklemek için yeterli CPU ve RAM'e sahip olması gerekir.

uygulama

Etkinlik yaşam döngüsü yönetiminin çoğu sistemde ActivityManager ve WindowManager arasında yapılır. Referans UI uygulaması, SystemUI paketindedir.

Sistemde yapılan değişiklikler, Uyumluluk Test Paketi (CTS) testlerinde tanımlanan içsel davranışını etkilememelidir. PIP için sistem mantığı, temel olarak "sabitlenmiş" yığın içindeki görevlerin ve etkinliklerin yönetimi etrafında döner. İşte hızlı bir sınıf özeti:

  • ActivityRecord : her etkinliğin resim içinde resim durumunu izler. Kullanıcıların kilit ekranından veya VR sırasında olduğu gibi belirli durumlarda PIP'ye girmesini önlemek için checkEnterPictureInPictureState() öğesine vakalar ekleyin.
  • ActivityManagerService : etkinlikten PIP girme talebinde bulunan birincil arabirim ve PIP etkinlik durumunu değiştirmek için WindowManager ve SystemUI gelen çağrılara yönelik arabirim.
  • ActivityStackSupervisor : ActivityManagerService görevleri sabitlenmiş yığının içine veya dışına taşımak için çağrılır ve WindowManager gerektiği gibi günceller.
  • PinnedStackWindowController : ActivityManager WindowManager arayüzü.
  • PinnedStackController : gösterilen/gizlenen IME, değişen en boy oranı veya değiştirilen eylemler gibi sistemdeki değişiklikleri SystemUI bildirir.
  • BoundsAnimationController : yeniden boyutlandırma sırasında bir yapılandırma değişikliğini tetiklemeyen bir şekilde PIP etkinlik pencerelerini canlandırır.
  • PipSnapAlgorithm : hem sistemde hem de SystemUI'de kullanılan ve ekranın kenarlarına yakın PIP penceresinin yapışma davranışını kontrol eden paylaşılan bir sınıf.

Referans SystemUI kullanıcılara özel eylemler sunmayı ve genişletme ve kapatma gibi genel manipülasyonu destekleyen eksiksiz bir PIP uygulaması sağlar. Cihaz üreticileri, CDD tarafından tanımlandığı şekliyle içsel davranışları etkilemedikleri sürece bu değişiklikleri geliştirebilir. İşte hızlı bir sınıf özeti:

  • PipManager : SystemUI ile başlatılan SystemUI bileşeni.
  • PipTouchHandler : PIP'yi değiştiren hareketleri kontrol eden dokunmatik işleyici. Bu, yalnızca PIP için girdi tüketicisi etkinken kullanılır (bkz. InputConsumerController ). Buraya yeni hareketler eklenebilir.
  • PipMotionHelper : PIP konumunu ve ekranda izin verilen bölgeyi izleyen bir uygunluk sınıfı. PIP'nin konumunu ve boyutunu güncellemek veya canlandırmak için ActivityManagerService çağırır.
  • PipMenuActivityController : o anda PIP'de bulunan aktivite tarafından sağlanan eylemleri gösteren bir aktivite başlatır. Bu etkinlik, bir görev bindirme etkinliğidir ve etkileşimli olmasına izin vermek için bindirilen girdi tüketicisini kaldırır.
  • PipMenuActivity : menü etkinliğinin uygulanması.
  • PipMediaController : medya oturumu PIP'deki varsayılan eylemleri etkileyebilecek şekilde değiştiğinde SystemUI güncelleyen dinleyici.
  • PipNotificationController : Bir kullanıcı PIP özelliğini kullanırken bir bildirimin aktif olmasını sağlayan kontrolör.
  • PipDismissViewController : PIP ile etkileşime başladıklarında kullanıcılara gösterilen kaplama, bunun kapatılabileceğini belirtir.

Varsayılan yerleşim

PIP'nin varsayılan yerleşimini kontrol eden çeşitli sistem kaynakları vardır:

  • config_defaultPictureInPictureGravity : BOTTOM|RIGHT gibi PIP'yi yerleştirmek için köşeyi kontrol eden yerçekimi tamsayısı.
  • config_defaultPictureInPictureScreenEdgeInsets : PIP'yi yerleştirmek için ekranın kenarlarından uzaklıklar.
  • config_pictureInPictureDefaultSizePercent ve config_pictureInPictureDefaultAspectRatio : ekran genişliği yüzdesi ve en boy oranı kombinasyonu, PIP boyutunu kontrol eder. Hesaplanan varsayılan PIP boyutu, CTS ve CDD tarafından tanımlandığı gibi @dimen/default_minimal_size_pip_resizable_task değerinden küçük olmamalıdır.
  • config_pictureInPictureSnapMode : PipSnapAlgorithm tanımlanan yakalama davranışı.

Cihaz uygulamaları, CDD ve CTS'de tanımlanan minimum ve maksimum en boy oranlarını değiştirmemelidir.

İzinler

AppOpsManager ( master/core/java/android/app/AppOpsManager.java ) paket başına "uygulama işlemi" ( OP_PICTURE_IN_PICTURE ), kullanıcıların sistem ayarları aracılığıyla uygulama bazında PIP'yi kontrol etmesine olanak tanır. Bir etkinlik resim içinde resim moduna girmek istediğinde cihaz uygulamalarının bu kontrole uyması gerekir.

Test yapmak

PIP uygulamalarını test etmek için, /cts/hostsidetests/services/activitymanager altında, özellikle ActivityManagerPinnedStackTests.java ana bilgisayar tarafı CTS testlerinde bulunan resim içinde resim ile ilgili tüm testleri çalıştırın.