कटलफ़िश कंट्रोल पैनल

Cuttlefish के लिए डिफ़ॉल्ट WebRTC ब्राउज़र इंटरफ़ेस में एक कंट्रोल पैनल शामिल होता है. इससे वर्चुअल डिवाइस के साथ इंटरैक्ट करने के ज़्यादा तरीके मिलते हैं.

कंट्रोल पैनल में डिफ़ॉल्ट बटन होते हैं. इनकी मदद से, डिवाइस पर की जाने वाली सामान्य कार्रवाइयों को सिम्युलेट किया जा सकता है. जैसे, पावर बटन या आवाज़ कम-ज़्यादा करने वाले बटन दबाना. इसके अलावा, डिवाइस को घुमाया भी जा सकता है.

पसंद के मुताबिक की जाने वाली कार्रवाइयां

कंट्रोल पैनल को पसंद के मुताबिक बनाया जा सकता है. इसमें ज़्यादा बटन जोड़े जा सकते हैं, ताकि वर्चुअल डिवाइस आपके फ़िज़िकल डिवाइस की तरह काम कर सके. यह आपके डिवाइस की खास सुविधाओं को टेस्ट करने के लिए काम आता है. जैसे, हार्डवेयर बटन या खास जेस्चर, जो ओएस में कोई खास कार्रवाई ट्रिगर करता है. कस्टम बटन का इस्तेमाल करके, QA पर फ़ोकस करने वाली ज़्यादा सुविधाओं को चालू किया जा सकता है. जैसे, डिवाइस की बैटरी कम होने पर ओएस का व्यवहार.

Cuttlefish के डिफ़ॉल्ट कंट्रोल पैनल में, कस्टम कार्रवाइयों को "प्लग इन" करने की सुविधा शामिल होती है. इसके लिए, Cuttlefish के मुख्य AOSP प्रोजेक्ट में बदलाव करने की ज़रूरत नहीं होती. कस्टम कार्रवाइयों का इस्तेमाल शुरू करने के लिए, आपके वर्चुअल डिवाइस में सिर्फ़ एक कॉन्फ़िगरेशन फ़ाइल होनी चाहिए. यह कस्टम ऐक्शन की कॉन्फ़िगरेशन फ़ाइल का उदाहरण देखें.

  1. एक JSON फ़ाइल बनाएं, जिसमें आपके डिवाइस की कस्टम कार्रवाइयों के बारे में बताया गया हो. इस फ़ाइल को अपनी किसी भी डायरेक्ट्री में रखा जा सकता है. इस फ़ाइल की संरचना के बारे में, ADB शेल और ऐक्शन सर्वर सेक्शन में बताया गया है.

  2. अपने JSON कॉन्फ़िगरेशन के लिए prebuilt_etc_host मॉड्यूल बनाएं. पक्का करें कि sub_dir की वैल्यू, cvd_custom_action_config के बराबर हो.

    prebuilt_etc_host {
        // Use any name you choose.
        name: "my_custom_action_config.json",
        src: "my_custom_action_config.json",
        // Always use this sub_dir.
        sub_dir: "cvd_custom_action_config",
    }
    
  3. अपने डिवाइस के प्रॉडक्ट मेकफ़ाइल में, Soong कॉन्फ़िगरेशन के बिल्ड वैरिएबल सेट करें. इससे वर्चुअल डिवाइस होस्ट पैकेज को कॉन्फ़िगर किया जा सकेगा, ताकि उसमें आपकी कस्टम ऐक्शन कॉन्फ़िगरेशन फ़ाइल शामिल की जा सके.

    # Set these variables exactly as shown here to enable the host package to see
    # your custom config module name.
    SOONG_CONFIG_NAMESPACES += cvd
    SOONG_CONFIG_cvd += custom_action_config
    
    # Set this value to the name of your JSON module.
    SOONG_CONFIG_cvd_custom_action_config := my_custom_action_config.json
    

कस्टम ऐक्शन लागू करने के लिए, ये दो तरीके इस्तेमाल किए जा सकते हैं:

  • ADB शेल कमांड
  • ऐक्शन सर्वर

आपकी JSON कॉन्फ़िगरेशन फ़ाइल, हर तरह के लागू करने के तरीके के कई इंस्टेंस तय कर सकती है.

ADB शेल कमांड

एक ऐसा बटन तय किया जा सकता है जिसे सिर्फ़ एक adb shell कमांड को लागू करके इस्तेमाल किया जा सकता है. उदाहरण के लिए, यहां दिए गए JSON स्निपेट में एक ऐसे बटन के बारे में बताया गया है जो वेब पेज लॉन्च करता है:

{
  "shell_command":"am start -a android.intent.action.VIEW -d https://www.android.com/",
  "button":{
      "command":"web",
      "title":"Web Page",
      "icon_name":"language"
  }
}

ये फ़ील्ड हैं:

  • shell_command: बटन दबाने पर, adb shell में लागू होने वाला निर्देश
  • button: यह एक बटन ऑब्जेक्ट है. इसमें ये सब-फ़ील्ड शामिल होते हैं:
    • command: इस बटन के लिए यूनीक नाम
    • title: इस बटन के लिए वैकल्पिक टेक्स्ट का टाइटल
    • icon_name: https://material.io/resources/icons से किसी आइकॉन का नाम

ऐक्शन सर्वर

ऐक्शन सर्वर की मदद से, अपने ऐक्शन के व्यवहार को बेहतर तरीके से कंट्रोल किया जा सकता है. ऐक्शन सर्वर, होस्ट बाइनरी होता है. यह सॉकेट पेयर का इस्तेमाल करके, WebRTC से बटन दबाने के इवेंट की जानकारी इकट्ठा करता है. WebRTC, इवेंट को ऐक्शन सर्वर पर फ़ॉरवर्ड करता है. इसके बाद, ऐक्शन सर्वर यह तय करता है कि ऐक्शन को कैसे लागू करना है.

ऐक्शन सर्वर की मदद से, ज़्यादा बेहतर तरीके से कंट्रोल किया जा सकता है. जैसे, किसी इवेंट की स्थिति को बनाए रखना (जैसे कि टॉगल किए जा सकने वाले इवेंट के लिए) या "मेटा-ऐक्शन" चलाना. जैसे, मौजूदा डिवाइस को बंद करना, ज़्यादा डिवाइस लॉन्च करना या स्क्रीन रिकॉर्डिंग करने वाले ब्राउज़र एक्सटेंशन को शुरू करना. होस्ट बाइनरी में लागू किए जाने वाले फ़ैसलों के आधार पर ही, सुविधाओं को सीमित किया जा सकता है.

यहां दिया गया JSON स्निपेट, एक ऐसे ऐक्शन सर्वर के बारे में बताता है जो दो बटन पर होने वाले इवेंट को सुनता है:

{
  "server":"cuttlefish_example_action_server",
  "buttons":[
    {
      "command":"settings",
      "title":"Quick Settings",
      "icon_name":"settings"
    },
    {
      "command":"alert",
      "title":"Do Not Disturb",
      "icon_name":"notifications_paused"
    }
  ]
}

ये फ़ील्ड हैं:

  • server: आपके होस्ट बाइनरी मॉड्यूल का नाम
  • buttons: बटन का कलेक्शन. इसमें ऊपर दिए गए सब-फ़ील्ड शामिल होते हैं

JSON कॉन्फ़िगरेशन अपडेट करने के बाद, Soong कॉन्फ़िगरेशन के बिल्ड वैरिएबल cvd_custom_action_servers में, ऐक्शन सर्वर मॉड्यूल का नाम जोड़ें. उदाहरण के लिए:

# Append to this variable exactly as shown here.
SOONG_CONFIG_cvd += custom_action_servers

# Append the name of your action server(s) to this variable.
SOONG_CONFIG_cvd_custom_action_servers += cuttlefish_example_action_server

हर ऐक्शन सर्वर होस्ट बाइनरी को यह तरीका अपनाना चाहिए:

  1. सॉकेट फ़ाइल डिस्क्रिप्टर नंबर को पहले और सिर्फ़ प्रोग्राम के आर्ग्युमेंट के तौर पर स्वीकार करता है.

    इस सॉकेट को launch_cvd ने बनाया है. इसके लिए, socketpair का इस्तेमाल किया गया है. साथ ही, डोमेन AF_LOCAL, टाइप SOCK_STREAM, और प्रोटोकॉल 0 का इस्तेमाल किया गया है.

  2. लूप में, सॉकेट से 128 बाइट पढ़ने की कोशिश करें. इन बाइट में, WebRTC क्लाइंट से भेजे गए बटन दबाने के इवेंट होते हैं. ये इवेंट, command:state फ़ॉर्मैट में होते हैं. command को JSON कॉन्फ़िगरेशन में दिए गए तरीके से सेट किया जाता है. साथ ही, state को बटन दबाने की स्थिति (down या up) के हिसाब से सेट किया जाता है.

  3. कस्टम ऐक्शन को सिम्युलेट करने के लिए, इनकमिंग इवेंट पर कार्रवाई करें.