অ্যাপ অ্যাকশনের সাথে Google অ্যাসিস্ট্যান্টে ডায়নামিক শর্টকাট প্রসারিত করুন

1. ওভারভিউ

পূর্ববর্তী কোডল্যাবে , আপনি একটি নমুনা অ্যাপে সাধারণভাবে ব্যবহৃত বিল্ট-ইন ইনটেন্ট (BII) প্রয়োগ করতে স্ট্যাটিক শর্টকাট ব্যবহার করেছেন। অ্যান্ড্রয়েড ডেভেলপাররা অ্যাপ অ্যাকশন ব্যবহার করে অ্যাপের কার্যকারিতা গুগল অ্যাসিস্ট্যান্টে প্রসারিত করতে।

স্ট্যাটিক শর্টকাটগুলি একটি অ্যাপের সাথে বান্ডিল করা হয় এবং শুধুমাত্র অ্যাপের নতুন সংস্করণ প্রকাশ করে আপডেট করা যায়। একটি অ্যাপে গতিশীল উপাদানগুলির জন্য ভয়েস কার্যকারিতা সক্ষম করা, যেমন ব্যবহারকারী-উত্পাদিত সামগ্রী, ডায়নামিক শর্টকাট ব্যবহার করে অর্জন করা হয়৷ একটি টাস্ক ট্র্যাকিং অ্যাপে একটি নতুন নোট তৈরি করার মতো প্রাসঙ্গিক ক্রিয়া সম্পাদন করার পরে অ্যাপগুলি গতিশীল শর্টকাটগুলি পুশ করে৷ অ্যাপ অ্যাকশনের সাহায্যে, আপনি ভয়েসের জন্য এই শর্টকাটগুলিকে একটি BII-তে আবদ্ধ করে সক্ষম করেন, ব্যবহারকারীদের "Hey Google, ExampleApp-এ আমার গ্রোসারি তালিকা খুলুন" এই ধরনের কথা বলে সহকারী থেকে তাদের সামগ্রী অ্যাক্সেস করতে সক্ষম করে।

তিনটি প্রগতিশীল স্ক্রীন Google অ্যাসিস্ট্যান্টকে একটি গতিশীল শর্টকাট চালু করছে।

চিত্র 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 স্টুডিওতে এটি খুলতে এই পদক্ষেপগুলি অনুসরণ করুন:

  1. অ্যান্ড্রয়েড স্টুডিওতে স্বাগতম ডায়ালগে, ইমপোর্ট প্রোজেক্টে ক্লিক করুন।
  2. ফোল্ডারটি নির্বাচন করুন যেখানে আপনি সংগ্রহস্থল ক্লোন করেছেন।

বিকল্পভাবে, আপনি গিথুব রেপোর 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'
   ...
}

আপনার ডিভাইসে অ্যাপটি পরীক্ষা করুন

অ্যাপটিতে আরও পরিবর্তন করার আগে, নমুনা অ্যাপটি কী করতে পারে তার একটি ধারণা পেতে সহায়ক। আপনার এমুলেটরে অ্যাপটি চালানোর জন্য, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. অ্যান্ড্রয়েড স্টুডিওতে, রান > রান অ্যাপ নির্বাচন করুন বা রান ক্লিক করুন অ্যান্ড্রয়েড স্টুডিওতে অ্যাপ আইকন চালান টুলবারে
  2. ডিপ্লয়মেন্ট টার্গেট নির্বাচন করুন ডায়ালগে, একটি ডিভাইস নির্বাচন করুন এবং ঠিক আছে ক্লিক করুন। প্রস্তাবিত OS সংস্করণটি Android 10 (API স্তর 30) বা উচ্চতর, যদিও অ্যাপ অ্যাকশনগুলি Android 5 (API স্তর 21) তে ফিরে আসা ডিভাইসগুলিতে কাজ করে৷
  3. সহকারী সেট আপ করতে এবং এটি কাজ করে কিনা তা যাচাই করতে হোম বোতামে দীর্ঘক্ষণ চাপ দিন। আপনার ডিভাইসে অ্যাসিস্ট্যান্ট-এ সাইন-ইন করতে হবে, যদি আপনি ইতিমধ্যে না করে থাকেন।

অ্যান্ড্রয়েড ভার্চুয়াল ডিভাইস সম্পর্কে আরও তথ্যের জন্য, ভার্চুয়াল ডিভাইস তৈরি করুন এবং পরিচালনা করুন দেখুন।

সংক্ষিপ্তভাবে অ্যাপটি কী করতে পারে তা দেখতে দেখুন। প্লাস আইকনে আলতো চাপলে একটি নতুন টাস্ক আইটেম তৈরি হয় এবং উপরের ডানদিকের মেনু আইটেমগুলি আপনাকে সমাপ্তির স্থিতি দ্বারা টাস্ক আইটেমগুলি অনুসন্ধান এবং ফিল্টার করতে দেয়৷

