Selaa lähdekoodia

Merge branch 'develop' of https://github.com/swict/LifeplusAndroid into develop

Hasemi 6 vuotta sitten
vanhempi
commit
ed5e0bff0f

+ 6 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/ContentsDetailListBean.java

@@ -5,6 +5,7 @@ package kr.co.zumo.app.lifeplus.bean.api;
 
 import com.google.gson.annotations.SerializedName;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import kr.co.zumo.app.lifeplus.bean.JsonBeanBase;
@@ -63,9 +64,13 @@ public class ContentsDetailListBean extends JsonBeanBase {
    * 시리즈의 첫 번째 데이터는 시리즈의 정보
    */
   public void setupSeriesInfo() {
-    if (null != seriesItemList && seriesItemList.size() > 0) {
+    // 3개 이상 일 경우에만 시리즈를 표시한다.
+    if (null != seriesItemList && seriesItemList.size() > 3) {
       seriesInfo = seriesItemList.remove(0);
     }
+    else {
+      seriesItemList = new ArrayList<>();
+    }
   }
 
   /**

+ 6 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/Event.java

@@ -145,6 +145,10 @@ public class Event {
   public static final int NEWS = 117;
   public static final int WITH_SHOWN = 118;
   public static final int POINT = 119;
+  public static final int FOCUS = 120;
+  public static final int TEXT = 121;
+  public static final int PHOTO = 122;
+  public static final int PERMISSION_GRANTED = 123;
 
   @Retention(RetentionPolicy.SOURCE)
   @IntDef({
@@ -157,8 +161,8 @@ public class Event {
     SWITCH, BOOK_MARK_DEFAULT, BOOK_MARK_LIST, ADD, MY_COIN_MAIN, MY_PURCHASE_HISTORY, GUIDE, ADD_BUCKET, MY_MAIN_GUEST, COUPON_MALL, CATEGORY_CLICK,
     MY_FAQ, UPDATE, FILTER, CLOSE, HELP, CONTENTS, MORE, BANNER, RECOMMEND, KAKAO_TALK, FACE_BOOK, CODE_COPY, EVENT, TAG, BOOKMARK, ORDER, DEFAULT, COMPLETE_BUCKET,
     LIKE, FRAGMENT_STACK_EMPTY, OVER_VIEW, SHARE, CALL_INFO, LINK, HOME_PAGE, INSTAGRAM, ADDRESS, SCROLL, SORT, TUTORIAL, CLICK_HTML, LAST, PREV, NEXT, REFRESH, MY_EVENT,
-    ING_EVENT, WINNER_ANNOUNCEMENT, COUPON, TODAY, RECT, VOTE, MAIN, SEARCH, COIN, ENTRY, IMAGE, DIALOG, URI, AGREE, PUSH, NEWS, WITH_SHOWN, POINT
-
+    ING_EVENT, WINNER_ANNOUNCEMENT, COUPON, TODAY, RECT, VOTE, MAIN, SEARCH, COIN, ENTRY, IMAGE, DIALOG, URI, AGREE, PUSH, NEWS, WITH_SHOWN, POINT, FOCUS, TEXT,
+    PHOTO, PERMISSION_GRANTED
   })
   public @interface ID {}
 

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

@@ -44,6 +44,7 @@ public class ContentsHtmlHolder extends ContentsHolder<ContentsItemBean> {
   public ContentsHtmlHolder(View itemView) {
     super(itemView);
     webView = itemView.findViewById(R.id.web_view);
+    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
     layoutMoreInfo = itemView.findViewById(R.id.layout_more_info);
     dim0 = itemView.findViewById(R.id.view_dim_0);
     dim1 = itemView.findViewById(R.id.view_dim_1);
@@ -68,6 +69,7 @@ public class ContentsHtmlHolder extends ContentsHolder<ContentsItemBean> {
 
         @Override
         public boolean shouldOverrideUrlLoading(WebView view, String url) {
+          Log.d("APP# ContentsHtmlHolder | shouldOverrideUrlLoading", "| " + url);
           view.loadUrl(url);
           return true;
         }
@@ -77,9 +79,11 @@ public class ContentsHtmlHolder extends ContentsHolder<ContentsItemBean> {
           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);
@@ -140,6 +144,7 @@ public class ContentsHtmlHolder extends ContentsHolder<ContentsItemBean> {
 
     // 캐쉬 사용 방법을 정의
     settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
+
   }
 
   @Override

+ 19 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/event/EventQuestionAnswerViewHolder.java

@@ -5,7 +5,9 @@ import android.widget.TextView;
 
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.bean.api.EventQuestionBean;
+import kr.co.zumo.app.lifeplus.view.Event;
 import kr.co.zumo.app.lifeplus.view.IEventListener;
+import kr.co.zumo.app.lifeplus.view.SimpleTextWatcher;
 import kr.co.zumo.app.lifeplus.view.custom.ClearEditText;
 
 /**
@@ -35,10 +37,26 @@ public class EventQuestionAnswerViewHolder extends EventQuestionViewHolder {
   public void draw(int index, IEventListener listener, EventQuestionBean bean) {
     super.draw(index, listener, bean);
     textViewQuestion.setText(bean.getQuestionName());
+
+    validate(true);
+
+    editTextAnswer.setOnFocusChangeListener(new View.OnFocusChangeListener() {
+      @Override
+      public void onFocusChange(View v, boolean hasFocus) {
+        listener.onEvent(new Event.Builder(Event.FOCUS).index(index).build());
+      }
+    });
+
+    editTextAnswer.addTextChangedListener(new SimpleTextWatcher() {
+      @Override
+      public void onTextChanged(CharSequence s, int start, int before, int count) {
+        listener.onEvent(new Event.Builder(Event.TEXT).index(index).string(s.toString()).build());
+      }
+    });
   }
 
   @Override
   public void validate(boolean isValidate) {
-
+    textViewValidation.setVisibility(isValidate ? View.GONE : View.VISIBLE);
   }
 }

+ 56 - 43
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/event/EventQuestionFragment.java

@@ -16,6 +16,7 @@ import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v4.app.ActivityCompat;
 import android.support.v4.content.ContextCompat;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -53,7 +54,6 @@ import kr.co.zumo.app.lifeplus.view.screen.FragmentBase;
 public class EventQuestionFragment extends FragmentBase<EventQuestionPresenter> implements IEventQuestionView {
 
   private static final int GET_ALBUM_PHOTO = 1;
-  private Bitmap uploadImage;
   private LinearLayout layoutContainer;
   private LayoutInflater inflater;
   private View layoutSubmit;
@@ -98,25 +98,33 @@ public class EventQuestionFragment extends FragmentBase<EventQuestionPresenter>
     return false;
   }
 
+
   @Override
-  public void getAlbumImage() {
-    Intent intent = new Intent();
-    intent.setType("image/*");
-    intent.setAction(Intent.ACTION_GET_CONTENT);
-    startActivityForResult(intent, GET_ALBUM_PHOTO);
+  public boolean hasStoragePermission() {
+    //갤러리 사용권한 체크
+    return ContextCompat.checkSelfPermission(getContext(), Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
   }
 
   @Override
-  public void checkPermission() {
-    //갤러리 사용권한 체크
-    if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
-      //권한 없음
-      requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
-          Manifest.permission.READ_EXTERNAL_STORAGE},
-        PERMISSION_CHECK);
-    }
-    else {
-      getAlbumImage();
+  public void requestStoragePermission() {
+    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_CHECK);
+  }
+
+  @Override
+  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+    switch (requestCode) {
+      case PERMISSION_CHECK:
+        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+          presenter.onEvent(new Event.Builder(Event.PERMISSION_GRANTED).build());
+        }
+        else {
+          if (false == ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE)) {
+            presenter.onEvent(new Event.Builder(Event.DIALOG).build());
+          }
+        }
+        break;
+      default:
+        break;
     }
   }
 
@@ -181,8 +189,19 @@ public class EventQuestionFragment extends FragmentBase<EventQuestionPresenter>
         eventQuestionViewHolder.draw(i, event -> presenter.onEvent(event), eventQuestionBean);
       }
 
-      if (null != questionItemView && null != eventQuestionViewHolder) {
-        eventQuestionViewHolders.add(eventQuestionViewHolder);
+      if (null == eventQuestionViewHolder) {
+        // dummy : model 과 index 를 맞추기 위해서
+        eventQuestionViewHolder = new EventQuestionViewHolder(null) {
+          @Override
+          public void validate(boolean isValidate) {
+
+          }
+        };
+      }
+
+      eventQuestionViewHolders.add(eventQuestionViewHolder);
+
+      if (null != questionItemView) {
         layoutContainer.addView(questionItemView);
       }
     }
@@ -211,30 +230,22 @@ public class EventQuestionFragment extends FragmentBase<EventQuestionPresenter>
 
   }
 
-
   @Override
-  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
-    switch (requestCode) {
-      case PERMISSION_CHECK:
-        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
-          getAlbumImage();
-        }
-        else {
-          if (false == ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE)) {
-            presenter.onEvent(new Event.Builder(Event.DIALOG).build());
-          }
-        }
-        break;
-      default:
-        break;
+  public void putAlbumImage(int index, Bitmap image) {
+    EventQuestionViewHolder eventQuestionViewHolder = eventQuestionViewHolders.get(index);
+    Log.d("APP# EventQuestionFragment | putAlbumImage", "|" + "hoolder -> " + eventQuestionViewHolder);
+    if (null != eventQuestionViewHolder) {
+      Log.d("APP# EventQuestionFragment | putAlbumImage", "| " + eventQuestionViewHolder.getClass().getSimpleName());
+      eventQuestionViewHolder.setUploadImage(image);
     }
   }
 
   @Override
-  public void uploadAlbumImage() {
-    if (null != uploadImage) {
-//      eventQuestionImageView.setUploadImage(uploadImage);
-    }
+  public void requestAlbumImage() {
+    Intent intent = new Intent();
+    intent.setType("image/*");
+    intent.setAction(Intent.ACTION_GET_CONTENT);
+    startActivityForResult(intent, GET_ALBUM_PHOTO);
   }
 
   @Override
@@ -243,16 +254,18 @@ public class EventQuestionFragment extends FragmentBase<EventQuestionPresenter>
       try {
         Uri uri = data.getData();
         String urlString = data.getData().getPath();
-        // Log.e("APP#  EventQuestionFragment | onActivityResult", "| urlString" + urlString); // /external/images/media/196
-        //Log.e("APP#  EventQuestionFragment | onActivityResult", "| uri" + uri); // content://media/external/images/media/196
-        //Log.e("APP#  EventQuestionFragment | onActivityResult", "|  실제경로" + getPath(uri));// /storage/emulated/0/Pictures/Screenshots/Screenshot_2018-12-21-10-35-03.jpg
-        presenter.onEvent(new Event.Builder(Event.URI).string(getPath(uri)).build());
+        Log.d("APP#  EventQuestionFragment | onActivityResult", "| urlString" + urlString); // /external/images/media/196
+        Log.d("APP#  EventQuestionFragment | onActivityResult", "| uri" + uri); // content://media/external/images/media/196
+        Log.d("APP#  EventQuestionFragment | onActivityResult", "|  실제경로" + getPath(uri));// /storage/emulated/0/Pictures/Screenshots/Screenshot_2018-12-21-10-35-03.jpg
 
+        // fixme 파일 url 구하기
+        
         InputStream inputStream = getContext().getContentResolver().openInputStream(data.getData());
-        uploadImage = BitmapFactory.decodeStream(inputStream);
+        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
         inputStream.close();
-        presenter.onEvent(new Event.Builder(Event.IMAGE).build());
 
+        String path = getPath(uri);
+        presenter.onImageReceived(bitmap, path);
       } catch (Exception e) {
         e.printStackTrace();
       }

+ 3 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/event/EventQuestionImageViewHolder.java

@@ -44,13 +44,15 @@ public class EventQuestionImageViewHolder extends EventQuestionViewHolder {
     super.draw(index, listener, bean);
     this.listener = listener;
     layoutCamera.setOnClickListener(view -> {
-      listener.onEvent(new Event.Builder(Event.SHARE).build());
+      listener.onEvent(new Event.Builder(Event.SHARE).index(index).build());
     });
   }
 
   @Override
   public void setUploadImage(Bitmap image) {
     ++count;
+    setUploadButtonVisible();
+
     LayoutInflater inflater = (LayoutInflater) itemView.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
     FlowLayout.LayoutParams layoutParams = new FlowLayout.LayoutParams(FlowLayout.LayoutParams.WRAP_CONTENT, FlowLayout.LayoutParams.WRAP_CONTENT);
@@ -59,7 +61,6 @@ public class EventQuestionImageViewHolder extends EventQuestionViewHolder {
     layoutParams.topMargin = ResourceUtil.dpToPx(2);
     layoutParams.bottomMargin = ResourceUtil.dpToPx(2);
 
-    setUploadButtonVisible();
     View imageView = inflater.inflate(R.layout.capture_image_view, null);
 
     ImageView albumImage = imageView.findViewById(R.id.image_view_album);

+ 8 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/event/EventQuestionModel.java

@@ -16,6 +16,7 @@ import kr.co.zumo.app.lifeplus.model.Model;
 public class EventQuestionModel extends Model {
 
   private Disposable disposable;
+  private int requestIndex = -1;
 
   @Override
   protected void createViewInternal() {
@@ -55,4 +56,11 @@ public class EventQuestionModel extends Model {
 
   }
 
+  public int getRequestIndex() {
+    return requestIndex;
+  }
+
+  public void setRequestIndex(int requestIndex) {
+    this.requestIndex = requestIndex;
+  }
 }

+ 30 - 6
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/event/EventQuestionPresenter.java

@@ -1,5 +1,6 @@
 package kr.co.zumo.app.lifeplus.view.screen.event;
 
+import android.graphics.Bitmap;
 import android.util.Log;
 
 import kr.co.zumo.app.R;
@@ -91,18 +92,31 @@ public class EventQuestionPresenter extends Presenter<EventQuestionModel, IEvent
         // 각 항목 클릭
         Log.d("APP# EventQuestionPresenter | onEventInternal", "|" + "index: " + event.getIndex() + ", int: " + event.getInteger() + ", b: " + event.getBool());
         break;
+      case Event.FOCUS:
+        // 각 항목 포커스 인
+        Log.d("APP# EventQuestionPresenter | onEventInternal", "|" + "index: " + event.getIndex() + " focus in");
+        break;
+      case Event.TEXT:
+        // 각 항목 텍스트 입력
+        Log.d("APP# EventQuestionPresenter | onEventInternal", "|" + "index: " + event.getIndex() + ", text: " + event.getString());
+        break;
       case Event.SHARE: //캡쳐 추가 버튼 클릭
-        view.checkPermission();
+        Log.d("APP# EventQuestionPresenter | onEventInternal", "|" + "index: " + event.getIndex() + " photo request");
+        model.setRequestIndex(event.getIndex());
+        if (view.hasStoragePermission()) {
+          view.requestAlbumImage();
+        }
+        else {
+          view.requestStoragePermission();
+        }
         break;
-      case Event.IMAGE: //이미지 가져오기성공
-        view.uploadAlbumImage();
+      case Event.PERMISSION_GRANTED:
+        view.requestAlbumImage();
         break;
       case Event.DIALOG: //권한 설정 완전 거부시 다이얼로그 임시
         showPermissionCheckDialog();
         break;
-      case Event.URI: //이미지 업로드시 경로
-        Log.w("APP# EventQuestionPresenter | onEventInternal", "| upload image path ===>" + event.getString());
-        break;
+
       case Event.AGREE: //약관동의 상세 클릭
         String contents = eventDetailBean.getEventPolicyList().get(event.getIndex()).getContents();
         showPolicyDetail(contents);
@@ -172,4 +186,14 @@ public class EventQuestionPresenter extends Presenter<EventQuestionModel, IEvent
       .show();
   }
 
+  /**
+   * 사용자가 이미지를 선택했을 때
+   *
+   * @param image
+   * @param path
+   */
+  public void onImageReceived(Bitmap image, String path) {
+    Log.d("APP# EventQuestionPresenter | onImageReceived", "| upload image path ===>" + path);
+    view.putAlbumImage(model.getRequestIndex(), image);
+  }
 }

+ 8 - 4
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/event/IEventQuestionView.java

@@ -1,5 +1,7 @@
 package kr.co.zumo.app.lifeplus.view.screen.event;
 
+import android.graphics.Bitmap;
+
 import kr.co.zumo.app.lifeplus.bean.api.EventDetailBean;
 import kr.co.zumo.app.lifeplus.view.IView;
 
@@ -15,14 +17,16 @@ import kr.co.zumo.app.lifeplus.view.IView;
  */
 public interface IEventQuestionView extends IView {
 
-  void getAlbumImage();
-
-  void uploadAlbumImage();
+  boolean hasStoragePermission();
 
-  void checkPermission();
+  void requestStoragePermission();
 
   void goSettingPermission();
 
+  void requestAlbumImage();
+
+  void putAlbumImage(int index, Bitmap image);
+
   void drawList(EventDetailBean detailBean);
 
 }