# คู่มือการย้ายข้อมูล

### การย้ายข้อมูลจาก Android SDK 5 ไปยัง 6

1. ย้ายโปรเจกต์ของคุณไปยัง AndroidX ตาม [เอกสารอย่างเป็นทางการ](https://developer.android.com/jetpack/androidx/migrate)
2. เพิ่มโมดูลใหม่ในไฟล์ **build.gradle** ของแอป หากคุณใช้ **Firebase Cloud Messaging**

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

สำหรับผู้ที่ใช้ **Amazon** และไม่ได้ใช้ **Firebase** ไม่จำเป็นต้องมีการเปลี่ยนแปลงใดๆ

### การย้ายข้อมูลจาก Android SDK เวอร์ชันก่อนหน้า

คลาสและเมธอดส่วนใหญ่ของ Pushwoosh กลายเป็น deprecated ตั้งแต่เวอร์ชัน 5.0 และบางส่วนก็ถูกยกเลิกไปแล้ว คลาส **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** เคยใช้เพื่อจัดการเหตุการณ์การลงทะเบียนและยกเลิกการลงทะเบียน push ปัจจุบัน receiver นี้ถูกแทนที่ด้วยกลไก callback แบบง่าย:

```java
Pushwoosh.getInstance().registerForPushNotifications(result -> {
    if (result.isSuccess()) {
        String token = result.getData();
        // จัดการการลงทะเบียนสำเร็จ
    }
    else {
        PushwooshException exception = result.getException();
        // จัดการข้อผิดพลาดในการลงทะเบียน
    }
});
```

## BasePushMessageReceiver

**BasePushMessageReceiver** เคยใช้เพื่อเลียนแบบพฤติกรรมการแจ้งเตือนของ iOS เมื่อได้รับ push notification ขณะที่แอปพลิเคชันอยู่เบื้องหน้า ทำได้โดยการยกเลิกการแจ้งเตือนที่เข้ามาและเรียกใช้ callback **onMessageReceive** ซึ่งเป็นวิธีที่ยุ่งยากและต้องมีการลงทะเบียนด้วยตนเองเมื่อแอปพลิเคชันทำงานและยกเลิกการลงทะเบียนเมื่อแอปพลิเคชันย้ายไปอยู่เบื้องหลัง\
receiver นี้ถูกแทนที่ด้วย **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);
            });

            // นี่แสดงว่าไม่ควรแสดงการแจ้งเตือน
            return true;
        }

        return false;
    }

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

    @MainThread
    private void handlePush(PushMessage message) {
        // TODO: จัดการ push message
    }
}
```

extension นี้ยังใช้เพื่อจัดการการมาถึงของการแจ้งเตือนและเหตุการณ์การยอมรับ ซึ่งจะมาแทนที่โค้ดที่ยุ่งยากทั้งหมดที่เคยใช้ในการรวม Activity ด้วยตนเอง

## PushFragment

**PushFragment** เป็นทางเลือกที่เบากว่าสำหรับการรวมระบบที่ซับซ้อนซึ่งเกี่ยวข้องกับวงจรชีวิตของ Activity แต่อีกด้านหนึ่งก็ต้องมีการสืบทอด **FragmentActivity** และใช้วงจรชีวิตของ Fragment ที่ซับซ้อนกว่าโดยปริยาย\
**PushFragment** และ **PushEventListener** ถูกแทนที่ด้วย **Pushwoosh#registerForPushNotifications(Callback)** และ **NotificationServiceExtension** แล้ว

## Custom Push Broadcast Receiver (PW\_NOTIFICATION\_RECEIVER)

**PW\_NOTIFICATION\_RECEIVER** เคยใช้เพื่อปรับแต่งพฤติกรรมเมื่อผู้ใช้คลิกการแจ้งเตือน ซึ่งช่วยให้สามารถจัดการการแจ้งเตือนนอกบริบทของ Activity และเปิด Activity ที่แตกต่างกันได้ขึ้นอยู่กับเนื้อหาของการแจ้งเตือน การรวมระบบนี้ใช้ Pushwoosh SDK API ภายในซึ่งไม่มีอยู่อีกต่อไปแล้ว\
receiver นี้ถูกแทนที่ทั้งหมดด้วย **NotificationServiceExtension**:

```java title="YourNotificationServiceExtension.java"
public class YourNotificationServiceExtension extends NotificationServiceExtension {
    @Override
    protected void startActivityForPushMessage(PushMessage message) {
    	// super.startActivityForPushMessage() จะเริ่ม Activity ตัวเปิดใช้งานเริ่มต้น
    	// หรือ Activity ที่ทำเครื่องหมายด้วย ${applicationId}.MESSAGE action
    	// เพียงแค่ไม่ต้องเรียกใช้เพื่อแทนที่พฤติกรรมนี้
        // super.startActivityForPushMessage(message);

        // เริ่ม Activity ของคุณแทน:
        Intent launchIntent  = new Intent(getApplicationContext(), YourActivity.class);
        launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

        // (ไม่บังคับ) ส่งข้อมูลการแจ้งเตือนไปยัง Activity
        launchIntent.putExtra(Pushwoosh.PUSH_RECEIVE_EVENT, message.toJson().toString());

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

## Notification Factory

นอกจากนี้ยังมีการเปลี่ยนแปลงที่สำคัญบางอย่างที่เกี่ยวข้องกับ notification factory:

**1.** **AbsNotificationFactory** ถูกแทนที่ด้วย **NotificationFactory**\
**2.** เมธอด **AbsNotificationFactory#onPushReceived(PushData)** และ **AbsNotificationFactory#onPushHandle(Activity)** ถูกแทนที่ด้วยคลาส **NotificationServiceExtension** (**onMessageReceived**, **startActivityForPushMessage**).\
**3.** **DefaultNotificationFactory** ถูกแทนที่ด้วย **PushwooshNotificationFactory**.\
**4.** **PushData** ถูกแทนที่ด้วย **PushMessage**.

## In-App Messages

**1.** **InAppFacade** ถูกแทนที่ด้วย **PushwooshInApp**.\
**2.** ออบเจกต์ `pushwoosh` ถูกนำมาใช้สำหรับอินเทอร์เฟซ JavaScript native พร้อม API ดังต่อไปนี้:\
**getHwid(): string** - ส่งคืน pushwoosh hwid สำหรับอุปกรณ์ปัจจุบัน\
**getVersion(): string** - ส่งคืนเวอร์ชัน Pushwoosh SDK ปัจจุบัน\
**postEvent(event: string, attributes?: object, successCallback?: function, errorCallback?: function)** - ส่งคำขอ postEvent\
**sendTags(tags: object)** - ส่ง tags ที่เกี่ยวข้องกับอุปกรณ์ปัจจุบัน\
**getTags(successCallback: function, errorCallback?: function)** - ส่งคืน tags ที่เกี่ยวข้องกับอุปกรณ์ปัจจุบัน\
**closeInApp()** - ปิดหน้า HTML In-App

## แบ่งปันความคิดเห็นของคุณกับเรา

ความคิดเห็นของคุณช่วยให้เราสร้างประสบการณ์ที่ดีขึ้น ดังนั้นเรายินดีรับฟังจากคุณหากคุณมีปัญหาใดๆ ในระหว่างกระบวนการ SDK integration หากคุณประสบปัญหาใดๆ โปรดอย่าลังเลที่จะแบ่งปันความคิดเห็นของคุณกับเรา [ผ่านแบบฟอร์มนี้](https://docs.google.com/forms/d/e/1FAIpQLSd\_0b8jwn-V\_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform)