Android 9 और उससे पहले के वर्शन में, SurfaceFlinger और DisplayManagerService
ने यह माना था कि ज़्यादा से ज़्यादा दो फ़िज़िकल डिसप्ले मौजूद हैं. इन डिसप्ले के लिए, हार्ड-कोड किए गए आईडी 0 और 1 का इस्तेमाल किया गया था. स्टैटिक डिसप्ले आइडेंटिफ़ायर में बताए गए तरीके के मुताबिक, SurfaceFlinger अब स्टैबल डिसप्ले आईडी जनरेट करने के लिए, हार्डवेयर कंपोजर (एचडब्ल्यूसी) एपीआई का इस्तेमाल करता है. इससे, यह किसी भी संख्या में फ़िज़िकल डिसप्ले मैनेज कर सकता है.
फ़्रेमवर्क, SurfaceControl#getPhysicalDisplayIds
या DisplayEventReceiver
hotplug इवेंट से 64-बिट डिसप्ले आईडी पाने के बाद, SurfaceControl#getPhysicalDisplayToken
के ज़रिए किसी फ़िज़िकल डिसप्ले के लिए IBinder
टोकन देख सकता है.
Android 10 में, मुख्य इंटरनल डिसप्ले को TYPE_BUILT_IN
के तौर पर फ़्लैग किया जाता है. साथ ही, सभी सेकंडरी डिसप्ले को TYPE_HDMI
के तौर पर फ़्लैग किया जाता है. इस बात से कोई फ़र्क़ नहीं पड़ता कि डिसप्ले को किस तरह से कनेक्ट किया गया है. इसलिए, फ़िलहाल अतिरिक्त इंटरनल डिसप्ले को बाहरी डिसप्ले माना जाता है. इस समस्या को हल करने के लिए, डिवाइस के हिसाब से बने कोड में DisplayAddress.Physical#getPort
के बारे में अनुमान लगाया जा सकता है. ऐसा तब किया जा सकता है, जब एचडब्ल्यूसी के बारे में जानकारी हो और पोर्ट के ऐलोकेशन के लॉजिक का अनुमान लगाया जा सकता हो.
लागू करना
पहले, डिसप्ले की पहचान 32-बिट आईडी से की जाती थी. इसमें 0, इंटरनल डिसप्ले होता है, 1 बाहरी डिसप्ले होता है, [2, INT32_MAX] एचडब्ल्यूसी वर्चुअल डिसप्ले होते हैं, और -1 अमान्य डिसप्ले या एचडब्ल्यूसी वर्चुअल डिसप्ले को दिखाता है. SurfaceFlinger और DisplayManagerService
के लिए, दो से ज़्यादा डिसप्ले को ट्रैक करने और पहले देखे गए डिसप्ले को पहचानने के लिए, डिसप्ले को स्थिर और लगातार काम करने वाले आईडी दिए जाने चाहिए.
अगर एचडब्ल्यूसी IComposerClient.getDisplayIdentificationData
के साथ काम करता है और डिसप्ले आइडेंटिफ़िकेशन डेटा उपलब्ध कराता है, तो SurfaceFlinger, ईडीआईडी स्ट्रक्चर को पार्स करता है और फ़िज़िकल और एचडब्ल्यूसी वर्चुअल डिसप्ले के लिए, स्थिर 64-बिट डिसप्ले आईडी असाइन करता है. आईडी को किसी विकल्प के टाइप का इस्तेमाल करके दिखाया जाता है. यहां शून्य वैल्यू, अमान्य डिसप्ले या नॉन-एचडब्ल्यूसी वर्चुअल डिसप्ले को दिखाती है. HWC के बिना, SurfaceFlinger, ज़्यादा से ज़्यादा दो फ़िज़िकल डिसप्ले के साथ लेगसी व्यवहार पर वापस आ जाता है.