পোস্টটি পড়া হয়েছে 616 বার

Android অ্যাপে পুশ নোটিফিকেশন: Firebase API ও PHP backend

আমাদের ডেভেলপ করা অ্যাপগুলোতে ইউজারদেরকে আরো বেশি এঙ্গেজ করতে আমরা পুশ নোটিফিকেশন ব্যবহার করে থাকি। নোটিফিকেশনের মাধ্যমে জানাতে পারি অ্যাপের নতুন ফিচার, ই-কমার্স টাইপ অ্যাপ হলে জানাতে পারি নতুন কোন অফার। বা কোনো বিশেষ দিবসে ইউজারদেরকে পাঠাতে পারি কোন শুভেচ্ছা বার্তা। অনেকগুলো সার্ভিসের মাধ্যমে পুশ নোটিফিকেশনের কাজটা করা যায়। আমি এখানে দেখাবো Firebase Push Notification এর মাধ্যমে Android App এ কিভাবে নোটিফিকেশন পাঠানো যায়।

Problem Description

ধরুন আপনার একটা ব্লগ সাইট আছে। প্রতিদিন আপনি নতুন লেখা পোস্ট করেন। আপনার ব্লগের জন্য একটা অ্যাপ বানিয়েছেন। সেটা দিয়ে শুধুমাত্র আপনার ব্লগের প্রতিদিনের নতুন পোস্টটা পড়া যায়। ধরা যাক, আগের কোন পোস্ট এই অ্যাপ দিয়ে পড়া যাবে না। ব্লগে নতুন পোস্ট করা হলে আপনি সার্ভার থেকে অ্যাপে একটা নোটিফিকেশন পাঠাবেন। ঐ নোটিফিকেশনে ক্লিক করে ছবি সহ আপনার আর্টিকেলটা ইউজার পড়তে পারবেন।



Custom Ad: Download App of Ramadan from Google Play Store

সার্ভার থেকে নোটিফিকেশন পাঠালে ফোনের সিসটেম ট্রেতে নোটিফিকেশনের আইকন শো করবে। সাথে থাকবে একটা অডিও টোন। নোটিফিকেশন ট্রে থেকে swipe down করলে দেখা যাবে সার্ভার থেকে সেট করে দেয়া নোটিফিকেশনের টাইটেল, শর্ট মেসেজ ও একটা ইমেজ। এখানে ক্লিক করলে একটা Activity ওপেন হবে। সেখানে থাকবে ওয়েব সার্ভার থেকে নোটিফিকেশন আকারে পাঠানো সেই ইমেজ, আর্টিকেলের টাইটেল, time stamp ও সম্পূর্ণ আর্টিকেল।

Firebase সম্পর্কে প্রাথমিক ধারণা

ফায়ারবেজ একটা অ্যাপ্লিকেশন ডেভেলপমেন্ট প্ল্যাটফর্ম। বেশ কিছু টুলস এর সমন্বয়ে গঠিত এই প্ল্যাটফর্মের সাহায্যে খুব দ্রুত ও সহজে দারুণ সব অ্যাপ বানানে যায়। একটা অ্যাপে যে সকল কমন টুলসগুলোর দরকার পড়ে সেগুলো ফায়ারবেজের মাধ্যমে ইমপ্লিমেন্ট করা যায়। ফায়ারবেজ যেই সুবিধাগুলো দেয় সেগুলোর মধ্য কয়েকটির নাম উল্লেখ করা হলো:

  • Analytics
  • Push Notification
  • Adwords
  • Realtime Database
  • Cloud Messaging
  • Storage
  • Crash Reporting
  • App Indexing

Firebase Push Notification সম্পর্কে প্রাথমিক ধারণা

Firebase Message Types: ফায়ারবেজের মাধ্যমে ৩ ধরনের নোটিফিকেশন পাঠানো যায়।

  1. Notification message,
  2. Data message,
  3. Both (notification and data).

