Firebase এবং Jetpack Compose দিয়ে একটি Android অ্যাপ তৈরি করুন

1. ভূমিকা

শেষ আপডেট: ২০২২-১১-১৬

ফায়ারবেস এবং জেটপ্যাক কম্পোজ দিয়ে একটি অ্যান্ড্রয়েড অ্যাপ তৈরি করা

এই কোডল্যাবে, আপনি মেক ইট সো নামে একটি অ্যান্ড্রয়েড অ্যাপ তৈরি করবেন। এই অ্যাপটির UI সম্পূর্ণরূপে Jetpack Compose দিয়ে তৈরি, যা নেটিভ UI তৈরির জন্য অ্যান্ড্রয়েডের আধুনিক টুলকিট - এটি স্বজ্ঞাত এবং .xml ফাইল লেখা এবং অ্যাক্টিভিটি, ফ্র্যাগমেন্ট বা ভিউতে আবদ্ধ করার চেয়ে কম কোডের প্রয়োজন।

Firebase এবং Jetpack Compose একসাথে কতটা ভালোভাবে কাজ করে তা বোঝার প্রথম ধাপ হল আধুনিক অ্যান্ড্রয়েড আর্কিটেকচার বোঝা। একটি ভালো আর্কিটেকচার সিস্টেমটিকে বোঝা সহজ, বিকাশ করা সহজ এবং রক্ষণাবেক্ষণ করা সহজ করে তোলে, কারণ এটি কম্পোনেন্টগুলি কীভাবে সংগঠিত এবং একে অপরের সাথে যোগাযোগ করে তা খুব স্পষ্ট করে তোলে। অ্যান্ড্রয়েড জগতে, প্রস্তাবিত আর্কিটেকচারকে Model - View - ViewModel বলা হয়। Model সেই স্তরকে প্রতিনিধিত্ব করে যা অ্যাপ্লিকেশনের ডেটা অ্যাক্সেস করে। View হল UI স্তর এবং ব্যবসায়িক লজিক সম্পর্কে কিছুই জানা উচিত নয়। এবং ViewModel হল যেখানে ব্যবসায়িক লজিক প্রয়োগ করা হয়, যার জন্য কখনও কখনও ViewModel কে মডেল লেয়ারটি কল করতে হয়।

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

তুমি কী তৈরি করবে

মেক ইট সো হল একটি সহজ করণীয় তালিকা অ্যাপ্লিকেশন যা ব্যবহারকারীকে কাজগুলি যোগ এবং সম্পাদনা করতে, পতাকা, অগ্রাধিকার এবং নির্ধারিত তারিখ যোগ করতে এবং কাজগুলি সম্পন্ন হিসাবে চিহ্নিত করতে দেয়। নীচের চিত্রগুলিতে এই অ্যাপ্লিকেশনটির দুটি প্রধান পৃষ্ঠা দেখানো হয়েছে: টাস্ক তৈরির পৃষ্ঠা এবং তৈরি করা কাজের তালিকা সহ প্রধান পৃষ্ঠা।

এটিকে তাই করুন টাস্ক স্ক্রিন যোগ করুনহোম স্ক্রিনে এটিকে তাই করুন

আপনি এই অ্যাপটিতে অনুপস্থিত কিছু বৈশিষ্ট্য যুক্ত করবেন:

  • ইমেল এবং পাসওয়ার্ড দিয়ে ব্যবহারকারীদের প্রমাণীকরণ করুন
  • একটি Firestore সংগ্রহে একজন শ্রোতা যোগ করুন এবং UI কে পরিবর্তনের প্রতি প্রতিক্রিয়া জানাতে বাধ্য করুন
  • অ্যাপে নির্দিষ্ট কোডের কর্মক্ষমতা নিরীক্ষণ করতে কাস্টম ট্রেস যোগ করুন
  • রিমোট কনফিগ ব্যবহার করে একটি ফিচার টগল তৈরি করুন এবং এটি চালু করতে স্টেজড রোলআউট ব্যবহার করুন।

