ऐप्लिकेशन की खास सुविधाओं के लिए कार्रवाइयों की मदद से, Google Assistant के डाइनैमिक शॉर्टकट का इस्तेमाल करना

1. खास जानकारी

पिछले कोडलैब में, आपने सैंपल ऐप्लिकेशन में आम तौर पर इस्तेमाल होने वाले बिल्ट-इन इंटेंट (बीआईआई) को लागू करने के लिए, स्टैटिक शॉर्टकट का इस्तेमाल किया था. Android डेवलपर, Google Assistant की सुविधाओं का इस्तेमाल करने के लिए, ऐप्लिकेशन की खास सुविधाओं के लिए कार्रवाइयों का इस्तेमाल करते हैं.

स्टैटिक शॉर्टकट, ऐप्लिकेशन के साथ बंडल किए जाते हैं और इन्हें सिर्फ़ ऐप्लिकेशन के नए वर्शन रिलीज़ करने के बाद ही अपडेट किया जा सकता है. किसी ऐप्लिकेशन में डाइनैमिक एलिमेंट के लिए बोलकर निर्देश देने की सुविधा चालू करने के लिए, डाइनैमिक शॉर्टकट इस्तेमाल किए जाते हैं. जैसे, यूज़र जनरेटेड कॉन्टेंट. जब उपयोगकर्ता काम की कार्रवाइयां करते हैं, जैसे कि किसी टास्क ट्रैकिंग ऐप्लिकेशन में नया नोट बनाना, तब ऐप्लिकेशन डाइनैमिक शॉर्टकट पुश करते हैं. ऐप्लिकेशन की खास सुविधाओं के लिए कार्रवाइयों की मदद से, आवाज़ के लिए इन शॉर्टकट को बीआईआई से बाइंड करके चालू किया जा सकता है. इससे उपयोगकर्ता, Assistant की मदद से अपना कॉन्टेंट ऐक्सेस कर सकते हैं. इसके लिए, वे "Ok Google, ExampleApp पर मेरे किराने के सामान की सूची खोलो" जैसा कुछ कह सकते हैं.

तीन प्रोग्रेसिव स्क्रीन पर, Google Assistant डाइनैमिक शॉर्टकट लॉन्च कर रही है.

पहला डायग्राम. स्क्रीन पर तीन प्रोग्रेसिव स्क्रीन दिख रही हैं. इनमें उपयोगकर्ता का बनाया हुआ टास्क दिख रहा है. Google Assistant उस टास्क आइटम के लिए डाइनैमिक शॉर्टकट लॉन्च कर रही है.

आपको क्या बनाना होगा

इस कोडलैब में, Android ऐप्लिकेशन के सैंपल के तौर पर, काम की सूची में आवाज़ के लिए डाइनैमिक शॉर्टकट चालू किए जा सकते हैं. इससे उपयोगकर्ता, Assistant से उन आइटम को खोलने के लिए कह सकते हैं जो ऐप्लिकेशन में बनाए गए हैं. ऐसा करने के लिए, Android आर्किटेक्चर पैटर्न, खास तौर पर डेटा स्टोर करने की जगह, सर्विस लोकेटर, और ViewModel पैटर्न का इस्तेमाल किया जाता है.

ज़रूरी शर्तें

यह कोडलैब, पिछले कोडलैब में शामिल ऐप्लिकेशन की खास सुविधाओं के लिए कार्रवाइयों के कॉन्सेप्ट पर आधारित होता है. खास तौर पर, यह कोड बीआईआई और स्टैटिक शॉर्टकट पर आधारित होता है. अगर आपने ऐप्लिकेशन की खास सुविधाओं के लिए कार्रवाइयों का इस्तेमाल पहले कभी नहीं किया है, तो हमारा सुझाव है कि आगे बढ़ने से पहले कोडलैब को पूरा करें.

इसके अलावा, आगे बढ़ने से पहले पक्का करें कि आपके डेवलपमेंट एनवायरमेंट में यह कॉन्फ़िगरेशन हो:

  • शेल कमांड चलाने के लिए एक टर्मिनल, जिसमें git इंस्टॉल हो.
  • Android Studio का नया और ठीक से काम करने वाला वर्शन.
  • इंटरनेट की सुविधा वाला फ़िज़िकल या वर्चुअल Android डिवाइस.
  • एक ऐसा Google खाता जिससे Android Studio, Google ऐप्लिकेशन, और Google Assistant ऐप्लिकेशन में साइन इन किया गया हो.

2. जानें कि यह सुविधा कैसे काम करती है

बोलकर फ़ोन को ऐक्सेस करने के लिए, डाइनैमिक शॉर्टकट चालू करने के लिए, ये तरीके अपनाएं:

  • डाइनैमिक शॉर्टकट को ज़रूरी शर्तें पूरी करने वाले बीआईआई के साथ बाइंड करना.
  • Google Shortcuts इंटिग्रेशन लाइब्रेरी को जोड़कर, Assistant को शॉर्टकट का डेटा डालने की सुविधा चालू की जा सकती है.
  • जब भी कोई उपयोगकर्ता ऐप्लिकेशन में काम का टास्क पूरा करता है, तो उससे जुड़ा शॉर्टकट पुश करना.

