From acbf4de7df385d8fe8e19c3a5385988b67f2b9e1 Mon Sep 17 00:00:00 2001 From: Brieuc Viel Date: Fri, 18 Aug 2017 15:37:42 +0200 Subject: [PATCH] [FileSharing] fix download file + clean up --- res/drawable-xhdpi/chat_attachment.png | Bin 0 -> 3383 bytes res/layout/chat_bubble.xml | 52 +++++- res/values/styles.xml | 11 ++ src/android/org/linphone/ChatFragment.java | 82 +++++++-- src/android/org/linphone/ContactsManager.java | 1 - .../org/linphone/LinphoneActivity.java | 4 - .../linphone/LinphoneLauncherActivity.java | 24 +-- src/android/org/linphone/LinphoneUtils.java | 160 ++++++++++++++++++ 8 files changed, 292 insertions(+), 42 deletions(-) create mode 100644 res/drawable-xhdpi/chat_attachment.png diff --git a/res/drawable-xhdpi/chat_attachment.png b/res/drawable-xhdpi/chat_attachment.png new file mode 100644 index 0000000000000000000000000000000000000000..f46b54e12af881c118108cef879be2fe6bda7ad9 GIT binary patch literal 3383 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 - + + + + + + + + + + + italic + + + + \ No newline at end of file diff --git a/src/android/org/linphone/ChatFragment.java b/src/android/org/linphone/ChatFragment.java index 39c179bbc..f049616a3 100644 --- a/src/android/org/linphone/ChatFragment.java +++ b/src/android/org/linphone/ChatFragment.java @@ -893,7 +893,6 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC //File transfer private void pickImage() { - //TODO : update to use with any file types List cameraIntents = new ArrayList(); Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File file = new File(Environment.getExternalStorageDirectory(), getString(R.string.temp_photo_name_with_date).replace("%s", String.valueOf(System.currentTimeMillis()))); @@ -902,7 +901,6 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC cameraIntents.add(captureIntent); Intent galleryIntent = new Intent(); - //galleryIntent.setType("image/*"); galleryIntent.setType("*/*"); galleryIntent.setAction(Intent.ACTION_PICK); @@ -1048,9 +1046,6 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC @Override protected byte[] doInBackground(File... params) { File file = params[0]; - //FileInputStream fileInputStream = null; - //ByteArrayOutputStream stream = new ByteArrayOutputStream(); - //String extension = LinphoneUtils.getExtensionFromFileName(path); byte[] byteArray = new byte[(int) file.length()]; FileInputStream fis = null; @@ -1096,9 +1091,13 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC String fileToUploadPath = null; if (data != null && data.getData() != null) { fileToUploadPath = getRealPathFromURI(data.getData()); + if(fileToUploadPath == null) + fileToUploadPath = data.getData().toString(); } else if (imageToUploadUri != null) { fileToUploadPath = imageToUploadUri.getPath(); } + sendImageMessage(fileToUploadPath, 0); + } else { super.onActivityResult(requestCode, resultCode, data); } @@ -1123,7 +1122,6 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC newChatConversation = false; initChatRoom(sipUri); - //TODO : if(fileSharedUri != null){ //save SipUri into bundle onSaveInstanceState(getArguments()); @@ -1215,6 +1213,8 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC public LinearLayout imdmLayout; public ImageView imdmIcon; public TextView imdmLabel; + public TextView fileExtensionLabel; + public TextView fileNameLabel; public ViewHolder(View view) { id = view.getId(); @@ -1234,6 +1234,8 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC imdmLayout = (LinearLayout) view.findViewById(R.id.imdmLayout); imdmIcon = (ImageView) view.findViewById(R.id.imdmIcon); imdmLabel = (TextView) view.findViewById(R.id.imdmText); + fileExtensionLabel = (TextView) view.findViewById(R.id.file_extension); + fileNameLabel = (TextView) view.findViewById(R.id.file_name); } @Override @@ -1356,6 +1358,8 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC holder.delete.setVisibility(View.GONE); holder.messageText.setVisibility(View.GONE); holder.messageImage.setVisibility(View.GONE); + holder.fileExtensionLabel.setVisibility(View.GONE); + holder.fileNameLabel.setVisibility(View.GONE); holder.fileTransferLayout.setVisibility(View.GONE); holder.fileTransferProgressBar.setProgress(0); holder.fileTransferAction.setEnabled(true); @@ -1415,9 +1419,14 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC holder.imdmLayout.setVisibility(View.INVISIBLE); } + + + + if (externalBodyUrl != null || fileTransferContent != null) { String appData = message.getAppData(); + if (message.isOutgoing() && appData != null) { holder.messageImage.setVisibility(View.VISIBLE); if (!sameMessage) { @@ -1457,6 +1466,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC loadBitmap(appData, holder.messageImage); holder.messageImage.setTag(message.getAppData()); } + } } } @@ -1494,10 +1504,10 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC public void onClick(View v) { if (context.getPackageManager().checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, context.getPackageName()) == PackageManager.PERMISSION_GRANTED) { v.setEnabled(false); - String extension = message.getFileTransferInformation().getSubtype(); - String filename = context.getString(R.string.temp_photo_name_with_date).replace("%s", String.valueOf(System.currentTimeMillis())) + "." + extension; + String filename = message.getFileTransferInformation().getName(); + String filename2 = context.getString(R.string.temp_photo_name_with_date).replace("%s", String.valueOf(System.currentTimeMillis())) ; //+ "." + extension; File file = new File(Environment.getExternalStorageDirectory(), filename); - message.setAppData(filename); + message.setAppData(file.getPath()); LinphoneManager.getInstance().addDownloadMessagePending(message); message.setListener(LinphoneManager.getInstance()); message.setFileTransferFilepath(file.getPath()); @@ -1536,6 +1546,51 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC } holder.bubbleLayout.setLayoutParams(layoutParams); + if(message.getAppData() != null && holder.fileTransferLayout.getVisibility() != View.VISIBLE){ + if(LinphoneUtils.isExtensionImage(message.getAppData())){ + holder.fileExtensionLabel.setVisibility(View.GONE); + holder.fileNameLabel.setVisibility(View.GONE); + }else { + String extension = (LinphoneUtils.getExtensionFromFileName(message.getAppData())); + if(extension != null) + extension = extension.toUpperCase(); + else + extension = "FILE"; + + if (extension.length() > 4) + extension = extension.substring(0, 3); + + //holder.messageImage.setImageResource(R.drawable.chat_attachment); + holder.fileExtensionLabel.setText(extension); + holder.fileExtensionLabel.setVisibility(View.VISIBLE); + //holder.fileExtensionLabel.setTag(message.getAppData()); + holder.fileNameLabel.setText(LinphoneUtils.getNameFromFilePath(message.getAppData())); + holder.fileNameLabel.setVisibility(View.VISIBLE); + holder.fileExtensionLabel.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(Intent.ACTION_VIEW); + File file = null; + Uri contentUri = null; + String imageUri = (String)holder.messageImage.getTag(); + if (imageUri.startsWith("file://")) { + imageUri = imageUri.substring("file://".length()); + file = new File(imageUri); + contentUri = FileProvider.getUriForFile(getActivity(), "org.linphone.provider", file); + } else if (imageUri.startsWith("content://")) { + contentUri = Uri.parse(imageUri); + } else { + file = new File(imageUri); + contentUri = FileProvider.getUriForFile(getActivity(), "org.linphone.provider", file); + } + intent.setDataAndType(contentUri, "*/*"); + intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); + context.startActivity(intent); + } + }); + } + } + if (isEditMode) { holder.delete.setVisibility(View.VISIBLE); holder.delete.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @@ -1635,7 +1690,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC if(LinphoneUtils.isExtensionImage(path)) defaultBitmap = BitmapFactory.decodeResource(getActivity().getResources(), R.drawable.chat_picture_over); else - defaultBitmap = BitmapFactory.decodeResource(getActivity().getResources(), R.drawable.chat_attachment_over); + defaultBitmap = BitmapFactory.decodeResource(getActivity().getResources(), R.drawable.chat_attachment); BitmapWorkerTask task = new BitmapWorkerTask(imageView); final AsyncBitmap asyncBitmap = new AsyncBitmap(context.getResources(), defaultBitmap, task); @@ -1660,7 +1715,6 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC path = params[0]; Bitmap bm = null; Bitmap thumbnail = null; - if(LinphoneUtils.isExtensionImage(path)) { if (path.startsWith("content")) { try { @@ -1723,17 +1777,17 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_VIEW); - + File file = null; Uri contentUri = null; String imageUri = (String)v.getTag(); if (imageUri.startsWith("file://")) { imageUri = imageUri.substring("file://".length()); - File file = new File(imageUri); + file = new File(imageUri); contentUri = FileProvider.getUriForFile(getActivity(), "org.linphone.provider", file); } else if (imageUri.startsWith("content://")) { contentUri = Uri.parse(imageUri); } else { - File file = new File(imageUri); + file = new File(imageUri); contentUri = FileProvider.getUriForFile(getActivity(), "org.linphone.provider", file); } intent.setDataAndType(contentUri, "*/*"); diff --git a/src/android/org/linphone/ContactsManager.java b/src/android/org/linphone/ContactsManager.java index 7bd05b680..ee5830c3e 100644 --- a/src/android/org/linphone/ContactsManager.java +++ b/src/android/org/linphone/ContactsManager.java @@ -299,7 +299,6 @@ public class ContactsManager extends ContentObserver { } } } - Log.e(" =====>>>> ContacsManager - fetchContactsSync Ended"); } long timeElapsed = (new Date()).getTime() - contactsTime.getTime(); diff --git a/src/android/org/linphone/LinphoneActivity.java b/src/android/org/linphone/LinphoneActivity.java index b71406261..a1d3e0436 100644 --- a/src/android/org/linphone/LinphoneActivity.java +++ b/src/android/org/linphone/LinphoneActivity.java @@ -647,14 +647,12 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick return; } - Log.e(" ===>>> displayChat : message = "+message+" - fileUri = "+fileUri); String pictureUri = null; String thumbnailUri = null; String displayName = null; LinphoneAddress lAddress = null; if(sipUri != null) { - Log.e(" ===>>> displayChat : sipUri = "+ sipUri); try { lAddress = LinphoneManager.getLc().interpretUrl(sipUri); } catch (LinphoneCoreException e) { @@ -692,7 +690,6 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick changeCurrentFragment(FragmentsAvailable.CHAT, extras); } } else { - Log.e(" ===>>> displayChat : currentFragment != Chat"); if(isTablet()){ changeCurrentFragment(FragmentsAvailable.CHAT_LIST, null); //displayChat(sipUri, message, fileUri); @@ -1326,7 +1323,6 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick } else { if (!ContactsManager.getInstance().contactsFetchedOnce()) { ContactsManager.getInstance().enableContactsAccess(); - Log.e(" ====>>>> LinphoneActivity - ContactsManager.getInstance().fetchContactsAsync() 2 !!!"); ContactsManager.getInstance().fetchContactsAsync(); } } diff --git a/src/android/org/linphone/LinphoneLauncherActivity.java b/src/android/org/linphone/LinphoneLauncherActivity.java index e201eff4e..174e473f8 100644 --- a/src/android/org/linphone/LinphoneLauncherActivity.java +++ b/src/android/org/linphone/LinphoneLauncherActivity.java @@ -19,14 +19,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. package org.linphone; import android.app.Activity; -import android.content.CursorLoader; import android.content.Intent; import android.content.pm.ActivityInfo; -import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Handler; -import android.provider.MediaStore; import org.linphone.assistant.RemoteProvisioningActivity; import org.linphone.mediastream.Log; @@ -127,9 +124,13 @@ public class LinphoneLauncherActivity extends Activity { stringFileShared = intent.getStringExtra(Intent.EXTRA_STREAM); }else { fileUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); - stringFileShared = getRealPathFromURI(fileUri); + stringFileShared = LinphoneUtils.getRealPathFromURI(getBaseContext(), fileUri); if(stringFileShared == null) - stringFileShared = fileUri.getPath(); + if(fileUri.getPath().contains("/0/1/mediakey:/local")) + stringFileShared = LinphoneUtils.getFilePath(getBaseContext(), fileUri); + else + stringFileShared = fileUri.getPath(); + } newIntent.putExtra("fileShared", stringFileShared); } @@ -160,18 +161,7 @@ public class LinphoneLauncherActivity extends Activity { }, 1000); } - public String getRealPathFromURI(Uri contentUri) { - String[] proj = {MediaStore.Images.Media.DATA}; - CursorLoader loader = new CursorLoader(this, contentUri, proj, null, null, null); - Cursor cursor = loader.loadInBackground(); - if (cursor != null && cursor.moveToFirst()) { - int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); - String result = cursor.getString(column_index); - cursor.close(); - return result; - } - return null; - } + private class ServiceWaitThread extends Thread { public void run() { diff --git a/src/android/org/linphone/LinphoneUtils.java b/src/android/org/linphone/LinphoneUtils.java index 4b1e1efbd..6044426c3 100644 --- a/src/android/org/linphone/LinphoneUtils.java +++ b/src/android/org/linphone/LinphoneUtils.java @@ -23,8 +23,10 @@ import android.app.AlertDialog; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; +import android.content.CursorLoader; import android.content.Intent; import android.content.res.Resources; +import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.ConnectivityManager; @@ -32,9 +34,11 @@ import android.net.NetworkInfo; import android.net.Uri; import android.os.Build; import android.os.Environment; +import android.os.ParcelFileDescriptor; import android.provider.MediaStore; import android.provider.MediaStore.Images; import android.telephony.TelephonyManager; +import android.text.TextUtils; import android.util.TypedValue; import android.view.KeyEvent; import android.view.View; @@ -60,6 +64,8 @@ import org.linphone.mediastream.video.capture.hwconf.Hacks; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; +import java.io.FileDescriptor; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; @@ -73,6 +79,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Collection; +import java.util.Date; import java.util.List; import java.util.Locale; import java.util.zip.ZipEntry; @@ -472,6 +479,16 @@ public final class LinphoneUtils { } } + public static String getNameFromFilePath(String filePath) { + String name = filePath; + int i = filePath.lastIndexOf('/'); + if (i > 0) { + name = filePath.substring(i+1); + } + return name; + } + + public static String getExtensionFromFileName(String fileName) { String extension = null; int i = fileName.lastIndexOf('.'); @@ -713,5 +730,148 @@ public final class LinphoneUtils { .show(); } } + + + /************************************************************************************************ + * Picasa/Photos management workaround * + ************************************************************************************************/ + + public static String getFilePath(final Context context, final Uri uri) { + + // Google photo uri example + // content://com.google.android.apps.photos.contentprovider/0/1/mediakey%3A%2FAF1QipMObgoK_wDY66gu0QkMAi/ORIGINAL/NONE/114919 + + if ("content".equalsIgnoreCase(uri.getScheme())) { + String result = getDataColumn(context, uri, null, null); // + if (TextUtils.isEmpty(result)) + if (uri.getAuthority().contains("com.google.android")) { + try { + File localFile = createImageFile(context, null); + FileInputStream remoteFile = getSourceStream(context, uri); + if(copyToFile(remoteFile, localFile)) + result = localFile.getAbsolutePath(); + remoteFile.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return result; + } + // File + else if ("file".equalsIgnoreCase(uri.getScheme())) { + return uri.getPath(); + } + + return null; + } + + /** + * Copy data from a source stream to destFile. + * Return true if succeed, return false if failed. + */ + private static boolean copyToFile(InputStream inputStream, File destFile) { + if (inputStream == null || destFile == null) return false; + try { + OutputStream out = new FileOutputStream(destFile); + try { + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) >= 0) { + out.write(buffer, 0, bytesRead); + } + } finally { + out.close(); + } + return true; + } catch (IOException e) { + return false; + } + } + + public static String getTimestamp() { + try { + return new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ROOT).format(new Date()); + } catch (RuntimeException e) { + return new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); + } + } + + public static File createImageFile(Context context, String imageFileName) throws IOException { + if (TextUtils.isEmpty(imageFileName)) + imageFileName = getTimestamp()+".JPEG"; // make random filename if you want. + + final File root; + imageFileName = imageFileName; + root = context.getExternalCacheDir(); + + if (root != null && !root.exists()) + root.mkdirs(); + return new File(root, imageFileName); + } + + + public static FileInputStream getSourceStream(Context context, Uri u) throws FileNotFoundException { + FileInputStream out = null; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + ParcelFileDescriptor parcelFileDescriptor = + context.getContentResolver().openFileDescriptor(u, "r"); + FileDescriptor fileDescriptor = null; + if (parcelFileDescriptor != null) { + fileDescriptor = parcelFileDescriptor.getFileDescriptor(); + out = new FileInputStream(fileDescriptor); + } + } else { + out = (FileInputStream) context.getContentResolver().openInputStream(u); + } + return out; + } + + /** + * Get the value of the data column for this Uri. This is useful for + * MediaStore Uris, and other file-based ContentProviders. + * + * @param context The context. + * @param uri The Uri to query. + * @param selection (Optional) Filter used in the query. + * @param selectionArgs (Optional) Selection arguments used in the query. + * @return The value of the _data column, which is typically a file path. + */ + static String getDataColumn(Context context, Uri uri, String selection, + String[] selectionArgs) { + + Cursor cursor = null; + final String column = "_data"; + final String[] projection = { + column + }; + + try { + cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, + null); + if (cursor != null && cursor.moveToFirst()) { + final int column_index = cursor.getColumnIndexOrThrow(column); + return cursor.getString(column_index); + } + } finally { + if (cursor != null) + cursor.close(); + } + + return null; + } + + public static String getRealPathFromURI(Context context, Uri contentUri) { + String[] proj = {MediaStore.Images.Media.DATA}; + CursorLoader loader = new CursorLoader(context, contentUri, proj, null, null, null); + Cursor cursor = loader.loadInBackground(); + if (cursor != null && cursor.moveToFirst()) { + int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); + String result = cursor.getString(column_index); + cursor.close(); + return result; + } + return null; + } + }