# Android SDK কাস্টমাইজ করুন

<Aside type="note">
নিশ্চিত করুন যে আপনি আপনার প্রজেক্টে Pushwoosh Android SDK ইন্টিগ্রেট করেছেন:

*   [Firebase ইন্টিগ্রেশন](/bn/developer/pushwoosh-sdk/android-sdk/firebase-integration/quick-start/)
*   [Amazon ইন্টিগ্রেশন](/bn/developer/pushwoosh-sdk/android-sdk/amazon/)
</Aside>

## ডিপ লিঙ্কিং

আপনার যে অ্যাক্টিভিটি ডিপ লিঙ্ক হ্যান্ডেল করবে, সেখানে স্কিম, হোস্ট এবং পাথপ্রিফিক্স প্যারামিটার সহ \<data> ট্যাগ যোগ করুন।

```txt
<activity
          android:name=".PromoActivity"
          android:label="PromoActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data android:scheme="com.pushwoosh"
          android:host="promotion"
          android:pathPrefix="" />
    </intent-filter>
</activity>
```

<Aside type="note">
ডিপ লিঙ্ক পেজের নাম (প্রদত্ত উদাহরণে _promotion_) **host** ফিল্ডে যাবে, **pathPrefix**-এ নয়।
</Aside>

উপরের উদাহরণে, ডিপ লিঙ্কটি PromoActivity খুলবে। নিচের বেসিক ইমপ্লিমেন্টেশনটি সরলতার জন্য প্রোমো আইডি ভ্যালু সহ একটি অ্যালার্ট প্রদর্শন করে। আপনার অ্যাপ্লিকেশনে এটি অবশ্যই কোনো দরকারি কাজ করতে পারে!

```java
public class PromoActivity extends Activity
{
		@Override
		protected void onCreate(Bundle savedInstanceState)
		{
				super.onCreate(savedInstanceState);

				setContentView(R.layout.deep_link);
				setTitle("Deep link activity");

				Intent intent = getIntent();
	  	  String action = intent.getAction();
	    	Uri data = intent.getData();

		    if (TextUtils.equals(action, Intent.ACTION_VIEW))
		    {
	  		  	openUrl(data);
		    }
		}

		private void openUrl(Uri uri)
		{
				String promoId = uri.getQueryParameter("id");
				Toast.makeText(getApplicationContext(), promoId, Toast.LENGTH_LONG).show();
		}
}
```

## ইন-অ্যাপ পারচেজ ট্র্যাকিং

আপনি যদি [Customer Journeys](/bn/product/customer-journey/pushwoosh-journey-overview)-এ ইন-অ্যাপ পারচেজ ট্র্যাক করতে চান, তাহলে এই মেথডটি কল করে Pushwoosh-এ পারচেজ তথ্য পাঠানোর জন্য কনফিগার করুন:

```java
Pushwoosh.getInstance().sendInappPurchase(@NonNull String sku, @NonNull BigDecimal price, @NonNull String currency);
```

## জিওজোন পুশ নোটিফিকেশন

জিওজোন পুশ ব্যবহার করতে, `com.pushwoosh:pushwoosh-location` লাইব্রেরি যোগ করুন এবং কল করুন:

```java
PushwooshLocation.startLocationTracking();
```

আপনার **AndroidManifest.xml**-এ প্রয়োজনীয় পারমিশনগুলো অন্তর্ভুক্ত করুন:

```xml
<manifest ... >
  <!-- Required for geolocation-based push notifications -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

  <!-- Required for precise location tracking -->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

  <!-- Required for background location access on Android 10 (API level 29) and higher -->
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
```

## Pushwoosh-এর সাথে লোকাল নোটিফিকেশন ব্যবহার

আপনি যদি Pushwoosh Local Notifications API ব্যবহার করেন, তাহলে আপনার AndroidManifest.xml-এ RECEIVE\_BOOT\_COMPLETED পারমিশন যোগ করুন:

```txt title="AndroidManifest.xml"
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>x
```

