From 3cca2d1c71c0cfcc698a0bf2089d6c1bd9ba19ca Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 14 Aug 2013 11:18:37 +0200 Subject: [PATCH] Finished to handle pictures with liblinphone storage --- src/org/linphone/ChatFragment.java | 38 ++++++++++++++++++++++-------- src/org/linphone/ChatMessage.java | 11 +++++++++ src/org/linphone/ChatStorage.java | 11 +++++++-- submodules/linphone | 2 +- 4 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/org/linphone/ChatFragment.java b/src/org/linphone/ChatFragment.java index 5e194e88c..35cd31533 100644 --- a/src/org/linphone/ChatFragment.java +++ b/src/org/linphone/ChatFragment.java @@ -314,7 +314,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC for (int i = messagesList.size() - limit; i < messagesList.size(); i++) { ChatMessage msg = messagesList.get(i); - if (msg.getMessage() != null) { + if (msg.getMessage() != null && msg.getMessage().length() > 0) { displayMessage(msg.getId(), msg.getMessage(), msg.getTimestamp(), msg.isIncoming(), msg.getStatus(), messagesLayout); } else { displayImageMessage(msg.getId(), msg.getImage(), msg.getTimestamp(), msg.isIncoming(), msg.getStatus(), messagesLayout, msg.getUrl()); @@ -410,7 +410,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC final Bitmap bm = ChatFragment.downloadImage(url); if (bm != null) { if (useLinphoneMessageStorage) { - saveImage(bm, finalId); + saveImage(bm, finalId, null); } else { LinphoneActivity.instance().getChatStorage().saveImage(finalId, bm); } @@ -596,8 +596,12 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC if (LinphoneActivity.isInstanciated()) { newId = LinphoneActivity.instance().onMessageSent(sipUri, bitmap, url); } + newId = checkId(newId); latestImageMessages.put(newId, url); + if (useLinphoneMessageStorage) + saveImage(bitmap, newId, chatMessage); + displayImageMessage(newId, bitmap, String.valueOf(System.currentTimeMillis()), false, State.InProgress, messagesLayout, url); scrollToEnd(); } else if (!isNetworkReachable && LinphoneActivity.isInstanciated()) { @@ -633,9 +637,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC }); } else if (message.getExternalBodyUrl() != null) { Bitmap bm = null; - if (useLinphoneMessageStorage) { - //TODO: Try to read image from file - } else { + if (!useLinphoneMessageStorage) { byte[] rawImage = LinphoneActivity.instance().getChatStorage().getRawImageFromMessage(id); if (rawImage != null) { bm = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length); @@ -737,26 +739,42 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC private void saveImage(int id) { byte[] rawImage = LinphoneActivity.instance().getChatStorage().getRawImageFromMessage(id); Bitmap bm = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length); - if (saveImage(bm, id)) { + if (saveImage(bm, id, null)) { Toast.makeText(getActivity(), getString(R.string.image_saved), Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getActivity(), getString(R.string.image_not_saved), Toast.LENGTH_LONG).show(); } } - private boolean saveImage(Bitmap bm, int id) { + private boolean saveImage(Bitmap bm, int id, LinphoneChatMessage message) { try { String path = Environment.getExternalStorageDirectory().toString(); + if (!path.endsWith("/")) + path += "/"; + path += "Pictures/"; + File directory = new File(path); + directory.mkdirs(); + + String filename = getString(R.string.picture_name_format).replace("%s", String.valueOf(id)); + File file = new File(path, filename); + OutputStream fOut = null; - File file = new File(path, getString(R.string.picture_name_format).replace("%s", String.valueOf(id))); fOut = new FileOutputStream(file); bm.compress(Bitmap.CompressFormat.JPEG, 100, fOut); fOut.flush(); fOut.close(); - //TODO: Update url path in liblinphone database - + if (useLinphoneMessageStorage) { + //Update url path in liblinphone database + if (message == null) { + LinphoneChatMessage[] history = chatRoom.getHistory(); + message = history[id-1]; + } + message.setExternalBodyUrl(path + filename); + chatRoom.updateUrl(message); + } + MediaStore.Images.Media.insertImage(getActivity().getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName()); return true; } catch (Exception e) { diff --git a/src/org/linphone/ChatMessage.java b/src/org/linphone/ChatMessage.java index eb45e3b4c..1d8c567d7 100644 --- a/src/org/linphone/ChatMessage.java +++ b/src/org/linphone/ChatMessage.java @@ -47,6 +47,17 @@ public class ChatMessage { this.isRead = read; } + public ChatMessage(int id, String message, Bitmap image, String timestamp, boolean incoming, int status, boolean read) { + super(); + this.id = id; + this.message = message; + this.timestamp = timestamp; + this.incoming = incoming; + this.status = status; + this.image = image; + this.isRead = read; + } + public int getId() { return id; } diff --git a/src/org/linphone/ChatStorage.java b/src/org/linphone/ChatStorage.java index 674fe7d4e..3216a529a 100644 --- a/src/org/linphone/ChatStorage.java +++ b/src/org/linphone/ChatStorage.java @@ -30,6 +30,7 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Bitmap.CompressFormat; /** @@ -284,10 +285,16 @@ public class ChatStorage { LinphoneChatMessage[] history = room.getHistory(); for (int i = 0; i < history.length; i++) { LinphoneChatMessage message = history[i]; - ChatMessage chatMessage = new ChatMessage(i+1, message.getText(), null, + + Bitmap bm = null; + String url = message.getExternalBodyUrl(); + if (url != null && !url.startsWith("http")) { + bm = BitmapFactory.decodeFile(url); + } + ChatMessage chatMessage = new ChatMessage(i+1, message.getText(), bm, String.valueOf(message.getTime()), !message.isOutgoing(), message.getStatus().toInt(), message.isRead()); - chatMessage.setUrl(message.getExternalBodyUrl()); + chatMessage.setUrl(url); chatMessages.add(chatMessage); } } diff --git a/submodules/linphone b/submodules/linphone index d56d927ca..b3c08e5d7 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit d56d927caf4c22554e333ff3227628da2d370a65 +Subproject commit b3c08e5d7ebbc30b1448f7a288f667c86904e6e2