তুমি কি শিখবে

  • একটি আধুনিক অ্যান্ড্রয়েড অ্যাপ্লিকেশনে ফায়ারবেস প্রমাণীকরণ, পারফরম্যান্স মনিটরিং, রিমোট কনফিগ এবং ক্লাউড ফায়ারস্টোর কীভাবে ব্যবহার করবেন
  • কিভাবে Firebase API গুলিকে MVVM আর্কিটেকচারে ফিট করা যায়
  • একটি কম্পোজ UI-তে Firebase API-এর মাধ্যমে করা পরিবর্তনগুলি কীভাবে প্রতিফলিত করবেন

তোমার যা লাগবে

২. নমুনা অ্যাপটি পান এবং Firebase সেট আপ করুন

নমুনা অ্যাপের কোডটি পান

কমান্ড লাইন থেকে GitHub রিপোজিটরি ক্লোন করুন:

git clone https://github.com/FirebaseExtended/make-it-so-android.git

একটি ফায়ারবেস প্রকল্প তৈরি করুন

  1. আপনার গুগল অ্যাকাউন্ট ব্যবহার করে ফায়ারবেস কনসোলে সাইন ইন করুন।
  2. একটি নতুন প্রকল্প তৈরি করতে বোতামটি ক্লিক করুন, এবং তারপর একটি প্রকল্পের নাম লিখুন (উদাহরণস্বরূপ, Compose Firebase codelab )।
  3. চালিয়ে যান ক্লিক করুন।
  4. যদি অনুরোধ করা হয়, তাহলে Firebase শর্তাবলী পর্যালোচনা করুন এবং গ্রহণ করুন, এবং তারপর Continue এ ক্লিক করুন।
  5. (ঐচ্ছিক) Firebase কনসোলে ("Gemini in Firebase" নামে পরিচিত) AI সহায়তা সক্ষম করুন।
  6. এই কোডল্যাবের জন্য, আপনাকে রিমোট কনফিগের সাথে উন্নত টার্গেটিং বিকল্পগুলি ব্যবহার করতে Google Analytics-এর প্রয়োজন হবে, তাই Google Analytics বিকল্পের জন্য টগল চালু রাখুন। Google Analytics সেট আপ করতে অন-স্ক্রিন নির্দেশাবলী অনুসরণ করুন।
  7. Create project এ ক্লিক করুন, আপনার province করার জন্য অপেক্ষা করুন, এবং তারপর Continue এ ক্লিক করুন।

আপনার Firebase প্রকল্পে একটি Android অ্যাপ যোগ করুন

আপনার Firebase প্রকল্পে, আপনি বিভিন্ন অ্যাপ নিবন্ধন করতে পারেন: Android, iOS, Web, Flutter এবং Unity এর জন্য।

এখানে যেমনটা দেখছেন, অ্যান্ড্রয়েড অপশনটি বেছে নিন:

ফায়ারবেস প্রকল্পের ওভারভিউ

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

  1. প্যাকেজের নাম হিসেবে com.example.makeitso লিখুন এবং ঐচ্ছিকভাবে, একটি ডাকনাম লিখুন। এই কোডল্যাবের জন্য, আপনাকে ডিবাগ সাইনিং সার্টিফিকেট যোগ করার প্রয়োজন নেই।
  2. আপনার অ্যাপটি নিবন্ধন করতে এবং Firebase কনফিগারেশন ফাইলটি অ্যাক্সেস করতে Next এ ক্লিক করুন।
  3. আপনার কনফিগারেশন ফাইলটি ডাউনলোড করতে এবং make-it-so-android/app ডিরেক্টরিতে সংরক্ষণ করতে Download google-services.json এ ক্লিক করুন।
  4. Next এ ক্লিক করুন। যেহেতু Firebase SDK গুলি ইতিমধ্যেই নমুনা প্রকল্পের build.gradle ফাইলে অন্তর্ভুক্ত করা হয়েছে, তাই Next ধাপে যেতে Next এ ক্লিক করুন।
  5. শেষ করতে কনসোলে Continue এ ক্লিক করুন।

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