## Android-এ ব্যাজ নম্বর ব্যবহার

Pushwoosh নিম্নলিখিত Android লঞ্চারগুলির জন্য অ্যাপ আইকন শর্টকাটে ব্যাজ নম্বর সেট করা সমর্থন করে:\
Sony, Samsung, LG, HTC, ASUS, ADW, APEX, NOVA, HUAWEI, ZUK, OPPO।\
এই কার্যকারিতাটি ব্যবহার করতে, আপনার অ্যাপ্লিকেশনে কেবল `com.pushwoosh:pushwoosh-badge` লাইব্রেরি যোগ করুন।

## কাস্টম অ্যাক্টিভিটি খোলা

আপনি যদি পুশ নোটিফিকেশনের জবাবে একটি নির্দিষ্ট অ্যাক্টিভিটি শুরু করতে চান, তাহলে সেই অ্যাক্টিভিটিতে নিম্নলিখিত ইন্টেন্ট-ফিল্টার যোগ করুন:

```txt title="AndroidManifest.xml"
<activity android:name="YourActivity">
    <intent-filter>
        <action android:name="${applicationId}.MESSAGE"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>
```

## লগ লেভেল নিয়ন্ত্রণ

ডিবাগিং এবং ইন্টিগ্রেশনে সহায়তা করার জন্য, SDK ডিফল্টরূপে কনসোলে সমস্ত রিকোয়েস্ট প্রিন্ট করবে। আপনি যখন প্রোডাকশন বিল্ডের জন্য প্রস্তুত হবেন, তখন AndroidManifest.xml-এ "ERROR" ভ্যালু সহ `com.pushwoosh.log_level` মেটা-ডেটা যোগ করুন। এইভাবে শুধুমাত্র ত্রুটির তথ্য কনসোলে যাবে। অন্যান্য বিকল্পগুলির মধ্যে একটি হতে পারে:

_NONE_ - SDK থেকে কোনো লগ নেই\
_ERROR_ - কনসোলে শুধুমাত্র ত্রুটি প্রদর্শন করুন\
_WARN_ - সতর্কতাও প্রদর্শন করুন\
_INFO_ - তথ্যমূলক বার্তা প্রদর্শন করুন\
_DEBUG_ - এখন ডিবাগ তথ্যও প্রদর্শিত হয়\
_NOISE_ - SDK যা কিছু প্রিন্ট করতে পারে এবং আরও অনেক কিছু

```txt title="AndroidManifest.xml"
<meta-data android:name="com.pushwoosh.log_level" android:value="ERROR" />
```

## Proguard ব্যবহার

Proguard ব্যবহার করার সময়, নিম্নলিখিত বিকল্পগুলি যোগ করুন:

```txt title="proguard-rules.pro"
-keep class com.pushwoosh.** { *; }
-dontwarn com.pushwoosh.**
```