Notification message পাঠানো খুব সহজ। ফায়ারবেজের কনসোল থেকেই এই নোটিফিকেশন পাঠানো যায়। এই নোটিফিকেশন Firebase SDK নিজেই handle করে। আপনার অ্যাপ যদি ব্যাকগ্রাউন্ডে থাকে তাহলে কনসোল থেকে পাঠানো নোটিফিকেশন আপনার ফোনে জেনারেট হবে। তবে সমস্যা হচ্ছে কনসোল থেকে শুধু নোটিফিকেশনের টাইটেল, মেসেজ, আইকন এরকম একদম ব্যাসিক কিছু জিনিস পাঠানো যায়। আপনার মনের মাধুরি মিশিয়ে নোটিফিকেশন পাঠাতে চাইলে এর দ্বারা সম্ভব না। আর overall এই নোটিফিকেশনের উপর আপনার খুব বেশি কন্ট্রোল থাকবে না।

কনসোল থেকে এই ধরনের নোটিফিকেশন পাঠালে অ্যাপে আসা JSON data এর ফরমেট হয় উপরের JSON এর মত। এক্ষেত্রে “notification” keyword টা একটা JSON object এর key হিসাবে থাকে।

Data Message ফায়ারবেজ SDK নিজেই handle করতে পারে না। এটা অ্যাপ থেকে হ্যান্ডেল করতে হয়। ডেটা মেসেজ ফায়ারবেজ কনসোল থেকে পাঠানো সম্ভব না। এর জন্য আপনার নিজস্ব সার্ভার (অথবা localhost) ব্যবহার করে Firebase API এর মাধ্যমে নিচের মত JSON data পাঠাতে হবে। এক্ষেত্রে “data” keyword টা থাকতে হবে।

Both (notification and data) টাইপের মেসেজ পাঠানোর জন্য JSON ডেটায় “notification” ও “data” উভয় কীওয়ার্ডই থাকতে হবে।

অ্যাপ ব্যাকগ্রাউন্ডে আছে এমন অবস্থায় নোটিফিকেশন আসলে নোটিফিকেশন ট্রেতে “notification” কী এর ডেটাগুলোর মাধ্যমে নোটিফিকেশন জেনারেট করবে। ইউজার নোটিফিকেশনে ক্লিক করলে তখন “data” কী এর মেসেজগুলো প্রসেস করা হবে। কিন্তু অ্যাপ যদি foreground এ থাকে তাহলে অ্যাপ উভয় ডেটাই রিসিভ করে।

Target Audience of Firebase Push Notification

কনসোল ও আপনার নিজস্ব সার্ভার উভয় থেকেই আপনি আপনার টার্গেট ইউজারদেরকে মেসেজ পাঠাতে পারবেন। যে সকল ডিভাইসে আপনার অ্যাপটি ইন্সটল করা আছে সেগুলোতো ফায়ারবেজের একটা registration ID থাকবে। এই আইডির মাধ্যমে আপনি individual device এ নোটিফিকেশন পাঠাতে পারেন। উপরের message type এর উদাহরনের মেসেজগুলো individual device এর ক্ষেত্রে কাজ করবে। “to” : “e1w6hEbZn-8:APJewpsMu5JfI5Ak…” এখানে “to” key এর value হচ্ছে কোনো একটা ডিভাইসের ফায়ারবেজ রেজিস্ট্রেশন আইডি।

এছাড়া গ্রুপ আকারেও আপনার মেসেজগুলো পাঠাতে পারেন। যেমন বিবিসি নিউজের অ্যাপে আপনাকে সিলেক্ট করার অপশন দেয়া হয় যে, কোন কোন টপিকের নিউজের নোটিফিকেশন আপনি পেতে চান। গ্রুপ বা টপিক মেসেজ পাঠানোর জন্য অ্যাপে কিছু কাজ করা লাগবে। সেগুলো এই পোস্টেই দেখানো হবে। টপিক মেসেজের ডেটা ফরমেট হয় এরকম:

এই ছিল মোটামুটি ফায়ারবেজ পুশ নোটিফিকেশনের ব্যাসিক overview. এখন চলে যাব সরাসরি প্রোজেক্টে।

Integrating Firebase Push Notification

1. Firebase এর অফিসিয়াল সাইটে ঢুকে একটা একাউন্ট খুলে ফেলেন। একই সাথে Android Studio দিয়ে একটা নতুন প্রোজেক্ট ওপেন করুন। আপনার ইচ্ছা মত package name দিন।