প্রমাণীকরণ সেট আপ করুন

প্রথমে, ব্যবহারকারীদের অ্যাপে লগ ইন করার জন্য প্রমাণীকরণ সক্ষম করা যাক:

  1. বিল্ড মেনু থেকে, প্রমাণীকরণ নির্বাচন করুন, এবং তারপর শুরু করুন ক্লিক করুন।
  2. সাইন-ইন পদ্ধতি কার্ড থেকে, ইমেল/পাসওয়ার্ড নির্বাচন করুন এবং এটি সক্রিয় করুন।
  3. এরপর, নতুন প্রদানকারী যোগ করুন এ ক্লিক করুন এবং Anonymous নির্বাচন করে সক্ষম করুন।

ক্লাউড ফায়ারস্টোর সেট আপ করুন

এরপর, Firestore সেট আপ করুন। আপনি Firestore ব্যবহার করে একজন সাইন-ইন করা ব্যবহারকারীর কাজগুলি সংরক্ষণ করবেন। প্রতিটি ব্যবহারকারী ডাটাবেসের একটি সংগ্রহের মধ্যে তাদের নিজস্ব নথি পাবেন।

  1. Firebase কনসোলের বাম প্যানেলে, Build প্রসারিত করুন এবং তারপর Firestore database নির্বাচন করুন।
  2. ডাটাবেস তৈরি করুন ক্লিক করুন।
  3. ডাটাবেস আইডি (default) এ সেট করে রাখুন।
  4. আপনার ডাটাবেসের জন্য একটি অবস্থান নির্বাচন করুন, তারপর পরবর্তী ক্লিক করুন।
    একটি আসল অ্যাপের জন্য, আপনাকে এমন একটি অবস্থান বেছে নিতে হবে যা আপনার ব্যবহারকারীদের কাছাকাছি।
  5. পরীক্ষা মোডে শুরু করুন ক্লিক করুন। নিরাপত্তা নিয়ম সম্পর্কে দাবিত্যাগ পড়ুন।
    এই বিভাগের পরবর্তী ধাপে, আপনার ডেটা সুরক্ষিত করার জন্য আপনি নিরাপত্তা নিয়ম যোগ করবেন। আপনার ডাটাবেসের জন্য নিরাপত্তা নিয়ম যোগ না করে কোনও অ্যাপ সর্বজনীনভাবে বিতরণ বা প্রকাশ করবেন না
  6. তৈরি করুন ক্লিক করুন।

আসুন ফায়ারস্টোর ডাটাবেসে শক্তিশালী নিরাপত্তা নিয়ম তৈরি করার জন্য একটু সময় নিই।

  1. ফায়ারস্টোর ড্যাশবোর্ড খুলুন এবং নিয়ম ট্যাবে যান।
  2. নিরাপত্তা নিয়মগুলি আপডেট করুন যাতে এটি দেখতে এরকম হয়:
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /tasks/{document} {
      allow create: if request.auth != null;
      allow read, update, delete: if request.auth != null
        && resource.data.userId == request.auth.uid
        && request.data.userId == resource.data.userId;
    }
  }
}

এই নিয়মগুলি মূলত বলে যে অ্যাপের যেকোনো সাইন-ইন করা ব্যবহারকারী যেকোনো সংগ্রহের মধ্যে নিজের জন্য একটি নথি তৈরি করতে পারবেন। তারপর, একবার তৈরি হয়ে গেলে, শুধুমাত্র সেই ব্যবহারকারী যিনি সেই নথিটি তৈরি করেছেন তিনিই সেই নথিটি দেখতে, আপডেট করতে বা মুছে ফেলতে পারবেন।

অ্যাপ্লিকেশনটি চালান

এখন আপনি অ্যাপ্লিকেশনটি চালানোর জন্য প্রস্তুত! অ্যান্ড্রয়েড স্টুডিওতে make-it-so-android/start ফোল্ডারটি খুলুন এবং অ্যাপটি চালান (এটি একটি অ্যান্ড্রয়েড এমুলেটর বা একটি আসল অ্যান্ড্রয়েড ডিভাইস ব্যবহার করে করা যেতে পারে)।