बाइंडिंग शॉर्टकट

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

  • GET_THING बीआईआई का शॉर्टकट होने पर, उपयोगकर्ता सीधे Assistant से किसी इन-ऐप्लिकेशन कॉन्टेंट के लिए अनुरोध कर सकते हैं. * "Ok Google, ExampleApp पर मेरे किराने के सामान की सूची खोलो."
  • ORDER_MENU_ITEM बीआईआई के शॉर्टकट से उपयोगकर्ता पिछले ऑर्डर को फिर से चला सकते हैं. * "Ok Google, ExampleApp से मेरा सामान्य ऑर्डर ऑर्डर करो."

बीआईआई की कैटगरी की पूरी सूची देखने के लिए, पहले से मौजूद इंटेंट का रेफ़रंस देखें.

Assistant के लिए शॉर्टकट दिए जा रहे हैं

शॉर्टकट को बीआईआई से बाइंड करने के बाद, अपने प्रोजेक्ट में Google शॉर्टकट इंटिग्रेशन लाइब्रेरी जोड़कर, Assistant को इन शॉर्टकट का डेटा डालने की अनुमति दें. इस लाइब्रेरी के उपलब्ध होने पर, Assistant को आपके ऐप्लिकेशन से पुश किए गए हर शॉर्टकट की जानकारी होगी. इससे उपयोगकर्ता, Assistant में शॉर्टकट के ट्रिगर वाक्यांश का इस्तेमाल करके, उन शॉर्टकट को लॉन्च कर सकेंगे.

3. अपना डेवलपमेंट एनवायरमेंट तैयार करें

यह कोडलैब, Android के लिए बनाए गए 'काम की सूची' के नमूने का इस्तेमाल करता है. इस ऐप्लिकेशन से, उपयोगकर्ता सूचियों में आइटम जोड़ सकते हैं, कैटगरी के हिसाब से टास्क खोज सकते हैं, और टास्क पूरे होने की स्थिति के हिसाब से उन्हें फ़िल्टर कर सकते हैं. इस सेक्शन को पूरा करके, सैंपल ऐप्लिकेशन डाउनलोड करें और उसकी तैयारी करें.

अपनी बुनियादी फ़ाइलें डाउनलोड करें

सैंपल ऐप्लिकेशन के GitHub रिपॉज़िटरी का क्लोन बनाने के लिए, नीचे दिया गया कमांड चलाएं:

git clone https://github.com/actions-on-google/app-actions-dynamic-shortcuts.git

डेटा स्टोर करने की जगह को क्लोन करने के बाद, उसे Android Studio में खोलने के लिए यह तरीका अपनाएं:

  1. Android Studio में आपका स्वागत है डायलॉग में, प्रोजेक्ट इंपोर्ट करें पर क्लिक करें.
  2. वह फ़ोल्डर चुनें जिसमें आपने रिपॉज़िटरी (डेटा स्टोर की जगह) को क्लोन किया है.

इसके अलावा, सैंपल ऐप्लिकेशन के GitHub रेपो की codelab-complete ब्रांच को क्लोन करके, पूरे कोडलैब का वर्शन देखा जा सकता है:

git clone https://github.com/actions-on-google/app-actions-dynamic-shortcuts.git --branch codelab-complete

Android ऐप्लिकेशन का आईडी अपडेट करना

ऐप्लिकेशन के ऐप्लिकेशन आईडी को अपडेट करने से, आपके टेस्ट डिवाइस पर ऐप्लिकेशन की खास तरह से पहचान होती है. साथ ही, इसमें "डुप्लीकेट पैकेज नाम" की जानकारी भी शामिल नहीं होती है अगर ऐप्लिकेशन को Play Console में अपलोड किया गया है, तो गड़बड़ी का मैसेज दिखेगा. ऐप्लिकेशन आईडी अपडेट करने के लिए, app/build.gradle खोलें:

android {
...
  defaultConfig {
    applicationId "com.MYUNIQUENAME.android.fitactions"
    ...
  }
}

"MYUNIQUENAME" बदलें को applicationId फ़ील्ड में डालें.

Shortcuts API डिपेंडेंसी जोड़ें

app/build.gradle संसाधन फ़ाइल में, ये Jetpack लाइब्रेरी जोड़ें:

app/build.gradle

dependencies {
   ...
   // Shortcuts library
   implementation "androidx.core:core:1.6.0"
   implementation 'androidx.core:core-google-shortcuts:1.0.1'
   ...
}

अपने डिवाइस पर ऐप्लिकेशन की जांच करें

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

  1. Android Studio में, चलाएं > को चुनें ऐप्लिकेशन चलाएं या टूलबार में RunAndroid Studio में ऐप्लिकेशन का आइकॉन चलाएं पर क्लिक करें.
  2. डिप्लॉयमेंट टारगेट चुनें डायलॉग में, कोई डिवाइस चुनें और ठीक है पर क्लिक करें. हमारा सुझाव है कि आप Android 10 (एपीआई लेवल 30) या इसके बाद का ओएस वर्शन इस्तेमाल करें. हालांकि, ऐप्लिकेशन की खास सुविधाओं के लिए कार्रवाइयां, Android 5 (एपीआई लेवल 21) पर वापस चले गए डिवाइसों पर काम करती हैं.
  3. Assistant को सेट अप करने और यह पुष्टि करने के लिए कि यह काम कर रही है या नहीं, होम बटन को दबाकर रखें. अगर आपने अपने डिवाइस पर Assistant में साइन इन नहीं किया है, तो आपको ऐसा करना होगा.

