कार सेटिंग्स में व्याकुलता अनुकूलन

कार चलते समय सेटिंग्स ऐप के साथ ड्राइवर की बातचीत को कम करने के लिए डिस्ट्रेक्शन ऑप्टिमाइज़ेशन (डीओ) एक उपकरण के रूप में प्रदान किया जाता है। गाड़ी चलाते समय कुछ सेटिंग्स बदलने की आवश्यकता हो सकती है, ताकि ऐप पूरी तरह से अवरुद्ध न हो। हालाँकि, डिफ़ॉल्ट रूप से, अधिकांश प्राथमिकताएँ अक्षम होती हैं और केवल कुंजी और आसानी से अपडेट की जाने वाली प्राथमिकताएँ सक्षम होती हैं।

वाहन चलाते समय सक्षम ऐप्स

चित्र 1. गाड़ी चलाते समय सक्षम ऐप्स

यदि वे विकर्षण अनुकूलित नहीं हैं, तो संपूर्ण गतिविधियों को भी अवरुद्ध किया जा सकता है, जैसा कि नीचे दिखाया गया है। यह विधि वर्तमान में मुख्य रूप से सेटिंग्स खोज के लिए उपयोग की जाती है।

सभी गतिविधियां अवरुद्ध

चित्र 2. सभी गतिविधियाँ अवरुद्ध

डीओ के प्रदर्शन के लिए बुनियादी अनुकूलन कॉन्फ़िगरेशन ओवरले के माध्यम से किया जा सकता है। यदि आपको अधिक सूक्ष्म अनुकूलन की आवश्यकता है, तो कोड के माध्यम से अतिरिक्त परिवर्तन किए जा सकते हैं।

उच्च स्तरीय अनुकूलन

जब गाड़ी चलाते समय कोई प्राथमिकता अक्षम हो जाती है, तो उस पर टैप करने पर एक टोस्ट संदेश प्रदर्शित होता है, जिसमें कहा गया है कि गाड़ी चलाते समय प्राथमिकता उपलब्ध नहीं है, बशर्ते कि प्राथमिकता के साथ एक प्राथमिकता नियंत्रक जुड़ा हो। संदेश restricted_while_driving स्ट्रिंग का उपयोग करता है, जिसे ओवरले के साथ अनुकूलित किया जा सकता है (बशर्ते स्ट्रिंग 60-वर्ण सीमा से कम हो)।

अनुकूलित ओवरले

चित्र 3. अनुकूलित ओवरले

संपूर्ण DO फ्रेमवर्क को config_always_ignore_ux_restrictions का उपयोग करके अक्षम किया जा सकता है। इसे सही पर सेट करने का मतलब है कि ड्राइवर सेटिंग्स ऐप के हर पहलू के साथ इंटरैक्ट कर सकता है।

<bool name="config_always_ignore_ux_restrictions">true</bool>

यदि उपरोक्त कॉन्फ़िगरेशन गलत पर सेट है, तो सेटिंग ऐप यह निर्धारित करने के लिए config_ignore_ux_restrictions पर वापस आ जाता है कि ड्राइविंग करते समय कौन सी प्राथमिकताएं सक्षम की जानी चाहिए। यहां प्रदान की गई स्ट्रिंग्स को preference_keys.xml.

उदाहरण

यह दिखाने के लिए कि गाड़ी चलाते समय डीप नेस्टेड सेटिंग को कैसे सक्षम किया जाए, यह उदाहरण दर्शाता है कि टेक्स्ट-टू-स्पीच (टीटीएस) आउटपुट सेटिंग्स को कैसे सक्षम किया जाए। इसे काम करने के लिए, पदानुक्रम में सभी सेटिंग्स को config_ignore_ux_restrictions में जोड़ें। इसमें सिस्टम, भाषाएं और इनपुट, और कॉन्फ़िगरेशन में टीटीएस प्राथमिकताएं शामिल हैं, क्योंकि हमारा पदानुक्रम सिस्टम->भाषाएं और इनपुट->टेक्स्ट-टू-स्पीच आउटपुट है। हालाँकि, टेक्स्ट-टू-स्पीच खंड के भीतर प्राथमिकताएँ अभी भी अक्षम हैं। उन्हें सक्षम करने के लिए, हमें उन प्राथमिकताओं के लिए कुंजियाँ जोड़नी होंगी जिन्हें हम एक्सेस करना चाहते हैं। इस उदाहरण में, हम प्लेबैक प्राथमिकताओं को सक्षम करना चाहते हैं लेकिन इंजन प्राथमिकता को नहीं, इसलिए हम अपनी कॉन्फ़िगरेशन में pk_tts_playback_group जोड़ते हैं।