৩. ফায়ারবেস প্রমাণীকরণ

আপনি কোন বৈশিষ্ট্যটি যুক্ত করতে যাচ্ছেন?

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

কোড করার সময়!

ব্যবহারকারী যখনই একটি অ্যাকাউন্ট তৈরি করবেন, তখনই একটি ইমেল এবং পাসওয়ার্ড টাইপ করে, আপনাকে Firebase Authentication API-এর কাছে একটি ইমেল শংসাপত্র চাইতে হবে, তারপর নতুন শংসাপত্রটি বেনামী অ্যাকাউন্টের সাথে লিঙ্ক করতে হবে। Android Studio-তে AccountServiceImpl.kt ফাইলটি খুলুন এবং linkAccount ফাংশনটি আপডেট করুন যাতে এটি নিম্নলিখিতটির মতো দেখায়:

মডেল/পরিষেবা/ইমপ্ল/অ্যাকাউন্টসার্ভিসইমপ্ল.কেটি

override suspend fun linkAccount(email: String, password: String) {
    val credential = EmailAuthProvider.getCredential(email, password)
    auth.currentUser!!.linkWithCredential(credential).await()
}

এখন SignUpViewModel.kt খুলুন এবং onSignUpClick ফাংশনের launchCatching ব্লকের ভিতরে থাকা service linkAccount ফাংশনটি কল করুন:

স্ক্রিন/সাইন_আপ/সাইনআপভিউমডেল.কেটি

launchCatching {
    accountService.linkAccount(email, password)
    openAndPopUp(SETTINGS_SCREEN, SIGN_UP_SCREEN)
}

প্রথমে এটি প্রমাণীকরণের চেষ্টা করে, এবং যদি কলটি সফল হয়, তবে এটি পরবর্তী স্ক্রিনে ( SettingsScreen ) এগিয়ে যায়। যখন আপনি একটি launchCatching ব্লকের ভিতরে এই কলগুলি সম্পাদন করছেন, যদি প্রথম লাইনে কোনও ত্রুটি ঘটে, তাহলে ব্যতিক্রমটি ধরা হবে এবং পরিচালনা করা হবে, এবং দ্বিতীয় লাইনে পৌঁছানো যাবে না।

SettingsScreen আবার খোলার সাথে সাথেই, আপনাকে নিশ্চিত করতে হবে যে Sign in এবং Create account এর বিকল্পগুলি চলে গেছে, কারণ এখন ব্যবহারকারী ইতিমধ্যেই প্রমাণিত। এটি করার জন্য, SettingsViewModel কে বর্তমান ব্যবহারকারীর অবস্থা ( AccountService.kt এ উপলব্ধ) শোনাতে দিন, যাতে অ্যাকাউন্টটি বেনামী কিনা তা পরীক্ষা করা যায়। এটি করার জন্য, SettingsViewModel.ktuiState আপডেট করুন যাতে এটি নিম্নলিখিত মত দেখায়:

স্ক্রিন/সেটিংস/সেটিংসViewModel.kt

val uiState = accountService.currentUser.map {
    SettingsUiState(it.isAnonymous)
}

SettingsViewModel দ্বারা নির্গত অবস্থা সংগ্রহ করার জন্য আপনাকে SettingsScreen.ktuiState আপডেট করতে হবে:

স্ক্রিন/সেটিংস/সেটিংসস্ক্রিন.কেটি

val uiState by viewModel.uiState.collectAsState(
    initial = SettingsUiState(false)
)

এখন প্রতিবার ব্যবহারকারী পরিবর্তন করার সময়, SettingsScreen ব্যবহারকারীর নতুন প্রমাণীকরণ অবস্থা অনুসারে বিকল্পগুলি প্রদর্শনের জন্য নিজেকে পুনরায় কম্পোজ করবে।

পরীক্ষা করার সময়!

