Handler
Shoplive Player에서 발생한 알림을 클라이언트에서 Handler
함수를 통해 전달받고 필요한 처리를 합니다.
ShopLive.setHandler
ShopLive event handler입니다.
void setHandler(@NonNull ShopLiveHandler handler)
샘플 코드
import cloud.shoplive.sdk.ShopLive;
import cloud.shoplive.sdk.ShopLiveHandler;
import cloud.shoplive.sdk.ShopLiveHandlerCallback;
public class MainActivity extends AppCompatActivity {
private ShopLiveHandler handler = new ShopLiveHandler() {
@Override
public void handleNavigation(Context context, @NonNull String url) {
Log.d(TAG, "handleNavigation >> url : " + url);
}
@Override
public void onChangeCampaignStatus(@NonNull Context context, @NonNull String campaignStatus) {
Log.d(TAG, "onChangeCampaignStatus >> " + campaignStatus);
}
...
};
private void init() {
ShopLive.setHandler(handler);
}
...
}
- 적용 가이드
ShopLiveHandler.handleNavigation
Shoplive에서 상품, 배너 등을 선택했을 때, 선택한 상품 또는 배너 정보를 전달합니다.
handleNavigation으로 url이 전달되면 플레이어가 PIP로 전환되므로 ShopLive.startPictureInPicture()를 호출하지 않아도 됩니다.
PIP 전환을 원하지 않는다면 ShopLive.setNextActionOnHandleNavigation 인터페이스를 참고하세요.
void handleNavigation(Context context, @NonNull String url) {}
매개변수 | 설명 |
---|---|
url | 상품 또는 배너 선택 시 이동할 URL |
샘플 코드
private ShopLiveHandler handler = new ShopLiveHandler() {
...
@Override
public void handleNavigation(Context context, @NonNull String url) {
ShopLive.ActionType type = {"your_action_type"};
switch (type) {
case PIP:
case CLOSE:
Intent intent = new Intent(SampleActivity.this, WebViewActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("url", url);
startActivity(intent);
break;
case KEEP:
DialogFragment webDialogFragment = new WebViewDialogFragment(url);
ShopLive.showDialogFragment(webDialogFragment);
break;
default:
break;
}
}
...
}
- 적용 가이드
ShopLiveHandler.handleDownloadCoupon
Shoplive에서 쿠폰을 선택(탭) 했을 때 클라이언트로 쿠폰 정보를 전달합니다. 클라이언트의 쿠폰 처리 결과를 Shoplive Android SDK로 다시 전달하는 callback
을 통해 Shoplive Player에서의 쿠폰 상태를 설정합니다.
oid handleDownloadCoupon(@NonNull Context context, @NonNull String couponId, @NonNull ShopLiveHandlerCallback callback) {}
매개변수 | 설명 |
---|---|
context | Context |
couponId | 선택한 쿠폰 ID |
callback | 쿠폰 처리 완료 시 ShopLive로 알려줄 callback |
callback
ShopLiveHandlerCallback.couponResult
callback
ShopLiveHandlerCallback.couponResult쿠폰 다운로드를 완료하였을 때, 결과의 성공 또는 실패 여부, 메시지 등을 전달하기 위해 호출합니다.
/**
* @param isDownloadSuccess - true: 성공, false: 실패
* @param message - 성공 또는 실패 메시지
* @param couponStatus - SHOW: 쿠폰 재활성, HIDE: 쿠폰 숨김, KEEP: 상태 유지
* @param alertType - ALERT: 팝업, TOAST: 메시지
* */
default void couponResult(
@NonNull Boolean isDownloadSuccess,
@Nullable String message,
@NonNull ShopLive.CouponPopupStatus couponStatus,
@Nullable ShopLive.CouponPopupResultAlertType alertType
) {}
샘플 코드
private ShopLiveHandler handler = new ShopLiveHandler() {
...
@Override
public void handleDownloadCoupon(@NonNull Context context, @NonNull String couponId, @NonNull ShopLiveHandlerCallback callback) {
AlertDialog.Builder builder = new AlertDialog.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
);
});
builder.setCancelable(false);
Dialog dialog = builder.create();
dialog.show();
}
...
}
- 적용 가이드
ShopLiveHandler.handleCustomAction
팝업에서 선택 이벤트를 custom
으로 지정하고, 팝업을 선택했을 때 팝업 정보를 전달합니다. 팝업의 id
, type
, payload
를 전달합니다.
void handleCustomAction(@NonNull Context context, @NonNull String id, @NonNull String type, @NonNull String payload, @NonNull ShopLiveHandlerCallback callback) {}
매개변수 | 설명 |
---|---|
context | Context |
id | 쿠폰 또는 배너 ID |
type | 쿠폰 또는 배너 type |
payload | 사용자가 정의한 payload |
callback | custom 처리를 완료했을 때, ShopLive로 알려줄 callback |
callback
ShopLiveHandlerCallback.customActionResult
callback
ShopLiveHandlerCallback.customActionResultcustomAction
처리가 완료 되었을 때, 성공 또는 실패 결과 여부, 메시지 등을 전달하기 위해 호출합니다.
/**
* @param isSuccess - true: 성공, false: 실패
* @param message - 성공 또는 실패 메시지
* @param couponStatus - SHOW: 재활성, HIDE: 숨김, KEEP: 상태 유지
* @param alertType - ALERT: 팝업, TOAST: 메시지
* */
default void customActionResult(
@NonNull Boolean isSuccess,
@Nullable String message,
@NonNull ShopLive.CouponPopupStatus couponStatus,
@Nullable ShopLive.CouponPopupResultAlertType alertType
) {}
샘플 코드
private ShopLiveHandler handler = new ShopLiveHandler() {
...
@Override
public void handleCustomAction(@NonNull Context context, @NonNull String id, @NonNull String type, @NonNull String payload, @NonNull ShopLiveHandlerCallback callback) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("커스텀 액션(팝업)");
builder.setMessage("id: " + id + " type: " + type + " payload: " + payload);
builder.setPositiveButton("성공", (dialog, which) -> {
// 성공했을 때 콜백 설정
callback.couponResult(
true,
"Custom action(Popup) 처리가 성공하였습니다.",
ShopLive.CouponPopupStatus.HIDE,
ShopLive.CouponPopupResultAlertType.TOAST
);
});
builder.setNegativeButton("실패", (dialog, which) -> {
// 실패했을 때 콜백 설정
callback.couponResult(
false,
"Custom action(Popup) 처리가 실패하였습니다.",
ShopLive.CouponPopupStatus.SHOW,
ShopLive.CouponPopupResultAlertType.ALERT
);
});
builder.setCancelable(false);
Dialog dialog = builder.create();
dialog.show();
}
...
}
- 적용 가이드
ShopLiveHandler.handleShare
방송 중 공유하기를 선택했을 때 Handler입니다.
안드로이드 Share Sheet를 사용하지 않고 직접 구현하려면 반드시 override
해야 합니다.
default void handleShare(Context context, String shareUrl) {}
매개변수 | 설명 |
---|---|
context | Context |
shareUrl | 공유할 URL 또는 scheme |
샘플 코드
private ShopLiveHandler handler = new ShopLiveHandler() {
...
@Override
public void handleShare(Context context, String shareUrl) {
// 커스텀 공유 팝업 다이얼로그
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.custom_share_dialog, null);
TextView tvMessage = view.findViewById(R.id.tvMessage);
tvMessage.setText(shareUrl);
Button btCopy = view.findViewById(R.id.btCopy);
Button btKakao = view.findViewById(R.id.btKakao);
Button btLine = view.findViewById(R.id.btLine);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(getString(R.string.sample_share));
builder.setView(view);
Dialog dialog = builder.create();
dialog.show();
btCopy.setOnClickListener(v -> {
Toast.makeText(context, getString(R.string.sample_copy_link), Toast.LENGTH_SHORT).show();
dialog.dismiss();
});
btKakao.setOnClickListener(v -> {
Toast.makeText(context, getString(R.string.sample_share_kakao), Toast.LENGTH_SHORT).show();
dialog.dismiss();
});
btLine.setOnClickListener(v -> {
Toast.makeText(context, getString(R.string.sample_share_line), Toast.LENGTH_SHORT).show();
dialog.dismiss();
});
}
...
}
- 적용 가이드
ShopLiveHandler.onChangeCampaignStatus
방송 상태가 변경되었을 때 Handler입니다.
/**
* @param context - Context
* @param campaignStatus - READY | ONAIR | CLOSED
*/
void onChangeCampaignStatus(@NonNull Context context, @NonNull String campaignStatus) {}
매개변수 | 설명 |
---|---|
context | Context |
campaignStatus | campaignStatusREADY , ONAIR , CLOSED |
샘플 코드
private ShopLiveHandler handler = new ShopLiveHandler() {
...
@Override
public void onChangeCampaignStatus(@NonNull Context context, @NonNull String campaignStatus) {
Log.d(TAG, "onChangeCampaignStatus >> " + campaignStatus);
}
...
}
ShopLiveHandler.onCampaignInfo
JSON Object 형태의 방송 정보입니다.
void onCampaignInfo(@NonNull JSONObject campaignInfo) {}
매개변수 | 설명 |
---|---|
campaignInfo | campaignInfo 예) {'title':'방송 제목'} |
샘플 코드
private ShopLiveHandler handler = new ShopLiveHandler() {
...
@Override
public void onCampaignInfo(@NonNull JSONObject campaignInfo) {
Log.d(TAG, "onCampaignInfo >> " + campaignInfo.toString());
}
...
}
ShopLiveHandler.onChangedPlayerStatus
Shoplive Player 상태를 전달 받습니다.
/**
* @param isPipMode - true:PIP, false:FULL
* @param state - "CREATED" or "DESTROYED"
*/
@Deprecated
default void onChangedPlayerStatus(@NonNull Boolean isPipMode, @NonNull String state) { }
매개변수 | 설명 |
---|---|
isPipMode | 현재 PIP 화면 모드 예) {'title':'방송 제목'} |
state | Shoplive Player 상태CREATED , CLOSING , DESTROYED |
default void onChangedPlayerStatus(@NonNull Boolean isPipMode, @NonNull ShopLive.PlayerLifecycle playerLifecycle) { }
매개변수 | 설명 |
---|---|
isPipMode | 현재 PIP 화면 모드 예) {'title':'방송 제목'} |
playerLifecycle | Shoplive Player 상태CREATED , CLOSING , DESTROYED |
enum PlayerLifecycle | 설명 |
---|---|
CREATED | 플레이어 생성됨 |
CLOSING | 플레이어 종료전 |
DESTROYED | 플레이어 종료됨 |
샘플 코드
private ShopLiveHandler handler = new ShopLiveHandler() {
...
@Override
public void onChangedPlayerStatus(@NonNull Boolean isPipMode, @NonNull ShopLive.PlayerLifecycle playerLifecycle) {
switch(playerLifecycle) {
case ShopLive.PlayerLifecycle.CREATED :
break;
case ShopLive.PlayerLifecycle.CLOSING :
break;
case ShopLive.PlayerLifecycle.DESTROYED :
break;
}
}
...
}
ShopLiveHandler.onSetUserName
사용자 이름이 변경되었을 때 호출됩니다.
default void onSetUserName(JSONObject jsonObject) {}
매개변수 | 설명 |
---|---|
jsonObject | 사용자 정보 예) {'userId':'123', 'userName':'test'} |
샘플 코드
private ShopLiveHandler handler = new ShopLiveHandler() {
...
@Override
public void onSetUserName(JSONObject jsonObject) {
Log.d(TAG, "onSetUserName >> " + jsonObject.toString());
try {
Toast.makeText(SampleActivity.this,
"userId=" + jsonObject.get("userId") + ", userName=" + jsonObject.get("userName"),
Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
...
}
ShopLiveHandler.handlePreview
ShopLive 미리보기 화면을 선택했을 때 Handler입니다.
미리보기 화면을 선택하면 해당 방송으로 진입합니다. (기본값)
방송에 진입하지 않고, 직접 구현하려면 반드시 override
해야 합니다.
단, 다른 앱 위에 표시
로 제공 되는 미리보기 화면에서만 이벤트가 전달됩니다.
OS PIP
에서는 미리보기 이벤트가 전달되지 않고, 자동으로 전체 화면 방송으로 진입합니다.
default void handlePreview(@NonNull Context context, @NonNull String campaignKey) {}
매개변수 | 설명 |
---|---|
context | Context |
campaignKey | 캠페인(방송) 키 |
샘플 코드
private ShopLiveHandler handler = new ShopLiveHandler() {
...
@Override
public void handlePreview(@NonNull Context context, @NonNull String campaignKey) {
Log.d(TAG, "ck=" + campaignKey);
}
...
}
- 적용 가이드
ShopLiveHandler.onReceivedCommand
command
명령어를 받았을 때 호출됩니다.
default void onReceivedCommand(@NonNull Context context, @NonNull String command, @NonNull JSONObject data) {}
매개변수 | 설명 |
---|---|
context | Context |
command | 전달된 명령어 |
data | 전달된 데이터 |
CLICK_PRODUCT_DETAIL
사용자가 방송 화면에서 상품 목록을 열고, 상품을 선택하면 전달되는 상품 정보입니다.
command:
CLICK_PRODUCT_DETAIL
payload:
{
action = 링크;
brand = 브랜드;
sku = product01234;
url = "http://product.com";
}
CLICK_PRODUCT_CART
사용자가 방송 화면에서 상품 목록을 열고, 장바구니 버튼을 선택하면 전달되는 장바구니 정보입니다.
command:
CLICK_PRODUCT_CART
payload:
{
action = LINK;
brand = "company brand";
...
url = "https://company.com/product/12345/detail";
}
LOGIN_REQUIRED
Shoplive Android SDK가 적용되는 앱에 로그인이 필요할 때 전달되는 로그인 동작을 요청합니다.
command:
LOGIN_REQUIRED
payload: 없음
ON_SUCCESS_CAMPAIGN_JOIN
방송 진입에 성공했을 때 전달되는 정보입니다.
command:
ON_SUCCESS_CAMPAIGN_JOIN
payload:
{
isGuest: 1 // 1: 게스트, 0: 인증 사용자
}
샘플 코드
private ShopLiveHandler handler = new ShopLiveHandler() {
...
@Override
public void onReceivedCommand(@NonNull Context context, @NonNull String command, @NonNull JSONObject data) {
Log.d(TAG, "onReceivedCommand >> command:" + command + "data:" + data.toString());
switch(command) {
case "LOGIN_REQUIRED" :
{
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(getString(R.string.alert_need_login));
builder.setPositiveButton(getString(R.string.yes), ((dialog, which) -> {
}));
Dialog dialog = builder.create();
dialog.show();
}
break;
}
}
...
}
```
ShopLive.setNextActionOnHandleNavigation
사용자가 상품, 공지사항, 배너 등 링크를 선택하였을 때, Shoplive Player의 다음 동작을 설정합니다.
void setNextActionOnHandleNavigation(ActionType type)
enum
ActionType
매개변수 | 설명 |
---|---|
PIP | PIP 전환 |
KEEP | 상태 유지 |
CLOSE | 종료 |
샘플 코드
ShopLive.setNextActionOnHandleNavigation(ActionType.PIP)
ShopLive.showDialogFragment
Shoplive Player 화면에 사용자의 DialogFragment
를 표시하기 위해 사용합니다.
void showDialogFragment(DialogFragment dialogFragment)
매개변수 | 설명 |
---|---|
dialogFragment | 사용자의 DialogFragment |
샘플 코드
override fun handleNavigation(context: Context, url: String) {
val nexcActionType = "{your_action_type}"
when(nexcActionType) {
ShopLive.ActionType.KEEP -> {
ShopLive.showDialogFragment(WebViewDialogFragment(url))
}
}
}
ShopLive.setEndpoint
Shoplive Player의 Web Landing 페이지가 아닌 특정 Landing 페이지 또는 URL에서 Shoplive 서비스를 사용해야 할 때 사용합니다.
예를 들어, 보안으로 인해 Shoplive Landing 페이지를 사용할 수 없는 경우, 특정 도메인으로 Landing 페이지를 생성할 수 있습니다.
※ Shoplive Player의 Web Landing 페이지는 Shoplive와 협의 후 적용할 수 있습니다.
void setEndpoint(String url)
매개변수 | 설명 |
---|---|
url | Shoplive Player의 Web Landing url |
샘플 코드
ShopLive.setEndpoint("https://www.your_landingpage.com/")
ShopLiveHandler.onError
방송 전 또는 방송 중 발생하는 오류 상황에 관한 메시지를 전달합니다.
void onError(@NonNull Context context, @NonNull String code, @NonNull String message) {}
매개변수 | 설명 |
---|---|
context | Context |
code | 오류 코드 |
message | 오류 메시지 |
샘플 코드
private ShopLiveHandler handler = new ShopLiveHandler() {
...
@Override
public void onError(@NonNull Context context, @NonNull String code, @NonNull String message) {
Log.d(TAG, "code:" + code + ", message:" + message);
}
...
}
Updated over 2 years ago