2. “Add Project” অপশনে ক্লিক করে প্রোজেক্টের নাম ও দেশের নাম দিন।

“CREATE PROJECT” বাটনে ক্লিক করার পর ফায়ারবেজের সবগুলো সার্ভিসের লিস্ট সম্বলিত একটা পেজ পাবেন। তার উপরের অংশে থাকবে নিচের মত তিনটি অপশন। একটা প্রোজেক্টের তিনটা ভার্সন হতে পারে। আমি এখানে Android নিয়ে কাজ করব। সিলেক্ট করুন “Add Firebase to your Android app”.

3. আপনার অ্যাপের package name এন্ট্রি দিন। পরের দুটি ফিল্ড অপশনাল। ইচ্ছা হলে দিতে পারেন।

“REGISTER APP” বাটনে ক্লিক করলে নিচের মত একটা pop up message আসবে।

তিনটা instruction আছে এখানে। প্রথমে ১ নাম্বার অপশনে থাকা ডাউনলোড বাটনে ক্লিক করে google-services.json ফাইলটি ডাউনলোড করে নিন। Project view তে সুইচ করে ৩ নাম্বার নির্দেশনা মোতাবেক ডাউনলোড হওয়া ফাইলটি app ফোল্ডারে paste করুন

এরপর Firebase console এর “CONTINUE” বাটনে ক্লিক করুন।

4. এরপর এরকম একটা পপ আপ আসবে:

Android Studio এর মাধ্যমে project level gradle ফাইলের dependency তে Google Service যোগ করুন। এর চেহারা দেখতে হবে এরকম:

এরপর App level gradle ফাইলের একদম শেষে যোগ করুন:

এবং dependencies এর ভিতর add করুন:

এরপর Sync Now তে ক্লিক করে sync করুন। ইমুলেটর বা রিয়েল ডিভাইসে আপনার অ্যাপটি ইন্সটল করুন। অ্যাপটিকে foreground এ না রেখে ক্লোজ করে দিন (uninstall না, just close)। এরপর browser এর পপ আপ মেসেজের নিচের “FINISH” বাটনে ক্লিক করুন।

অভিনন্দন! আপনার অ্যাপটি এখন Data Message টাইপ নোটিফিকেশনের জন্য তৈরি!

Firebase console থেকে নোটিফিকেশন পাঠানো

ফায়ারবেজ কনসোলের Left bar এ দেখুন “Notification” নামের একটা অপশন আছে। সেখানে ক্লিক করলে নিচের ভিউটা পাবেন:

“SEND YOUR FIRST MESSAGE” এ ক্লিক করলে নিচের মত মেসেজ পাঠানোর অপশন পাবেন:


সেন্ড করুন আপনার প্রথম মেসেজটি। আপনার অ্যাপটি ব্যাকগ্রাউন্ডে থেকে থাকলে সেন্ড করার সাথে সাথেই নোটিফিকেশন ট্রেতে আপনার নোটিফিকেশন দেখা যাবে। ক্লিক করলে আপনার অ্যাপ ওপেন হবে।

তো এই নোটিফিকেশন নিয়ে কিছুক্ষণ খেলাধুলা চলুক। একটু পরই বুঝতে পারবেন এই জিনিস দিয়ে আসলে খুব বেশি কাজের কাজ করা যাচ্ছে না। যেহেতু এটা আমাদের পোস্টের শুরুতে দেয়া Problem Description অনুযায়ী কাজ করতে পারছে না তাই এখন দেখব কিভাবে প্রবলেম ডেস্ক্রিপশনের কাজটা করা যায়।

PHP backend থেকে Firebase API ব্যবহার করে নোটিফিকেশন পাঠানো