"Make it So" রান করুন এবং স্ক্রিনের উপরের ডানদিকের কোণায় গিয়ার আইকনে ক্লিক করে সেটিংসে যান। সেখান থেকে, "অ্যাকাউন্ট তৈরি করুন" বিকল্পে ক্লিক করুন:

সেটিংস স্ক্রিনে "এটা তাই করুন"তাই সাইন আপ স্ক্রিনে এটি তৈরি করুন

আপনার অ্যাকাউন্ট তৈরি করতে একটি বৈধ ইমেল এবং একটি শক্তিশালী পাসওয়ার্ড টাইপ করুন। এটি কাজ করবে এবং আপনাকে সেটিংস পৃষ্ঠায় পুনঃনির্দেশিত করা হবে, যেখানে আপনি দুটি নতুন বিকল্প দেখতে পাবেন: সাইন আউট করতে এবং আপনার অ্যাকাউন্ট মুছে ফেলতে। আপনি Firebase কনসোলের প্রমাণীকরণ ড্যাশবোর্ডে ব্যবহারকারী ট্যাবে ক্লিক করে তৈরি করা নতুন অ্যাকাউন্টটি পরীক্ষা করতে পারেন।

৪. ক্লাউড ফায়ারস্টোর

আপনি কোন বৈশিষ্ট্যটি যুক্ত করতে যাচ্ছেন?

ক্লাউড ফায়ারস্টোরের জন্য, আপনি ফায়ারস্টোর সংগ্রহে একজন শ্রোতা যোগ করবেন যা Make it So এ প্রদর্শিত কাজগুলির প্রতিনিধিত্বকারী নথিগুলি সংরক্ষণ করে। একবার আপনি এই শ্রোতা যোগ করলে, আপনি এই সংগ্রহে করা প্রতিটি আপডেট পাবেন।

কোড করার সময়!

StorageServiceImpl.kt এ উপলব্ধ Flow এইরকম দেখতে আপডেট করুন:

মডেল/পরিষেবা/ইমপ্ল/স্টোরেজসার্ভিসইমপ্ল.কেটি

override val tasks: Flow<List<Task>>
    get() =
      auth.currentUser.flatMapLatest { user ->
        firestore.collection(TASK_COLLECTION).whereEqualTo(USER_ID_FIELD, user.id).dataObjects()
      }

এই কোডটি user.id উপর ভিত্তি করে টাস্ক সংগ্রহে একটি শ্রোতা যোগ করছে। প্রতিটি টাস্ককে tasks নামক একটি সংগ্রহে একটি ডকুমেন্ট দ্বারা প্রতিনিধিত্ব করা হয় এবং তাদের প্রতিটির userId নামে একটি ক্ষেত্র রয়েছে। দয়া করে মনে রাখবেন যে currentUser অবস্থা পরিবর্তন হলে (উদাহরণস্বরূপ, সাইন আউট করে) একটি নতুন Flow নির্গত হবে।

এখন আপনাকে TasksViewModel.ktFlow পরিষেবার মতোই প্রতিফলিত করতে হবে:

স্ক্রিন/টাস্ক/টাস্কভিউমডেল.কেটি

val tasks = storageService.tasks

এবং শেষ কাজটি হবে TasksScreens.ktcomposable function তৈরি করা, যা UI-এর প্রতিনিধিত্ব করে, এই প্রবাহ সম্পর্কে সচেতন থাকা এবং এটিকে একটি অবস্থা হিসেবে সংগ্রহ করা। যতবার অবস্থা পরিবর্তন হবে, composable ফাংশনটি স্বয়ংক্রিয়ভাবে নিজেকে পুনরায় কম্পোজ করবে এবং ব্যবহারকারীর কাছে সাম্প্রতিক অবস্থা প্রদর্শন করবে। এটি TasksScreen composable function যোগ করুন:

স্ক্রিন/টাস্ক/টাস্কস্ক্রিন.কেটি

val tasks = viewModel
    .tasks
    .collectAsStateWithLifecycle(emptyList())