Android वर्चुअल डिवाइसों के बारे में ज़्यादा जानकारी के लिए, वर्चुअल डिवाइस बनाना और उन्हें मैनेज करना लेख पढ़ें.

यह देखने के लिए कि यह क्या कर सकता है, ऐप्लिकेशन को थोड़ा एक्सप्लोर करें. प्लस आइकॉन पर टैप करने से, एक नया टास्क आइटम बन जाता है. सबसे ऊपर दाईं ओर मौजूद मेन्यू आइटम में, टास्क पूरे होने की स्थिति के हिसाब से उन्हें खोजा और फ़िल्टर किया जा सकता है.

4. शॉर्टकट रिपॉज़िटरी क्लास बनाना

डाइनैमिक शॉर्टकट को पुश और मैनेज करने के लिए, हमारे सैंपल ऐप्लिकेशन की कई क्लास, ShortcutManagerCompat एपीआई को कॉल करेंगी. कोड की रिडंडंसी कम करने के लिए, रिपॉज़िटरी लागू करनी होगी. इससे आपके प्रोजेक्ट की क्लास में डाइनैमिक शॉर्टकट को आसानी से मैनेज किया जा सकेगा.

रिपॉज़िटरी के डिज़ाइन पैटर्न से शॉर्टकट मैनेज करने के लिए, एक साफ़ एपीआई मिलता है. रिपॉज़िटरी का फ़ायदा यह है कि इसमें मौजूद एपीआई की जानकारी, कम से कम एपीआई की मदद से एक जैसी दी जाती है. डेटा स्टोर करने की जगह को लागू करने के लिए यह तरीका अपनाएं:

  1. ShortcutManagerCompat एपीआई को एब्सट्रैक्ट करने के लिए, ShortcutsRepository क्लास बनाएं.
  2. ऐप्लिकेशन के सर्विस लोकेटर में ShortcutsRepository तरीके जोड़ें.
  3. ShortcutRepository सेवा को मुख्य ऐप्लिकेशन में रजिस्टर करें.

डेटा स्टोर करने की जगह बनाना

com.example.android.architecture.blueprints.todoapp.data.source पैकेज में, ShortcutsRepository नाम की एक नई Kotlin क्लास बनाएं. आपको यह पैकेज app/src/main/java फ़ोल्डर में व्यवस्थित दिखेगा. इस क्लास का इस्तेमाल ऐसे इंटरफ़ेस को लागू करने के लिए किया जाएगा जिसमें कोडलैब के इस्तेमाल के उदाहरण के लिए कम से कम तरीकों का सेट दिया गया हो.

Android Studio की विंडो, जिस पर ShortcutsRepository क्लास की जगह की जानकारी दिख रही है.

दूसरा डायग्राम. Android Studio की प्रोजेक्ट फ़ाइलों की विंडो में, ShortcutsRepository क्लास की जगह दिख रही है.

इस कोड को नई क्लास में चिपकाएं:

package com.example.android.architecture.blueprints.todoapp.data.source

import android.content.Context
import android.content.Intent
import androidx.annotation.WorkerThread
import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat
import com.example.android.architecture.blueprints.todoapp.data.Task
import com.example.android.architecture.blueprints.todoapp.tasks.TasksActivity

private const val GET_THING_KEY = "q"

/**
* ShortcutsRepository provides an interface for managing dynamic shortcuts.
*/
class ShortcutsRepository(val context: Context) {

   private val appContext = context.applicationContext

   /**
    * Pushes a dynamic shortcut. The task ID is used as the shortcut ID.
    * The task's title and description are used as shortcut's short and long labels.
    * The resulting shortcut corresponds to the GET_THING capability with task's
    * title used as BII's "name" argument.
    *
    * @param task Task object for which to create a shortcut.
    */
   @WorkerThread
   fun pushShortcut(task: Task) {
      // TODO
   }

   private fun createShortcutCompat(task: Task): ShortcutInfoCompat {
      //...
   }

   /**
    *  Updates a dynamic shortcut for the provided task. If the shortcut
    *  associated with this task doesn't exist, this method throws an error.
    *  This operation may take a few seconds to complete.
    *
    * @param tasks list of tasks to update.
    */
   @WorkerThread
   fun updateShortcuts(tasks: List<Task>) {
       //...
   }

   /**
    * Removes shortcuts if IDs are known.
    *
    * @param ids list of shortcut IDs
    */
   @WorkerThread
   fun removeShortcutsById(ids: List<String>) {
       //...
   }

   /**
    * Removes shortcuts associated with the tasks.
    *
    * @param tasks list of tasks to remove.
    */
   @WorkerThread
   fun removeShortcuts(tasks: List<Task>) {
       //...
   }
}

इसके बाद, ShortcutManagerCompat एपीआई को कॉल करने के लिए, pushShortcut तरीके को अपडेट करें. इस कोड की मदद से, ShortcutsRepository क्लास को अपडेट करें:

ShortcutsRepository.kt

/**
* Pushes a dynamic shortcut for the task. The task's ID is used as a shortcut
* ID. The task's title and description are used as shortcut's short and long
* labels. The created shortcut corresponds to GET_THING capability with task's
* title used as BII's "name" argument.
*
* @param task Task object for which to create a shortcut.
*/


@WorkerThread
fun pushShortcut(task: Task) {
   ShortcutManagerCompat.pushDynamicShortcut(appContext, createShortcutCompat(task))
}

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

इसके अलावा, एपीआई के लिए ज़रूरी है कि हम टास्क ऑब्जेक्ट के लिए, ShortcutInfoCompat ऑब्जेक्ट पास करें. पिछले कोड सैंपल में, हम createShortcutCompat निजी तरीके को कॉल करके ऐसा करते हैं. हम ShortcutInfoCompat ऑब्जेक्ट बनाने और उसे लौटाने के लिए, इस तरीके को अपडेट करेंगे. ऐसा करने के लिए, createShortcutCompat स्टब को इस कोड की मदद से अपडेट करें:

ShortcutsRepository.kt

private fun createShortcutCompat(task: Task): ShortcutInfoCompat {
   val intent = Intent(appContext, TasksActivity::class.java)
   intent.action = Intent.ACTION_VIEW
   // Filtering is set based on currentTitle.
   intent.putExtra(GET_THING_KEY, task.title)

   // A unique ID is required to avoid overwriting an existing shortcut.
   return ShortcutInfoCompat.Builder(appContext, task.id)
           .setShortLabel(task.title)
           .setLongLabel(task.title)
           // Call addCapabilityBinding() to link this shortcut to a BII. Enables user to invoke a shortcut using its title in Assistant.
           .addCapabilityBinding(
                   "actions.intent.GET_THING", "thing.name", listOf(task.title))
           .setIntent(intent)
           .setLongLived(false)
       .build()
}

इस क्लास में बाकी फ़ंक्शन स्टब, डाइनैमिक शॉर्टकट को अपडेट करने और मिटाने का काम करते हैं. इन फ़ंक्शन को चालू करने के लिए, इन्हें नीचे दिए गए कोड से अपडेट करें:

ShortcutsRepository.kt

/**
* Updates a Dynamic Shortcut for the task. If the shortcut associated with this task
* doesn't exist, throws an error. This operation may take a few seconds to complete.
*
* @param tasks list of tasks to update.
*/
@WorkerThread
fun updateShortcuts(tasks: List<Task>) {
   val scs = tasks.map { createShortcutCompat(it) }
   ShortcutManagerCompat.updateShortcuts(appContext, scs)
}

/**
* Removes shortcuts if IDs are known.
* @param ids list of shortcut IDs
*/
@WorkerThread
fun removeShortcutsById(ids: List<String>) {
   ShortcutManagerCompat.removeDynamicShortcuts(appContext, ids)
}

/**
* Removes shortcuts associated with the tasks.
*
* @param tasks list of tasks to remove.
*/
@WorkerThread
fun removeShortcuts(tasks: List<Task>) {
   ShortcutManagerCompat.removeDynamicShortcuts (appContext,
           tasks.map { it.id })
}

सर्विस लोकेटर में क्लास जोड़ें

ShortcutsRepository क्लास बनाने के बाद अगला चरण, इस क्लास के इंस्टैंशिएट किए गए ऑब्जेक्ट को बाकी ऐप्लिकेशन के लिए उपलब्ध कराना होता है. यह ऐप्लिकेशन, सर्विस लोकेटर पैटर्न लागू करके, क्लास की डिपेंडेंसी मैनेज करता है. Android Studio में क्लास ब्राउज़र का इस्तेमाल करके सर्विस लोकेटर क्लास खोलें. इसके लिए, नेविगेट करें > क्लास और "ServiceLocator" टाइप करें. इसके बाद, बनी Kotlin फ़ाइल पर क्लिक करें और उसे अपने IDE में खोलें.

ShortcutsRepository और SuppressLint पैकेज को इंपोर्ट करने के लिए, ServiceLocator.kt के सबसे ऊपर यह कोड चिपकाएं:

ServiceLocator.kt

package com.example.android.architecture.blueprints.todoapp

// ...Other import statements
import com.example.android.architecture.blueprints.todoapp.data.source.ShortcutsRepository
import android.annotation.SuppressLint

ShortcutRepository की सेवा में शामिल सदस्यों और तरीकों को जोड़ने के लिए, इस कोड को ServiceLocator.kt की जानकारी में चिपकाएं:

ServiceLocator.kt

object ServiceLocator {

   // ...
   // Only the code immediately below this comment needs to be copied and pasted
   // into the body of ServiceLocator.kt:

   @SuppressLint("StaticFieldLeak")
   @Volatile
   var shortcutsRepository: ShortcutsRepository? = null


   private fun createShortcutsRepository(context: Context): ShortcutsRepository {
       val newRepo = ShortcutsRepository(context.applicationContext)
       shortcutsRepository = newRepo
       return newRepo
   }

