Event handler

    Event handler


    기사 요약

    Shoplive Player에서 발생한 알림을 클라이언트에서 Handler 함수를 통해 전달받고 필요한 처리를 합니다.

    ShopLive.setHandler

    ShopLive event handler입니다.

    fun setHandler(handler: ShopLiveHandler)

    Sample code

    class MainActivity : AppCompatActivity() {
    
        private val handler = object : ShopLiveHandler() {
    
            override fun handleNavigation(context: Context, url: String) {
              	Log.d(TAG, "handleNavigation >> url=$url")
            }
    
            override fun onChangeCampaignStatus(context: Context, campaignStatus: String) {
              	Log.d(TAG, "onChangeCampaignStatus >> $campaignStatus")
            }
        }
    
        private fun init() {
          	ShopLive.setHandler(handler)
        }
    }


    ShopLiveHandler.handleNavigation

    Shoplive에서 상품, 배너 등을 선택했을 때, 선택한 상품 또는 배너 정보를 전달합니다.

    handleNavigation으로 url이 전달되면 플레이어가 PIP로 전환되므로 ShopLive.startPictureInPicture()를 호출하지 않아도 됩니다.

    PIP 전환을 원하지 않는다면 ShopLive.setNextActionOnHandleNavigation 인터페이스를 참고하세요.

    fun handleNavigation(context: Context, url: String)

    Parameter name

    Type

    Description

    url

    String

    상품 또는 배너 선택 시 이동할 URL

    Sample code

    private val handler = object : ShopLiveHandler() {
        override fun handleNavigation(context: Context, url: String) {
            val type: ActionType = "your_action_type"
            when (type) {
                ActionType.PIP, ActionType.CLOSE -> {
                    val intent: Intent = Intent(this@SampleActivity, WebViewActivity::class.java)
                    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
                    intent.putExtra("url", url)
                    startActivity(intent)
                }
                ActionType.KEEP -> {
                    val webDialogFragment = WebViewDialogFragment(url)
                    ShopLive.showDialogFragment(webDialogFragment)
                }
            }
        }
    }

    Coupon

    쿠폰 처리를 완료할 때 쿠폰 활성 여부를 설정하기 위한 상태입니다.

    public enum CouponPopupStatus {
        SHOW,  // 쿠폰 다시 활성
        HIDE,  // 쿠폰 사라짐
        KEEP   // 상태 유지
    }

    쿠폰 처리를 완료할 때 알림 메시지가 있으면 나타나는 타입을 설정합니다.

    public enum CouponPopupResultAlertType {
        ALERT,  // 얼럿
        TOAST   // 토스트
    }


    ShopLiveHandler.handleDownloadCoupon

    Shoplive에서 쿠폰을 선택(탭) 했을 때 클라이언트로 쿠폰 정보를 전달합니다. 클라이언트의 쿠폰 처리 결과를 Shoplive Android SDK로 다시 전달하는 callback을 통해 Shoplive Player에서의 쿠폰 상태를 설정합니다.

    fun handleDownloadCoupon(context: Context, couponId: String, callback: ShopLiveHandlerCallback)

    Parameter name

    Type

    Description

    context

    Context

    Context

    couponId

    String

    선택한 쿠폰 ID

    callback

    ShopLiveHandlerCallback

    쿠폰 처리 완료 시 ShopLive로 알려줄 callback

    callback ShopLiveHandlerCallback.couponResult

    쿠폰 다운로드를 완료하였을 때, 결과의 성공 또는 실패 여부, 메시지 등을 전달하기 위해 호출합니다.

    /**
    * @param isDownloadSuccess - true: 성공, false: 실패
    * @param message - 성공 또는 실패 메시지
    * @param couponStatus - SHOW: 쿠폰 재활성, HIDE: 쿠폰 숨김, KEEP: 상태 유지
    * @param alertType - ALERT: 팝업, TOAST: 메시지
    * */
    fun couponResult(
        isDownloadSuccess: Boolean, 
        message: String?, 
        couponStatus: ShopLive.CouponPopupStatus, 
        alertType: ShopLive.CouponPopupResultAlertType) {}

    Sample code

    private val handler = object : ShopLiveHandler() {
        override fun handleDownloadCoupon(
          context: Context,
          couponId: String,
          callback: ShopLiveHandlerCallback
        ) {
            val builder: AlertDialog.Builder = Builder(context)
            builder.setTitle("쿠폰 다운로드")
            builder.setMessage("couponId $couponId")
            builder.setPositiveButton("성공") { dialog, which ->
                // 성공했을 때 callback 설정
                callback.couponResult(
                  true,
                  "쿠폰을 다운로드했습니다.",
                  ShopLive.CouponPopupStatus.HIDE,
                  ShopLive.CouponPopupResultAlertType.TOAST
                )
            }
    
            builder.setNegativeButton("실패") { dialog, which ->
                // 실패했을 때 callback 설정
                callback.couponResult(
                  false,
                  "쿠폰을 다운로드하지 못했습니다.",
                  ShopLive.CouponPopupStatus.SHOW,
                  ShopLive.CouponPopupResultAlertType.ALERT
                )
            }
            val dialog: Dialog = builder.create()
            dialog.show() 
        }
    }


    ShopLiveHandler.handleCustomAction

    팝업에서 선택 이벤트를 custom으로 지정하고, 팝업을 선택했을 때 팝업 정보를 전달합니다. 팝업의 idtypepayload를 전달합니다.

    fun handleCustomAction(context: Context, id: String, type: String, payload: JSONObject, callback: ShopLiveHandlerCallback)

    Parameter name

    Type

    Description

    context

    Context

    Context

    id

    String

    쿠폰 또는 배너 ID

    type

    String

    쿠폰 또는 배너 type

    payload

    JSONObject

    사용자가 정의한 payload

    callback

    ShopLiveHandlerCallback

    custom 처리를 완료했을 때, ShopLive로 알려줄 callback

    callback ShopLiveHandlerCallback.customActionResult

    customAction 처리가 완료 되었을 때, 성공 또는 실패 결과 여부, 메시지 등을 전달하기 위해 호출합니다.

    /**
    * @param isSuccess - true: 성공, false: 실패
    * @param message - 성공 또는 실패 메시지
    * @param couponStatus - SHOW: 재활성, HIDE: 숨김, KEEP: 상태 유지
    * @param alertType - ALERT: 팝업, TOAST: 메시지
    * */
    fun customActionResult(
        isSuccess: Boolean, 
        message: String?, 
        couponStatus: ShopLive.CouponPopupStatu, 
        alertType: ShopLive.CouponPopupResultAlertType?) {}

    Sample code

    private val handler = object : ShopLiveHandler() {
        override fun handleDownloadCoupon(
          context: Context,
          couponId: String,
          callback: ShopLiveHandlerCallback
        ) {
            val builder: AlertDialog.Builder = Builder(context)
            builder.setTitle("쿠폰 다운로드")
            builder.setMessage("couponId $couponId")
            builder.setPositiveButton("성공") { dialog, which ->
                // 성공했을 때 callback 설정
                callback.couponResult(
                  true,
                  "쿠폰을 다운로드했습니다.",
                  ShopLive.CouponPopupStatus.HIDE,
                  ShopLive.CouponPopupResultAlertType.TOAST
                )
            }
    
            builder.setNegativeButton("실패") { dialog, which ->
                // 실패했을 때 callback 설정
                callback.couponResult(
                  false,
                  "쿠폰을 다운로드하지 못했습니다.",
                  ShopLive.CouponPopupStatus.SHOW,
                  ShopLive.CouponPopupResultAlertType.ALERT
                )
            }
            val dialog: Dialog = builder.create()
            dialog.show() 
        }
    }


    ShopLiveHandler.handleShare

    방송 중 공유하기를 선택했을 때 Handler입니다. 안드로이드 Share Sheet를 사용하지 않고 직접 구현하려면 반드시 override해야 합니다.

    fun handleShare(context: Context, data: ShopLivePlayerShareData) {}

    Parameter name

    Type

    Description

    context

    Context

    Context

    data

    ShopLivePlayerShareData

    ShopLivePlayerShareData

    type

    String

    쿠폰 또는 배너 type

    payload

    JSONObject

    사용자가 정의한 payload

    callback

    ShopLiveHandlerCallback

    custom 처리를 완료했을 때, ShopLive로 알려줄 callback

    ShopLivePlayerShareData

    Property name

    Type

    Description

    campaign

    ShopLivePlayerShareCampaign?

    Campaign 정보

    url

    String?

    ShopLive.setShareScheme()으로 적용 된 주

    ShopLivePlayerShareData

    Property name

    Type

    Description

    campaignKey

    String?

    Campaign Key

    title

    String?

    Campaign 제목

    description

    String?

    Campaign 설명

    thumbnail

    String?

    Campaign 배경화면

    Sample code

    private val handler = object : ShopLiveHandler() {
        override fun handleShare(context: Context?, data: ShopLivePlayerShareData) {
          	Toast.makeText(context, "url=${data.url}", Toast.LENGTH_SHORT).show()
        } 
    }


    ShopLiveHandler.onChangeCampaignStatus

    방송 상태가 변경되었을 때 Handler입니다.

    /**
    * @param context - Context
    * @param campaignStatus - READY | ONAIR | CLOSED
    */
    fun onChangeCampaignStatus(context: Context, campaignStatus: String) {}

    Parameter name

    Type

    Description

    context

    Context

    Context

    campaignStatus

    String

    campaignStatus: READY, ONAIR, CLOSED

    Sample code

    private val handler = object : ShopLiveHandler() {
        override fun onChangeCampaignStatus(context: Context, campaignStatus: String) {
          	Log.d(TAG, "onChangeCampaignStatus >> $campaignStatus")
        }
    }


    ShopLiveHandler.onCampaignInfo

    JSON Object 형태의 방송 정보입니다.

    fun onCampaignInfo(campaignInfo: JSONObject) {}

    Parameter name

    Type

    Description

    campaignInfo

    JSONObject

    campaignInfo

    예) {'title':'방송 제목'}

    Sample code

    private val handler = object : ShopLiveHandler() {
        override fun onCampaignInfo(campaignInfo: JSONObject) {
          	Log.d(TAG, "onCampaignInfo >> $campaignInfo") 
        }
    }


    ShopLiveHandler.onChangedPlayerStatus

    Shoplive Player 상태를 전달 받습니다.

    fun onChangedPlayerStatus(isPipMode: Boolean, playerLifecycle: ShopLive.PlayerLifecycle) { }

    Parameter name

    Type

    Description

    isPipMode

    Boolean

    현재 PIP 여부

    playerLifecycle

    ShopLive.PlayerLifecycle

    Shoplive Player 상태: CREATED, CLOSING, DESTROYED

    enum PlayerLifecycle

    Value

    Description

    CREATED

    플레이어 생성됨

    CLOSING

    플레이어 종료전

    DESTROYED

    플레이어 종료됨

    Sample code

    private val handler = object : ShopLiveHandler() {
        override fun onChangedPlayerStatus(
          isPipMode: Boolean,
          playerLifecycle: ShopLive.PlayerLifecycle) {
            when(playerLifecycle) {
                ShopLive.PlayerLifecycle.CREATED -> {
    
                }
                ShopLive.PlayerLifecycle.CLOSING -> {
    
                }
                ShopLive.PlayerLifecycle.DESTROYED -> {
    
                }
            }
        }
    }


    ShopLiveHandler.onSetUserName

    사용자 이름이 변경되었을 때 호출됩니다.

    fun onSetUserName(jsonObject: JSONObject) {}

    Parameter name

    Type

    Description

    jsonObject

    JSONObject

    사용자 정보

    예) {'userId':'123', 'userName':'test'}

    Sample code

    private val handler = object : ShopLiveHandler() {
        override fun onSetUserName(jsonObject: JSONObject?) {
         	 Log.d(TAG, "onSetUserName >> $jsonObject")
        }
    }


    ShopLiveHandler.handlePreview

    Shoplive 미리보기 화면을 선택했을 때 Handler입니다.

    미리보기 화면을 선택하면 해당 방송으로 진입합니다. (기본값) 방송에 진입하지 않고, 직접 구현하려면 반드시 override해야 합니다. 단, 다른 앱 위에 표시로 제공 되는 미리보기 화면에서만 이벤트가 전달됩니다. OS PIP에서는 미리보기 이벤트가 전달되지 않고, 자동으로 전체 화면 방송으로 진입합니다.

    fun handlePreview(context: Context, campaignKey: String) {}

    Parameter name

    Type

    Description

    context

    Context

    Context

    campaignKey

    String

    캠페인(방송) 키

    Sample code

    private val handler = object : ShopLiveHandler() {
        override fun handlePreview(context: Context, campaignKey: String) {
          	Log.d(TAG, "campaignKey=$campaignKey") 
        }
    }


    ShopLiveHandler.onReceivedCommand

    command 명령어를 받았을 때 호출됩니다.

    fun onReceivedCommand(context: Context, command: String, data: JSONObject) {}

    Parameter name

    Type

    Description

    context

    Context

    Context

    command

    String

    전달된 명령어

    data

    JSONObject

    전달된 데이터

    Sample code

    private val handler = object : ShopLiveHandler() {
        override fun onReceivedCommand(context: Context, command: String, data: JSONObject) {
            when(command) {
                "LOGIN_REQUIRED" -> {
    
                }
                "CLICK_PRODUCT_CART" -> {
    
                }
                "EVENT_LOG" -> {
                    // parsing example 1
                    val name = data.getString("name")
                    val feature = data.getString("feature")
                    val parameter = data.getString("parameter")
                    Toast.makeText(
                        context,
                        "name : $name, feature : $feature, parameter : $parameter",
                        Toast.LENGTH_SHORT
                    ).show()
                    // parsing example 2
                    val log = Gson().fromJson(data.toString(), ShopLiveLog.Data::class.java)
                    if (Options.isShowClickLog()) {
                    Toast.makeText(
                        context,
                        "name : ${log.name}, feature : ${log.feature}, campaignKey : ${log.campaignKey}, parameter : ${log.parameter}",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }
        }
    }

    ShopLiveHandler.onEvent

    사용자 행동을 추적할 수 있습니다.

    ShopLiveLog.Data

    Property name

    Type

    Description

    name

    String

    Event 의 이름

    feature

    String

    Event 의 종류 click, show, action

    campaignKey

    String?

    방송의 Unique Key

    parameter

    Map<String, Any>?

    관련 추가 parameter

    Sample code

    private val handler = object : ShopLiveHandler() {
        ...
        override fun onEvent(context: Context, data: ShopLiveLog.Data) {
            Log.d(TAG, "name=${data.name} feature=${data.feature} campaignKey=${data.campaignKey} parameter=${data.parameter}")
        }
        ...
    }


    ShopLiveHandler.onError

    방송 전 또는 방송 중 발생하는 오류 상황에 관한 메시지를 전달합니다.

    fun onError(context: Context, code: String, message: String) {}

    Parameter name

    Type

    Description

    context

    Context

    Context

    code

    String

    오류 코드

    message

    String

    오류 메시지

    Sample code

    private val handler = object : ShopLiveHandler() {
        override fun onError(context: Context, code: String, message: String) {
          	Log.d(TAG, "code=$code, message=$message")
        }
    }


    What's Next