<string-array name="config_ignore_ux_restrictions">
    [...]
    <item>@string/pk_system_settings_entry</item>
    <item>@string/pk_languages_and_input_settings</item>
    <item>@string/pk_tts_settings_entry</item>
    <item>@string/pk_tts_playback_group</item>
</string-array>

विस्तृत अनुकूलन

ऐसी कुछ प्राथमिकताएँ हैं जिनके लिए ड्राइविंग स्थिति के आधार पर किसी प्राथमिकता को सक्षम/अक्षम करने की तुलना में अधिक अनुकूलित व्यवहार की आवश्यकता हो सकती है। उदाहरण के लिए, ड्राइविंग के दौरान सहेजे गए ब्लूटूथ डिवाइस या वाई-फाई एक्सेस पॉइंट दिखाने के लिए ब्लूटूथ और वाई-फाई को पहले ही संशोधित किया जा चुका है।

वर्तमान में इस प्रकार के समायोजन करने के लिए कोई कॉन्फ़िगरेशन आधारित समाधान नहीं है। इसके बजाय आप एक कस्टम क्लास बना सकते हैं जो वांछित परिवर्तन करने के लिए PreferenceController का विस्तार करता है और onApplyUxRestrictions() को ओवरराइड करता है।

जब एक कस्टम प्राथमिकता नियंत्रक बनाया जाता है, तो आप डिफ़ॉल्ट प्राथमिकता नियंत्रक को अपने स्वयं के कार्यान्वयन के साथ बदलने के लिए प्रासंगिक XML फ़ाइल को ओवरले कर सकते हैं।

उदाहरण

कारसेटिंग्स में, कुछ प्राथमिकताओं में यह अधिक अनुकूलित व्यवहार होता है, जिसका उपयोग अतिरिक्त अनुकूलन के लिए उदाहरण के रूप में किया जा सकता है। उदाहरण के लिए, वाई-फ़ाई एक्सेस पॉइंट सूची में, वांछित व्यवहार केवल ड्राइविंग करते समय सहेजे गए एक्सेस पॉइंट दिखाना है (और बाकी को छुपाना है)। इसे प्राप्त करने के लिए, निम्नलिखित कार्य करें:

mAccessPoints = CarUxRestrictionsHelper.isNoSetup(getUxRestrictions())
               ? getCarWifiManager().getSavedAccessPoints()
               : getCarWifiManager().getAllAccessPoints();

क्योंकि यहां दिखाई देने वाले पहुंच बिंदु पहले से ही प्रतिबंधित हैं, आप इन प्राथमिकताओं पर अतिरिक्त UxRestrictions लागू नहीं करना चाहते हैं। इसलिए, onApplyUxRestrictions ओवरराइड करें और जानबूझकर नो-ऑप निष्पादित करें:

@Override
protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) {
    // Since the list dynamically changes based on the UX restrictions, we
    // enable this fragment regardless of the restriction. Intentional no-op.
}

ब्लूटूथ-बॉन्ड डिवाइस में एक और उदाहरण दिया गया है। ब्लूटूथ डिवाइसों को कनेक्ट करने और डिस्कनेक्ट करने में सक्षम बनाना जारी रखने के लिए, लेकिन इन डिवाइसों के लिए अतिरिक्त सेटिंग्स तक पहुंचने की क्षमता को अक्षम करना चाहता था। इसे प्राप्त करने के लिए, हम फिर से onApplyUxRestrictions ओवरराइड करते हैं लेकिन इस बार, यदि NO_SETUP प्रतिबंध सक्रिय है, तो प्राथमिकता पर द्वितीयक कार्रवाई छिपाएं।

@Override
protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) {
    super.onApplyUxRestrictions(uxRestrictions);
    if (CarUxRestrictionsHelper.isNoSetup(uxRestrictions)) {
        updateActionVisibility(getPreference(), /* isActionVisible= */ false);
    }
}