   fun provideShortcutsRepository(context: Context): ShortcutsRepository {
       synchronized(this) {
           return shortcutsRepository ?: shortcutsRepository ?: createShortcutsRepository(context)
       }
   }
 }

शॉर्टकट सेवा को रजिस्टर करें

आखिर में, आपको अपनी नई ShortcutsRepository सेवा को ऐप्लिकेशन में रजिस्टर करना होगा. Android Studio में, TodoApplication.kt खोलें और फ़ाइल के सबसे ऊपर दिए गए कोड को कॉपी करें:

TodoApplication.kt

package com.example.android.architecture.blueprints.todoapp
/// ... Other import statements

import com.example.android.architecture.blueprints.todoapp.data.source.ShortcutsRepository

इसके बाद, क्लास के मुख्य भाग में नीचे दिया गया कोड जोड़कर सेवा को रजिस्टर करें:

TodoApplication.kt

//...
class TodoApplication : Application() {

   //...

   val shortcutsRepository: ShortcutsRepository
       get() = ServiceLocator.provideShortcutsRepository(this)

   //...
}

ऐप्लिकेशन बनाएं और पक्का करें कि वह चलता रहे.

5. नया शॉर्टकट जोड़ें

अब शॉर्टकट बनाने की सुविधा चालू कर दी गई है. उपयोगकर्ता इस ऐप्लिकेशन में कॉन्टेंट (टास्क आइटम) जनरेट करते हैं और उम्मीद करते हैं कि वे उन्हें बाद में देख पाएंगे. इसलिए, जब भी कोई उपयोगकर्ता नया टास्क बनाता है, तब हम डाइनैमिक शॉर्टकट की मदद से, इस कॉन्टेंट का ऐक्सेस चालू कर देते हैं. यह शॉर्टकट, GET_THING बीआईआई के साथ जुड़ा होता है. इसकी मदद से Assistant, लोगों को सीधे तौर पर उनके अनुरोध किए गए टास्क आइटम पर लॉन्च कर देती है. ऐसा तब होता है, जब वे बीआईआई ट्रिगर करते हैं. इसके लिए, वे ऐसा कुछ पूछते हैं, जैसे कि "Ok Google, sampleApp पर मेरे किराने के सामान की सूची खोलो."

सैंपल ऐप्लिकेशन में जाकर, इस सुविधा को चालू किया जा सकता है. इसके लिए, यह तरीका अपनाएं:

  1. AddEditTaskViewModel क्लास में ShortcutsRepository सेवा को इंपोर्ट किया जा रहा है. इसकी मदद से, टास्क सूची के ऑब्जेक्ट मैनेज किए जाते हैं.
  2. जब उपयोगकर्ता कोई नया टास्क बनाता हो, तो डाइनैमिक शॉर्टकट पुश करना.

शॉर्टकट रिपॉज़िटरी इंपोर्ट करें

हमें पहले AddEditTaskViewModel पर ShortcutsRepository सेवा उपलब्ध करानी होगी. ऐसा करने के लिए, सेवा को ViewModelFactory में इंपोर्ट करें. यह एक फ़ैक्ट्री क्लास है, जिसका इस्तेमाल ऐप्लिकेशन ViewModel ऑब्जेक्ट को इंस्टैंशिएट करने के लिए करता है. इसमें AddEditTaskViewModel भी शामिल है.

Android Studio में क्लास ब्राउज़र खोलने के लिए, नेविगेट > Class और "ViewModelManufacturer" टाइप करना. इसके बाद, बनी Kotlin फ़ाइल पर क्लिक करें और उसे अपने IDE में खोलें.

ShortcutsRepository और SuppressLint पैकेज को इंपोर्ट करने के लिए, ViewModelFactory.kt के सबसे ऊपर यह कोड चिपकाएं:

ViewModelFactory.kt

package com.example.android.architecture.blueprints.todoapp

// ...Other import statements
import com.example.android.architecture.blueprints.todoapp.data.source.ShortcutsRepository

इसके बाद, ViewModelFactory के मुख्य भाग को इस कोड से बदलें:

ViewModelFactory.kt

/**
 * Factory for all ViewModels.
 */
@Suppress("UNCHECKED_CAST")
class ViewModelFactory constructor(
    private val tasksRepository: TasksRepository,
    private val shortcutsRepository: ShortcutsRepository,
    owner: SavedStateRegistryOwner,
    defaultArgs: Bundle? = null
) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {

    override fun <T : ViewModel> create(
        key: String,
        modelClass: Class<T>,
        handle: SavedStateHandle
    ) = with(modelClass) {
        when {
            isAssignableFrom(StatisticsViewModel::class.java) ->
                StatisticsViewModel(tasksRepository)
            isAssignableFrom(TaskDetailViewModel::class.java) ->
                TaskDetailViewModel(tasksRepository)
            isAssignableFrom(AddEditTaskViewModel::class.java) ->
                AddEditTaskViewModel(tasksRepository, shortcutsRepository)
            isAssignableFrom(TasksViewModel::class.java) ->
                TasksViewModel(tasksRepository, handle)
            else ->
                throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}")
        }
    } as T
}

एक लेयर ऊपर जाकर, ViewModelFactory के बदलाव पूरे करें और ShortcutsRepository को फ़ैक्ट्री के कंस्ट्रक्टर को पास करें. नेविगेट > File और "फ़्रैगमेंटExt.kt" टाइप करना होगा. अपने IDE में खोलने के लिए, util पैकेज में मौजूद Kotlin फ़ाइल पर क्लिक करें.

FragmentExt.kt के मुख्य भाग को इस कोड से बदलें:

fun Fragment.getViewModelFactory(): ViewModelFactory {
   val taskRepository = (requireContext().applicationContext as TodoApplication).taskRepository
   val shortcutsRepository = (requireContext().applicationContext as TodoApplication).shortcutsRepository
   return ViewModelFactory(taskRepository, shortcutsRepository, this)
}

शॉर्टकट पुश करना

सैंपल ऐप्लिकेशन की ViewModel क्लास के लिए, ShortcutsRepository ऐब्सट्रैक्ट क्लास उपलब्ध होने पर, AddEditTaskViewModel को अपडेट किया जाता है. ViewModel क्लास, नोट बनाने के लिए ज़िम्मेदार है. इससे हर बार उपयोगकर्ता के नया नोट बनाने पर डाइनैमिक शॉर्टकट पुश किए जाते हैं.

Android Studio में, क्लास ब्राउज़र खोलें और "AddEditTaskViewModel" टाइप करें. इसके बाद, बनी Kotlin फ़ाइल पर क्लिक करें और उसे अपने IDE में खोलें.

सबसे पहले, इस क्लास में ShortcutsRepository पैकेज को इस इंपोर्ट स्टेटमेंट के साथ जोड़ें:

package com.example.android.architecture.blueprints.todoapp.addedittask

//Other import statements
import com.example.android.architecture.blueprints.todoapp.data.source.ShortcutsRepository

इसके बाद, नीचे दिए गए कोड की मदद से क्लास कंस्ट्रक्टर को अपडेट करके, shortcutsRepository क्लास प्रॉपर्टी जोड़ें:

AddEditTaskViewModel.kt

//...

