diff --git a/app/src/main/java/com/chatty/android/chattyClient/api/ChattyApiDefinition.java b/app/src/main/java/com/chatty/android/chattyClient/api/ChattyApiDefinition.java index 0cb141d..f86b708 100644 --- a/app/src/main/java/com/chatty/android/chattyClient/api/ChattyApiDefinition.java +++ b/app/src/main/java/com/chatty/android/chattyClient/api/ChattyApiDefinition.java @@ -36,7 +36,8 @@ public interface ChattyApiDefinition { @POST("diary/chat/{diary_id}/") Call postChat( @Path("diary_id") int diary_id, - @Body ChatRequest chatRequest + @Part("label") String label, + @Part MultipartBody.Part profile_image ); @GET("/diary/detail/{diary_id}") diff --git a/app/src/main/java/com/chatty/android/chattyClient/model/ChatBalloon.java b/app/src/main/java/com/chatty/android/chattyClient/model/ChatBalloon.java index 2b66234..bb593c3 100644 --- a/app/src/main/java/com/chatty/android/chattyClient/model/ChatBalloon.java +++ b/app/src/main/java/com/chatty/android/chattyClient/model/ChatBalloon.java @@ -1,5 +1,7 @@ package com.chatty.android.chattyClient.model; +import android.net.Uri; + import java.util.Calendar; public class ChatBalloon { @@ -7,4 +9,13 @@ public class ChatBalloon { public String speech; public String username; public boolean isRead; + public String selectImage; + + public void setSelectImage(String selectImage) { + this.selectImage = selectImage; + } + + public String getSelectImage() { + return selectImage; + } } diff --git a/app/src/main/java/com/chatty/android/chattyClient/model/request/ChatRequest.java b/app/src/main/java/com/chatty/android/chattyClient/model/request/ChatRequest.java index f86e02a..1143074 100644 --- a/app/src/main/java/com/chatty/android/chattyClient/model/request/ChatRequest.java +++ b/app/src/main/java/com/chatty/android/chattyClient/model/request/ChatRequest.java @@ -2,4 +2,9 @@ public class ChatRequest { public String label; + public String image; + + public String getImage() { + return image; + } } diff --git a/app/src/main/java/com/chatty/android/chattyClient/presenter/write/ChatDialogueAdapter.java b/app/src/main/java/com/chatty/android/chattyClient/presenter/write/ChatDialogueAdapter.java index bc07e76..c500359 100644 --- a/app/src/main/java/com/chatty/android/chattyClient/presenter/write/ChatDialogueAdapter.java +++ b/app/src/main/java/com/chatty/android/chattyClient/presenter/write/ChatDialogueAdapter.java @@ -1,29 +1,39 @@ package com.chatty.android.chattyClient.presenter.write; +import android.annotation.SuppressLint; +import android.content.Context; +import android.net.Uri; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.TextView; +import com.bumptech.glide.Glide; import com.chatty.android.chattyClient.R; +import com.chatty.android.chattyClient.externalModules.ReduxJava.ReduxJava; import com.chatty.android.chattyClient.model.ChatBalloon; +import com.chatty.android.chattyClient.view.write.WriteActivity; import java.util.ArrayList; import java.util.List; public class ChatDialogueAdapter extends RecyclerView.Adapter { private List chatBalloons; + Context context; public ChatDialogueAdapter(List chatBalloons) { this.chatBalloons = chatBalloons; } - public void update(ArrayList chatBalloons) { + public void update(ArrayList chatBalloons,Context context) { this.chatBalloons.clear(); this.chatBalloons.addAll(chatBalloons); + this.context = context; this.notifyDataSetChanged(); } @@ -38,12 +48,14 @@ public class ChatEntryPartnerViewHolder extends RecyclerView.ViewHolder { } } - public class ChatEntrySelfViewHolder extends RecyclerView.ViewHolder { + public static class ChatEntrySelfViewHolder extends RecyclerView.ViewHolder { TextView textView; + ImageView imageView; ChatEntrySelfViewHolder(View itemView) { super(itemView); - this.textView= itemView.findViewById(R.id.textView); + this.textView = itemView.findViewById(R.id.textView_self); + this.imageView = itemView.findViewById(R.id.imageView_send_image); } } @@ -80,12 +92,19 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi ((ChatEntryPartnerViewHolder) holder).textView_isRead.setText(chatBalloon.username); break; case 2: + Log.e("내 말", String.valueOf(chatBalloon.selectImage+"0")); + if (chatBalloon.selectImage != null) { + ImageView imageView = ((ChatEntrySelfViewHolder) holder).imageView; + imageView.setVisibility(View.VISIBLE); + Glide.with(this.context) + .load(chatBalloon.selectImage) + .into(imageView); + } ((ChatEntrySelfViewHolder) holder).textView.setText(chatBalloon.speech); break; } } } - @Override public int getItemCount() { return this.chatBalloons.size(); diff --git a/app/src/main/java/com/chatty/android/chattyClient/presenter/write/WritePresenter.java b/app/src/main/java/com/chatty/android/chattyClient/presenter/write/WritePresenter.java index ccf0044..dede6cf 100644 --- a/app/src/main/java/com/chatty/android/chattyClient/presenter/write/WritePresenter.java +++ b/app/src/main/java/com/chatty/android/chattyClient/presenter/write/WritePresenter.java @@ -1,26 +1,41 @@ package com.chatty.android.chattyClient.presenter.write; -import android.app.Activity; -import android.text.TextUtils; +import android.Manifest; +import android.content.Context; +import android.net.Uri; +import android.support.v4.app.FragmentManager; import android.util.Log; -import android.view.View; import android.widget.EditText; -import android.widget.Toast; -import com.chatty.android.chattyClient.api.ChattyApiDefinition; -import com.chatty.android.chattyClient.api.ChattyApi; import com.chatty.android.chattyClient.externalModules.AndroidExtended.ExtendedPresenter; +import com.chatty.android.chattyClient.model.ChatBalloon; import com.chatty.android.chattyClient.model.State; -import com.chatty.android.chattyClient.externalModules.ReduxJava.ReduxJavaAndroidConnector; import com.chatty.android.chattyClient.state.Store; import com.chatty.android.chattyClient.state.action.ChatAction; import com.chatty.android.chattyClient.view.write.WriteActivityProps; import com.chatty.android.chattyClient.view.write.WriteActivityState; +import com.gun0912.tedpermission.PermissionListener; +import com.gun0912.tedpermission.TedPermission; + +import java.io.File; +import java.util.List; + +import gun0912.tedbottompicker.TedBottomPicker; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; public class WritePresenter extends ExtendedPresenter { private static final String FALSE= "FALSE"; private static final String IS_INITIALIZED = "IS_INITIALIZED"; private static final String TRUE = "TRUE"; + private static int SELECT = 0; + private Uri uri=null; + + File sendImage = new File(uri.getPath()); + + RequestBody currentImage = RequestBody.create(MediaType.parse("multipart/*"), this.sendImage); + MultipartBody.Part requestImage = MultipartBody.Part.createFormData("profile_image", this.sendImage.getName(), currentImage); @Override public WriteActivityProps initiate() { @@ -31,6 +46,7 @@ public WriteActivityProps initiate() { } WriteActivityProps writeActivityProps = new WriteActivityProps(); writeActivityProps.handleClickWriteSubmitButton = this::handleClickWriteSubmit; + writeActivityProps.handleClickSelectImageButton = this::handleClickSelectImage; return writeActivityProps; } @@ -41,14 +57,48 @@ public WriteActivityProps stateListener(State state) { props.writeDiaryId = state.chat.writeDiaryId; return props; } - public void handleClickWriteSubmit(EditText editText) { try { String writeDiaryId = Store.getState().chat.writeDiaryId; - Store.dispatch(ChatAction.requestAppendChat(writeDiaryId, editText.getText().toString())); + Store.dispatch(ChatAction.requestAppendChat( + writeDiaryId, + editText.getText().toString(), + toString(this.uri), + requestImage)); + this.uri = null; editText.setText(null); } catch (Exception e) { e.printStackTrace(); } } + + public void handleClickSelectImage(Context context, FragmentManager fragmentManager) { + SELECT=1; + PermissionListener permissionListener = new PermissionListener() { + @Override + public void onPermissionGranted() { + TedBottomPicker tedBottomPicker = new TedBottomPicker.Builder(context) + .setOnImageSelectedListener(uri -> + selectImage(uri) + ).create(); + tedBottomPicker.show(fragmentManager); + } + + @Override + public void onPermissionDenied(List deniedPermissions) { +// Toast.makeText(WriteActivity, "Not allowed\n.", Toast.LENGTH_SHORT).show();fd f + } + }; + + TedPermission.with(context) + .setPermissionListener(permissionListener) + .setDeniedMessage("If you reject permission,you can not use this service\\n\\nPlease turn on permissions at [Setting] > [Permission]") + .setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE) + .check(); + } + + private void selectImage(Uri uri) { + this.uri = uri; + Log.e("2", String.valueOf(this.uri)); + } } diff --git a/app/src/main/java/com/chatty/android/chattyClient/state/action/ChatAction.java b/app/src/main/java/com/chatty/android/chattyClient/state/action/ChatAction.java index 04ea27a..386ccff 100644 --- a/app/src/main/java/com/chatty/android/chattyClient/state/action/ChatAction.java +++ b/app/src/main/java/com/chatty/android/chattyClient/state/action/ChatAction.java @@ -1,5 +1,7 @@ package com.chatty.android.chattyClient.state.action; +import android.util.Log; + import com.chatty.android.chattyClient.api.ChattyApi; import com.chatty.android.chattyClient.constants.ActionType; import com.chatty.android.chattyClient.externalModules.ReduxJava.Action; @@ -8,6 +10,11 @@ import com.chatty.android.chattyClient.model.response.AppendChatResponse; import com.chatty.android.chattyClient.model.response.ChatResponse; +import org.w3c.dom.Entity; + +import java.util.HashMap; + +import okhttp3.MultipartBody; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; @@ -33,23 +40,27 @@ public void onFailure(Call call, Throwable t) { }; } - public static ReduxJava.DispatcherMiddleware requestAppendChat(String diaryId, String text) { + public static ReduxJava.DispatcherMiddleware requestAppendChat(String diaryId, String text, String uri, MultipartBody.Part file) { return (dispatch) -> { ChatRequest request = new ChatRequest(); request.label = text; + request.image = uri; + Log.e("통신시작",text+uri); dispatch.run(Action.of(ActionType.REQUEST_APPEND_CHAT) - .payloadAdd("chat", text)); + .payloadAdd("chat", request)); - ChattyApi.getApi().postChat(Integer.parseInt(diaryId), request) + ChattyApi.getApi().postChat(Integer.parseInt(diaryId),request.label,file) .enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { + Log.e("통신성공","ㅋ"); dispatch.run(Action.of(ActionType.REQUEST_APPEND_CHAT_SUCCESS) .payloadAdd("chat", response.body())); } @Override public void onFailure(Call call, Throwable t) { + Log.e("통신실패","ㅋ"); dispatch.run(Action.of(ActionType.REQUEST_APPEND_CHAT_ERROR) .payloadAdd("error", t.getMessage())); } diff --git a/app/src/main/java/com/chatty/android/chattyClient/state/reducers/ChatReducer.java b/app/src/main/java/com/chatty/android/chattyClient/state/reducers/ChatReducer.java index 4f00919..8d4d59f 100644 --- a/app/src/main/java/com/chatty/android/chattyClient/state/reducers/ChatReducer.java +++ b/app/src/main/java/com/chatty/android/chattyClient/state/reducers/ChatReducer.java @@ -6,18 +6,21 @@ import com.chatty.android.chattyClient.externalModules.ReduxJava.ReduxJava; import com.chatty.android.chattyClient.model.ChatBalloon; import com.chatty.android.chattyClient.model.State; +import com.chatty.android.chattyClient.model.request.ChatRequest; import com.chatty.android.chattyClient.model.response.AppendChatResponse; import com.chatty.android.chattyClient.model.response.ChatResponse; import java.util.ArrayList; +import java.util.HashMap; public class ChatReducer implements Reducer { public State.Chat run(State.Chat chat, Action action) { switch (action.getType()) { case ActionType.REQUEST_APPEND_CHAT: - String text = (String) action.getPayload().get("chat"); + ChatRequest chatRequest = (ChatRequest) action.getPayload().get("chat"); ChatBalloon chatBalloon = new ChatBalloon(); - chatBalloon.speech = text; + chatBalloon.speech =chatRequest.label; + chatBalloon.selectImage = chatRequest.image; chat.chatBalloons.add(chatBalloon); ArrayList newChatBalloons = new ArrayList<>(); diff --git a/app/src/main/java/com/chatty/android/chattyClient/state/reducers/DiaryReducer.java b/app/src/main/java/com/chatty/android/chattyClient/state/reducers/DiaryReducer.java index 06a137e..818434d 100644 --- a/app/src/main/java/com/chatty/android/chattyClient/state/reducers/DiaryReducer.java +++ b/app/src/main/java/com/chatty/android/chattyClient/state/reducers/DiaryReducer.java @@ -21,7 +21,7 @@ public State.Diary run(State.Diary diary, Action action) { case ActionType.REQUEST_GET_DIARIES_SUCCESS: TimelineResponse timeline = (TimelineResponse) action.getPayload().get("timeline"); ArrayList timelineEntries = timeline - .diaries + .complete_diaries .stream() .map((_diary) -> { TimelineEntry entry = new TimelineEntry(); diff --git a/app/src/main/java/com/chatty/android/chattyClient/view/write/WriteActivity.java b/app/src/main/java/com/chatty/android/chattyClient/view/write/WriteActivity.java index 76f29fc..be45797 100644 --- a/app/src/main/java/com/chatty/android/chattyClient/view/write/WriteActivity.java +++ b/app/src/main/java/com/chatty/android/chattyClient/view/write/WriteActivity.java @@ -1,19 +1,20 @@ package com.chatty.android.chattyClient.view.write; import android.content.Intent; +import android.net.Uri; +import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.util.Log; import android.widget.EditText; import android.widget.ImageButton; +import android.widget.ImageView; import android.widget.TextView; import com.chatty.android.chattyClient.R; import com.chatty.android.chattyClient.constants.Header; import com.chatty.android.chattyClient.externalModules.AndroidExtended.ExtendedView; -import com.chatty.android.chattyClient.externalModules.AndroidExtended.Props; import com.chatty.android.chattyClient.externalModules.Renderer.Renderer; import com.chatty.android.chattyClient.model.ChatBalloon; import com.chatty.android.chattyClient.presenter.Contract; @@ -41,12 +42,19 @@ public class WriteActivity extends AppCompatActivity implements ExtendedView chatBalloons = (ArrayList) o; - this.dialogueAdapter.update(chatBalloons); + this.dialogueAdapter.update(chatBalloons,getApplicationContext()); this.dialogueRecyclerView.scrollToPosition(chatBalloons.size() -1); } + + private void renderSelectImageButton(WriteActivityProps writeActivityProps) { + this.imagePlusButton.setOnClickListener((__) -> { + writeActivityProps.handleClickSelectImageButton.accept(this.getApplicationContext(),this.getSupportFragmentManager()); + }); + } + } diff --git a/app/src/main/java/com/chatty/android/chattyClient/view/write/WriteActivityProps.java b/app/src/main/java/com/chatty/android/chattyClient/view/write/WriteActivityProps.java index a29bdd1..23258a3 100644 --- a/app/src/main/java/com/chatty/android/chattyClient/view/write/WriteActivityProps.java +++ b/app/src/main/java/com/chatty/android/chattyClient/view/write/WriteActivityProps.java @@ -1,5 +1,9 @@ package com.chatty.android.chattyClient.view.write; +import android.content.Context; +import android.net.Uri; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; import android.text.Editable; import android.widget.EditText; @@ -18,4 +22,14 @@ public class WriteActivityProps extends Props { public String writeDiaryId = ""; public List chatBalloons = new ArrayList<>(); public Consumer handleClickWriteSubmitButton; + public SelectImageButton handleClickSelectImageButton; + + @FunctionalInterface + public interface SelectImageButton { + /** + * @param var1 + * @param var2 + */ + void accept(T1 var1, T2 var2); + } } diff --git a/app/src/main/res/layout/activity_write.xml b/app/src/main/res/layout/activity_write.xml index e9ee05e..a50f3a9 100644 --- a/app/src/main/res/layout/activity_write.xml +++ b/app/src/main/res/layout/activity_write.xml @@ -15,6 +15,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" layout="@layout/item_global_header"/> + + diff --git a/app/src/main/res/layout/item_chat_entry_self.xml b/app/src/main/res/layout/item_chat_entry_self.xml index b851a71..5ee76e1 100644 --- a/app/src/main/res/layout/item_chat_entry_self.xml +++ b/app/src/main/res/layout/item_chat_entry_self.xml @@ -10,7 +10,7 @@ android:background="@drawable/write_answer_ninepatch_3x" android:elevation="@dimen/SIZE_4" android:fontFamily="sans-serif" - android:id="@+id/textView" + android:id="@+id/textView_self" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/SIZE_2" android:layout_marginStart="@dimen/SIZE_20" @@ -23,11 +23,24 @@ android:textColor="@color/black0" android:textSize="@dimen/text_size_14sp" android:textStyle="normal" - app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:text="no plans!!! :( I have part time job in the morning that's it... But i think i might hang out with my friends from uni next week."/> + + + \ No newline at end of file