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

पहली इमेज. इस इमेज में, तीन प्रोग्रेसिव स्क्रीन दिखाई गई हैं. इनमें, उपयोगकर्ता की ओर से बनाया गया टास्क और Google Assistant को उस टास्क आइटम के लिए डाइनैमिक शॉर्टकट लॉन्च करते हुए दिखाया गया है.
आपको क्या बनाना है
इस कोडलैब में, आपको Android पर मौजूद 'क्या-क्या करना है' की सूची वाले ऐप्लिकेशन के सैंपल में, आवाज़ से कंट्रोल किए जाने वाले डाइनैमिक शॉर्टकट चालू करने का तरीका बताया जाएगा. इससे उपयोगकर्ता, Assistant से ऐप्लिकेशन में बनाई गई टास्क लिस्ट के आइटम खोलने के लिए कह सकेंगे. इसके लिए, आपको Android आर्किटेक्चर पैटर्न का इस्तेमाल करना होगा. खास तौर पर, repository, service locator, और ViewModel पैटर्न का इस्तेमाल करना होगा.
ज़रूरी शर्तें
यह कोडलैब, पिछले कोडलैब में बताए गए ऐप्लिकेशन ऐक्शन के कॉन्सेप्ट पर आधारित है. खास तौर पर, बीआईआई और स्टैटिक शॉर्टकट. अगर आपने पहले कभी ऐप्लिकेशन कार्रवाइयों का इस्तेमाल नहीं किया है, तो हमारा सुझाव है कि आप आगे बढ़ने से पहले, उस कोडलैब को पूरा कर लें.
इसके अलावा, आगे बढ़ने से पहले पक्का करें कि आपके डेवलपमेंट एनवायरमेंट में यह कॉन्फ़िगरेशन हो:
- git इंस्टॉल किया गया टर्मिनल, ताकि शेल कमांड चलाई जा सकें.
- Android Studio का नया स्टेबल वर्शन.
- इंटरनेट की सुविधा वाला कोई फ़िज़िकल या वर्चुअल Android डिवाइस.
- एक Google खाता, जिससे आपने Android Studio, Google ऐप्लिकेशन, और Google Assistant ऐप्लिकेशन में साइन इन किया हो.
2. जानें कि यह सुविधा कैसे काम करती है
बोलकर ऐक्सेस करने की सुविधा के लिए डाइनैमिक शॉर्टकट चालू करने के लिए, यह तरीका अपनाएं:
- डाइनैमिक शॉर्टकट को ज़रूरी शर्तें पूरी करने वाले BII से बाइंड करना.
- Google Shortcuts Integration library को जोड़कर, Assistant को शॉर्टकट इस्तेमाल करने की अनुमति दें.
- जब भी कोई उपयोगकर्ता ऐप्लिकेशन में कोई काम पूरा करता है, तब उसे उससे जुड़ा शॉर्टकट पुश करना.
शॉर्टकट बाइंड करना
डाइनैमिक शॉर्टकट को Assistant से ऐक्सेस करने के लिए, उसे काम के BII से बाइंड करना होगा. शॉर्टकट के साथ बीआईआई ट्रिगर होने पर, Assistant उपयोगकर्ता के अनुरोध में मौजूद पैरामीटर को, बाउंड शॉर्टकट में तय किए गए कीवर्ड से मैच करती है. उदाहरण के लिए:
GET_THINGबीआईआई से जुड़ा शॉर्टकट, उपयोगकर्ताओं को सीधे तौर पर Assistant से ऐप्लिकेशन में मौजूद किसी खास कॉन्टेंट का अनुरोध करने की अनुमति दे सकता है. * "Ok Google, ExampleApp पर मेरी किराने के सामान की सूची खोलो."START_EXERCISEबीआईआई से जुड़ा शॉर्टकट, लोगों को उनके कसरत के सेशन देखने की अनुमति दे सकता है. * "Ok Google, ExampleApp से कहो कि वह मेरी रोज़ की कसरत शुरू करे."
बीआइआई की कैटगरी के हिसाब से पूरी सूची देखने के लिए, पहले से मौजूद इंटेंट का रेफ़रंस देखें.
Assistant को शॉर्टकट उपलब्ध कराना
शॉर्टकट को बीआईआई से बाइंड करने के बाद, अगला चरण Assistant को इन शॉर्टकट को इस्तेमाल करने की अनुमति देना है. इसके लिए, अपने प्रोजेक्ट में Google Shortcuts Integration library जोड़ें. इस लाइब्रेरी को लागू करने के बाद, Assistant को आपके ऐप्लिकेशन के हर शॉर्टकट के बारे में पता चल जाएगा. इससे लोग, Assistant में शॉर्टकट का ट्रिगर फ़्रेज़ इस्तेमाल करके, उन शॉर्टकट को लॉन्च कर सकेंगे.
3. डेवलपमेंट एनवायरमेंट तैयार करना
इस कोडलैब में, Android के लिए बनाए गए 'क्या-क्या करना है' सूची वाले ऐप्लिकेशन के सैंपल का इस्तेमाल किया गया है. इस ऐप्लिकेशन की मदद से, उपयोगकर्ता सूचियों में आइटम जोड़ सकते हैं. साथ ही, कैटगरी के हिसाब से टास्क की सूची में मौजूद आइटम खोज सकते हैं. इसके अलावा, टास्क पूरे होने के स्टेटस के हिसाब से उन्हें फ़िल्टर कर सकते हैं. इस सेक्शन को पूरा करके, सैंपल ऐप्लिकेशन डाउनलोड करें और उसे तैयार करें.
अपनी बेस फ़ाइलें डाउनलोड करना
सैंपल ऐप्लिकेशन की GitHub रिपॉज़िटरी को क्लोन करने के लिए, यह कमांड चलाएं:
git clone https://github.com/actions-on-google/app-actions-dynamic-shortcuts.git
रिपॉज़िटरी को क्लोन करने के बाद, Android Studio में इसे खोलने के लिए यह तरीका अपनाएं:
- Android Studio में आपका स्वागत है डायलॉग बॉक्स में, प्रोजेक्ट इंपोर्ट करें पर क्लिक करें.
- वह फ़ोल्डर चुनें जहां आपने रिपॉज़िटरी को क्लोन किया है.
इसके अलावा, पूरे कोडलैब को दिखाने वाले सैंपल ऐप्लिकेशन का वर्शन देखने के लिए, इसकी 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 लाइब्रेरी जोड़ें:
app/build.gradle
dependencies {
...
// Shortcuts library
implementation "androidx.core:core:1.6.0"
implementation 'androidx.core:core-google-shortcuts:1.0.1'
...
}
अपने डिवाइस पर ऐप्लिकेशन को आज़माना
ऐप्लिकेशन में और बदलाव करने से पहले, यह जान लें कि सैंपल ऐप्लिकेशन क्या-क्या कर सकता है. ऐप्लिकेशन को अपने एम्युलेटर पर चलाने के लिए, यह तरीका अपनाएं:
- Android Studio में, Run > Run app को चुनें या टूलबार में Run
पर क्लिक करें. - डिप्लॉयमेंट टारगेट चुनें डायलॉग में, कोई डिवाइस चुनें और ठीक है पर क्लिक करें. हमारा सुझाव है कि आप Android 10 (एपीआई लेवल 30) या उसके बाद के वर्शन का इस्तेमाल करें. हालांकि, ऐप्लिकेशन कार्रवाइयां Android 5 (एपीआई लेवल 21) या उसके बाद के वर्शन वाले डिवाइसों पर भी काम करती हैं.
- Assistant को सेट अप करने के लिए, होम बटन को दबाकर रखें. साथ ही, पुष्टि करें कि यह काम कर रही है. अगर आपने पहले से ही अपने डिवाइस पर Assistant में साइन इन नहीं किया है, तो आपको साइन इन करना होगा.
Android वर्चुअल डिवाइसों के बारे में ज़्यादा जानने के लिए, वर्चुअल डिवाइस बनाना और उन्हें मैनेज करना लेख पढ़ें.
ऐप्लिकेशन के बारे में जानने के लिए, इसे कुछ देर तक एक्सप्लोर करें. प्लस आइकॉन पर टैप करने से, नया टास्क आइटम बनता है. साथ ही, सबसे ऊपर दाईं ओर मौजूद मेन्यू आइटम की मदद से, टास्क आइटम को पूरा होने की स्थिति के हिसाब से खोजा और फ़िल्टर किया जा सकता है.
4. शॉर्टकट रिपॉज़िटरी क्लास बनाना
हमारे सैंपल ऐप्लिकेशन में मौजूद कई क्लास, डाइनैमिक शॉर्टकट को पुश और मैनेज करने के लिए ShortcutManagerCompat एपीआई को कॉल करेंगी. कोड की ज़रूरत को कम करने के लिए, आपको एक रिपॉज़िटरी लागू करनी होगी. इससे आपकी प्रोजेक्ट क्लास, डाइनैमिक शॉर्टकट को आसानी से मैनेज कर पाएंगी.
रिपॉज़िटरी के डिज़ाइन का पैटर्न, शॉर्टकट मैनेज करने के लिए एक स्पष्ट एपीआई मुहैया कराता है. रिपॉज़िटरी का फ़ायदा यह है कि इसमें, एपीआई की जानकारी को एक छोटे एपीआई के पीछे छिपा दिया जाता है. यह तरीका अपनाकर, रिपॉज़िटरी लागू करें:
ShortcutsRepositoryएपीआई को ऐब्स्ट्रैक्ट करने के लिए,ShortcutsRepositoryक्लास बनाएं.ShortcutManagerCompat- ऐप्लिकेशन के सर्विस लोकेटर में
ShortcutsRepositoryतरीके जोड़ें. - मुख्य ऐप्लिकेशन में
ShortcutRepositoryसेवा रजिस्टर करें.
डेटाबेस बनाना
com.example.android.architecture.blueprints.todoapp.data.source पैकेज में ShortcutsRepository नाम की नई Kotlin क्लास बनाएं. आपको यह पैकेज, app/src/main/java फ़ोल्डर में व्यवस्थित किया हुआ मिलेगा. इस क्लास का इस्तेमाल, एक इंटरफ़ेस लागू करने के लिए किया जाएगा. यह इंटरफ़ेस, हमारे कोडलैब के इस्तेमाल के उदाहरण को कवर करने वाले तरीकों का कम से कम सेट उपलब्ध कराता है.