উপরের ব্যাসিক আলোচনার মাধ্যমে আমরা জেনেছি যে Notification Message শুধুমাত্র ফায়ারবেজ কনসোল থেকে পাঠানো যায়। সাথে data payload পাঠাতে হলে অবশ্যই আপনাকে কিছু সার্ভার সাইড লজিক নিয়ে কাজ করতে হবে। আমি এক্ষেত্রে Server Side Language হিসাবে PHP ব্যবহার করছি। প্রথমে PHP এর পার্টটা দেখবো। এরপর অ্যাপে আরো কিছু কাজ করতে হবে সেগুলোও দেখবো। আর ধরে নিচ্ছি আপনি HTML, CSS, PHP এর ব্যাসিকগুলো জানেন। কিভাবে একটা PHP ফাইল localhost এ রান করতে হয় এ বিষয়ে আপনার জানা থাকতে হবে। Firebase Push Notification পাঠানোর জন্য আপনার live server এর প্রয়োজন নাই। আপনার পিসির Localhost থেকেই আপনি আপনার অ্যাপ ইন্সটল থাকা হাজার হাজার ডিভাইসে নোটিফিকেশন পাঠাতে পারবেন! Exciting না???

Preparing the PHP backend for Firebase Push Notification

আমাদের উদ্দেশ্য হচ্ছে নিচের মত একটা ইনপুট দেয়ার সিসটেম বানানো। ধরুন আমরা চাচ্ছি এমন একটা নোটিফিকেশন পাঠাতে যেখানে টাইটেল, একটা শর্ট মেসেজ, আর্টিকেল ও ইমেজের একটা লিংক থাকবে।

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

যাই হোক, উপরের মত ভিউ বানানোর সোর্স কোড সব রেডি করা আছে। এখান থেকে ফাইলগুলো নামিয়ে লোকাল হোস্ট থেকে রান করলে লগিন পেজ দেখাবে। সেখানে লগিনের আইডি-পাসওয়ার্ডও সেট করে দেয়া আছে। আমি PHP এর কোডগুলো Linux Mint অপারেটিং সিসটেমে রান করে নোটিফিকেশন টেস্ট করেছি। এক্ষেত্রে শুরুতে firebase.php ফাইলে থাকা curl এর ফাংশনগুলো রান করতে সমস্যায় পড়ি। আমার পিসিতে তখন curl ইন্সটল ছিল না। পরে তা ইন্সটল দেয়ার পর সমস্যা সমাধান হয়। আপনার ক্ষেত্রেও একই ধরনের সমস্যা হতে পারে। আশা করছি গুগল করে curl ইন্সটল করে নিতে কোনো সমস্যা হবে না।

Modify config.php file

config.php ফাইলে গিয়ে, Firebase console থেকে প্রাপ্ত server key টা বসিয়ে দিতে হবে।

কনসোলে ‘সার্ভার কী’ খুঁজে না পেলে নিচের ছবিটা দেখতে পারেন।

dashboard.php File

এই ফাইলের একদম নিচে দেখবেন একটা HTML form আছে। এখান থেকে আমাদের ডেটাগুলো ইনপুট নিয়ে PHP code এর কাছে পাঠানো হবে ফায়ারবেজের API এর মাধ্যমে নোটিফিকেশন সেন্ড করার জন্য। একদম নিচে দেখেন আছে। এর মানে হচ্ছে আমরা গ্রুপ হিসাবে কোনো একটা ইউজারের গ্রুপের সবাইকে মেসেজ পাঠাতে চাচ্ছি। যদি individual একজনকে পাঠাতে চাই তখন value=”individual” করতে হবে।

এই ইনপুট হওয়া ডেটাগুলো handle করবে একই ফাইলেরtag এর শুরুতে থাকা PHP code block-টুকু। 101 নাম্বার লাইনে দেখুন চেক করা হচ্ছে push_type টা topic নাকি individual. যদি topic message হয় তাহলে 103 নাম্বার লাইনে $response = $firebase->sendToTopic(‘global’, $json); অর্থাৎ ‘global’ গ্রুপের সকল ইউজারদেরকে মেসেজটা পাঠানো হবে। ‘global’ গ্রুপটা কী? আমরা পরে দেখব কিভাবে কোনো একটা গ্রুপে অ্যাপ থেকে সাবস্ক্রাইব করা যায়। আপতত by default অ্যাপের সকল ইউজারদেরকে আমরা global টপিকে subscribe করিয়ে দিব।

