1. ওভারভিউ
পূর্ববর্তী কোডল্যাবে , আপনি একটি নমুনা অ্যাপে সাধারণভাবে ব্যবহৃত বিল্ট-ইন ইনটেন্ট (BII) প্রয়োগ করতে স্ট্যাটিক শর্টকাট ব্যবহার করেছেন। অ্যান্ড্রয়েড ডেভেলপাররা অ্যাপ অ্যাকশন ব্যবহার করে অ্যাপের কার্যকারিতা গুগল অ্যাসিস্ট্যান্টে প্রসারিত করতে।
স্ট্যাটিক শর্টকাটগুলি একটি অ্যাপের সাথে বান্ডিল করা হয় এবং শুধুমাত্র অ্যাপের নতুন সংস্করণ প্রকাশ করে আপডেট করা যায়। একটি অ্যাপে গতিশীল উপাদানগুলির জন্য ভয়েস কার্যকারিতা সক্ষম করা, যেমন ব্যবহারকারী-উত্পাদিত সামগ্রী, ডায়নামিক শর্টকাট ব্যবহার করে অর্জন করা হয়৷ একটি টাস্ক ট্র্যাকিং অ্যাপে একটি নতুন নোট তৈরি করার মতো প্রাসঙ্গিক ক্রিয়া সম্পাদন করার পরে অ্যাপগুলি গতিশীল শর্টকাটগুলি পুশ করে৷ অ্যাপ অ্যাকশনের সাহায্যে, আপনি ভয়েসের জন্য এই শর্টকাটগুলিকে একটি BII-তে আবদ্ধ করে সক্ষম করেন, ব্যবহারকারীদের "Hey Google, ExampleApp-এ আমার গ্রোসারি তালিকা খুলুন" এই ধরনের কথা বলে সহকারী থেকে তাদের সামগ্রী অ্যাক্সেস করতে সক্ষম করে।
চিত্র 1. তিনটি প্রগতিশীল স্ক্রীন একটি ব্যবহারকারীর তৈরি কাজ দেখাচ্ছে, এবং Google সহকারী সেই টাস্ক আইটেমের একটি গতিশীল শর্টকাট চালু করছে৷
আপনি কি নির্মাণ করবেন
এই কোডল্যাবে, আপনি একটি নমুনা করণীয় তালিকার অ্যান্ড্রয়েড অ্যাপে ভয়েসের জন্য গতিশীল শর্টকাট সক্ষম করবেন, যাতে ব্যবহারকারীরা অ্যাসিস্ট্যান্টকে অ্যাপে তৈরি করা টাস্ক তালিকা আইটেমগুলি খুলতে বলতে পারে। আপনি অ্যান্ড্রয়েড আর্কিটেকচার প্যাটার্ন, বিশেষ করে রিপোজিটরি , সার্ভিস লোকেটার এবং ভিউমডেল প্যাটার্ন ব্যবহার করে এটি সম্পন্ন করেন।
পূর্বশর্ত
এই কোডল্যাবটি পূর্ববর্তী কোডল্যাবে কভার করা অ্যাপ অ্যাকশন ধারণার উপর ভিত্তি করে তৈরি করে, বিশেষ করে BII এবং স্ট্যাটিক শর্টকাট। আপনি যদি অ্যাপ অ্যাকশনে নতুন হন, তাহলে আমরা চালিয়ে যাওয়ার আগে সেই কোডল্যাবটি সম্পূর্ণ করার পরামর্শ দিই।
উপরন্তু, এগিয়ে যাওয়ার আগে নিশ্চিত করুন যে আপনার উন্নয়ন পরিবেশে নিম্নলিখিত কনফিগারেশন আছে:
- Git ইনস্টল সহ শেল কমান্ড চালানোর জন্য একটি টার্মিনাল।
- অ্যান্ড্রয়েড স্টুডিওর সর্বশেষ স্থিতিশীল রিলিজ।
- ইন্টারনেট অ্যাক্সেস সহ একটি শারীরিক বা ভার্চুয়াল অ্যান্ড্রয়েড ডিভাইস।
- একটি Google অ্যাকাউন্ট যা Android Studio, Google অ্যাপ এবং Google Assistant অ্যাপে সাইন ইন করা আছে।
2. এটি কিভাবে কাজ করে তা বুঝুন
ভয়েস অ্যাক্সেসের জন্য একটি গতিশীল শর্টকাট সক্ষম করার জন্য নিম্নলিখিত পদক্ষেপগুলি জড়িত:
- একটি যোগ্য BII-তে একটি গতিশীল শর্টকাট বাঁধা।
- Google শর্টকাট ইন্টিগ্রেশন লাইব্রেরি যোগ করে সহকারীকে শর্টকাটগুলি ইনজেস্ট করতে সক্ষম করা৷
- যখনই একজন ব্যবহারকারী প্রাসঙ্গিক ইন-অ্যাপ টাস্ক সম্পূর্ণ করে তখনই একটি শর্টকাট পুশ করা ।
বাঁধাই শর্টকাট
অ্যাসিস্ট্যান্ট থেকে একটি ডায়নামিক শর্টকাট অ্যাক্সেসযোগ্য হওয়ার জন্য, এটি একটি প্রাসঙ্গিক BII-এর সাথে আবদ্ধ হতে হবে। যখন একটি শর্টকাট সহ একটি BII ট্রিগার করা হয়, তখন সহায়ক ব্যবহারকারীর অনুরোধের প্যারামিটারগুলি আবদ্ধ শর্টকাটে সংজ্ঞায়িত কীওয়ার্ডের সাথে মেলে। যেমন:
-
GET_THING
BII এর সাথে আবদ্ধ একটি শর্টকাট ব্যবহারকারীদের সরাসরি অ্যাসিস্ট্যান্ট থেকে নির্দিষ্ট অ্যাপ-মধ্যস্থ সামগ্রীর অনুরোধ করতে দেয়। * "ওহে Google, ExampleApp-এ আমার মুদির তালিকা খুলুন।" -
ORDER_MENU_ITEM
BII এর সাথে আবদ্ধ একটি শর্টকাট ব্যবহারকারীদের আগের অর্ডারগুলি পুনরায় প্লে করার অনুমতি দিতে পারে৷ * "ওহে গুগল, আমার স্বাভাবিক নিয়ম ExampleApp থেকে অর্ডার করুন।"
বিআইআই-এর সম্পূর্ণ শ্রেণীবদ্ধ তালিকার জন্য অন্তর্নির্মিত উদ্দেশ্য রেফারেন্স দেখুন।
সহকারীকে শর্টকাট প্রদান করা হচ্ছে
আপনার শর্টকাটগুলিকে BII-তে আবদ্ধ করার পরে, পরবর্তী পদক্ষেপ হল আপনার প্রোজেক্টে Google শর্টকাট ইন্টিগ্রেশন লাইব্রেরি যোগ করে এই শর্টকাটগুলিকে ইনজেস্ট করতে সহায়ককে সক্ষম করা৷ এই লাইব্রেরির জায়গায়, সহকারী আপনার অ্যাপের দ্বারা পুশ করা প্রতিটি শর্টকাট সম্পর্কে সচেতন থাকবে, ব্যবহারকারীদের সহকারীতে শর্টকাটের ট্রিগার বাক্যাংশ ব্যবহার করে সেই শর্টকাটগুলি চালু করতে সক্ষম করবে।
3. আপনার উন্নয়ন পরিবেশ প্রস্তুত করুন
এই কোডল্যাবটি অ্যান্ড্রয়েডের জন্য তৈরি একটি নমুনা করণীয় তালিকা অ্যাপ ব্যবহার করে। এই অ্যাপের সাহায্যে, ব্যবহারকারীরা তালিকায় আইটেম যোগ করতে পারেন, ক্যাটাগরি অনুসারে টাস্ক লিস্ট আইটেমগুলি অনুসন্ধান করতে পারেন এবং সমাপ্তির স্থিতি অনুসারে কাজগুলি ফিল্টার করতে পারেন। এই বিভাগটি সম্পূর্ণ করে নমুনা অ্যাপটি ডাউনলোড করুন এবং প্রস্তুত করুন।
আপনার বেস ফাইল ডাউনলোড করুন
নমুনা অ্যাপের GitHub সংগ্রহস্থল ক্লোন করতে নিম্নলিখিত কমান্ডটি চালান:
git clone https://github.com/actions-on-google/app-actions-dynamic-shortcuts.git
একবার আপনি সংগ্রহস্থলটি ক্লোন করার পরে, Android স্টুডিওতে এটি খুলতে এই পদক্ষেপগুলি অনুসরণ করুন:
- অ্যান্ড্রয়েড স্টুডিওতে স্বাগতম ডায়ালগে, ইমপোর্ট প্রোজেক্টে ক্লিক করুন।
- ফোল্ডারটি নির্বাচন করুন যেখানে আপনি সংগ্রহস্থল ক্লোন করেছেন।
বিকল্পভাবে, আপনি গিথুব রেপোর codelab-complete
শাখাটি ক্লোন করে সম্পূর্ণ কোডল্যাবের প্রতিনিধিত্বকারী নমুনা অ্যাপ্লিকেশনটির একটি সংস্করণ দেখতে পারেন:
git clone https://github.com/actions-on-google/app-actions-dynamic-shortcuts.git --branch codelab-complete
অ্যান্ড্রয়েড অ্যাপ্লিকেশন আইডি আপডেট করুন
অ্যাপের অ্যাপ্লিকেশান আইডি আপডেট করা আপনার পরীক্ষা ডিভাইসে অ্যাপটিকে অনন্যভাবে সনাক্ত করে এবং অ্যাপটি প্লে কনসোলে আপলোড করা হলে একটি "ডুপ্লিকেট প্যাকেজ নাম" ত্রুটি এড়ায়। অ্যাপ্লিকেশন আইডি আপডেট করতে, app/build.gradle
খুলুন:
android {
...
defaultConfig {
applicationId "com.MYUNIQUENAME.android.fitactions"
...
}
}
applicationId
ক্ষেত্রে "MYUNIQUENAME" প্রতিস্থাপন করুন আপনার জন্য অনন্য কিছুতে।
শর্টকাট এপিআই নির্ভরতা যোগ করুন
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'
...
}
আপনার ডিভাইসে অ্যাপটি পরীক্ষা করুন
অ্যাপটিতে আরও পরিবর্তন করার আগে, নমুনা অ্যাপটি কী করতে পারে তার একটি ধারণা পেতে সহায়ক। আপনার এমুলেটরে অ্যাপটি চালানোর জন্য, এই পদক্ষেপগুলি অনুসরণ করুন:
- অ্যান্ড্রয়েড স্টুডিওতে, রান > রান অ্যাপ নির্বাচন করুন বা রান ক্লিক করুন
টুলবারে
- ডিপ্লয়মেন্ট টার্গেট নির্বাচন করুন ডায়ালগে, একটি ডিভাইস নির্বাচন করুন এবং ঠিক আছে ক্লিক করুন। প্রস্তাবিত OS সংস্করণটি Android 10 (API স্তর 30) বা উচ্চতর, যদিও অ্যাপ অ্যাকশনগুলি Android 5 (API স্তর 21) তে ফিরে আসা ডিভাইসগুলিতে কাজ করে৷
- সহকারী সেট আপ করতে এবং এটি কাজ করে কিনা তা যাচাই করতে হোম বোতামে দীর্ঘক্ষণ চাপ দিন। আপনার ডিভাইসে অ্যাসিস্ট্যান্ট-এ সাইন-ইন করতে হবে, যদি আপনি ইতিমধ্যে না করে থাকেন।
অ্যান্ড্রয়েড ভার্চুয়াল ডিভাইস সম্পর্কে আরও তথ্যের জন্য, ভার্চুয়াল ডিভাইস তৈরি করুন এবং পরিচালনা করুন দেখুন।
সংক্ষিপ্তভাবে অ্যাপটি কী করতে পারে তা দেখতে দেখুন। প্লাস আইকনে আলতো চাপলে একটি নতুন টাস্ক আইটেম তৈরি হয় এবং উপরের ডানদিকের মেনু আইটেমগুলি আপনাকে সমাপ্তির স্থিতি দ্বারা টাস্ক আইটেমগুলি অনুসন্ধান এবং ফিল্টার করতে দেয়৷
4. একটি শর্টকাট রিপোজিটরি ক্লাস তৈরি করুন
আমাদের নমুনা অ্যাপের বেশ কিছু ক্লাস ডায়নামিক শর্টকাট পুশ এবং পরিচালনা করতে ShortcutManagerCompat
API-কে কল করবে। কোডের অপ্রয়োজনীয়তা কমাতে, আপনি আপনার প্রকল্পের ক্লাসগুলিকে সহজে গতিশীল শর্টকাট পরিচালনা করতে সক্ষম করার জন্য একটি সংগ্রহস্থল বাস্তবায়ন করবেন।
সংগ্রহস্থল ডিজাইন প্যাটার্ন শর্টকাট পরিচালনার জন্য একটি পরিষ্কার API প্রদান করে। একটি সংগ্রহস্থলের সুবিধা হল অন্তর্নিহিত API-এর বিবরণ একটি ন্যূনতম API-এর পিছনে অভিন্নভাবে বিমূর্ত করা হয়। এই পদক্ষেপগুলি অনুসরণ করে সংগ্রহস্থলটি বাস্তবায়ন করুন:
-
ShortcutManagerCompat
API বিমূর্ত করতে একটিShortcutsRepository
ক্লাস তৈরি করুন। - অ্যাপের পরিষেবা লোকেটারে
ShortcutsRepository
পদ্ধতি যোগ করুন। - মূল অ্যাপ্লিকেশনে
ShortcutRepository
পরিষেবা নিবন্ধন করুন।
সংগ্রহস্থল তৈরি করুন
com.example.android.architecture.blueprints.todoapp.data.source
প্যাকেজে ShortcutsRepository
নামে একটি নতুন Kotlin ক্লাস তৈরি করুন। আপনি app/src/main/java
ফোল্ডারে সংগঠিত এই প্যাকেজটি খুঁজে পেতে পারেন। আমাদের কোডল্যাব ব্যবহারের ক্ষেত্রে একটি ন্যূনতম সেট প্রদান করে এমন একটি ইন্টারফেস বাস্তবায়ন করতে আপনি এই ক্লাসটি ব্যবহার করবেন।
চিত্র 2. অ্যান্ড্রয়েড স্টুডিও প্রজেক্ট ফাইল উইন্ডো শর্টকাট রিপোজিটরি ক্লাসের অবস্থান প্রদর্শন করছে।
নতুন ক্লাসে নিম্নলিখিত কোড পেস্ট করুন:
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
API কল করতে 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))
}
পূর্ববর্তী কোড নমুনায় আমরা API এ appContext
পাস করেছি। এটি একটি অ্যাপ্লিকেশন প্রসঙ্গ ধারণ করা একটি শ্রেণীর সম্পত্তি। মেমরি লিক এড়াতে একটি অ্যাপ্লিকেশন প্রসঙ্গ (একটি অ্যাক্টিভিটি কনটেক্সট এর বিপরীতে) ব্যবহার করা গুরুত্বপূর্ণ, যেহেতু প্রসঙ্গটি হোস্ট অ্যাক্টিভিটি লাইফসাইকেলের চেয়ে বেশি সময় ধরে রাখা যেতে পারে।
উপরন্তু, API এর প্রয়োজন যে আমরা টাস্ক অবজেক্টের জন্য একটি ShortcutInfoCompat
অবজেক্ট পাস করি। পূর্ববর্তী কোড নমুনায় আমরা createShortcutCompat
প্রাইভেট পদ্ধতিতে কল করে এটি সম্পন্ন করি, যা আমরা একটি ShortcutInfoCompat
অবজেক্ট তৈরি করতে এবং ফেরত দিতে আপডেট করব। এটি সম্পন্ন করতে, নিম্নলিখিত কোড সহ createShortcutCompat
stub আপডেট করুন:
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
ক্লাস তৈরি করে, পরবর্তী ধাপ হল এই ক্লাসের তাত্ক্ষণিক অবজেক্টগুলি অ্যাপের বাকি অংশে উপলব্ধ করা। এই অ্যাপটি পরিষেবা লোকেটার প্যাটার্ন প্রয়োগ করে শ্রেণি নির্ভরতা পরিচালনা করে। অ্যান্ড্রয়েড স্টুডিওতে ক্লাস ব্রাউজার ব্যবহার করে নেভিগেট > ক্লাসে গিয়ে "সার্ভিসলোকেটার" টাইপ করে পরিষেবা লোকেটার ক্লাস খুলুন। আপনার IDE তে এটি খুলতে ফলস্বরূপ কোটলিন ফাইলটিতে ক্লিক করুন।
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
পরিষেবা নিবন্ধন করা। অ্যান্ড্রয়েড স্টুডিওতে, 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-এর সাথে আবদ্ধ থাকবে প্রতিবার যখন কোনও ব্যবহারকারী একটি নতুন তৈরি করবে টাস্ক এটি সহকারীকে ব্যবহারকারীদের তাদের অনুরোধ করা টাস্ক আইটেমটিতে সরাসরি লঞ্চ করতে সক্ষম করে যখন তারা BII ট্রিগার করে এমন কিছু জিজ্ঞাসা করে, " Hey Google, SampleApp-এ আমার মুদির তালিকা খুলুন। "
আপনি এই পদক্ষেপগুলি সম্পূর্ণ করে নমুনা অ্যাপে এই কার্যকারিতা সক্ষম করুন:
-
AddEditTaskViewModel
ক্লাসেShortcutsRepository
পরিষেবা আমদানি করা, টাস্ক লিস্ট অবজেক্ট পরিচালনার জন্য দায়ী। - ব্যবহারকারী যখন একটি নতুন টাস্ক তৈরি করে তখন একটি গতিশীল শর্টকাট পুশ করা।
শর্টকাট রিপোজিটরি আমদানি করুন
আমাদের প্রথমে AddEditTaskViewModel
এ ShortcutsRepository
পরিষেবা উপলব্ধ করতে হবে। এটি সম্পন্ন করতে, পরিষেবাটি ViewModelFactory
এ আমদানি করুন, যে ফ্যাক্টরি ক্লাসটি অ্যাপটি AddEditTaskViewModel
সহ ViewModel অবজেক্টগুলিকে ইনস্ট্যান্ট করতে ব্যবহার করে।
অ্যান্ড্রয়েড স্টুডিওতে ক্লাস ব্রাউজার খুলুন নেভিগেট > ক্লাসে গিয়ে এবং "ভিউমডেলফ্যাক্টরি" টাইপ করে। আপনার 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
পাস করুন। নেভিগেট > ফাইলে গিয়ে "FragmentExt.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
ক্লাস, প্রতিবার ব্যবহারকারী যখন একটি নতুন নোট তৈরি করে তখন একটি গতিশীল শর্টকাট পুশ করতে।
অ্যান্ড্রয়েড স্টুডিওতে, ক্লাস ব্রাউজার খুলুন এবং "AddEditTaskViewModel" টাইপ করুন। আপনার 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 সহকারী অ্যাপ ব্যবহার করে এটি পরিদর্শন করুন।
একটি পূর্বরূপ তৈরি করুন
Google অ্যাসিস্ট্যান্ট প্লাগইন ব্যবহার করে একটি প্রিভিউ তৈরি করা আপনার ডায়নামিক শর্টকাটগুলিকে আপনার টেস্ট ডিভাইসে অ্যাসিস্ট্যান্টে দেখাতে সক্ষম করে।
পরীক্ষা প্লাগইন ইনস্টল করুন
আপনার যদি ইতিমধ্যেই Google অ্যাসিস্ট্যান্ট প্লাগইন না থাকে তবে Android স্টুডিওতে এই পদক্ষেপগুলি অনুসরণ করে এটি ইনস্টল করুন:
- **ফাইল > সেটিংসে যান (Android Studio > MacOS-এ পছন্দ)।
- প্লাগইন বিভাগে, মার্কেটপ্লেসে যান এবং "গুগল সহকারী" অনুসন্ধান করুন।
- আপনি যদি মার্কেটপ্লেসে প্লাগইনটি খুঁজে না পান তবে ম্যানুয়ালি প্লাগইনটি ডাউনলোড করুন এবং ডিস্ক থেকে প্লাগইন ইনস্টল করুন এর নির্দেশাবলী অনুসরণ করুন।
- টুলটি ইনস্টল করুন এবং অ্যান্ড্রয়েড স্টুডিও পুনরায় চালু করুন।
প্রিভিউ তৈরি করুন
অ্যান্ড্রয়েড স্টুডিওতে এই পদক্ষেপগুলি অনুসরণ করে একটি পূর্বরূপ তৈরি করুন:
- টুলস > গুগল অ্যাসিস্ট্যান্ট > " অ্যাপ অ্যাকশন টেস্ট টুল "-এ ক্লিক করুন।
- অ্যাপের নাম বাক্সে, "টুডো তালিকা" এর মতো একটি নাম সংজ্ঞায়িত করুন।
- পূর্বরূপ তৈরি করুন ক্লিক করুন। জিজ্ঞাসা করা হলে, অ্যাপ অ্যাকশন নীতি এবং পরিষেবার শর্তাবলী পর্যালোচনা করুন এবং স্বীকার করুন।
চিত্র 3। অ্যাপ অ্যাকশন টেস্ট টুল প্রিভিউ তৈরির ফলক।
পরীক্ষার সময়, আপনি অ্যাসিস্ট্যান্টের কাছে যে ডায়নামিক শর্টকাটগুলি পুশ করবেন তা অ্যাসিস্ট্যান্ট-এ দেখা যাবে প্রিভিউয়ের জন্য আপনার দেওয়া অ্যাপের নাম অনুসারে সাজানো।
ধাক্কা এবং একটি শর্টকাট পরিদর্শন
আপনার পরীক্ষার ডিভাইসে নমুনা অ্যাপটি পুনরায় চালু করুন এবং নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:
- "স্টার্ট কোডল্যাব" শিরোনামের সাথে একটি নতুন টাস্ক তৈরি করুন
- গুগল অ্যাসিস্ট্যান্ট অ্যাপ খুলুন এবং বলুন বা টাইপ করুন: "আমার শর্টকাটগুলি।"
- এক্সপ্লোর ট্যাবে আলতো চাপুন। আপনি নমুনা শর্টকাট দেখতে হবে.
- এটিকে আহ্বান করতে শর্টকাটটিতে আলতো চাপুন৷ আপনি ফিল্টার বক্সে শর্টকাটের নাম সহ অ্যাপ লঞ্চ দেখতে পাবেন, যাতে অনুরোধ করা টাস্ক আইটেমটি খুঁজে পাওয়া সহজ হয়।
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)
}
}
অ্যাপটি পুনরায় চালু করে এবং এই পদক্ষেপগুলি অনুসরণ করে আপনার কোড পরীক্ষা করুন:
- আপনার বিদ্যমান টাস্ক আইটেমের শিরোনামটিকে "কোডল্যাব শেষ করুন" এ পুনঃনামকরণ করুন।
- "Hey Google, my shortcuts" বলে Google Assistant খুলুন।
- এক্সপ্লোর ট্যাবে আলতো চাপুন। আপনার পরীক্ষার শর্টকাটের জন্য আপনাকে একটি আপডেট করা শর্ট লেবেল দেখতে হবে।
একটি শর্টকাট সরান
আমাদের নমুনা অ্যাপ্লিকেশন শর্টকাট মুছে ফেলা উচিত যখনই কোনো ব্যবহারকারী একটি টাস্ক মুছে দেয়. নমুনা অ্যাপে, টাস্ক ডিলিট করার লজিক TaskDetailViewModel
ক্লাসে থাকে। আমরা এই ক্লাসটি আপডেট করার আগে, TaskDetailViewModel
এ shortcutsRepository
পাস করতে আমাদের আবার 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() {
...
}
অবশেষে, shortcutsRepository
কল করার জন্য deleteTask()
ফাংশনটি পরিবর্তন করুন যখনই একটি সংশ্লিষ্ট taskId
সহ একটি টাস্ক মুছে ফেলা হয় তখন তার আইডির উপর ভিত্তি করে একটি শর্টকাট মুছে ফেলুন:
TaskDetailViewModel.kt
fun deleteTask() = viewModelScope.launch {
_taskId.value?.let {
//...
shortcutsRepository.removeShortcutsById(listOf(it))
}
}
আপনার কোড পরীক্ষা করতে, অ্যাপটি পুনরায় চালু করুন এবং এই পদক্ষেপগুলি অনুসরণ করুন:
- আপনার পরীক্ষা টাস্ক মুছুন.
- আপনার বিদ্যমান টাস্ক আইটেমের শিরোনামটিকে "কোডল্যাব শেষ করুন" এ পুনঃনামকরণ করুন।
- "Hey Google, my shortcuts" বলে Google Assistant খুলুন।
- এক্সপ্লোর ট্যাবে আলতো চাপুন। নিশ্চিত করুন যে আপনার পরীক্ষার শর্টকাট আর দেখা যাচ্ছে না।
7. পরবর্তী পদক্ষেপ
অভিনন্দন! আপনাকে ধন্যবাদ, আমাদের নমুনা অ্যাপের ব্যবহারকারীরা সহকারীকে জিজ্ঞাসা করার মাধ্যমে সহজেই তাদের তৈরি করা নোটগুলিতে ফিরে যেতে পারে যেমন, "Hey Google, ExampleApp-এ আমার মুদিখানার তালিকা খুলুন"। শর্টকাটগুলি ব্যবহারকারীদের জন্য আপনার অ্যাপ্লিকেশানে প্রায়শই ব্যবহৃত অ্যাকশনগুলিকে পুনরায় প্লে করা সহজ করে ব্যবহারকারীর গভীর ব্যস্ততাকে উত্সাহিত করে৷
আমরা কভার করেছি কি
এই কোডল্যাবে, আপনি শিখেছেন কিভাবে:
- একটি অ্যাপে গতিশীল শর্টকাট পুশ করার জন্য ব্যবহারের ক্ষেত্রে চিহ্নিত করুন।
- সংগ্রহস্থল, নির্ভরতা ইনজেকশন এবং পরিষেবা লোকেটার ডিজাইন প্যাটার্ন ব্যবহার করে কোড জটিলতা হ্রাস করুন।
- ব্যবহারকারীর তৈরি অ্যাপ সামগ্রীতে ভয়েস-সক্ষম গতিশীল শর্টকাটগুলি পুশ করুন৷
- বিদ্যমান শর্টকাটগুলি আপডেট করুন এবং সরান৷
এরপর কি
এখান থেকে, আপনি আপনার টাস্ক লিস্ট অ্যাপে আরও পরিমার্জন করার চেষ্টা করতে পারেন। সমাপ্ত প্রকল্পের উল্লেখ করতে, গিটহাবের রেপো -কোডেল্যাব-সম্পূর্ণ শাখাটি দেখুন।
অ্যাপ অ্যাকশনগুলির সাথে এই অ্যাপটি প্রসারিত করার বিষয়ে আরও শেখার জন্য এখানে কিছু পরামর্শ রয়েছে:
- আপনার অ্যাপ অ্যাকশনের পারফরম্যান্স কীভাবে ট্র্যাক করবেন তা শিখতে Firebase-এর জন্য Google Analytics-এর করণীয় তালিকার নমুনা দেখুন।
- অ্যাসিস্ট্যান্টে আপনার অ্যাপগুলিকে প্রসারিত করার আরও উপায় আবিষ্কার করতে অ্যাপ অ্যাকশন বিল্ট-ইন ইন্টেন্ট রেফারেন্সে যান।
আপনার অ্যাকশন অন Google যাত্রা চালিয়ে যেতে, এই সম্পদগুলি অন্বেষণ করুন:
- actions.google.com : অ্যাকশন অন গুগলের জন্য অফিসিয়াল ডকুমেন্টেশন সাইট।
- অ্যাপ অ্যাকশনের নমুনা সূচক : অ্যাপ অ্যাকশনের ক্ষমতা অন্বেষণের জন্য নমুনা অ্যাপ এবং কোড।
- Google GitHub রেপোতে অ্যাকশন : নমুনা কোড এবং লাইব্রেরি।
- r/GoogleAssistantDev : Google সহকারীর সাথে কাজ করা বিকাশকারীদের জন্য অফিসিয়াল Reddit সম্প্রদায়।
আমাদের লেটেস্ট ঘোষণার সাথে যুক্ত থাকতে Twitter @ActionsOnGoogle- এ আমাদের অনুসরণ করুন, এবং আপনি যা তৈরি করেছেন তা শেয়ার করতে #appActions- এ টুইট করুন!
প্রতিক্রিয়া সমীক্ষা
অবশেষে, এই কোডল্যাবের সাথে আপনার অভিজ্ঞতা সম্পর্কে প্রতিক্রিয়া জানাতে অনুগ্রহ করে এই সমীক্ষাটি পূরণ করুন।