커스터마이징 절전 상태 UI

절전 상태 UI 기본 구성

절전 상태 UI란 왼쪽의 스크린샷에서 상단 부분에 보이는 하얀 배경의 네모 영역을 말합니다. 절전 상태 UI는 BaseLockerActivity에 속해 있으므로, 절전 상태 UI를 직접 구현하기 위해서는 BaseLockerActivity를 확장한 CustomLockerActivity를 구현해야 합니다. 구현에 참고하거나 구현해야 할 클래스들을 아래에 정리하였습니다.

 

  • BaseLockerActivity: 잠금화면을 위한 추상 클래스입니다.

    • isBatteryGuideEnabled()true를 반환하는 경우, 기본 절전 상태 UI를 표시합니다.

    • SimpleLockerActivity: SDK에서 기본으로 사용하는 구현체입니다.

  • 절전 상태 UI는 MVP 패턴으로 구현되어 있습니다.

    • BatteryBannerContract.Presenter : 절전 상태 UI의 프리젠터입니다.

      • BatteryBannerPresenter: 구현체입니다. 절전 상태 UI를 표시해야 하는 상황인지 체크하고, View를 보이거나 보이지 않게 합니다.

    • BatteryBannerContract.View: 절전 상태 UI의 뷰입니다.

      • BatteryBannerView: 구현체입니다.

    • R.layout.view_battery_guide_banner: 절전 상태 UI의 기본 레이아웃입니다. 언제든 변경될 수 있으므로 직접 사용하는 것에 주의해야 합니다.

절전 상태 UI를 직접 구현하기

1. 직접 BatteryBannerContract.View의 구현체 작성하기

우선 UI를 직접 디자인하기 위해서, BatteryBannerContract.View의 구현체를 작성해야 합니다. 다음의 코드를 참고하여 구현하시면 됩니다.
주의) 여기서는 예시 코드의 간결함을 위해 SDK 내부에 정의되어 있는 레이아웃을 쓰지만, 직접 작성한 레이아웃을 쓰는 것을 추천합니다.

class BatteryCustomView extends FrameLayout implements BatteryBannerContract.View { private final Activity activity; private final View bannerContainer; private final TextView guideTextView; private final BatteryBannerContract.Presenter presenter; public BatteryCustomView(@NonNull final Activity activity, @NonNull final BatteryBannerContract.Presenter presenter) { super(activity); // 여기서는 sdk에 포함된 기본 레이아웃을 사용하지만, 직접 작성한 레이아웃 파일을 사용하는 것을 권장합니다. inflate(activity, com.buzzvil.buzzscreen.sdk.R.layout.view_battery_guide_banner, this); this.activity = activity; this.presenter = presenter; presenter.setView(this); this.bannerContainer = findViewById(com.buzzvil.buzzscreen.sdk.R.id.bannerContainer); this.guideTextView = findViewById(com.buzzvil.buzzscreen.sdk.R.id.guideText); guideTextView.setText("변경할 알림 문구"); // 닫기 버튼 findViewById(com.buzzvil.buzzscreen.sdk.R.id.btnDismiss).setOnClickListener(v -> presenter.dismiss()); // 설정 버튼 findViewById(com.buzzvil.buzzscreen.sdk.R.id.btnSettings).setOnClickListener(v -> launchSettingsActivity()); } @Override public void show() { this.bannerContainer.setVisibility(VISIBLE); } @Override public void hide() { this.bannerContainer.setVisibility(GONE); } public void resume() { // presenter가 절전 상태 UI가 표시되어야 하는 환경인지 체크해서 show() 또는 hide() // 를 호출합니다. presenter.checkAvailability(getContext()); } private void launchSettingsActivity() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { BuzzScreen.getInstance().openBatterySettingsWithOverlay(activity, activity.getClass(), BatteryGuideManager.TriggerType.LockscreenBanner); } } }

2. 잠금화면 액티비티 직접 구현하기

직접 구현한 절전 상태 UI를 사용하기 위해서, 잠금화면 액티비티를 직접 구현해야 합니다. 이미 BaseLockerActivity를 확장하여 사용하는 경우 해당 액티비티에서 아래 코드를 추가하면 되고, 그렇지 않은 경우에는 SimpleLockerActivity를 확장하여 구현하면 편합니다.

// 또는 BaseLockerActivity를 확장하여 잠금화면 전체를 직접 구현 public class CustomLockerActivity extends SimpleLockerActivity { private BatteryCustomView batteryView; @Override protected void onCreate(Bundle onSavedInstanceState) { super.onCreate(onSavedInstanceState); this.batteryView = new BatteryCustomView(this, new BatteryBannerPresenter(BuzzScreen.getInstance().getPreferenceStore())); // 절전 상태 UI를 원하는 위치에 붙입니다. ((ViewGroup) findViewById(android.R.id.content)).addView(batteryView); } @Override protected boolean isBatteryGuideEnabled() { // 기본 절전 상태 UI가 뜨지 않게 하기 위해서 false를 반환하도록 오버라이드합니다. return false; } @Override protected void onResume() { super.onResume(); // onResume에서 절전 상태 UI가 보여야 하는지 체크하고, 체크 결과에 따라 UI를 보이거나 보이지 않게 합니다. batteryView.resume(); } }

3. 기본 잠금 화면을 쓰고 있던 경우 추가 작업하기

만약 SDK에서 제공하는 기본 잠금 화면 (SimpleLockerActivity)을 사용하고 있던 경우, 새로 작업한 것들이 올바르게 반영될 수 있도록 추가 작업을 해야 합니다.

A) 새 액티비티 등록하기

AndroidManifest.xml에 새로 작성한 액티비티를 등록합니다.

<?xml version="1.0" encoding="utf-8"?> <manifest ...> ... <application ...> ... <activity android.name=".CustomLockerActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:excludeFromRecents="true" android:launchMode="singleTask" android:resizeableActivity="false" android:screenOrientation="portrait" android:taskAffinity="${applicationId}.Locker" /> </application> </manifest>

 

B) 직접 작성한 잠금 화면을 SDK에 등록하기

SDK에 직접 작성한 잠금 화면을 사용하도록 등록합니다.

 

문구를 변경한 모습