4. একটি শর্টকাট রিপোজিটরি ক্লাস তৈরি করুন

আমাদের নমুনা অ্যাপের বেশ কিছু ক্লাস ডায়নামিক শর্টকাট পুশ এবং পরিচালনা করতে ShortcutManagerCompat API-কে কল করবে। কোডের অপ্রয়োজনীয়তা কমাতে, আপনি আপনার প্রকল্পের ক্লাসগুলিকে সহজে গতিশীল শর্টকাট পরিচালনা করতে সক্ষম করার জন্য একটি সংগ্রহস্থল বাস্তবায়ন করবেন।

সংগ্রহস্থল ডিজাইন প্যাটার্ন শর্টকাট পরিচালনার জন্য একটি পরিষ্কার API প্রদান করে। একটি সংগ্রহস্থলের সুবিধা হল অন্তর্নিহিত API-এর বিবরণ একটি ন্যূনতম API-এর পিছনে অভিন্নভাবে বিমূর্ত করা হয়। এই পদক্ষেপগুলি অনুসরণ করে সংগ্রহস্থলটি বাস্তবায়ন করুন:

  1. ShortcutManagerCompat API বিমূর্ত করতে একটি ShortcutsRepository ক্লাস তৈরি করুন।
  2. অ্যাপের পরিষেবা লোকেটারে ShortcutsRepository পদ্ধতি যোগ করুন।
  3. মূল অ্যাপ্লিকেশনে 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-এ আমার মুদির তালিকা খুলুন। "

আপনি এই পদক্ষেপগুলি সম্পূর্ণ করে নমুনা অ্যাপে এই কার্যকারিতা সক্ষম করুন:

  1. AddEditTaskViewModel ক্লাসে ShortcutsRepository পরিষেবা আমদানি করা, টাস্ক লিস্ট অবজেক্ট পরিচালনার জন্য দায়ী।
  2. ব্যবহারকারী যখন একটি নতুন টাস্ক তৈরি করে তখন একটি গতিশীল শর্টকাট পুশ করা।

শর্টকাট রিপোজিটরি আমদানি করুন

আমাদের প্রথমে AddEditTaskViewModelShortcutsRepository পরিষেবা উপলব্ধ করতে হবে। এটি সম্পন্ন করতে, পরিষেবাটি 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 স্টুডিওতে এই পদক্ষেপগুলি অনুসরণ করে এটি ইনস্টল করুন:

  1. **ফাইল > সেটিংসে যান (Android Studio > MacOS-এ পছন্দ)।
  2. প্লাগইন বিভাগে, মার্কেটপ্লেসে যান এবং "গুগল সহকারী" অনুসন্ধান করুন।
  3. টুলটি ইনস্টল করুন এবং অ্যান্ড্রয়েড স্টুডিও পুনরায় চালু করুন।

প্রিভিউ তৈরি করুন

অ্যান্ড্রয়েড স্টুডিওতে এই পদক্ষেপগুলি অনুসরণ করে একটি পূর্বরূপ তৈরি করুন:

  1. টুলস > গুগল অ্যাসিস্ট্যান্ট > " অ্যাপ অ্যাকশন টেস্ট টুল "-এ ক্লিক করুন।
  2. অ্যাপের নাম বাক্সে, "টুডো তালিকা" এর মতো একটি নাম সংজ্ঞায়িত করুন।
  3. পূর্বরূপ তৈরি করুন ক্লিক করুন। জিজ্ঞাসা করা হলে, অ্যাপ অ্যাকশন নীতি এবং পরিষেবার শর্তাবলী পর্যালোচনা করুন এবং স্বীকার করুন।

অ্যাপ অ্যাকশন টেস্ট টুল প্রিভিউ তৈরির ফলক।

চিত্র 3। অ্যাপ অ্যাকশন টেস্ট টুল প্রিভিউ তৈরির ফলক।

পরীক্ষার সময়, আপনি অ্যাসিস্ট্যান্টের কাছে যে ডায়নামিক শর্টকাটগুলি পুশ করবেন তা অ্যাসিস্ট্যান্ট-এ দেখা যাবে প্রিভিউয়ের জন্য আপনার দেওয়া অ্যাপের নাম অনুসারে সাজানো।

ধাক্কা এবং একটি শর্টকাট পরিদর্শন