/**
* ViewModel for the Add/Edit screen.
*/
class AddEditTaskViewModel(
   private val tasksRepository: TasksRepository,
   private val shortcutsRepository: ShortcutsRepository
) : ViewModel() {

    //...

ShortcutsRepository क्लास को जोड़ने के बाद, इस क्लास को कॉल करने के लिए pushShortcut() नाम का नया फ़ंक्शन बनाएं. नीचे दिए गए निजी फ़ंक्शन को AddEditTaskViewModel के मुख्य भाग में चिपकाएं:

AddEditTaskViewModel.kt

//...
private fun pushShortcut(newTask: Task) = viewModelScope.launch {
   shortcutsRepository.pushShortcut(newTask)
}

आखिर में, जब भी कोई टास्क बनाया जाए, तो एक नया डाइनैमिक शॉर्टकट जोड़ें. saveTask() फ़ंक्शन की सामग्री को इस कोड से बदलें:

AddEditTaskViewModel.kt

fun saveTask() {
    val currentTitle = title.value
    val currentDescription = description.value

    if (currentTitle == null || currentDescription == null) {
        _snackbarText.value = Event(R.string.empty_task_message)
        return
    }
    if (Task(currentTitle, currentDescription).isEmpty) {
        _snackbarText.value = Event(R.string.empty_task_message)
        return
    }

    val currentTaskId = taskId
    if (isNewTask || currentTaskId == null) {
        val task = Task(currentTitle, currentDescription)
        createTask(task)
        pushShortcut(task)
    } else {
        val task = Task(currentTitle, currentDescription, taskCompleted, currentTaskId)
        updateTask(task)
    }
}

अपने कोड की जांच करें

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

गाने के टीज़र के तौर पर बना शॉर्ट वीडियो बनाना

Google Assistant प्लगिन का इस्तेमाल करके झलक बनाने पर, आपके डाइनैमिक शॉर्टकट, आपके टेस्ट डिवाइस पर Assistant में दिखने लगते हैं.

टेस्ट प्लगिन इंस्टॉल करें

अगर आपके पास पहले से Google Assistant प्लगिन नहीं है, तो Android Studio में यह तरीका अपनाकर उसे इंस्टॉल करें:

  1. **फ़ाइल > पर जाएं सेटिंग (MacOS पर Android Studio > प्राथमिकताएं).
  2. प्लगिन सेक्शन में, मार्केटप्लेस पर जाएं और "Google Assistant" खोजें.
  3. टूल इंस्टॉल करें और Android Studio को रीस्टार्ट करें.

टीज़र के तौर पर शॉर्ट वीडियो बनाना

Android Studio में यह तरीका अपनाकर, गाने की झलक बनाएं:

  1. टूल पर क्लिक करें > Google Assistant > "ऐप्लिकेशन की खास सुविधाओं के लिए कार्रवाइयों की जांच करने वाला टूल".
  2. ऐप्लिकेशन का नाम वाले बॉक्स में, "काम की सूची" जैसा नाम डालें.
  3. झलक बनाएं पर क्लिक करें. अगर कहा जाए, तो ऐप्लिकेशन की खास सुविधाओं के लिए कार्रवाइयों से जुड़ी नीतियों और सेवा की शर्तों को पढ़ें और स्वीकार करें.

ऐप्लिकेशन की खास सुविधाओं के लिए कार्रवाइयों की जांच करने वाले टूल की झलक बनाने वाला पैनल.

तीसरी इमेज. ऐप्लिकेशन की खास सुविधाओं के लिए कार्रवाइयों की जांच करने वाले टूल की झलक बनाने वाला पैनल.

टेस्टिंग के दौरान, Assistant पर पुश किए जाने वाले डाइनैमिक शॉर्टकट, Assistant में दिखेंगे. ये शॉर्टकट, झलक के लिए उपलब्ध कराए गए ऐप्लिकेशन के नाम के हिसाब से व्यवस्थित होते हैं.

शॉर्टकट पुश करें और उसकी जांच करें

अपने टेस्ट डिवाइस पर, सैंपल ऐप्लिकेशन को फिर से लॉन्च करें और यह तरीका अपनाएं :

  1. "कोडलैब शुरू करें" टाइटल वाला नया टास्क बनाएं
  2. Google Assistant ऐप्लिकेशन खोलें और "मेरे शॉर्टकट" कहें या लिखें.
  3. एक्सप्लोर करें टैब पर टैप करें. आपको सैंपल शॉर्टकट दिखेगा.
  4. शॉर्टकट को शुरू करने के लिए, उस पर टैप करें. ऐप्लिकेशन लॉन्च होने के बाद, आपको फ़िल्टर बॉक्स में शॉर्टकट के नाम की जानकारी पहले से दिखेगी. इससे, अनुरोध किए गए टास्क आइटम को ढूंढना आसान हो जाएगा.

6. (ज़रूरी नहीं) शॉर्टकट अपडेट करें और मिटाएं

रनटाइम पर नए डाइनैमिक शॉर्टकट का इस्तेमाल करने के अलावा, आपका ऐप्लिकेशन उन्हें अपडेट कर सकता है, ताकि आपके उपयोगकर्ता कॉन्टेंट और प्राथमिकताओं की मौजूदा स्थिति के बारे में पता चल सके. जब कोई उपयोगकर्ता डेस्टिनेशन आइटम में बदलाव करता है, तो मौजूदा शॉर्टकट को अपडेट करना एक अच्छा तरीका है. जैसे, हमारे सैंपल ऐप्लिकेशन में किसी टास्क का नाम बदलना. डेस्टिनेशन रिसॉर्स को हटाने पर, आपको उससे जुड़े शॉर्टकट को भी मिटाना चाहिए, ताकि उपयोगकर्ता को काम न करने वाले शॉर्टकट न दिखें.

शॉर्टकट अपडेट करना

जब भी कोई उपयोगकर्ता किसी टास्क आइटम की जानकारी बदलता है, तब डाइनैमिक शॉर्टकट को अपडेट करने के लिए, AddEditTaskViewModel में बदलाव करें. सबसे पहले, नीचे दिए गए कोड की मदद से क्लास के मुख्य भाग को अपडेट करें, ताकि हमारी रिपॉज़िटरी क्लास का इस्तेमाल करने वाला अपडेट फ़ंक्शन जोड़ा जा सके:

AddEditTaskViewModel.kt

private fun updateShortcut(newTask: Task) = viewModelScope.launch {
   shortcutsRepository.updateShortcuts(listOf(newTask))
}

इसके बाद, जब भी कोई मौजूदा टास्क अपडेट होता है, तो हमारे नए तरीके को कॉल करने के लिए saveTask() फ़ंक्शन में बदलाव करें.

AddEditTaskViewModel.kt

// Called when clicking on fab.
fun saveTask() {
   // ...
   // Note: the shortcuts are created/updated in a worker thread.
   if (isNewTask || currentTaskId == null) {
       //...
   } else {
       //...
       updateShortcut(task)
   }
}

ऐप्लिकेशन को फिर से लॉन्च करके और यह तरीका अपनाकर, अपने कोड की जांच करें:

  1. अपने मौजूदा टास्क आइटम के टाइटल का नाम बदलकर, "कोडलैब खत्म करें" करें.
  2. "Ok Google, मेरे शॉर्टकट" बोलकर Google Assistant खोलें.
  3. एक्सप्लोर करें टैब पर टैप करें. आपको अपने टेस्ट शॉर्टकट के लिए, अपडेट किया गया एक छोटा लेबल दिखेगा.

शॉर्टकट हटाना

जब भी कोई उपयोगकर्ता किसी टास्क को मिटाता है, तो हमारे सैंपल ऐप्लिकेशन शॉर्टकट को हटा देना चाहिए. सैंपल ऐप्लिकेशन में, टास्क मिटाने का लॉजिक TaskDetailViewModel क्लास में मौजूद होता है. इस क्लास को अपडेट करने से पहले, हमें shortcutsRepository को TaskDetailViewModel में पास करने के लिए, ViewModelFactory को फिर से अपडेट करना होगा.

ViewModelFactory को खोलें और इसके कंस्ट्रक्टर के तरीके के कॉन्टेंट को, नीचे दिए गए कोड से बदलें:

//...
class ViewModelFactory constructor(
       private val tasksRepository: TasksRepository,
       private val shortcutsRepository: ShortcutsRepository,
       owner: SavedStateRegistryOwner,
       defaultArgs: Bundle? = null
) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {

   override fun <T : ViewModel> create(
           key: String,
           modelClass: Class<T>,
           handle: SavedStateHandle
   ) = with(modelClass) {
       when {
           isAssignableFrom(StatisticsViewModel::class.java) ->
               StatisticsViewModel(tasksRepository)
           isAssignableFrom(TaskDetailViewModel::class.java) ->
               TaskDetailViewModel(tasksRepository, shortcutsRepository)
           isAssignableFrom(AddEditTaskViewModel::class.java) ->
               AddEditTaskViewModel(tasksRepository, shortcutsRepository)
           isAssignableFrom(TasksViewModel::class.java) ->
               TasksViewModel(tasksRepository, handle)
           else ->
               throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}")
       }
   } as T
}

