# মাইগ্রেশন গাইড

### Android SDK 5 থেকে 6-এ মাইগ্রেশন

1. [অফিসিয়াল ডকুমেন্টেশন](https://developer.android.com/jetpack/androidx/migrate) অনুযায়ী আপনার প্রজেক্টটি AndroidX-এ মাইগ্রেট করুন।
2. আপনি যদি **Firebase Cloud Messaging** ব্যবহার করেন, তাহলে অ্যাপের **build.gradle** ফাইলে একটি নতুন মডিউল যোগ করুন।

```groovy title="build.gradle"
implementation 'com.pushwoosh:pushwoosh-firebase:+'
```

যারা **Amazon** ব্যবহার করেন এবং **Firebase** ব্যবহার করেন না, তাদের জন্য কোনো পরিবর্তনের প্রয়োজন নেই।

### Android SDK-এর পূর্ববর্তী সংস্করণ থেকে মাইগ্রেশন

5.0 রিলিজের পর থেকে বেশিরভাগ Pushwoosh ক্লাস এবং মেথড অবচিত হয়ে গেছে এবং কিছু বিলুপ্ত হয়ে গেছে। **PushManager**, **BasePushMessageReceiver**, **BaseRegistrationReceiver**, **SendPushTagsCallback**, **PushFragment** এবং **PushEventListener** ক্লাসগুলো এখনও `com.pushwoosh:pushwoosh-deprecated` লাইব্রেরির অংশ হিসেবে উপলব্ধ আছে, কিন্তু যত তাড়াতাড়ি সম্ভব নতুন API-তে মাইগ্রেট করার পরামর্শ দেওয়া হচ্ছে।

## PushManager

**PushManager** বিভিন্ন ফিচারের জন্য বিভিন্ন মেথড নিয়ে গঠিত ছিল। এই মেথডগুলো এখন বিভিন্ন ক্লাস এবং লাইব্রেরিতে বিভক্ত করা হয়েছে:\
`com.pushwoosh:pushwoosh`: **Pushwoosh**, **PushwooshNotificationSettings**, **PushwooshInApp**।\
`com.pushwoosh:pushwoosh-badge`: **PushwooshBadge**।\
`com.pushwoosh:pushwoosh-location`: **PushwooshLocation**।\
`com.pushwoosh:pushwoosh-beacon`: **PushwooshBeacon**।

## BaseRegistrationReceiver

**BaseRegistrationReceiver** পুশ রেজিস্ট্রেশন এবং আনরেজিস্ট্রেশন ইভেন্টগুলো পরিচালনা করার জন্য ব্যবহৃত হত। এই রিসিভারটি এখন একটি সাধারণ কলব্যাক মেকানিজম দ্বারা প্রতিস্থাপিত হয়েছে:

```java
Pushwoosh.getInstance().registerForPushNotifications(result -> {
    if (result.isSuccess()) {
        String token = result.getData();
        // handle successful registration
    }
    else {
        PushwooshException exception = result.getException();
        // handle registration error
    }
});
```

## BasePushMessageReceiver

**BasePushMessageReceiver** ফোরগ্রাউন্ডে পুশ নোটিফিকেশন পাওয়ার সময় iOS নোটিফিকেশনের আচরণ অনুকরণ করতে ব্যবহৃত হত। এটি ইনকামিং নোটিফিকেশন বাতিল করে এবং **onMessageReceive** কলব্যাক চালু করে অর্জন করা হয়েছিল। এটি বেশ জটিল ছিল এবং অ্যাপ্লিকেশন সক্রিয় হলে ম্যানুয়াল রেজিস্ট্রেশন এবং অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে গেলে ডি-রেজিস্ট্রেশন প্রয়োজন হত।\
এই রিসিভারটি **NotificationServiceExtension** দ্বারা প্রতিস্থাপিত হয়েছে:

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

```java title="YourNotificationServiceExtension.java"
public class YourNotificationServiceExtension extends NotificationServiceExtension {
    @Override
    public boolean onMessageReceived(final PushMessage message) {
        if (isAppOnForeground()) {
            Handler mainHandler = new Handler(getApplicationContext().getMainLooper());
            mainHandler.post(() -> {
                handlePush(message);
            });

            // this indicates that notification should not be displayed
            return true;
        }

        return false;
    }

    @Override
    protected void startActivityForPushMessage(PushMessage message) {
        super.startActivityForPushMessage(message);
        handlePush(message);
    }

    @MainThread
    private void handlePush(PushMessage message) {
        // TODO: handle push message
    }
}
```

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

## PushFragment

**PushFragment** অ্যাক্টিভিটি লাইফসাইকেল জড়িত জটিল ইন্টিগ্রেশনের জন্য একটি হালকা বিকল্প ছিল। কিন্তু অন্যদিকে, এর জন্য **FragmentActivity** ইনহেরিটেন্স প্রয়োজন ছিল এবং এটি পরোক্ষভাবে আরও জটিল ফ্র্যাগমেন্ট লাইফসাইকেল ব্যবহার করত।\
**PushFragment** এবং **PushEventListener** এখন **Pushwoosh#registerForPushNotifications(Callback)** এবং **NotificationServiceExtension** দ্বারা প্রতিস্থাপিত হয়েছে।

## কাস্টম পুশ ব্রডকাস্ট রিসিভার (PW_NOTIFICATION_RECEIVER)

**PW_NOTIFICATION_RECEIVER** ব্যবহারকারী যখন নোটিফিকেশনে ক্লিক করে তখন আচরণ কাস্টমাইজ করতে ব্যবহৃত হত। এটি অ্যাক্টিভিটি কনটেক্সটের বাইরে নোটিফিকেশন পরিচালনা করতে এবং নোটিফিকেশনের বিষয়বস্তুর উপর নির্ভর করে বিভিন্ন অ্যাক্টিভিটি খুলতে সাহায্য করত। এই ইন্টিগ্রেশনটি অভ্যন্তরীণ Pushwoosh SDK API ব্যবহার করত যা এখন আর বিদ্যমান নেই।\
এই রিসিভারটি এখন সম্পূর্ণরূপে **NotificationServiceExtension** দ্বারা প্রতিস্থাপিত হয়েছে:

```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);
    }
}
```

## নোটিফিকেশন ফ্যাক্টরি

নোটিফিকেশন ফ্যাক্টরি সম্পর্কিত কিছু ব্রেকিং পরিবর্তনও ছিল:

**1.** **AbsNotificationFactory**-কে **NotificationFactory** দ্বারা প্রতিস্থাপিত করা হয়েছে\
**2.** **AbsNotificationFactory#onPushReceived(PushData)** এবং **AbsNotificationFactory#onPushHandle(Activity)** মেথডগুলো **NotificationServiceExtension** ক্লাস (**onMessageReceived**, **startActivityForPushMessage**) দ্বারা প্রতিস্থাপিত হয়েছে।\
**3.** **DefaultNotificationFactory**-কে **PushwooshNotificationFactory** দ্বারা প্রতিস্থাপিত করা হয়েছে।\
**4.** **PushData**-কে **PushMessage** দ্বারা প্রতিস্থাপিত করা হয়েছে।

## ইন-অ্যাপ মেসেজ

**1.** **InAppFacade**-কে **PushwooshInApp** দ্বারা প্রতিস্থাপিত করা হয়েছে।\
**2.** JavaScript নেটিভ ইন্টারফেসের জন্য `pushwoosh` অবজেক্টটি নিম্নলিখিত API সহ চালু করা হয়েছে:\
**getHwid(): string** - বর্তমান ডিভাইসের জন্য pushwoosh hwid প্রদান করে।\
**getVersion(): string** - বর্তমান pushwoosh SDK সংস্করণ প্রদান করে।\
**postEvent(event: string, attributes?: object, successCallback?: function, errorCallback?: function)** - postEvent অনুরোধ পাঠায়।\
**sendTags(tags: object)** - বর্তমান ডিভাইসের সাথে যুক্ত ট্যাগ পাঠায়।\
**getTags(successCallback: function, errorCallback?: function)** - বর্তমান ডিভাইসের সাথে যুক্ত ট্যাগ প্রদান করে।\
**closeInApp()** - ইন-অ্যাপ html পেজ বন্ধ করে।

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

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