Proguard সম্পর্কিত **Google Play Services** লাইব্রেরির প্রয়োজনীয়তা এখানে দেখুন:\
[https://developers.google.com/android/guides/setup](https://developers.google.com/android/guides/setup)

## নোটিফিকেশন ওপেন বিহেভিয়ার কাস্টমাইজ করা

পুশ নোটিফিকেশনের ফলে কোন অ্যাক্টিভিটি প্রদর্শন করতে হবে তা যদি প্রোগ্রাম্যাটিকভাবে নির্বাচন করার প্রয়োজন হয়, আপনি একটি কাস্টম [NotificationServiceExtension](https://github.com/Pushwoosh/pushwoosh-android-sdk/blob/master/Documentation/notification/NotificationServiceExtension.md) তৈরি করতে পারেন এবং `com.pushwoosh.notification_service_extension` ভ্যালুর অধীনে মেটাডেটাতে আপনার NotificationServiceExtension-এর সম্পূর্ণ কোয়ালিফাইড ক্লাস নাম অন্তর্ভুক্ত করতে পারেন।

```txt title="AndroidManifest.xml"
<meta-data
    android:name="com.pushwoosh.notification_service_extension"
    android:value="com.your.package.YourNotificationServiceExtension" />
```

```java title="YourNotificationServiceExtension.java"
public class YourNotificationServiceExtension extends NotificationServiceExtension {
    @Override
    protected void startActivityForPushMessage(PushMessage message) {
      // super.startActivityForPushMessage() starts default launcher activity
      // or activity marked with ${applicationId}.MESSAGE action.
      // Simply do not call it to override this behaviour.
        // super.startActivityForPushMessage(message);

        // start your activity instead:
        Intent launchIntent  = new Intent(getApplicationContext(), YourActivity.class);
        launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

        // (Optional) pass notification data to Activity
        launchIntent.putExtra(Pushwoosh.PUSH_RECEIVE_EVENT, message.toJson().toString());

        context.startActivity(launchIntent);
    }
}
```

<Aside type="note">
**গুরুত্বপূর্ণ**

আপনি যদি প্রোডাকশন বিল্ডে proguard ব্যবহার করেন, তাহলে নিশ্চিত করুন যে আপনার কাস্টম NotificationServiceExtension অবফিউসকেটেড (obfuscated) নয় ( `-keep class` নিয়ম যোগ করে), অন্যথায় এটি ClassNotFoundException-এর কারণ হবে।
</Aside>

## পুশ নোটিফিকেশন কাস্টমাইজ করা

পুশ নোটিফিকেশনের ভিউ কাস্টমাইজ করতে, আপনাকে একটি কাস্টম ফ্যাক্টরি তৈরি করতে হবে, আপনি একটি কাস্টম [NotificationFactory](https://pushwoosh.github.io/pushwoosh-android-sdk/pushwoosh/com.pushwoosh.notification/-notification-factory/index.html) তৈরি করতে পারেন এবং `com.pushwoosh.notification_factory` ভ্যালুর অধীনে মেটাডেটাতে আপনার NotificationFactory-এর সম্পূর্ণ কোয়ালিফাইড ক্লাস নাম অন্তর্ভুক্ত করতে পারেন।

```txt title="AndroidManifest.xml"
<meta-data
    android:name="com.pushwoosh.notification_factory"
    android:value="com.your.package.YourNotificationFactory" />
```

```java title="YourNotificationFactory"
public class YourNotificationFactory extends PushwooshNotificationFactory {
	@Override
	public Notification onGenerateNotification(@NonNull PushMessage pushMessage) {
		if (customNotification) {
       // TODO: generate and return custom notification
    }

    // return default Pushwoosh notification
		return super.onGenerateNotification(pushMessage);
	}
}
```

## গ্রুপ সামারি কাস্টমাইজ করা

একটি [গ্রুপ সামারির](https://developer.android.com/training/notify-user/group#set_a_group_summary) অ্যাপিয়ারেন্স কাস্টমাইজ করতে, একটি কাস্টম ফ্যাক্টরি তৈরি করুন। আপনি কাস্টম SummaryNotificationFactory তৈরি করতে পারেন এবং com.pushwoosh.summary\_notification\_factory ভ্যালুর অধীনে মেটাডেটাতে আপনার SummaryNotificationFactory-এর সম্পূর্ণ কোয়ালিফাইড ক্লাস নাম অন্তর্ভুক্ত করতে পারেন।

```java title="AndroidManifest.xml"
<meta-data
    android:name="com.pushwoosh.summary_notification_factory"
    android:value="com.your.package.YourSummaryNotificationFactory" />
```

```java title="YourSummaryNotificationFactory"
public class YourSummaryNotificationFactory extends PushwooshSummaryNotificationFactory {
    @Override
    public String summaryNotificationMessage(int notificationsAmount) {
	      // return the message you want
        return super.summaryNotificationMessage(notificationsAmount);
    }
    @Override
    public int summaryNotificationIconResId() {
	      // return the icon resource id you want
        return super.summaryNotificationIconResId();
    }
}
```

## প্রাইভেট এন্ডপয়েন্ট URL

<Aside>
শুধুমাত্র **কাস্টম প্ল্যান** সাবস্ক্রিপশনের জন্য। আরও বিস্তারিত জানতে, অনুগ্রহ করে আমাদের [সেলস টিমের](https://www.pushwoosh.com/demo/?utm_source=docs&utm_medium=post&utm_campaign=customizing-android-sdk) সাথে যোগাযোগ করুন।
</Aside>

Pushwoosh কাস্টম প্ল্যান সাবস্ক্রিপশন সহ গ্রাহকদের জন্য প্রাইভেট এন্ডপয়েন্ট সরবরাহ করে। Android SDK-এর জন্য প্রাইভেট এন্ডপয়েন্ট সেট আপ করতে, আপনাকে আপনার **AndroidManifest.xml** ফাইলে নিম্নলিখিতটি যোগ করতে হবে:

```txt title="AndroidManifest.xml"
<meta-data android:name="com.pushwoosh.base_url" android:value="PUSHWOOSH_PRIVATE_ENDPOINT_URL_PROVIDED" />
```

## একটি রিচ মিডিয়া কিউ তৈরি করা

যদি একই সাথে দেখানোর জন্য বেশ কয়েকটি রিচ মিডিয়া পেজ থাকে (উদাহরণস্বরূপ, দুই বা ততোধিক ইন-অ্যাপের জন্য ট্রিগার ইভেন্ট একই মুহূর্তে ঘটে, অথবা একটি রিচ মিডিয়া পেজ দেখানোর সময় অন্য একটি ট্রিগার ইভেন্ট ঘটে), আপনি রিচ মিডিয়া পেজ দেখানোর জন্য একটি কিউ সেট আপ করতে পারেন। একটি কিউ তৈরি করতে, আপনার প্রজেক্টে নিম্নলিখিত কোড যোগ করুন:

```java title="Application.java"
package com.pushwoosh.testingapp;

import com.pushwoosh.RichMediaManager;
import com.pushwoosh.exception.PushwooshException;
import com.pushwoosh.richmedia.RichMediaPresentingDelegate;
import com.pushwoosh.richmedia.RichMedia;
import com.pushwoosh.internal.utils.PWLog;

import java.util.ArrayDeque;
import java.util.concurrent.locks.ReentrantLock;

public class DefaultRichMediaPresentingDelegate implements RichMediaPresentingDelegate {
    private final String TAG = DefaultRichMediaPresentingDelegate.class.getSimpleName();
    private ArrayDeque<RichMedia> richMediaQueue = new ArrayDeque<>();
    private RichMedia currentRichMedia = null;
    private ReentrantLock reentrantLock;

    public DefaultRichMediaPresentingDelegate() {
        PWLog.noise(TAG, "new DefaultRichMediaPresentingDelegate:" + this);
        reentrantLock = new ReentrantLock();
    }

    @Override
    public boolean shouldPresent(RichMedia richMedia) {
        PWLog.noise(TAG, "shouldPresent:" + richMedia);
        if (currentRichMedia == null) {
            PWLog.noise(TAG, "currentRichMedia is null");
        }
        if (richMedia.isLockScreen()) {
            PWLog.noise(TAG, "isLockScreen is true");
            return true;
        }
        try {
            reentrantLock.lock();
            if (currentRichMedia == null) {
                PWLog.noise(TAG, "show:" + richMedia);
                currentRichMedia = richMedia;
                return true;
            } else {
                PWLog.noise(TAG, "add to queue:" + richMedia);
                richMediaQueue.add(richMedia);
                return false;
            }
        } finally {
            reentrantLock.unlock();
        }
    }

    @Override
    public void onPresent(RichMedia richMedia) {
        PWLog.noise(TAG, "onPresent" + richMedia);
    }

    @Override
    public void onError(RichMedia richMedia, PushwooshException pushwooshException) {
        PWLog.error(TAG, pushwooshException + " richMedia:"+richMedia.toString());
        tryShowNextRichMediaThreadSafety();
    }



    @Override
    public void onClose(RichMedia richMedia) {
        PWLog.noise(TAG, "onClose:" + richMedia);
        tryShowNextRichMediaThreadSafety();
    }

    private void tryShowNextRichMediaThreadSafety() {
        try {
            reentrantLock.lock();
            tryShowNextRichMedia();
        } finally {
            reentrantLock.unlock();
        }
    }

    private void tryShowNextRichMedia() {
        if (!richMediaQueue.isEmpty()) {
			currentRichMedia = richMediaQueue.poll();
			PWLog.noise(TAG, "try manual show:" + currentRichMedia);
			RichMediaManager.present(currentRichMedia);
		} else {
			PWLog.noise(TAG, "richMediaQueue is empty");
			currentRichMedia = null;
		}
    }
}
```

<Aside type="caution" title="গুরুত্বপূর্ণ">
আমরা **Activity**-এর পরিবর্তে **Application**-এ একটি কিউ সেট আপ করার জন্য দৃঢ়ভাবে সুপারিশ করছি। অন্যথায়, এটি একাধিক কিউ তৈরি করতে পারে।
</Aside>

<Aside type="note">
প্রতিটি [postEvent](/bn/developer/api-reference/user-centric-api/#postevent) মেথড কল শুধুমাত্র একটি ইন-অ্যাপ প্রদর্শনের অনুমতি দেয়, এবং প্রতিটি পুশ শুধুমাত্র একটি রিচ মিডিয়ার সাথে যুক্ত হতে পারে। আপনি যদি একাধিক ইন-অ্যাপ দেখাতে চান, তাহলে প্রয়োজনীয় সংখ্যক বার [postEvent](/bn/developer/api-reference/user-centric-api/#postevent) মেথড কল করুন।
</Aside>

## কাস্টম সাউন্ড পুশ

<Aside>
Android 8+ ডিভাইসের জন্য উপলব্ধ।
</Aside>

1.  আপনার অডিও ফাইলটি সঠিক ফোল্ডারে রাখুন। নেটিভ Android ফ্রেমওয়ার্কের জন্য, আপনার ফাইলগুলি `/app/src/main/res/raw` ফোল্ডারে রাখা উচিত।

<Aside type="note">
অন্যান্য ফ্রেমওয়ার্কে তৈরি করা প্রজেক্টে অডিও ফাইল কোথায় রাখতে হবে তা জানতে অনুগ্রহ করে সংশ্লিষ্ট গাইডগুলি দেখুন।
</Aside>

2. একটি [নোটিফিকেশন চ্যানেল তৈরি করুন।](/bn/developer/pushwoosh-sdk/android-sdk/notification-channels/)

3. একটি পুশ মেসেজ কনফিগার করার সময় একটি সাউন্ড নির্বাচন করুন।

<img src="/android-push-notifications-customizing-android-sdk-5.0-1.webp" alt=""/>

4. মেসেজটি কোন নোটিফিকেশন চ্যানেলের অন্তর্গত হবে তা সেট করুন। এটি করতে, "Android root params" ফিল্ডে নিম্নলিখিতটি নির্দিষ্ট করুন: `{"pw_channel": "PUSH NOTIFICATION CHANNEL NAME"} //` `_`এখানে আপনার কাস্টম সাউন্ড সহ চ্যানেলের জন্য নাম নির্দিষ্ট করতে হবে`_`

রিমোট API ব্যবহার করার ক্ষেত্রে, আপনার /createMessage API রিকোয়েস্টের মধ্যে প্যারামিটারগুলি নিম্নরূপ সেট করুন:

```java
"android_root_params": {"pw_channel": "push"} // এখানে আপনার কাস্টম সাউন্ড সহ চ্যানেলের জন্য নাম নির্দিষ্ট করতে হবে, উদাহরণস্বরূপ, push.wav সাউন্ড সহ নোটিফিকেশনের জন্য "push"।
"android_sound": "push" // এখানে আপনার এক্সটেনশন ছাড়া ফাইলের নাম নির্দিষ্ট করা উচিত
```

আপনি যখন এই প্যারামিটারগুলি নির্দিষ্ট করে পুশ পাঠাবেন, তখন Android 8+ সহ সমস্ত ডিভাইসের জন্য নির্বাচিত সাউন্ড সহ নোটিফিকেশন চ্যানেল তৈরি হয়ে যাবে।

এখন, একটি কাস্টম সাউন্ড সহ পুশ পাঠাতে, আপনাকে শুধুমাত্র সেই সাউন্ডের সাথে যুক্ত চ্যানেলটি নির্দিষ্ট করতে হবে।

### কাস্টম নোটিফিকেশন সাউন্ডের জন্য Proguard নিয়ম

যদি আপনার অ্যাপ কোড এবং রিসোর্স সঙ্কুচিত করার জন্য proguard ব্যবহার করে, তবে আপনার সাউন্ড ফাইলগুলি অক্ষত রাখা এবং বাহ্যিক লাইব্রেরির জন্য উপলব্ধ রাখা গুরুত্বপূর্ণ। আপনি যদি আপনার **build.gradle**-এ **`minifyEnabled = true`** প্রপার্টি ব্যবহার করেন, তাহলে আপনার **proguard-rules.pro**-তে নিম্নলিখিত নিয়মগুলি যোগ করুন:

```
-keep public class your.package.name.R$raw {
 *;
}
```

আপনি যদি **`shrinkResources=true`** প্রপার্টি ব্যবহার করে কোড সঙ্কুচিত করার উপরে আপনার অ্যাপের রিসোর্স সঙ্কুচিত করেন, তাহলে আপনাকে অতিরিক্তভাবে নির্দিষ্ট করতে হবে যে আপনি কোন রিসোর্সগুলি রাখতে চান। এটি করতে, যেকোনো নামে একটি নতুন XML ফাইল তৈরি করুন, এটি আপনার প্রজেক্টের কোথাও সংরক্ষণ করুন (উদাহরণস্বরূপ, res/xml-এ), এবং **`resources`** ট্যাগে **`tools:keep`** প্যারামিটারের অধীনে রিসোর্সের নামগুলি নির্দিষ্ট করুন:

```
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
 tools:keep="@raw/*"
/>
```

## Android SDK মেটা-ডেটা ফ্ল্যাগের সম্পূর্ণ তালিকা

একটি ফ্ল্যাগ সেট আপ করতে, আপনাকে আপনার **AndroidManifest.xml** ফাইলের **application** ট্যাগের ভিতরে মেটা-ডেটা ব্লক যোগ করতে হবে। উদাহরণস্বরূপ, আপনি যদি Pushwoosh অ্যাপ্লিকেশন আইডি সেট করতে চান, তাহলে আপনার **AndroidManifest.xml** ফাইলে নিম্নলিখিত কোড যোগ করুন:

```txt title="AndroidManifest.xml"
<meta-data
    android:name="com.pushwoosh.appid"
    android:value="XXXXX-XXXXX" />
```

<table><thead><tr><th width="262.33243208828077" align="center">ফ্ল্যাগ</th><th width="284" align="center">বর্ণনা</th><th align="center">সম্ভাব্য মান</th></tr></thead><tbody><tr><td align="center">com.pushwoosh.appid</td><td align="center">Pushwoosh অ্যাপ্লিকেশন আইডি সেট করে।</td><td align="center">XXXXX-XXXXX</td></tr><tr><td align="center">com.pushwoosh.log_level</td><td align="center">লগিং লেভেল সেট করে। বিস্তারিত জানতে, <a href="#controlling-log-level">লগ লেভেল নিয়ন্ত্রণ</a> দেখুন।</td><td align="center">NONE / ERROR / WARN / INFO / <strong>DEBUG</strong> (<em>ডিফল্ট</em>) / NOISE</td></tr><tr><td align="center">com.pushwoosh.base_url</td><td align="center">Pushwoosh সার্ভার বেস ইউআরএল ওভাররাইড করে।</td><td align="center"><a href="https://cp.pushwoosh.com/json/1.3/">https://cp.pushwoosh.com/json/1.3/</a> (<em>ডিফল্ট</em>)</td></tr><tr><td align="center">com.pushwoosh.notification_service_extension</td><td align="center">কাস্টম NotificationServiceExtension। বিস্তারিত জানতে, <a href="#customising-notification-open-behaviour">নোটিফিকেশন ওপেন বিহেভিয়ার কাস্টমাইজ করা</a> দেখুন।</td><td align="center">com.myapp.MyNotificationServiceExtension</td></tr><tr><td align="center">com.pushwoosh.notification_factory</td><td align="center"><p>কাস্টম NotificationFactory।</p><p>বিস্তারিত জানতে, <a href="#customizing-push-notifications">পুশ নোটিফিকেশন কাস্টমাইজ করা</a> দেখুন।</p></td><td align="center">com.myapp.MyNotificationFactory</td></tr><tr><td align="center">com.pushwoosh.summary_notification_factory</td><td align="center">কাস্টম SummaryNotificationFactory।</td><td align="center">com.myapp.MySummaryNotificationFactory</td></tr><tr><td align="center">com.pushwoosh.multi_notification_mode</td><td align="center">যদি true হয়, নোটিফিকেশন গ্রুপ করা হবে। যদি false হয়, শুধুমাত্র শেষ প্রাপ্ত নোটিফিকেশনটি প্রদর্শিত হবে।</td><td align="center">true / <strong>false</strong> (<em>ডিফল্ট</em>)</td></tr><tr><td align="center">com.pushwoosh.allow_server_communication</td><td align="center">যদি true হয়, SDK-কে Pushwoosh সার্ভারে নেটওয়ার্ক রিকোয়েস্ট পাঠানোর অনুমতি দেওয়া হয়।</td><td align="center"><strong>true</strong> (<em>ডিফল্ট</em>) / false</td></tr><tr><td align="center">com.pushwoosh.handle_notifications_using_workmanager</td><td align="center">যদি true হয়, WorkManager নোটিফিকেশন হ্যান্ডেল করার জন্য সেট করা হয়।</td><td align="center">true / <strong>false</strong> (<em>ডিফল্ট</em>)</td></tr><tr><td align="center">com.pushwoosh.notification_icon</td><td align="center">কাস্টম নোটিফিকেশন (ছোট) আইকন রিসোর্সের নাম। যদি null হয়, ডিফল্ট অ্যাপ্লিকেশন আইকন ব্যবহার করা হবে।</td><td align="center">res/drawable-xxhdpi-v11/notification_small_icon.png / null</td></tr><tr><td align="center">com.pushwoosh.notification_icon_color</td><td align="center">নোটিফিকেশন (ছোট) আইকনের ব্যাকগ্রাউন্ড রঙ।</td><td align="center">#FFFFFF</td></tr><tr><td align="center">com.pushwoosh.allow_collecting_device_data</td><td align="center">যদি true হয়, SDK-কে ডিভাইস ডেটা সংগ্রহ এবং Pushwoosh-এ পাঠানোর অনুমতি দেওয়া হয়।</td><td align="center"><strong>true</strong> (<em>ডিফল্ট</em>) / false</td></tr><tr><td align="center">com.pushwoosh.allow_collecting_device_os_version</td><td align="center">যদি true হয়, SDK-কে ডিভাইস OS সংস্করণ সংগ্রহ এবং Pushwoosh-এ পাঠানোর অনুমতি দেওয়া হয়।</td><td align="center"><strong>true</strong> (<em>ডিফল্ট</em>) / false</td></tr><tr><td align="center">com.pushwoosh.allow_collecting_device_locale</td><td align="center">যদি true হয়, SDK-কে ডিভাইস লোকেল সংগ্রহ এবং Pushwoosh-এ পাঠানোর অনুমতি দেওয়া হয়।</td><td align="center"><strong>true</strong> (<em>ডিফল্ট</em>) / false</td></tr><tr><td align="center">com.pushwoosh.allow_collecting_device_model</td><td align="center">যদি true হয়, SDK-কে ডিভাইস মডেল সংগ্রহ এবং Pushwoosh-এ পাঠানোর অনুমতি দেওয়া হয়।</td><td align="center"><strong>true</strong> (<em>ডিফল্ট</em>) / false</td></tr><tr><td align="center">com.pushwoosh.in_app_business_solutions_capping</td><td align="center"><em>push-unregister</em> ইন-অ্যাপ দিনে কতবার দেখানো যাবে তা সীমাবদ্ধ করে।</td><td align="center"><strong>1</strong> (<em>ডিফল্ট</em>), 2, ..., n</td></tr><tr><td align="center">com.pushwoosh.start_foreground_service</td><td align="center">যদি true হয়, PushwooshLocation.startLocationTracking() কলের সাথে ফোরগ্রাউন্ড সার্ভিস চালু হয়।</td><td align="center">true / <strong>false</strong> (<em>ডিফল্ট</em>)</td></tr><tr><td align="center">com.pushwoosh.foreground_service_notification_text</td><td align="center">"com.pushwoosh.start_foreground_service" কী-এর জন্য ফোরগ্রাউন্ড সার্ভিস চালু হলে তৈরি হওয়া নোটিফিকেশনের টেক্সট সেট করে।</td><td align="center"><strong>Work in progress</strong> (<em>ডিফল্ট</em>)</td></tr><tr><td align="center">com.pushwoosh.foreground_service_notification_channel_name</td><td align="center">"com.pushwoosh.start_foreground_service" কী-এর জন্য ফোরগ্রাউন্ড সার্ভিস চালু হলে তৈরি হওয়া নোটিফিকেশনের চ্যানেল নাম সেট করে।</td><td align="center"><strong>Foreground service</strong> (<em>ডিফল্ট)</em></td></tr><tr><td align="center">com.pushwoosh.trusted_package_names</td><td align="center">নির্দিষ্ট প্যাকেজের সাথে Pushwoosh HWID শেয়ার করার অনুমতি দেয়।</td><td align="center">"com.mycompany.myapp1, com.mycompany.myapp2"</td></tr></tbody></table>

## TTL (Time-To-Live) এর মাধ্যমে পুশ নোটিফিকেশন ডিলিট করা

TTL (Time-to-Live) ব্যবহার করে একটি নির্দিষ্ট সময় পরে পুশ নোটিফিকেশন স্বয়ংক্রিয়ভাবে ডিলিট করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

1.  একটি কাস্টম NotificationFactory তৈরি করুন। [আরও জানুন](#customizing-push-notifications)

2.  `onGenerateNotification()` মেথডে, `Notification.Builder` বা `NotificationCompat.Builder` ক্লাস ব্যবহার করে একটি নোটিফিকেশন তৈরি করুন এবং `setTimeoutAfter` মেথড কল করুন:

```java
public class YourNotificationFactory extends PushwooshNotificationFactory {

    @Override
    public Notification onGenerateNotification(@NonNull PushMessage pushMessage) {
        Notification.Builder builder = new Notification.Builder(getApplicationContext(), addChannel(pushData));

        Notification notification = builder.setContentText(pushData.getMessage())
                                           .setContentTitle(title)
                                           .setContentText(text)
                                           // rest of your notification creation code
                                           .setTimeoutAfter(timeout) // time in milliseconds before the notification is canceled
                                           .build();
    }
}

```

## আমাদের সাথে আপনার মতামত শেয়ার করুন

আপনার মতামত আমাদের একটি উন্নত অভিজ্ঞতা তৈরি করতে সাহায্য করে, তাই SDK ইন্টিগ্রেশন প্রক্রিয়ার সময় আপনার কোনো সমস্যা হলে আমরা আপনার কাছ থেকে শুনতে চাই। আপনি যদি কোনো অসুবিধার সম্মুখীন হন, অনুগ্রহ করে [এই ফর্মের](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform) মাধ্যমে আমাদের সাথে আপনার চিন্তা শেয়ার করতে দ্বিধা করবেন না।