আপনার পরীক্ষার ডিভাইসে নমুনা অ্যাপটি পুনরায় চালু করুন এবং নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:

  1. "স্টার্ট কোডল্যাব" শিরোনামের সাথে একটি নতুন টাস্ক তৈরি করুন
  2. গুগল অ্যাসিস্ট্যান্ট অ্যাপ খুলুন এবং বলুন বা টাইপ করুন: "আমার শর্টকাটগুলি।"
  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. "Hey Google, my shortcuts" বলে Google Assistant খুলুন।
  3. এক্সপ্লোর ট্যাবে আলতো চাপুন। আপনার পরীক্ষার শর্টকাটের জন্য আপনাকে একটি আপডেট করা শর্ট লেবেল দেখতে হবে।

একটি শর্টকাট সরান

আমাদের নমুনা অ্যাপ্লিকেশন শর্টকাট মুছে ফেলা উচিত যখনই কোনো ব্যবহারকারী একটি টাস্ক মুছে দেয়. নমুনা অ্যাপে, টাস্ক ডিলিট করার লজিক TaskDetailViewModel ক্লাসে থাকে। আমরা এই ক্লাসটি আপডেট করার আগে, TaskDetailViewModelshortcutsRepository পাস করতে আমাদের আবার 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))
   }
}

আপনার কোড পরীক্ষা করতে, অ্যাপটি পুনরায় চালু করুন এবং এই পদক্ষেপগুলি অনুসরণ করুন:

  1. আপনার পরীক্ষা টাস্ক মুছুন.
  2. আপনার বিদ্যমান টাস্ক আইটেমের শিরোনামটিকে "কোডল্যাব শেষ করুন" এ পুনঃনামকরণ করুন।
  3. "Hey Google, my shortcuts" বলে Google Assistant খুলুন।
  4. এক্সপ্লোর ট্যাবে আলতো চাপুন। নিশ্চিত করুন যে আপনার পরীক্ষার শর্টকাট আর দেখা যাচ্ছে না।

7. পরবর্তী পদক্ষেপ

অভিনন্দন! আপনাকে ধন্যবাদ, আমাদের নমুনা অ্যাপের ব্যবহারকারীরা সহকারীকে জিজ্ঞাসা করার মাধ্যমে সহজেই তাদের তৈরি করা নোটগুলিতে ফিরে যেতে পারে যেমন, "Hey Google, ExampleApp-এ আমার মুদিখানার তালিকা খুলুন"। শর্টকাটগুলি ব্যবহারকারীদের জন্য আপনার অ্যাপ্লিকেশানে প্রায়শই ব্যবহৃত অ্যাকশনগুলিকে পুনরায় প্লে করা সহজ করে ব্যবহারকারীর গভীর ব্যস্ততাকে উত্সাহিত করে৷

আমরা কভার করেছি কি

এই কোডল্যাবে, আপনি শিখেছেন কিভাবে:

  • একটি অ্যাপে গতিশীল শর্টকাট পুশ করার জন্য ব্যবহারের ক্ষেত্রে চিহ্নিত করুন।
  • সংগ্রহস্থল, নির্ভরতা ইনজেকশন এবং পরিষেবা লোকেটার ডিজাইন প্যাটার্ন ব্যবহার করে কোড জটিলতা হ্রাস করুন।
  • ব্যবহারকারীর তৈরি অ্যাপ সামগ্রীতে ভয়েস-সক্ষম গতিশীল শর্টকাটগুলি পুশ করুন৷
  • বিদ্যমান শর্টকাটগুলি আপডেট করুন এবং সরান৷

এরপর কি

এখান থেকে, আপনি আপনার টাস্ক লিস্ট অ্যাপে আরও পরিমার্জন করার চেষ্টা করতে পারেন। সমাপ্ত প্রকল্পের উল্লেখ করতে, গিটহাবের রেপো -কোডেল্যাব-সম্পূর্ণ শাখাটি দেখুন।

অ্যাপ অ্যাকশনগুলির সাথে এই অ্যাপটি প্রসারিত করার বিষয়ে আরও শেখার জন্য এখানে কিছু পরামর্শ রয়েছে:

আপনার অ্যাকশন অন Google যাত্রা চালিয়ে যেতে, এই সম্পদগুলি অন্বেষণ করুন:

আমাদের লেটেস্ট ঘোষণার সাথে যুক্ত থাকতে Twitter @ActionsOnGoogle- এ আমাদের অনুসরণ করুন, এবং আপনি যা তৈরি করেছেন তা শেয়ার করতে #appActions- এ টুইট করুন!

প্রতিক্রিয়া সমীক্ষা

অবশেষে, এই কোডল্যাবের সাথে আপনার অভিজ্ঞতা সম্পর্কে প্রতিক্রিয়া জানাতে অনুগ্রহ করে এই সমীক্ষাটি পূরণ করুন।