Skip to content

Commit 84c7acd

Browse files
committed
Added image sending
1 parent 2c96799 commit 84c7acd

File tree

6 files changed

+218
-27
lines changed

6 files changed

+218
-27
lines changed

app/build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,9 @@ dependencies {
4040
implementation 'androidx.media:media:1.1.0'
4141
implementation 'com.android.support:support-media-compat:28.0.0'
4242
implementation 'com.android.support:support-v4:28.0.0'
43+
44+
implementation ("com.github.bumptech.glide:glide:4.9.0") {
45+
exclude group: "com.android.support"
46+
}
47+
implementation "com.android.support:support-fragment:26.1.0"
4348
}

app/src/main/java/com/example/chatfull/ChatActivity.java

Lines changed: 124 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,34 @@
11
package com.example.chatfull;
22

3+
import android.content.Context;
34
import android.content.Intent;
5+
import android.database.Cursor;
46
import android.net.Uri;
57
import android.os.Bundle;
8+
import android.provider.OpenableColumns;
9+
import android.util.Base64;
610
import android.util.Log;
711
import android.view.View;
812
import android.widget.Button;
913
import android.widget.EditText;
1014
import android.widget.ImageButton;
15+
import android.widget.ImageView;
1116
import android.widget.Toast;
1217

1318
import androidx.annotation.Nullable;
1419
import androidx.appcompat.app.AppCompatActivity;
1520

21+
import com.bumptech.glide.Glide;
22+
import com.squareup.picasso.Picasso;
23+
import com.stfalcon.chatkit.commons.ImageLoader;
1624
import com.stfalcon.chatkit.messages.MessagesList;
1725
import com.stfalcon.chatkit.messages.MessagesListAdapter;
1826

27+
import java.io.ByteArrayOutputStream;
28+
import java.io.File;
29+
import java.io.IOException;
30+
import java.io.InputStream;
31+
import java.io.UnsupportedEncodingException;
1932
import java.util.Calendar;
2033