কম্পোজেবল ফাংশনটি একবার এই অবস্থাগুলিতে অ্যাক্সেস পেয়ে গেলে, আপনি LazyColumn (যা আপনি স্ক্রিনে একটি তালিকা প্রদর্শনের জন্য ব্যবহার করেন) আপডেট করতে পারেন যা দেখতে এইরকম হবে:

স্ক্রিন/টাস্ক/টাস্কস্ক্রিন.কেটি

LazyColumn {
    items(tasks.value, key = { it.id }) { taskItem ->
        TaskItem( [...] )
    }
}

পরীক্ষা করার সময়!

এটি কাজ করছে কিনা তা পরীক্ষা করার জন্য, অ্যাপটি ব্যবহার করে একটি নতুন টাস্ক যোগ করুন (স্ক্রিনের নীচে ডান কোণে অ্যাড বোতামে ক্লিক করে)। টাস্কটি তৈরি করা শেষ হয়ে গেলে, এটি ফায়ারস্টোর কনসোলের ফায়ারস্টোর সংগ্রহে প্রদর্শিত হবে। আপনি যদি একই অ্যাকাউন্ট সহ অন্যান্য ডিভাইসে Make it So এ লগ ইন করেন, তাহলে আপনি আপনার করণীয় আইটেমগুলি সম্পাদনা করতে পারবেন এবং রিয়েল-টাইমে সমস্ত ডিভাইসে সেগুলি আপডেট হতে দেখতে পারবেন।

৫. কর্মক্ষমতা পর্যবেক্ষণ

আপনি কোন বৈশিষ্ট্যটি যুক্ত করতে যাচ্ছেন?

পারফরম্যান্স একটি অত্যন্ত গুরুত্বপূর্ণ বিষয় যার প্রতি মনোযোগ দেওয়া উচিত কারণ ব্যবহারকারীরা আপনার অ্যাপ ব্যবহার করা ছেড়ে দেওয়ার সম্ভাবনা বেশি থাকে যদি এর পারফরম্যান্স ভালো না হয় এবং এটি ব্যবহার করে একটি সহজ কাজ সম্পন্ন করতে তারা খুব বেশি সময় নেয়। এই কারণেই কখনও কখনও আপনার অ্যাপে ব্যবহারকারীর করা নির্দিষ্ট যাত্রা সম্পর্কে কিছু মেট্রিক্স সংগ্রহ করা কার্যকর। এবং আপনাকে এটি করতে সাহায্য করার জন্য, Firebase Performance Monitoring কাস্টম ট্রেস অফার করে। Make it So- তে বিভিন্ন কোডে কাস্টম ট্রেস যোগ করতে এবং পারফরম্যান্স পরিমাপ করতে পরবর্তী পদক্ষেপগুলি অনুসরণ করুন।

কোড করার সময়!

Performance.kt ফাইলটি খুললে, আপনি trace নামে একটি ইনলাইন ফাংশন দেখতে পাবেন। এই ফাংশনটি Performance Monitoring API কে একটি কাস্টম ট্রেস তৈরি করতে কল করে, যা ট্রেস নামের সাথে একটি প্যারামিটার হিসেবে থাকে। আপনি যে অন্য প্যারামিটারটি দেখতে পান তা হল কোডের ব্লক যা আপনি নিরীক্ষণ করতে চান। প্রতিটি ট্রেসের জন্য সংগৃহীত ডিফল্ট মেট্রিক হল এটি সম্পূর্ণরূপে রান করতে কত সময় নেয়:

মডেল/সার্ভিস/পারফরম্যান্স.কেটি

inline fun <T> trace(name: String, block: Trace.() -> T): T = Trace.create(name).trace(block)

কোডবেসের কোন অংশগুলি পরিমাপ করা আপনার কাছে গুরুত্বপূর্ণ বলে মনে হয় তা আপনি বেছে নিতে পারেন এবং এতে কাস্টম ট্রেস যোগ করতে পারেন। এই কোডল্যাবে আপনি আগে ( AccountServiceImpl.kt তে) যে linkAccount ফাংশনটি দেখেছিলেন তাতে একটি কাস্টম ট্রেস যোগ করার একটি উদাহরণ এখানে দেওয়া হল:

