ソースを参照

[공통][New] 네트워크 에러 '재시도' 시 창 닫힌 후 다시 열리게
- 그 동안 사용자 입력을 막는 배리어 추가

hyodong.min 6 年 前
コミット
c8c72a6714

+ 3 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/model/Model.java

@@ -6,6 +6,8 @@ package kr.co.zumo.app.lifeplus.model;
 import android.arch.lifecycle.ViewModel;
 import android.util.Log;
 
+import java.util.concurrent.TimeUnit;
+
 import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.annotations.Nullable;
 import io.reactivex.disposables.Disposable;
@@ -110,6 +112,7 @@ public abstract class Model extends ViewModel implements ILifeCycle, IHelperProv
    */
   public void checkNetwork() {
     retryDisposable = new NetworkWatcher().check(App.getInstance().getContext())
+      .delay(300, TimeUnit.MILLISECONDS)  // ui 를 표시하기위한 딜레이 추가
       .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
       .subscribe(isConnected -> {
         Log.i("APP# Model | checkNetwork", "| isConnected: " + isConnected);

+ 68 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/animation/Barrier.java

@@ -0,0 +1,68 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.animation;
+
+import android.app.Activity;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import kr.co.zumo.app.R;
+
+/**
+ * Barrier - 화면 입력 막기
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 12. 20.]   [최초 작성]
+ * @since 2018. 12. 20.
+ */
+public class Barrier {
+
+  private Activity activity;
+  private View view;
+
+
+  public Barrier(Activity context) {
+    this.activity = context;
+  }
+
+  /**
+   * Waiter 표시
+   * - android.R.id.content 최상위에 표시한다.
+   *
+   * @return
+   */
+  public Barrier show() {
+    create();
+
+    return this;
+  }
+
+  private void create() {
+    if (null == view) {
+      FrameLayout frameLayout = activity.findViewById(android.R.id.content);
+      LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+      view = inflater.inflate(R.layout.dialog_barrier, null);
+      view.setClickable(true);
+      view.setAlpha(0f);
+      frameLayout.addView(view);
+    }
+  }
+
+  /**
+   * hide
+   */
+  public void hide() {
+    if (null != view) {
+      FrameLayout frameLayout = activity.findViewById(android.R.id.content);
+      frameLayout.removeView(view);
+      view = null;
+      activity = null;
+    }
+  }
+}

+ 29 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/presenter/Presenter.java

@@ -41,6 +41,7 @@ import kr.co.zumo.app.lifeplus.view.Event;
 import kr.co.zumo.app.lifeplus.view.IEventListener;
 import kr.co.zumo.app.lifeplus.view.IView;
 import kr.co.zumo.app.lifeplus.view.IWaiterCallable;
+import kr.co.zumo.app.lifeplus.view.animation.Barrier;
 import kr.co.zumo.app.lifeplus.view.animation.LoadingDriver;
 import kr.co.zumo.app.lifeplus.view.command.Command;
 import kr.co.zumo.app.lifeplus.view.command.EmailSendingCommand;
@@ -358,7 +359,7 @@ public abstract class Presenter<M extends Model, V extends IView> implements ILi
         // event detail
         // 이벤트 구분 후 전달해야한다.
         String eventNo = linkBean.getLink();
-        if(StringUtil.isFull(eventNo)) {
+        if (StringUtil.isFull(eventNo)) {
           new EventDetailDelegate().loadEvent(eventNo, new EventDetailDelegate.IEventDetailDelegateListener() {
             @Override
             public void onLoadSuccess(EventDetailBean eventDetailBean, int screenId, EventDeliveryBean eventDeliveryBean) {
@@ -650,6 +651,27 @@ public abstract class Presenter<M extends Model, V extends IView> implements ILi
    * listener
    ***********************************/
   // INetworkReceiverListener
+  private Barrier barrier;
+
+  /**
+   * 배리어 제거
+   */
+  private void hideBarrier() {
+    if (null != barrier) {
+      barrier.hide();
+      barrier = null;
+    }
+  }
+
+  /**
+   * 사용자 터치 입력을 막는 배리어 생성
+   */
+  private void showBarrier() {
+    if (null == barrier) {
+      barrier = new Barrier(view.getActivity()).show();
+    }
+  }
+
   @Override
   public void onChangedConnection(boolean isConnected, int type) {
     Log.i("APP# Presenter | onChangedConnection", "| " + this.getClass().getSimpleName() + ", isConnected:" + isConnected);
@@ -659,6 +681,7 @@ public abstract class Presenter<M extends Model, V extends IView> implements ILi
         dialogNetwork.dispose();
         dialogNetwork = null;
       }
+      hideBarrier();
     }
     else {
       if (null == dialogNetwork) {
@@ -671,6 +694,11 @@ public abstract class Presenter<M extends Model, V extends IView> implements ILi
                 onCommand(new ExitCommand());
               }
               else {
+                dialogNetwork.dispose();
+                dialogNetwork = null;
+
+                showBarrier();
+
                 model.checkNetwork();
               }
             }

+ 14 - 0
app/src/main/res/layout/dialog_barrier.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout
+  xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:app="http://schemas.android.com/apk/res-auto"
+  xmlns:tools="http://schemas.android.com/tools"
+  android:layout_width="match_parent"
+  android:layout_height="match_parent"
+  android:background="@color/C4D000000"
+  app:layout_constraintBottom_toBottomOf="parent"
+  app:layout_constraintEnd_toEndOf="parent"
+  app:layout_constraintStart_toStartOf="parent"
+  app:layout_constraintTop_toTopOf="parent"
+  tools:background="@color/C000000">
+</android.support.constraint.ConstraintLayout>