浏览代码

[컨텐츠][New] 리스티클 상세 html 표시

hyodong.min 6 年之前
父节点
当前提交
0ab98bc5a8

+ 1 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsAdapter.java

@@ -83,7 +83,7 @@ public class ContentsAdapter extends RecyclerView.Adapter<ContentsHolder> {
         return new ContentsListicleCoverHolder(view, hasSeries() ? contentsItemBeans.get(0).getSeriesTitle() : "");
       case LISTICLE_DETAIL:
         view = inflater.inflate(R.layout.contents_listicle_detail, parent, false);
-        return new ContentsListicleHolder(view);
+        return new ContentsListicleHolder(view, activity);
       case SERIES:
         view = inflater.inflate(R.layout.cotents_detail_series, parent, false);
         return new ContentsSeriesHolder(view);

+ 7 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsListicleHolder.java

@@ -1,5 +1,6 @@
 package kr.co.zumo.app.lifeplus.view.screen.contents;
 
+import android.app.Activity;
 import android.support.constraint.ConstraintLayout;
 import android.view.View;
 import android.widget.LinearLayout;
@@ -29,10 +30,13 @@ public class ContentsListicleHolder extends ContentsHolder<ContentsItemBean> {
   private ListicleImageView listicleImageView;
   private LinearLayout layoutContainer;
   private ConstraintLayout layoutMoreInfoPopup;
+  private Activity activity;
 
-  public ContentsListicleHolder(View itemView) {
+  public ContentsListicleHolder(View itemView, Activity activity) {
     super(itemView);
 
+    this.activity = activity;
+
     listicleImageView = itemView.findViewById(R.id.custom_listicle_image_view);
     layoutContainer = itemView.findViewById(R.id.layout_container);
     layoutMoreInfoPopup = itemView.findViewById(R.id.layout_more_info);
@@ -43,7 +47,7 @@ public class ContentsListicleHolder extends ContentsHolder<ContentsItemBean> {
   protected void bindInternal() {
     List<ContentsDetailImageBean> contentsDetailImageBeans = bean.getItemImageList();
 
-    listicleImageView.init(itemView.getContext(), index, bean.getTwoLineTitle(), bean.getSubTitle(), contentsDetailImageBeans, event -> {
+    listicleImageView.init(itemView.getContext(), activity, index, bean.getTwoLineTitle(), bean.getSubTitle(), contentsDetailImageBeans, event -> {
       listener.onEvent(event);
     });
 
@@ -93,7 +97,7 @@ public class ContentsListicleHolder extends ContentsHolder<ContentsItemBean> {
 
   @Override
   public boolean dispatchBackPressed() {
-    return false;
+    return listicleImageView.dispatchBackPressed();
   }
 
 }

+ 157 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/view/ListicleHtmlViewHolder.java

@@ -0,0 +1,157 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.screen.contents.view;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.net.http.SslError;
+import android.util.Log;
+import android.view.View;
+import android.webkit.JavascriptInterface;
+import android.webkit.SslErrorHandler;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+import com.google.gson.Gson;
+
+import kr.co.zumo.app.R;
+import kr.co.zumo.app.lifeplus.bean.HtmlBean;
+import kr.co.zumo.app.lifeplus.bean.api.ContentsDetailImageBean;
+import kr.co.zumo.app.lifeplus.util.StringUtil;
+import kr.co.zumo.app.lifeplus.view.Event;
+import kr.co.zumo.app.lifeplus.view.IEventListener;
+import kr.co.zumo.app.lifeplus.view.custom.VideoWebChromeClient;
+
+/**
+ * ListicleHtmlViewHolder
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2019. 2. 19.]   [최초 작성]
+ * @since 2019. 2. 19.
+ */
+public class ListicleHtmlViewHolder extends ListicleImageViewHolder {
+
+  private WebView webView;
+  private VideoWebChromeClient webChromeClient;
+
+  public ListicleHtmlViewHolder(View itemView, Activity activity) {
+    super(itemView, activity);
+
+    webView = itemView.findViewById(R.id.web_view);
+  }
+
+  @Override
+  public void bind(ContentsDetailImageBean bean, IEventListener listener) {
+    this.bean = bean;
+    this.listener = listener;
+
+    String url = bean.getUtilityUrl();
+    if (null != webView && StringUtil.isFull(url)) {
+      webView.setWebViewClient(new WebViewClient() {
+
+        @Override
+        public void onPageStarted(WebView view, String url, Bitmap favicon) {
+          super.onPageStarted(view, url, favicon);
+        }
+
+        @Override
+        public boolean shouldOverrideUrlLoading(WebView view, String url) {
+          Log.d("APP# ContentsHtmlHolder | shouldOverrideUrlLoading", "| " + url);
+          view.loadUrl(url);
+          return true;
+        }
+
+        @Override
+        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
+          Log.w("APP# ContentsHtmlHolder | onReceivedSslError", "|" + "message: " + error.toString());
+          handler.proceed();
+        }
+
+      });
+
+      webChromeClient = new VideoWebChromeClient(activity) {
+
+        @Override
+        public void onShowCustomView(View view, CustomViewCallback callback) {
+          super.onShowCustomView(view, callback);
+          webView.setVisibility(View.GONE);
+        }
+
+        @Override
+        public void onHideCustomView() {
+          super.onHideCustomView();
+          webView.setVisibility(View.VISIBLE);
+        }
+      };
+
+      webView.setWebChromeClient(webChromeClient);
+
+      init(webView);
+
+      webView.loadUrl(url);
+    }
+  }
+
+  @JavascriptInterface
+  public void sendMessage(String json) {
+    try {
+      HtmlBean bean = new Gson().fromJson(json, HtmlBean.class);
+      if (null != bean) {
+        listener.onEvent(new Event.Builder(Event.CLICK_HTML).json(json).build());
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  private void init(WebView webView) {
+    WebSettings settings = webView.getSettings();
+    // Javascript 사용하기
+    settings.setJavaScriptEnabled(true);
+    // WebView 내장 줌 사용여부
+    settings.setBuiltInZoomControls(false);
+    // 화면에 맞게 WebView 사이즈를 정의
+    settings.setLoadWithOverviewMode(true);
+    // ViewPort meta tag를 활성화 여부
+    settings.setUseWideViewPort(true);
+    // 줌 컨트롤 사용 여부
+    settings.setDisplayZoomControls(false);
+    // 사용자 제스처를 통한 줌 기능 활성화 여부
+    settings.setSupportZoom(false);
+    // TextEncoding 이름 정의
+    settings.setDefaultTextEncodingName("UTF-8");
+
+    // Setting Local Storage
+    settings.setDatabaseEnabled(true);
+    settings.setDomStorageEnabled(true);
+
+    // 캐쉬 사용 방법을 정의
+    settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
+
+  }
+
+  @Override
+  public void attach() {
+    draw(webView);
+  }
+
+  @Override
+  public void detach() {
+    // nothing
+  }
+
+  @Override
+  public boolean dispatchBackPressed() {
+    // 풀 스크린 닫기
+    if (null != webChromeClient && webChromeClient.isShowFullScreenVideo()) {
+      webView.goBack();
+      return true;
+    }
+    return false;
+  }
+}

+ 17 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/view/ListicleImageView.java

@@ -1,5 +1,6 @@
 package kr.co.zumo.app.lifeplus.view.screen.contents.view;
 
+import android.app.Activity;
 import android.content.Context;
 import android.support.constraint.ConstraintLayout;
 import android.support.v7.widget.LinearLayoutManager;
@@ -47,6 +48,8 @@ public class ListicleImageView extends ConstraintLayout {
   private TextView textViewTitle;
   private TextView textViewSubTitle;
   private TextView textViewCopyRight;
+  private LinearLayoutManager linearLayoutManager;
+
 
   private View layoutPager;
   private int index = 0;
@@ -116,7 +119,7 @@ public class ListicleImageView extends ConstraintLayout {
 
   private RecyclerView.OnScrollListener scrollEventListener;
 
-  public void init(Context context, int index, String title, String subTitle, List<ContentsDetailImageBean> contentsDetailImageBeans, IEventListener listener) {
+  public void init(Context context, Activity activity, int index, String title, String subTitle, List<ContentsDetailImageBean> contentsDetailImageBeans, IEventListener listener) {
 
     textViewTitleNumber.setText(StringUtil.lpad(2, index));
     textViewTitle.setText(title);
@@ -136,7 +139,7 @@ public class ListicleImageView extends ConstraintLayout {
     }
 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) {
+    linearLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) {
       /**
        * 추가 영역을 지정해서 미리 다음 페이지를 준비(로딩)하도록 한다.
        *
@@ -161,7 +164,7 @@ public class ListicleImageView extends ConstraintLayout {
       }
     };
     recyclerView.setLayoutManager(linearLayoutManager);
-    adapter = new ListicleImageViewAdapter(context, inflater, contentsDetailImageBeans, event -> {
+    adapter = new ListicleImageViewAdapter(context, activity, inflater, contentsDetailImageBeans, event -> {
       if (null != listener) {
 
         listener.onEvent(event);
@@ -197,4 +200,15 @@ public class ListicleImageView extends ConstraintLayout {
     recyclerView.smoothScrollToPosition(index + 1);
   }
 
+  public boolean dispatchBackPressed() {
+    if (null == linearLayoutManager || null == recyclerView) {
+      return false;
+    }
+
+    ListicleImageViewHolder holder = (ListicleImageViewHolder) recyclerView.findViewHolderForAdapterPosition(linearLayoutManager.findFirstVisibleItemPosition());
+    if (null == holder) {
+      return false;
+    }
+    return holder.dispatchBackPressed();
+  }
 }

+ 35 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/view/ListicleImageViewAdapter.java

@@ -1,5 +1,6 @@
 package kr.co.zumo.app.lifeplus.view.screen.contents.view;
 
+import android.app.Activity;
 import android.content.Context;
 import android.support.annotation.NonNull;
 import android.support.v7.widget.RecyclerView;
@@ -12,6 +13,7 @@ import java.util.List;
 
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.bean.api.ContentsDetailImageBean;
+import kr.co.zumo.app.lifeplus.bean.api.LifeplusImageBean;
 import kr.co.zumo.app.lifeplus.view.IEventListener;
 
 /**
@@ -31,10 +33,15 @@ public class ListicleImageViewAdapter extends RecyclerView.Adapter<ListicleImage
   private List<ContentsDetailImageBean> contentsDetailImageBeans;
   private IEventListener listener;
   private boolean loading;
+  private Activity activity;
 
+  private static final int IMAGE = 0;
+  private static final int HTML = 8;
+  private static final int MOVIE = 9;
 
-  public ListicleImageViewAdapter(Context context, LayoutInflater inflater, List<ContentsDetailImageBean> textImageBeanList, IEventListener listener) {
+  public ListicleImageViewAdapter(Context context, Activity activity, LayoutInflater inflater, List<ContentsDetailImageBean> textImageBeanList, IEventListener listener) {
     this.context = context;
+    this.activity = activity;
     this.inflater = inflater;
     this.contentsDetailImageBeans = textImageBeanList;
     this.listener = listener;
@@ -48,8 +55,16 @@ public class ListicleImageViewAdapter extends RecyclerView.Adapter<ListicleImage
   @NonNull
   @Override
   public ListicleImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
-    View view = inflater.inflate(R.layout.custom_listicle_image_view_item, parent, false);
-    return new ListicleImageViewHolder(view);
+    View view;
+    switch (viewType) {
+      case HTML:
+      case MOVIE:
+        view = inflater.inflate(R.layout.custom_listicle_image_view_item_html, parent, false);
+        return new ListicleHtmlViewHolder(view, activity);
+      default:
+        view = inflater.inflate(R.layout.custom_listicle_image_view_item, parent, false);
+        return new ListicleImageViewHolder(view, activity);
+    }
   }
 
   @Override
@@ -87,4 +102,21 @@ public class ListicleImageViewAdapter extends RecyclerView.Adapter<ListicleImage
       return 0;
     }
   }
+
+  @Override
+  public int getItemViewType(int position) {
+    int type = IMAGE;
+
+    int realPosition = position % contentsDetailImageBeans.size();
+    ContentsDetailImageBean bean = contentsDetailImageBeans.get(realPosition);
+    String itemType = bean.getImageType();
+    if (LifeplusImageBean.TYPE_MOVIE.equals(itemType)) {
+      type = MOVIE;
+    }
+    else if (LifeplusImageBean.TYPE_HTML.equals(itemType)) {
+      type = HTML;
+    }
+
+    return type;
+  }
 }

+ 13 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/view/ListicleImageViewHolder.java

@@ -1,5 +1,6 @@
 package kr.co.zumo.app.lifeplus.view.screen.contents.view;
 
+import android.app.Activity;
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
 import android.widget.FrameLayout;
@@ -37,10 +38,12 @@ public class ListicleImageViewHolder extends RecyclerView.ViewHolder {
   ContentsDetailImageBean bean;
   IEventListener listener;
   List<View> rectangles;
+  Activity activity;
 
 
-  public ListicleImageViewHolder(View itemView) {
+  public ListicleImageViewHolder(View itemView, Activity activity) {
     super(itemView);
+    this.activity = activity;
     imageViewBackground = itemView.findViewById(R.id.image_view_background);
     textViewCopyRight = itemView.findViewById(R.id.text_view_copy_right);
   }
@@ -66,12 +69,16 @@ public class ListicleImageViewHolder extends RecyclerView.ViewHolder {
       listener.onEvent(new Event.Builder(Event.DETAIL).index(getAdapterPosition()).build());
     });
 
+    draw(imageViewBackground);
+  }
+
+  protected void draw(View view) {
     /**
      * 그리기 영역의 w/h 를 가져오기 위해서는 attach -> post 를 이용해야한다.
      * bind , bind -> post, attach 는 w/h 를 0으로 반환하는 경우가 있음.
      */
     final List<ItemRectBean> rectList = bean.getItemRectList();
-    FrameLayout parent = (FrameLayout) imageViewBackground.getParent();
+    FrameLayout parent = (FrameLayout) view.getParent();
 
     itemView.post(() -> {
       AddingRect.remove(parent, rectangles);
@@ -87,4 +94,8 @@ public class ListicleImageViewHolder extends RecyclerView.ViewHolder {
       imageViewBackground.setOnClickListener(null);
     }
   }
+
+  public boolean dispatchBackPressed() {
+    return false;
+  }
 }

+ 15 - 0
app/src/main/res/layout/custom_listicle_image_view_item_html.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout
+  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">
+
+
+  <WebView
+    android:id="@+id/web_view"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"/>
+
+</FrameLayout>