মডেল/পরিষেবা/ইমপ্ল/অ্যাকাউন্টসার্ভিসইমপ্ল.কেটি

override suspend fun linkAccount(email: String, password: String): Unit =
  trace(LINK_ACCOUNT_TRACE) {
      val credential = EmailAuthProvider.getCredential(email, password)
      auth.currentUser!!.linkWithCredential(credential).await()
  }

এবার তোমার পালা! Make it So অ্যাপে কিছু কাস্টম ট্রেস যোগ করো এবং এটি প্রত্যাশা অনুযায়ী কাজ করেছে কিনা তা পরীক্ষা করার জন্য পরবর্তী বিভাগে যাওয়া যাক।

পরীক্ষা করার সময়!

কাস্টম ট্রেস যোগ করা শেষ করার পর, অ্যাপটি চালান এবং আপনি যে বৈশিষ্ট্যগুলি পরিমাপ করতে চান তা কয়েকবার ব্যবহার করতে ভুলবেন না। তারপর Firebase কনসোলে যান এবং Performance ড্যাশবোর্ডে যান। স্ক্রিনের নীচে, আপনি তিনটি ট্যাব পাবেন: Network requests , Custom traces এবং Screen rendering

কাস্টম ট্রেস ট্যাবে যান এবং কোডবেসে আপনার যোগ করা ট্রেসগুলি সেখানে প্রদর্শিত হচ্ছে কিনা তা পরীক্ষা করুন এবং আপনি দেখতে পাচ্ছেন যে এই কোডগুলির টুকরোগুলি কার্যকর করতে সাধারণত কত সময় লাগে।

6. রিমোট কনফিগারেশন

আপনি কোন বৈশিষ্ট্যটি যুক্ত করতে যাচ্ছেন?

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

কোড করার সময়!

প্রথমে আপনাকে Firebase কনসোলে কনফিগারেশন তৈরি করতে হবে। এটি করার জন্য, আপনাকে Remote Config ড্যাশবোর্ডে যেতে হবে এবং Add parameter বোতামে ক্লিক করতে হবে। নীচের চিত্র অনুসারে ক্ষেত্রগুলি পূরণ করুন:

রিমোট কনফিগারেশন একটি প্যারামিটার ডায়ালগ তৈরি করুন

সমস্ত ক্ষেত্র পূরণ হয়ে গেলে, আপনি সংরক্ষণ বোতামে ক্লিক করতে পারেন এবং তারপর প্রকাশ করতে পারেন । এখন যেহেতু প্যারামিটারটি তৈরি হয়ে গেছে এবং আপনার কোডবেসে উপলব্ধ, আপনাকে সেই কোডটি যুক্ত করতে হবে যা আপনার অ্যাপে নতুন মান আনবে। ConfigurationServiceImpl.kt ফাইলটি খুলুন এবং এই দুটি ফাংশনের বাস্তবায়ন আপডেট করুন:

মডেল/পরিষেবা/ইমপ্ল/কনফিগারেশনসার্ভিসইমপ্ল.কেটি

override suspend fun fetchConfiguration(): Boolean {
  return remoteConfig.fetchAndActivate().await()
}

override val isShowTaskEditButtonConfig: Boolean
  get() = remoteConfig[SHOW_TASK_EDIT_BUTTON_KEY].asBoolean()

প্রথম ফাংশনটি সার্ভার থেকে মানগুলি নিয়ে আসে এবং SplashViewModel.kt তে অ্যাপটি শুরু হওয়ার সাথে সাথেই এটি কল করা হয়। এটি নিশ্চিত করার সর্বোত্তম উপায় যে শুরু থেকেই সমস্ত স্ক্রিনে সর্বাধিক আপডেটেড মানগুলি উপলব্ধ থাকবে। ব্যবহারকারী যখন কিছু করার মাঝখানে থাকে তখন আপনি যদি UI বা অ্যাপের আচরণ পরিবর্তন করেন তবে এটি একটি ভাল ব্যবহারকারীর অভিজ্ঞতা নয়!

