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에서 상품, 배너 등을 선택했을 때, 선택한 상품 또는 배너 정보를 전달합니다.
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