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

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

इस कोडलैब (कोड बनाना सीखने के लिए ट्यूटोरियल) के बारे में जानकारी

subjectपिछली बार सित॰ 12, 2024 को अपडेट किया गया
account_circleGoogle Assistant Developer Relations ने लिखा

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

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

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

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

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

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

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

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

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

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

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

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

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

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

शॉर्टकट बाइंड करना

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

  • GET_THING बीआईआई का शॉर्टकट होने पर, उपयोगकर्ता सीधे Assistant से किसी इन-ऐप्लिकेशन कॉन्टेंट के लिए अनुरोध कर सकते हैं. * "Ok Google, ExampleApp पर मेरे किराने के सामान की सूची खोलो."
  • START_EXERCISE बीआईआई से जुड़े शॉर्टकट की मदद से, उपयोगकर्ता अपने कसरत के सेशन देख सकते हैं. * "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"
   
...
 
}
}

applicationId फ़ील्ड में "MYUNIQUENAME" को किसी यूनीक नाम से बदलें.

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

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

ऐप्लिकेशन/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 API को कॉल करेंगी. कोड की डुप्लीकेट कॉपी को कम करने के लिए, आपको एक रिपॉज़िटरी लागू करनी होगी. इससे आपकी प्रोजेक्ट क्लास, डाइनैमिक शॉर्टकट को आसानी से मैनेज कर पाएंगी.

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

  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 बीआईआई के साथ जुड़ा होता है. इससे, जब उपयोगकर्ता "Ok Google, SampleApp पर मेरी किराने की सूची खोलो" जैसे सवाल पूछकर, बीआईआई को ट्रिगर करते हैं, तो Assistant उन्हें सीधे तौर पर उस टास्क आइटम पर ले जाती है जिसका अनुरोध किया गया है.

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

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

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

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

Android Studio में क्लास ब्राउज़र खोलें. इसके लिए, नेविगेट करें > क्लास और "ViewModelफ़ैक्ट्री" टाइप करना. इसके बाद बनी 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 को फ़ैक्ट्री के कंस्ट्रक्टर को पास करें. Android Studio का फ़ाइल ब्राउज़र खोलने के लिए, नेविगेट करें > फ़ाइल पर जाएं और "FragmentExt.kt" टाइप करें. util पैकेज में मौजूद Kotlin फ़ाइल पर क्लिक करके, उसे अपने IDE में खोलें.

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 branch रेपो देखें.

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

'Google पर कार्रवाइयां' की सुविधा का इस्तेमाल जारी रखने के लिए, ये संसाधन देखें:

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

सुझाव, राय या शिकायत के लिए सर्वे

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