দ্বিতীয় ফাংশনটি হল কনসোলে তৈরি করা প্যারামিটারের জন্য প্রকাশিত বুলিয়ান মানটি ফেরত দেওয়া। এবং আপনাকে loadTaskOptions ফাংশনে নিম্নলিখিতটি যোগ করে TasksViewModel.kt এ এই তথ্যটি পুনরুদ্ধার করতে হবে:

স্ক্রিন/টাস্ক/টাস্কভিউমডেল.কেটি

fun loadTaskOptions() {
  val hasEditOption = configurationService.isShowTaskEditButtonConfig
  options.value = TaskActionOption.getOptions(hasEditOption)
}

আপনি প্রথম লাইনের মানটি পুনরুদ্ধার করছেন এবং দ্বিতীয় লাইনের টাস্ক আইটেমগুলির জন্য মেনু বিকল্পগুলি লোড করার জন্য এটি ব্যবহার করছেন। যদি মানটি false হয়, তাহলে এর অর্থ হল মেনুতে সম্পাদনা বিকল্প থাকবে না। এখন আপনার কাছে বিকল্পগুলির তালিকা রয়েছে, আপনাকে UI সঠিকভাবে প্রদর্শন করতে হবে। আপনি যখন Jetpack Compose দিয়ে একটি অ্যাপ তৈরি করছেন, তখন আপনাকে composable function সন্ধান করতে হবে যা TasksScreen এর UI কেমন হওয়া উচিত তা ঘোষণা করে। তাই TasksScreen.kt ফাইলটি খুলুন এবং TasksViewModel.kt এ উপলব্ধ বিকল্পগুলি নির্দেশ করতে LazyColum আপডেট করুন:

স্ক্রিন/টাস্ক/টাস্কস্ক্রিন.কেটি

val options by viewModel.options

LazyColumn {
  items(tasks.value, key = { it.id }) { taskItem ->
    TaskItem(
      options = options,
      [...]
    )
  }
}

TaskItem হল আরেকটি composable function যা একটি একক টাস্কের UI কেমন হওয়া উচিত তা ঘোষণা করে। এবং প্রতিটি টাস্কের একটি মেনু থাকে যেখানে অপশন থাকে যা ব্যবহারকারী যখন এর শেষে তিন ডট আইকনে ক্লিক করেন তখন প্রদর্শিত হয়।

পরীক্ষা করার সময়!

এখন আপনি অ্যাপটি চালানোর জন্য প্রস্তুত! Firebase কনসোল ব্যবহার করে আপনি যে মানটি প্রকাশ করেছেন তা অ্যাপটির আচরণের সাথে মেলে কিনা তা পরীক্ষা করুন:

  • যদি এটি false , তাহলে তিন ডট আইকনে ক্লিক করার সময় আপনি কেবল দুটি বিকল্প দেখতে পাবেন;
  • যদি এটি true , তাহলে তিন বিন্দু আইকনে ক্লিক করার সময় আপনার তিনটি বিকল্প দেখা উচিত;

কনসোলে কয়েকবার মান পরিবর্তন করে অ্যাপটি পুনরায় চালু করার চেষ্টা করুন। রিমোট কনফিগ ব্যবহার করে আপনার অ্যাপে নতুন বৈশিষ্ট্য চালু করা কতটা সহজ!

৭. অভিনন্দন

অভিনন্দন, আপনি ফায়ারবেস এবং জেটপ্যাক কম্পোজ দিয়ে সফলভাবে একটি অ্যান্ড্রয়েড অ্যাপ তৈরি করেছেন!

আপনি UI এর জন্য Jetpack Compose দিয়ে সম্পূর্ণরূপে তৈরি একটি অ্যান্ড্রয়েড অ্যাপে Firebase Authentication, Performance Monitoring, Remote Config এবং Cloud Firestore যোগ করেছেন এবং এটিকে প্রস্তাবিত MVVM আর্কিটেকচারের সাথে মানানসই করে তুলেছেন!

আরও পড়া

রেফারেন্স ডক্স