From 107fc4b54fb0595cf24e66699cb2da5d1b63115e Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 18 Jul 2016 15:33:47 +0200 Subject: [PATCH] Set correct content type when uploading image + store image as correct type (fix png transparency issue) --- res/values/non_localizable_custom.xml | 6 ++-- res/values/strings.xml | 1 - src/org/linphone/ChatFragment.java | 11 ++++-- src/org/linphone/LinphoneManager.java | 50 +++++++++++++++++++++------ src/org/linphone/LinphoneUtils.java | 9 +++++ src/org/linphone/ui/BubbleChat.java | 3 +- 6 files changed, 60 insertions(+), 20 deletions(-) diff --git a/res/values/non_localizable_custom.xml b/res/values/non_localizable_custom.xml index d938030fe..437890f35 100644 --- a/res/values/non_localizable_custom.xml +++ b/res/values/non_localizable_custom.xml @@ -68,10 +68,8 @@ linphone-android@belledonne-communications.com false - - linphone-android-photo-temp.jpg - linphone-android-photo-%s.jpg - + linphone-android-photo-temp + linphone-android-photo-%s false false diff --git a/res/values/strings.xml b/res/values/strings.xml index 4f55d9a5b..5711011d1 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -20,7 +20,6 @@ dd/MM, HH:mm dd/MM HH:mm - linphone-mms-%s.jpg Username diff --git a/src/org/linphone/ChatFragment.java b/src/org/linphone/ChatFragment.java index de94d40de..6c5cdafd8 100644 --- a/src/org/linphone/ChatFragment.java +++ b/src/org/linphone/ChatFragment.java @@ -710,7 +710,6 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC editList.setVisibility(View.VISIBLE); isEditMode = true; redrawMessageList(); - //TODO refaire la liste } if(id == R.id.start_call){ LinphoneActivity.instance().setAddresGoToDialerAndCall(sipUri, LinphoneUtils.getUsernameFromAddress(sipUri), null); @@ -909,7 +908,12 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC } ByteArrayOutputStream stream = new ByteArrayOutputStream(); - bm.compress(Bitmap.CompressFormat.PNG, 100, stream); + String extension = LinphoneUtils.getExtensionFromFileName(path); + if (extension != null && extension.toLowerCase(Locale.getDefault()).equals("png")) { + bm.compress(Bitmap.CompressFormat.PNG, 100, stream); + } else { + bm.compress(Bitmap.CompressFormat.JPEG, 100, stream); + } byte[] byteArray = stream.toByteArray(); return byteArray; } @@ -921,8 +925,9 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC } mUploadingImageStream = new ByteArrayInputStream(result); - LinphoneContent content = LinphoneCoreFactory.instance().createLinphoneContent("image", "jpeg", result, null); String fileName = path.substring(path.lastIndexOf("/") + 1); + String extension = LinphoneUtils.getExtensionFromFileName(fileName); + LinphoneContent content = LinphoneCoreFactory.instance().createLinphoneContent("image", extension, result, null); content.setName(fileName); LinphoneChatMessage message = chatRoom.createFileTransferMessage(content); diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java index 6efc2a469..6d5c1139e 100644 --- a/src/org/linphone/LinphoneManager.java +++ b/src/org/linphone/LinphoneManager.java @@ -29,10 +29,12 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Set; import java.util.Timer; import java.util.TimerTask; @@ -79,6 +81,7 @@ import android.annotation.TargetApi; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.ContentResolver; +import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -102,6 +105,7 @@ import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.os.Vibrator; import android.provider.MediaStore; +import android.provider.MediaStore.Images; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.telephony.TelephonyManager; @@ -284,6 +288,40 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag public void setUploadingImageStream(ByteArrayInputStream array){ this.mUploadingImageStream = array; } + + private void storeImage(LinphoneChatMessage msg) { + if (msg == null || msg.getFileTransferInformation() == null || msg.getAppData() == null) return; + File file = new File(Environment.getExternalStorageDirectory(), msg.getAppData()); + Bitmap bm = BitmapFactory.decodeFile(file.getPath()); + if (bm == null) return; + + ContentValues values = new ContentValues(); + values.put(Images.Media.TITLE, file.getName()); + String extension = msg.getFileTransferInformation().getSubtype(); + values.put(Images.Media.MIME_TYPE, "image/" + extension); + ContentResolver cr = getContext().getContentResolver(); + Uri path = cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); + + OutputStream stream; + try { + stream = cr.openOutputStream(path); + if (extension != null && extension.toLowerCase(Locale.getDefault()).equals("png")) { + bm.compress(Bitmap.CompressFormat.PNG, 100, stream); + } else { + bm.compress(Bitmap.CompressFormat.JPEG, 100, stream); + } + + stream.close(); + file.delete(); + bm.recycle(); + + msg.setAppData(path.toString()); + } catch (FileNotFoundException e) { + Log.e(e); + } catch (IOException e) { + Log.e(e); + } + } @Override public void onLinphoneChatMessageStateChanged(LinphoneChatMessage msg, LinphoneChatMessage.State state) { @@ -292,17 +330,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag mUploadPendingFileMessage = null; mUploadingImageStream = null; } else { - File file = new File(Environment.getExternalStorageDirectory(), msg.getAppData()); - try { - Bitmap bm = BitmapFactory.decodeFile(file.getPath()); - if (bm != null) { - String url = MediaStore.Images.Media.insertImage(getContext().getContentResolver(), file.getPath(), file.getName(), null); - msg.setAppData(url); - file.delete(); - } - } catch (FileNotFoundException e) { - Log.e(e); - } + storeImage(msg); removePendingMessage(msg); } } diff --git a/src/org/linphone/LinphoneUtils.java b/src/org/linphone/LinphoneUtils.java index 8d3668418..42661832b 100644 --- a/src/org/linphone/LinphoneUtils.java +++ b/src/org/linphone/LinphoneUtils.java @@ -455,5 +455,14 @@ public final class LinphoneUtils { Log.e(e); } } + + public static String getExtensionFromFileName(String fileName) { + String extension = null; + int i = fileName.lastIndexOf('.'); + if (i > 0) { + extension = fileName.substring(i+1); + } + return extension; + } } diff --git a/src/org/linphone/ui/BubbleChat.java b/src/org/linphone/ui/BubbleChat.java index 50b3d4ea6..712c31933 100644 --- a/src/org/linphone/ui/BubbleChat.java +++ b/src/org/linphone/ui/BubbleChat.java @@ -173,7 +173,8 @@ public class BubbleChat implements LinphoneChatMessage.LinphoneChatMessageListen public void onClick(View v) { if (mContext.getPackageManager().checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, mContext.getPackageName()) == PackageManager.PERMISSION_GRANTED) { v.setEnabled(false); - String filename = context.getString(R.string.temp_photo_name_with_date).replace("%s", String.valueOf(System.currentTimeMillis())); + String extension = nativeMessage.getFileTransferInformation().getSubtype(); + String filename = context.getString(R.string.temp_photo_name_with_date).replace("%s", String.valueOf(System.currentTimeMillis())) + "." + extension; File file = new File(Environment.getExternalStorageDirectory(), filename); nativeMessage.setAppData(filename); LinphoneManager.getInstance().addDownloadMessagePending(nativeMessage);