2134
public class ChatActivity extends AppCompatActivity {
@@ -50,7 +63,18 @@ protected void onCreate(Bundle savedInstanceState) {
5063
messageReceiveServer = new MessageReceiveServer(ShowInfoActivity.getSelfIpAddress(), ShowInfoActivity.getSelfPort(),this);
5164

5265
this.messagesList = findViewById(R.id.messagesList);
53-
adapter = new MessagesListAdapter<>(senderId, null);
66+
67+
ImageLoader imageLoader = new ImageLoader() {
68+
@Override
69+
public void loadImage(ImageView imageView, @Nullable String url, @Nullable Object payload) {
70+
byte[] byteArray = Base64.decode(url,Base64.DEFAULT);
71+
Glide.with(getApplicationContext())
72+
.asBitmap()
73+
.load(byteArray)
74+
.into(imageView);
75+
}
76+
};
77+
adapter = new MessagesListAdapter<>(senderId, imageLoader);
5478
messagesList.setAdapter(adapter);
5579

5680
input = findViewById(R.id.et_message);
@@ -60,10 +84,14 @@ protected void onCreate(Bundle savedInstanceState) {
6084
}
6185

6286
public void onBtnSendClick(View view) {
87+
if(input.getText().toString() == null) return;
88+
6389
Message message = new Message(Integer.toString(++cnt), me, input.getText().toString(), Calendar.getInstance().getTime());
90+
message.setIsImage(false);
91+
message.setFilename(null);
6492
adapter.addToStart(message, true);
6593

66-
sender = new SendMessage(user.getIpAddress(), user.getPort(), input.getText().toString(),this);
94+
sender = new SendMessage(user.getIpAddress(), user.getPort(), message,this);
6795
sender.execute();
6896
Log.e("SEND",input.getText().toString());
6997
input.setText("");
@@ -96,11 +124,93 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten
96124
}else if (requestCode == PICK_IMAGE_REQUEST && data!=null) {
97125
if (resultCode == RESULT_OK) {
98126
Uri file = data.getData();
99-
Toast.makeText(this, file.getPath() + "IMAGE", Toast.LENGTH_SHORT).show();
127+
Message message = new Message(Integer.toString(++cnt), me, null, Calendar.getInstance().getTime());
128+
message.setFilename(getFileName(file));
129+
try {
130+
message.setFile(getBytes(this,file));
131+
} catch (IOException e) {
132+
e.printStackTrace();
133+
Log.e("SEND_FILE","COULD NOT CONVERT TO BYTE");
134+
}
135+
message.setIsImage(true);
136+
137+
adapter.addToStart(message,true);
138+
sender = new SendMessage(user.getIpAddress(), user.getPort(), message,this);
139+
sender.execute();
140+
// Toast.makeText(this, file.getPath() + "IMAGE", Toast.LENGTH_SHORT).show();
141+
}
142+
}
143+
}
144+
145+
public String getFileName(Uri uri) {
146+
String result = null;
147+
if (uri.getScheme().equals("content")) {
148+
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
149+
try {
150+
if (cursor != null && cursor.moveToFirst()) {
151+
result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
152+
}
153+
} finally {
154+
cursor.close();
155+
}
156+
}
157+
if (result == null) {
158+
result = uri.getPath();
159+
int cut = result.lastIndexOf('/');
160+
if (cut != -1) {
161+
result = result.substring(cut + 1);
100162
}
101163
}
164+
return result;
102165
}
103166

167+
/**
168+
* get bytes array from Uri.
169+
*
170+
* @param context current context.
171+
* @param uri uri fo the file to read.
172+
* @return a bytes array.
173+
* @throws IOException
174+
*/
175+
public static byte[] getBytes(Context context, Uri uri) throws IOException {
176+
InputStream iStream = context.getContentResolver().openInputStream(uri);
177+
try {
178+
return getBytes(iStream);
179+
} finally {
180+
// close the stream
181+
try {
182+
iStream.close();
183+
} catch (IOException ignored) { /* do nothing */ }
184+
}
185+
}
186+
187+
188+
189+
/**
190+
* get bytes from input stream.
191+
*
192+
* @param inputStream inputStream.
193+
* @return byte array read from the inputStream.
194+
* @throws IOException
195+
*/
196+
public static byte[] getBytes(InputStream inputStream) throws IOException {
197+
198+
byte[] bytesResult = null;
199+
ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
200+
int bufferSize = 1024;
201+
byte[] buffer = new byte[bufferSize];
202+
try {
203+
int len;
204+
while ((len = inputStream.read(buffer)) != -1) {
205+
byteBuffer.write(buffer, 0, len);
206+
}
207+
bytesResult = byteBuffer.toByteArray();
208+
} finally {
209+
// close the stream
210+
try{ byteBuffer.close(); } catch (IOException ignored){ /* do nothing */ }
211+
}
212+
return bytesResult;
213+
}
104214
// @Override
105215
// public boolean onSubmit(CharSequence input) {
106216
// Message message = new Message(Integer.toString(++cnt), me, input.toString(), Calendar.getInstance().getTime());
@@ -116,9 +226,9 @@ public void stopSender(){
116226
sender.cancel(true);
117227
}
118228

119-
public void setMessage(final String msg){
120-
Log.e("IN_SET",msg);
121-
if(msg.equalsIgnoreCase("OFFLINE")){
229+
public void setMessage(final Message msg){
230+
Log.e("IN_SET",msg.toString());
231+
if(msg.getText()!= null && msg.getText().equalsIgnoreCase("OFFLINE")){
122232
if(sender != null)
123233
sender.cancel(true);
124234
if(messageReceiveServer != null)
@@ -131,8 +241,13 @@ public void setMessage(final String msg){
131241
runOnUiThread(new Runnable() {
132242
@Override
133243
public void run() {
134-
Message message = new Message(Integer.toString(++cnt), user, msg, Calendar.getInstance().getTime());
135-
adapter.addToStart(message, true);
244+
if(msg.getText() != null) {
245+
Message message = new Message(Integer.toString(++cnt), user, msg.getText(), Calendar.getInstance().getTime());
246+
adapter.addToStart(message, true);
247+
} else if(msg.isImage()){
248+
msg.setUser(user);
249+
adapter.addToStart(msg,true);
250+
}
136251
}
137252
});
138253
}
@@ -150,7 +265,7 @@ protected void onDestroy() {
150265
@Override
151266
public void onBackPressed() {
152267
Log.e("CHAT_ACTIVITY", "PAUSE");
153-
sender = new SendMessage(user.getIpAddress(), user.getPort(), "OFFLINE",this);
268+
sender = new SendMessage(user.getIpAddress(), user.getPort(), new Message(Integer.toString(++cnt), me, "OFFLINE"),this);
154269
sender.execute();
155270
try {
156271
Thread.sleep(500);

app/src/main/java/com/example/chatfull/Message.java

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,36 @@
11
package com.example.chatfull;
22

3+
import android.annotation.TargetApi;
4+
import android.os.Build;
5+
import android.util.Base64;
6+
7+
import androidx.annotation.Nullable;
8+
39
import com.stfalcon.chatkit.commons.models.IMessage;
410
import com.stfalcon.chatkit.commons.models.IUser;
11+
import com.stfalcon.chatkit.commons.models.MessageContentType;
512

13+
import java.io.Serializable;
614
import java.util.Date;
715

8-
public class Message implements IMessage {
16+
public class Message implements IMessage, Serializable, MessageContentType.Image {
17+
18+
private String id, text;
19+
private User user;
20+
private Date createdAt;
21+
22+
private String filename;
23+
private byte[] file;
24+
25+
public void setId(String id) {
26+
this.id = id;
27+
}
28+
29+
public void setCreatedAt(Date createdAt) {
30+
this.createdAt = createdAt;
31+
}
932

10-
String id, text;
11-
User user;
12-
Date createdAt;
33+
private boolean isImage;
1334

1435
public Message(String id, User user, String text) {
1536
this(id, user, text, new Date());
@@ -22,6 +43,7 @@ public Message(String id, User user, String text, Date createdAt) {
2243
this.createdAt = createdAt;
2344
}
2445

46+
2547
@Override
2648
public String getId() {
2749
return id;
@@ -41,4 +63,47 @@ public IUser getUser() {
4163
public Date getCreatedAt() {
4264
return createdAt;
4365
}
66+
67+
@Override
68+
public String toString() {
69+
if(filename != null) return filename;
70+
else return id;
71+
}
72+
73+
public void setText(String text) { this.text = text; }
74+
75+
public void setUser(User user) { this.user = user; }
76+
77+
public String getFilename() {
78+
return filename;
79+
}
80+
81+
public void setFilename(String filename) {
82+
this.filename = filename;
83+
}
84+
85+
public byte[] getFile() {
86+
return file;
87+
}
88+
89+
public void setFile(byte[] file) {
90+
this.file = file;
91+
}
92+
93+
public boolean isImage() {
94+
return isImage;
95+
}
96+
97+
public void setIsImage(boolean image) {
98+
isImage = image;
99+
}
100+
101+
@Nullable
102+
@Override
103+
public String getImageUrl() {
104+
if(isImage == false) return null;
105+
else{
106+
return Base64.encodeToString(file,Base64.DEFAULT);
107+
}
108+
}
44109
}

app/src/main/java/com/example/chatfull/MessageReceiveServer.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.io.BufferedReader;
66
import java.io.IOException;
77
import java.io.InputStreamReader;
8+
import java.io.ObjectInputStream;
89
import java.net.ServerSocket;
910
import java.net.Socket;
1011

@@ -34,14 +35,16 @@ public void run() {
3435
Log.e("RECEIVE","Connected");
3536

3637
try {
37-
BufferedReader input = new BufferedReader(new InputStreamReader(received_userSocket.getInputStream()));
38-
String message;
39-
message = input.readLine();
38+
ObjectInputStream in = new ObjectInputStream(received_userSocket.getInputStream());
39+
Message message = (Message) in.readObject();
40+
4041
Log.e("RECEIVE","RECEIVED ==>" + message);
4142
activity.setMessage(message);
4243

4344
} catch (IOException e) {
4445
e.printStackTrace();
46+
} catch (ClassNotFoundException e) {
47+
e.printStackTrace();
4548
}
4649

4750
}

app/src/main/java/com/example/chatfull/SendMessage.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,20 @@
22

33
import android.os.AsyncTask;
44
import android.util.Log;
5+
6+
import java.io.ObjectOutputStream;
57
import java.io.PrintWriter;
68
import java.net.Socket;
79

810
public class SendMessage extends AsyncTask<Void, Void, String> {
911

1012
ChatActivity activity;
11-
private String dstAddress, message;
13+
private String dstAddress;
14+
private Message message;
1215
private int dstPort;
1316
private Socket clientSocket = null;
1417

15-
SendMessage(String addr, int port, String message, ChatActivity activity) {
18+
SendMessage(String addr, int port, Message message, ChatActivity activity) {
1619
this.dstAddress = addr;
1720
this.dstPort = port;
1821
this.message = message;
@@ -23,16 +26,18 @@ public class SendMessage extends AsyncTask<Void, Void, String> {
2326
protected String doInBackground(Void... arg0) {
2427
try {
2528
clientSocket = new Socket(dstAddress, dstPort);
26-
Log.e("SEND_MSG","Connected, Sending: " + message);
29+
Log.e("SEND_MSG","Connected, Sending: " + message.getText());
2730

2831
if(clientSocket != null) {
29-
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),true);
30-
out.println(message);
31-
Log.e("SEND_MSG","DONE: " + message);
32+
ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());
33+
out.writeObject(message);
34+
out.flush();
35+
36+
Log.e("SEND_MSG","DONE: " + message.getText());
3237
activity.stopSender();
3338
}
3439
} catch (Exception e) {
35-
Log.e("SEND_MSG","ConnectHoyNai "+ message);
40+
Log.e("SEND_MSG","ConnectHoyNai "+ message.getText());
3641
e.printStackTrace();
3742
}
3843
return null;

0 commit comments

Comments
 (0)