আপনার অ্যাপটি কোনো নিউজ টাইপ অ্যাপ হলে ইউজারকে sports, politics ইত্যাদি টপিকে সাবস্ক্রাইব করাতে পারবেন। তখন PHP এর লজিক আপনার মত করে পরিবর্তন করে নিতে হবে। যখন কোনো খেলাধুলার পোস্ট করবেন তখন 103 নাম্বার লাইনে লিখবেন $response = $firebase->sendToTopic(‘sports’, $json); তা না করে যদি সব পোস্টই global টপিকে সেন্ড করেন তাহলে ইউজার নোটিফিকেশনের যন্ত্রণায় অ্যাপ ছেড়ে পালাবে।

অন্য দিকে, আপনার push_type যদি ‘individual’ হয় এর মানে আপনি একজন একজন করে ইউজারকে মেসেজ পাঠাতে চাচ্ছেন। তখন $regId = “PUT YOUR DEVICE ID HERE”; কাজ করবে। প্রশ্ন হচ্ছে ইউজারের ফায়ারবেজ আইডি কিভাবে পাবেন? বা কিভাবে বুঝবেন যে এই আইডিটা ‘হাসান আবদুল্লাহ’ এর কিনা? এজন্য ভাল বুদ্ধি হতে পারে login authentication রাখা। লগিন করার সময় ফায়ারবেজের আইডিও সার্ভারে পাঠিয়ে দিবেন। পরে কুয়েরি-টুয়েরি করে ইউজারের আইডি বের করে তাতে নোটিফিকেশন পাঠাতে পারেন। এজন্য Firebase Authentication ও Firebase Realtime Database ব্যবহার করা যেতে পারে। তবে individual notification কাজ করে কিনা সেটা বোঝার জন্য আপাতত আপনার নিজের ইমুলেটর বা রিয়েল ডিভাইসের আইডি দিয়ে টেস্ট করে দেখতে পারেন।

PHP এর বাকি কোডগুলো আশা করি নিজেই বুঝে যাবেন। তাই আর কথা বাড়াচ্ছি না।

Preparing Android App for Firebase Push Notification

পোস্টের শুরুতে ফায়ারবেজ কনসোল থেকে যখন মেসেজ পাঠালাম তখন কিন্তু সেই মেসেজ গ্রহন করা ও নোটিফিকেশনে ক্লিক করলে কী ঘটবে এগুলো কিছুই বলে দেই নাই। Firebase SDK ঐ ব্যাপারটা সামলিয়েছে। কিন্তু data payload পাঠালে সেটা Firebase SDK হ্যান্ডেল করতে পারবে না। তাই অ্যাপে এবার কিছু কাজ করতে হবে। এত বড় পোস্টে বিরক্ত হয়ে গেলে উঠে একটু হাঁটাহাঁটি করে নিতে পারেন। এখন পর্যন্ত যতটুকু লিখেছি তা মোটামুটে আমার তিন দিনের কাজ। আজ তৃতীয় দিনের মত লিখতে বসছি। ব্রেনের উপর চাপ দেয়ার দরকার নাই। একটু রিল্যাক্সেরও দরকার আছে! 🙂

আশা করি ছোট্ট ব্রেক নিয়েছেন। চলুন কাজে নেমে পড়া যাক।

আপাতত গিটহাবের রিপোজিটরি থেকে সোর্সকোডগুলো উপরের ছবির মত করে কপি-পেস্ট করুন। NotificationPackage-টি আপনি পরবর্তীতে আপনার যে কোনো প্রোজেক্টে ব্যবহার করতে পারবেন। জাস্ট কপি-পেস্ট করলেই কাজ করবে। তিনটি সার্ভিস ক্লাস ব্যবহার করেছি। সেগুলো manifest ফাইলে বলে দিতে হবে। Internet permission নিতে ভুলবেন না যেন!

Description of some important classes

আপনার সুবিধার্থে ২-১ টা class এর কোড একটু ব্যাখ্যা করব। বাকিগুলো নিজে ঘাটাঘাটি করলেই বুঝে যাবেন।