दूसरी इमेज. 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 में क्लास ब्राउज़र का इस्तेमाल करके, सर्विस लोकेटर क्लास खोलें. इसके लिए, Navigate > Class पर जाएं और "ServiceLocator" टाइप करें. नतीजे के तौर पर मिली Kotlin फ़ाइल पर क्लिक करके, उसे अपने आईडीई में खोलें.
ServiceLocator.kt के सबसे ऊपर, ShortcutsRepository और SuppressLint पैकेज इंपोर्ट करने के लिए, यह कोड चिपकाएं:
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
ServiceLocator.kt के मुख्य हिस्से में यह कोड चिपकाकर, ShortcutRepository सेवा के सदस्यों और तरीकों को जोड़ें:
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 BII से जुड़ा होगा. इससे Assistant, उपयोगकर्ताओं को सीधे तौर पर उस टास्क आइटम पर ले जाती है जिसके लिए उन्होंने अनुरोध किया है. ऐसा तब होता है, जब वे "Ok Google, SampleApp पर मेरी किराने के सामान की सूची खोलो." जैसे सवाल पूछकर BII को ट्रिगर करते हैं.
इस सुविधा को सैंपल ऐप्लिकेशन में चालू करने के लिए, यह तरीका अपनाएं:
- टास्क की सूची वाले ऑब्जेक्ट को मैनेज करने के लिए ज़िम्मेदार
ShortcutsRepositoryक्लास मेंShortcutsRepositoryसेवा को इंपोर्ट करना.AddEditTaskViewModel - जब उपयोगकर्ता कोई नया टास्क बनाता है, तब डाइनैमिक शॉर्टकट को पुश करना.
ShortcutsRepository को इंपोर्ट करें
सबसे पहले, हमें ShortcutsRepository सेवा को AddEditTaskViewModel के लिए उपलब्ध कराना होगा. इसके लिए, ViewModelFactory में सेवा इंपोर्ट करें. यह फ़ैक्ट्री क्लास है, जिसका इस्तेमाल ऐप्लिकेशन ViewModel ऑब्जेक्ट को इंस्टैंशिएट करने के लिए करता है. इसमें AddEditTaskViewModel भी शामिल है.
Android Studio में क्लास ब्राउज़र खोलने के लिए, Navigate > Class पर जाएं. इसके बाद, "ViewModelFactory" टाइप करें. नतीजे के तौर पर मिली Kotlin फ़ाइल पर क्लिक करके, उसे अपने IDE में खोलें.
ViewModelFactory.kt के सबसे ऊपर, ShortcutsRepository और SuppressLint पैकेज इंपोर्ट करने के लिए, यह कोड चिपकाएं:
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 का फ़ाइल ब्राउज़र खोलने के लिए, Navigate > File पर जाएं और "FragmentExt.kt" टाइप करें. अपने आईडीई में, 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)
}
शॉर्टकट को पुश करना
ShortcutsRepository ऐब्स्ट्रैक्शन क्लास, सैंपल ऐप्लिकेशन की ViewModel क्लास के लिए उपलब्ध है. इसलिए, आपको AddEditTaskViewModel को अपडेट करना होगा. 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 में जाकर इसे इंस्टॉल करें. इसके लिए, यह तरीका अपनाएं:
- **फ़ाइल > सेटिंग (macOS पर Android Studio > प्राथमिकताएं) पर जाएं.
- प्लगिन सेक्शन में जाकर, Marketplace पर जाएं और "Google Assistant" खोजें.
- अगर आपको Marketplace पर प्लग इन नहीं मिलता है, तो प्लग इन को मैन्युअल तरीके से डाउनलोड करें. इसके बाद, डिस्क से प्लग इन इंस्टॉल करें पर दिए गए निर्देशों का पालन करें.
- टूल इंस्टॉल करें और Android Studio को फिर से चालू करें.
झलक बनाना
Android Studio में झलक देखने के लिए, यह तरीका अपनाएं:
- टूल > Google Assistant > "ऐप्लिकेशन ऐक्शन टेस्ट टूल" पर क्लिक करें.
- ऐप्लिकेशन का नाम बॉक्स में, "कामों की सूची" जैसा कोई नाम डालें.
- झलक बनाएं पर क्लिक करें. अगर आपसे कहा जाए, तो ऐप्लिकेशन की खास सुविधाओं के लिए कार्रवाइयों की नीतियों और सेवा की शर्तों को पढ़ें और उन्हें स्वीकार करें.