इसके बाद, TaskDetailViewModel खोलें. ShortcutsRepository मॉड्यूल को इंपोर्ट करें और नीचे दिए गए कोड का इस्तेमाल करके, इसके लिए एक इंस्टेंस वैरिएबल तय करें:

TaskDetailViewModel.kt

package com.example.android.architecture.blueprints.todoapp.taskdetail

...
import com.example.android.architecture.blueprints.todoapp.data.source.ShortcutsRepository


/**
* ViewModel for the Details screen.
*/
class TaskDetailViewModel(
       //...
       private val shortcutsRepository: ShortcutsRepository
   ) : ViewModel() {
...
}

आखिर में, जब भी इससे जुड़े taskId वाला टास्क मिटाया जाए, तो shortcutsRepository को कॉल करने के लिए deleteTask() फ़ंक्शन में बदलाव करें, ताकि उसके आईडी के आधार पर शॉर्टकट को हटाया जा सके:

TaskDetailViewModel.kt

fun deleteTask() = viewModelScope.launch {
   _taskId.value?.let {
       //...
       shortcutsRepository.removeShortcutsById(listOf(it))
   }
}

अपने कोड की जांच करने के लिए, ऐप्लिकेशन को फिर से लॉन्च करें और यह तरीका अपनाएं:

  1. टेस्ट टास्क मिटाएं.
  2. अपने मौजूदा टास्क आइटम के टाइटल का नाम बदलकर, "कोडलैब खत्म करें" करें.
  3. "Ok Google, मेरे शॉर्टकट" बोलकर Google Assistant खोलें.
  4. एक्सप्लोर करें टैब पर टैप करें. पुष्टि करें कि टेस्ट के लिए शॉर्टकट अब नहीं दिख रहा है.

7. अगले चरण

बधाई हो! आपकी बदौलत, हमारे सैंपल ऐप्लिकेशन का इस्तेमाल करने वाले लोग, Assistant से कुछ ऐसा बोलकर, आसानी से अपने बनाए नोट पर वापस जा सकते हैं. जैसे, "Ok Google, ExampleApp पर मेरे किराने के सामान की सूची खोलो". शॉर्टकट की मदद से, उपयोगकर्ताओं का जुड़ाव और मज़बूत होता है. इससे उपयोगकर्ता आपके ऐप्लिकेशन में, अक्सर इस्तेमाल की जाने वाली कार्रवाइयों को आसानी से फिर से देख पाते हैं.

इसमें हमने इन विषयों के बारे में बताया

इस कोडलैब में, आपने ये सीखा:

  • किसी ऐप्लिकेशन में डाइनैमिक शॉर्टकट पुश करने के लिए, इस्तेमाल के उदाहरण देखें.
  • रिपॉज़िटरी, डिपेंडेंसी इंजेक्शन, और सर्विस लोकेटर डिज़ाइन पैटर्न का इस्तेमाल करके, कोड से जुड़ी जटिलता कम करें.
  • आवाज़ की सुविधा वाले डाइनैमिक शॉर्टकट को यूज़र जनरेटेड ऐप्लिकेशन के कॉन्टेंट में जोड़ें.
  • मौजूदा शॉर्टकट को अपडेट करें और हटाएं.

आगे क्या करना है

यहां से, अपने टास्क की सूची वाले ऐप्लिकेशन को बेहतर बनाया जा सकता है. पूरे हो चुके प्रोजेक्ट का रेफ़रंस देने के लिए, GitHub पर रेपो –codelab-complete ब्रांच देखें.

ऐप्लिकेशन की खास सुविधाओं के लिए कार्रवाइयों की सुविधा का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, यहां कुछ सुझाव दिए गए हैं:

Actions on Google का इस्तेमाल जारी रखने के लिए, इन संसाधनों को एक्सप्लोर करें:

हमारी नई सूचनाओं के साथ बने रहने के लिए, हमें Twitter @ActionsOnGoogle पर फ़ॉलो करें. साथ ही, आपने जो बनाया है उसे शेयर करने के लिए #appActions पर ट्वीट करें!

सुझाव, शिकायत या राय से जुड़ा सर्वे

आखिर में, इस कोडलैब के साथ अपने अनुभव के बारे में सुझाव देने के लिए, कृपया यह सर्वे भरें.