এই সার্ভিস ক্লাসের মাধ্যমে ফায়ারবেজের ইউজার হিসাবে অ্যাপটি registered হয়। যতগুলো ডিভাইসে আপনার অ্যাপ ইন্সটল হবে সবগুলোতে এই আইডি হবে unique. আপনার যদি একজন একজন করে ইউজার ধরে ধরে নোটিফিকেশন পাঠানোর দরকার হয় সেক্ষেত্রে এই টোকেনগুলো আপনার সার্ভারে স্টোর করে রাখা লাগবে।

সার্ভার থেকে যখন নোটিফিকেশন পাঠানো হবে তখন এই সার্ভিস ক্লাসের onMessageReceived() মেথড কল হবে এবং ডেটাগুলো সে রিসিভ করবে। এই ডেটাগুলো দিয়ে সে নোটিফিকেশন জেনারেট করবে। handleDataMessage() মেথডের ভিতরে Intent initialization এর সময় দেখুন বলা আছে যে, নোটিফিকেশনে ক্লিক করলে কোন Activity ওপেন করতে হবে।

MainActivity.java class

যেই সার্ভিস ক্লাসের মাধ্যমে ফায়ারবেজ আইডি রেজিস্ট্রেশন করলাম সেখানে রেজিস্ট্রেশন কমপ্লিট হওয়া বিষয়ক একটা মেসেজ ব্রডকাস্ট করা হয়েছিল। তা রিসিভ করবে MainActivity.java এর ভিতর থাকা onReceive() overridden মেথডটি।

যদি সফল ভাবে রেজিস্টার্ড হয়ে থাকে তখন FirebaseMessaging.getInstance().subscribeToTopic(Configuration.TOPIC_GLOBAL); মেথডে কল করার মাধ্যমে ‘global’ টপিকে subscribe করা হবে। Configuration.java ক্লাসে TOPIC_GLOBAL সহ আরো কিছু constant value আছে যেগুলো আমরা পুরো অ্যাপে ব্যবহার করব। TOPIC_GLOBAL একটা String object. এর ভ্যালু হচ্ছে “global”. এই কীওয়ার্ড ব্যবহার করেই কিন্তু আমরা PHP কোড থেকে নোটিফিকেশন পাঠিয়েছিলাম। সাবস্ক্রাইব করার মত চাইলে আনসাবস্ক্রাইবও করা যাবে এই টপিক থেকে। এজন্য ব্যবহার করতে হবে এই মেথডটি: FirebaseMessaging.getInstance().unsubscribeFromTopic(‘global’);

বাকি রইলো NotificationUtils.java সহ আরো কিছু ক্লাস। NotificationUtils.java এর মাধ্যমে বিভিন্ন ধরনের নোটিফিকেশন জেনারেট করা হয়। মেথডগুলো লাইন বাই লাইন পড়লে কাজগুলো ক্লিয়ার হবে। আর প্রয়োজনীয় কমেন্ট করা আছে। তাই বুঝা কষ্টকর হবে না।

পুরো প্রোজেক্টটি একত্রে পাওয়া যাবে আমার গিটহাব রিপোজিটরিতে। সেখান থেকে ২টা Activity এর UI ও অন্যান্য কোডগুলো দেখে নিতে পারেন। উল্লেখ্য, এই প্রোজেক্ট সরাসরি রান করলেই কাজ করবে না। আপনার প্রোজেক্টের google-services.json ও প্যাকেজের নাম আলাদা হতে হবে।

পুশ নোটিফিকেশন শেখা, এই পোস্ট লিখা এবং গিটহাবের প্রোজেক্টটি ডেভেলপ করার জন্য আমি অনুসরণ করেছি Ravi Tamada এর Android Hive ব্লগের এই পোস্টটি। আমার ধারণা আমার লেখাটি বেশ খাপ ছাড়া আর অগোছালো রয়ে গেছে। সেক্ষেত্রে আপনি মূল লেখাটি পড়তে পারেন। ঐ লেখাটি আরো তথ্যবহুল।

লেখাটি আরে উন্নত করার জন্য যে কোন ধরনের পরামর্শ ও মতামত সাদরে গ্রহন করা হবে। ধন্যবাদ।

Leave a Reply

Your email address will not be published. Required fields are marked *