तीसरी इमेज. ऐप्लिकेशन ऐक्शन की जांच करने वाले टूल में, झलक बनाने वाला पैनल.
टेस्टिंग के दौरान, Assistant को भेजे गए डाइनैमिक शॉर्टकट, Assistant में दिखेंगे. ये शॉर्टकट, ऐप्लिकेशन के नाम के हिसाब से व्यवस्थित किए जाएंगे. यह नाम, आपने प्रीव्यू के लिए दिया था.
शॉर्टकट को पुश करना और उसकी जांच करना
अपने टेस्ट डिवाइस पर सैंपल ऐप्लिकेशन को फिर से लॉन्च करें और यह तरीका अपनाएं :
- "कोड लैब शुरू करें" टाइटल वाला नया टास्क बनाएं
- Google Assistant ऐप्लिकेशन खोलें और "मेरे शॉर्टकट" बोलें या टाइप करें.
- एक्सप्लोर करें टैब पर टैप करें. आपको शॉर्टकट का सैंपल दिखेगा.
- शॉर्टकट को चालू करने के लिए, उस पर टैप करें. आपको ऐप्लिकेशन लॉन्च होता हुआ दिखेगा. साथ ही, फ़िल्टर बॉक्स में शॉर्टकट का नाम पहले से भरा हुआ दिखेगा. इससे, अनुरोध किए गए टास्क आइटम को ढूंढना आसान हो जाएगा.
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)
}
}
ऐप्लिकेशन को फिर से लॉन्च करके, अपने कोड को टेस्ट करें. इसके लिए, यह तरीका अपनाएं:
- अपने मौजूदा टास्क आइटम के टाइटल का नाम बदलकर "कोडलैब पूरा करें" करो.
- "Ok Google, मेरे शॉर्टकट" कहकर, Google Assistant खोलें.
- एक्सप्लोर करें टैब पर टैप करें. आपको टेस्ट किए गए शॉर्टकट के लिए, अपडेट किया गया छोटा लेबल दिखेगा.
शॉर्टकट हटाना
जब भी कोई उपयोगकर्ता किसी टास्क को मिटाता है, तो हमारे सैंपल ऐप्लिकेशन के शॉर्टकट हटा दिए जाने चाहिए. सैंपल ऐप्लिकेशन में, टास्क मिटाने का लॉजिक TaskDetailViewModel क्लास में होता है. इस क्लास को अपडेट करने से पहले, हमें ViewModelFactory को फिर से अपडेट करना होगा, ताकि shortcutsRepository को TaskDetailViewModel में पास किया जा सके.
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() {
...
}
आखिर में, deleteTask() फ़ंक्शन में बदलाव करके shortcutsRepository को कॉल करें. इससे, taskId से जुड़ा कोई टास्क मिटने पर, उसके आईडी के आधार पर शॉर्टकट को हटाया जा सकेगा:
TaskDetailViewModel.kt
fun deleteTask() = viewModelScope.launch {
_taskId.value?.let {
//...
shortcutsRepository.removeShortcutsById(listOf(it))
}
}
अपने कोड को टेस्ट करने के लिए, ऐप्लिकेशन को फिर से लॉन्च करें और यह तरीका अपनाएं:
- टेस्ट टास्क मिटाएं.
- अपने मौजूदा टास्क आइटम के टाइटल का नाम बदलकर "कोडलैब पूरा करें" करो.
- "Ok Google, मेरे शॉर्टकट" कहकर, Google Assistant खोलें.
- एक्सप्लोर करें टैब पर टैप करें. पुष्टि करें कि आपका टेस्ट शॉर्टकट अब नहीं दिख रहा है.
7. अगले चरण
बधाई हो! आपकी वजह से, हमारे सैंपल ऐप्लिकेशन के उपयोगकर्ता आसानी से अपने बनाए गए नोट पर वापस जा सकते हैं. इसके लिए, उन्हें Assistant से "Ok Google, ExampleApp पर मेरी किराने के सामान की सूची खोलो" जैसे सवाल पूछने होंगे. शॉर्टकट की मदद से, उपयोगकर्ताओं को आपके ऐप्लिकेशन में ज़्यादा दिलचस्पी लेने के लिए बढ़ावा मिलता है. ऐसा इसलिए, क्योंकि इससे उपयोगकर्ताओं के लिए, आपके ऐप्लिकेशन में अक्सर इस्तेमाल की जाने वाली कार्रवाइयों को फिर से चलाना आसान हो जाता है.
हमने क्या-क्या बताया
इस कोडलैब में, आपने ये सीखा:
- किसी ऐप्लिकेशन में डाइनैमिक शॉर्टकट पुश करने के इस्तेमाल के उदाहरणों की पहचान करें.
- रिपॉज़िटरी, डिपेंडेंसी इंजेक्शन, और सर्विस लोकेटर डिज़ाइन पैटर्न का इस्तेमाल करके, कोड की जटिलता को कम करें.
- आवाज़ से कंट्रोल किए जा सकने वाले डाइनैमिक शॉर्टकट को, ऐप्लिकेशन के यूज़र जनरेटेड कॉन्टेंट पर पुश करें.
- मौजूदा शॉर्टकट अपडेट करना और उन्हें हटाना.
आगे क्या करना है
यहां से, Task List ऐप्लिकेशन को और बेहतर बनाया जा सकता है. पूरे प्रोजेक्ट का रेफ़रंस देखने के लिए, GitHub पर –codelab-complete branch repo देखें.
ऐप्लिकेशन की खास सुविधाओं के लिए कार्रवाइयों की मदद से, इस ऐप्लिकेशन को बेहतर बनाने के बारे में ज़्यादा जानने के लिए, यहां कुछ सुझाव दिए गए हैं:
- अपने ऐप्लिकेशन ऐक्शन की परफ़ॉर्मेंस को ट्रैक करने का तरीका जानने के लिए, Google Analytics for Firebase के साथ, 'क्या-क्या करना है' सूची का सैंपल देखें.
- अपने ऐप्लिकेशन को Assistant के साथ इंटिग्रेट करने के अन्य तरीके जानने के लिए, ऐप्लिकेशन कार्रवाइयों के पहले से मौजूद इंटेंट का रेफ़रंस देखें.
Actions on Google का इस्तेमाल जारी रखने के लिए, इन संसाधनों को देखें:
- actions.google.com: Actions on Google के लिए आधिकारिक दस्तावेज़ की साइट.
- ऐप्लिकेशन कार्रवाइयों के सैंपल इंडेक्स: ऐप्लिकेशन कार्रवाइयों की सुविधाओं के बारे में जानने के लिए, सैंपल ऐप्लिकेशन और कोड.
- Actions on Google GitHub रिपॉज़िटरी: सैंपल कोड और लाइब्रेरी.
- r/GoogleAssistantDev: यह Google Assistant के साथ काम करने वाले डेवलपर के लिए, Reddit की आधिकारिक कम्यूनिटी है.
हमारी नई घोषणाओं के बारे में जानने के लिए, हमें Twitter पर @ActionsOnGoogle पर फ़ॉलो करें. साथ ही, आपने जो बनाया है उसे शेयर करने के लिए, #appActions पर ट्वीट करें!
सुझाव/राय देने या शिकायत करने के लिए सर्वे
आखिर में, इस कोडलैब के बारे में अपने अनुभव के बारे में सुझाव/राय देने या शिकायत करने के लिए, कृपया यह सर्वे पूरा करें.