From 04ae3e11945d1dc27b99bf39df9e73e1b2dbf94a Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Thu, 2 Aug 2018 10:42:52 +0200 Subject: [PATCH 1/7] Change filesharing management --- src/android/org/linphone/LinphoneUtils.java | 97 ++++--------------- .../activities/LinphoneLauncherActivity.java | 12 +-- 2 files changed, 20 insertions(+), 89 deletions(-) diff --git a/src/android/org/linphone/LinphoneUtils.java b/src/android/org/linphone/LinphoneUtils.java index ab6057a1e..30b4e656c 100644 --- a/src/android/org/linphone/LinphoneUtils.java +++ b/src/android/org/linphone/LinphoneUtils.java @@ -22,9 +22,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import android.app.Activity; import android.app.AlertDialog; import android.content.ContentResolver; -import android.content.ContentUris; import android.content.Context; -import android.content.CursorLoader; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; @@ -37,7 +35,6 @@ import android.os.Environment; import android.os.Handler; import android.os.Looper; import android.os.ParcelFileDescriptor; -import android.provider.DocumentsContract; import android.provider.MediaStore; import android.telephony.TelephonyManager; import android.text.Spanned; @@ -599,84 +596,30 @@ public final class LinphoneUtils { } - /************************************************************************************************ - * Picasa/Photos management workaround * - ************************************************************************************************/ - public static String getFilePath(final Context context, final Uri uri) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context, uri)) { - // ExternalStorageProvider - if ("com.android.externalstorage.documents".equals(uri.getAuthority())) { - final String docId = DocumentsContract.getDocumentId(uri); - final String[] split = docId.split(":"); - if (split.length >= 1) return Environment.getExternalStorageDirectory() + "/" + split[1]; + String result = null; + Cursor returnCursor = + context.getContentResolver().query(uri, null, null, null, null); + String type = getTypeFromUri(uri, context); - // TODO handle non-primary volumes - }// Docs storage - else if ("com.google.android.apps.docs.storage".equals(uri.getAuthority())) { - //Google doc not supported right now + returnCursor.moveToFirst(); + try { + File localFile = createFile(context, null, type); + InputStream remoteFile = context.getContentResolver().openInputStream(uri); + + if(copyToFile(remoteFile, localFile)) { + result = localFile.getAbsolutePath(); } - // DownloadsProvider - else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) { - final String id = DocumentsContract.getDocumentId(uri); - try { - final Uri contentUri = ContentUris.withAppendedId( - Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); - - return getDataColumn(context, contentUri, null, null); - } catch (NumberFormatException nfe) { - if (id.startsWith("raw:")) { - return id.substring(4); - } - } - } - // MediaProvider - else if ("com.android.providers.media.documents".equals(uri.getAuthority())) { - final String docId = DocumentsContract.getDocumentId(uri); - final String[] split = docId.split(":"); - final String type = split[0]; - - Uri contentUri = null; - if ("image".equals(type)) { - contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; - } else if ("video".equals(type)) { - contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; - } else if ("audio".equals(type)) { - contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; - } - - final String selection = "_id=?"; - final String[] selectionArgs = new String[] { - split[1] - }; - - return getDataColumn(context, contentUri, selection, selectionArgs); - } - } else if ("content".equalsIgnoreCase(uri.getScheme())) { - String type = getTypeFromUri(uri, context); - String result = getDataColumn(context, uri, null, null); // - if (TextUtils.isEmpty(result)) - if (uri.getAuthority().contains("com.google.android") || uri.getAuthority().contains("com.android")) { - try { - File localFile = createFile(context, null, type); - FileInputStream remoteFile = getSourceStream(context, uri); - if(copyToFile(remoteFile, localFile)) - result = localFile.getAbsolutePath(); - remoteFile.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return result; - } else if ("file".equalsIgnoreCase(uri.getScheme())) { // File - return uri.getPath(); + remoteFile.close(); + } catch (IOException e) { + e.printStackTrace(); } - return null; + + return result; } - - private static String getTypeFromUri(Uri uri, Context context){ + private static String getTypeFromUri(Uri uri, Context context) { ContentResolver cR = context.getContentResolver(); MimeTypeMap mime = MimeTypeMap.getSingleton(); String type = mime.getExtensionFromMimeType(cR.getType(uri)); @@ -719,7 +662,6 @@ public final class LinphoneUtils { imageFileName = getStartDate()+"."+type; // make random filename if you want. final File root; - imageFileName = imageFileName; root = context.getExternalCacheDir(); if (root != null && !root.exists()) @@ -780,8 +722,7 @@ public final class LinphoneUtils { 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(); + Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null); if (cursor != null && cursor.moveToFirst()) { int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); String result = cursor.getString(column_index); @@ -844,7 +785,7 @@ public final class LinphoneUtils { public static Spanned getTextWithHttpLinks(String text) { if (text == null) return null; - + if (text.contains("<")) { text = text.replace("<", "<"); } diff --git a/src/android/org/linphone/activities/LinphoneLauncherActivity.java b/src/android/org/linphone/activities/LinphoneLauncherActivity.java index 1dfc4b657..777c97989 100644 --- a/src/android/org/linphone/activities/LinphoneLauncherActivity.java +++ b/src/android/org/linphone/activities/LinphoneLauncherActivity.java @@ -141,17 +141,7 @@ public class LinphoneLauncherActivity extends Activity { newIntent.putExtra("fileShared", stringFileShared); } }else { - if(((String) intent.getStringExtra(Intent.EXTRA_STREAM)) != null){ - stringUriFileShared = intent.getStringExtra(Intent.EXTRA_STREAM); - }else { - fileUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); - stringUriFileShared = LinphoneUtils.getRealPathFromURI(getBaseContext(), fileUri); - if(stringUriFileShared == null) - if(fileUri.getPath().contains("/0/1/mediakey:/local") || fileUri.getPath().contains("/ORIGINAL/NONE/")) { - stringUriFileShared = LinphoneUtils.getFilePath(getBaseContext(), fileUri); - }else - stringUriFileShared = fileUri.getPath(); - } + stringUriFileShared = LinphoneUtils.getFilePath(getBaseContext(), fileUri); newIntent.putExtra("fileShared", stringUriFileShared); } }else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { From 28f2e2ed5199554a0c9ce368a71b8fe6946548ad Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Thu, 2 Aug 2018 10:49:39 +0200 Subject: [PATCH 2/7] Fix last commit (missing affectation) --- .../org/linphone/activities/LinphoneLauncherActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/android/org/linphone/activities/LinphoneLauncherActivity.java b/src/android/org/linphone/activities/LinphoneLauncherActivity.java index 777c97989..8af4410de 100644 --- a/src/android/org/linphone/activities/LinphoneLauncherActivity.java +++ b/src/android/org/linphone/activities/LinphoneLauncherActivity.java @@ -141,6 +141,7 @@ public class LinphoneLauncherActivity extends Activity { newIntent.putExtra("fileShared", stringFileShared); } }else { + fileUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); stringUriFileShared = LinphoneUtils.getFilePath(getBaseContext(), fileUri); newIntent.putExtra("fileShared", stringUriFileShared); } From 14337f21a495d257010bdb36a1f310169a076cb8 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Thu, 2 Aug 2018 10:52:02 +0200 Subject: [PATCH 3/7] Prevent crash --- src/android/org/linphone/LinphoneUtils.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/android/org/linphone/LinphoneUtils.java b/src/android/org/linphone/LinphoneUtils.java index 30b4e656c..48ee97111 100644 --- a/src/android/org/linphone/LinphoneUtils.java +++ b/src/android/org/linphone/LinphoneUtils.java @@ -597,6 +597,7 @@ public final class LinphoneUtils { public static String getFilePath(final Context context, final Uri uri) { + if (uri == null) return null; String result = null; Cursor returnCursor = context.getContentResolver().query(uri, null, null, null, null); From 97db2028153060a7000f514dfc7bb98ef46f39db Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 2 Aug 2018 10:54:25 +0200 Subject: [PATCH 4/7] Update linphone submodule. --- submodules/linphone | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/linphone b/submodules/linphone index d0232344c..064b3c30e 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit d0232344c705a482feb5ca272abcb044303ef284 +Subproject commit 064b3c30e15de98ac7f03b1d0a323bf565c40498 From 40e5c6872ffcc9082e1a6fceedb220212ccb3ec9 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Thu, 2 Aug 2018 13:41:09 +0200 Subject: [PATCH 5/7] Refactor filesharing management --- src/android/org/linphone/LinphoneUtils.java | 119 ++++-------------- .../activities/LinphoneLauncherActivity.java | 11 +- 2 files changed, 30 insertions(+), 100 deletions(-) diff --git a/src/android/org/linphone/LinphoneUtils.java b/src/android/org/linphone/LinphoneUtils.java index 48ee97111..13c49a37a 100644 --- a/src/android/org/linphone/LinphoneUtils.java +++ b/src/android/org/linphone/LinphoneUtils.java @@ -36,6 +36,7 @@ import android.os.Handler; import android.os.Looper; import android.os.ParcelFileDescriptor; import android.provider.MediaStore; +import android.provider.OpenableColumns; import android.telephony.TelephonyManager; import android.text.Spanned; import android.text.TextUtils; @@ -598,14 +599,12 @@ public final class LinphoneUtils { public static String getFilePath(final Context context, final Uri uri) { if (uri == null) return null; - String result = null; - Cursor returnCursor = - context.getContentResolver().query(uri, null, null, null, null); - String type = getTypeFromUri(uri, context); - returnCursor.moveToFirst(); + String result = null; + String name = getNameFromUri(uri, context); + try { - File localFile = createFile(context, null, type); + File localFile = createFile(context, name); InputStream remoteFile = context.getContentResolver().openInputStream(uri); if(copyToFile(remoteFile, localFile)) { @@ -620,11 +619,20 @@ public final class LinphoneUtils { return result; } - private static String getTypeFromUri(Uri uri, Context context) { - ContentResolver cR = context.getContentResolver(); - MimeTypeMap mime = MimeTypeMap.getSingleton(); - String type = mime.getExtensionFromMimeType(cR.getType(uri)); - return type; + private static String getNameFromUri(Uri uri, Context context) { + String name = null; + if (uri.getScheme().equals("content")) { + Cursor returnCursor = context.getContentResolver().query(uri, null, null, null, null); + if (returnCursor != null) { + returnCursor.moveToFirst(); + int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); + name = returnCursor.getString(nameIndex); + returnCursor.close(); + } + } else if (uri.getScheme().equals("file")) { + name = uri.getLastPathSegment(); + } + return name; } /** @@ -658,67 +666,20 @@ public final class LinphoneUtils { } } - public static File createFile(Context context, String imageFileName, String type) throws IOException { - if (TextUtils.isEmpty(imageFileName)) - imageFileName = getStartDate()+"."+type; // make random filename if you want. + public static File createFile(Context context, String fileName) throws IOException { + if (TextUtils.isEmpty(fileName)) + fileName = getStartDate(); + + if (!fileName.contains(".")) { + fileName = fileName + ".unknown"; + } final File root; 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; + return new File(root, fileName); } public static String getRealPathFromURI(Context context, Uri contentUri) { @@ -733,32 +694,6 @@ public final class LinphoneUtils { return null; } - public static String processContactUri(Context context, Uri contactUri){ - ContentResolver cr = context.getContentResolver(); - InputStream stream = null; - if(cr !=null) { - try { - stream = cr.openInputStream(contactUri); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - if(stream != null) { - StringBuffer fileContent = new StringBuffer(""); - int ch; - try { - while ((ch = stream.read()) != -1) - fileContent.append((char) ch); - } catch (IOException e) { - e.printStackTrace(); - } - String data = new String(fileContent); - return data; - } - return null; - } - return null; - } - public static String getContactNameFromVcard(String vcard){ if(vcard != null) { String contactName = vcard.substring(vcard.indexOf("FN:") + 3); diff --git a/src/android/org/linphone/activities/LinphoneLauncherActivity.java b/src/android/org/linphone/activities/LinphoneLauncherActivity.java index 8af4410de..88d8e2ec1 100644 --- a/src/android/org/linphone/activities/LinphoneLauncherActivity.java +++ b/src/android/org/linphone/activities/LinphoneLauncherActivity.java @@ -132,14 +132,9 @@ public class LinphoneLauncherActivity extends Activity { String type = intent.getType(); newIntent.setData(intent.getData()); if (Intent.ACTION_SEND.equals(action) && type != null) { - if (type.contains("text/")){ - if(("text/plain").equals(type) && (String)intent.getStringExtra(Intent.EXTRA_TEXT)!= null) { - stringFileShared = intent.getStringExtra(Intent.EXTRA_TEXT); - newIntent.putExtra("msgShared", stringFileShared); - } else if(((Uri) intent.getExtras().get(Intent.EXTRA_STREAM)) != null){ - stringFileShared = (LinphoneUtils.createCvsFromString(LinphoneUtils.processContactUri(getApplicationContext(), (Uri)intent.getExtras().get(Intent.EXTRA_STREAM)))).toString(); - newIntent.putExtra("fileShared", stringFileShared); - } + if(("text/plain").equals(type) && (String)intent.getStringExtra(Intent.EXTRA_TEXT)!= null) { + stringFileShared = intent.getStringExtra(Intent.EXTRA_TEXT); + newIntent.putExtra("msgShared", stringFileShared); }else { fileUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); stringUriFileShared = LinphoneUtils.getFilePath(getBaseContext(), fileUri); From b8dc62cb3c5096d68246ec9accc6fecdb3a25f28 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Thu, 2 Aug 2018 13:41:25 +0200 Subject: [PATCH 6/7] Update ram memory used for gradle --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index a1e7a7cb6..878417ffc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ RELEASE_STORE_PASSWORD= RELEASE_KEY_ALIAS= RELEASE_KEY_PASSWORD= #source:https://docs.gradle.org/current/userguide/build_environment.html#sec:configuring_jvm_memory -org.gradle.jvmargs=-Xmx2g -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx2g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 From d98387923556c4ded2655a6b6cad36f8de502c0f Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Thu, 2 Aug 2018 13:47:43 +0200 Subject: [PATCH 7/7] Improve error log during file sharing --- src/android/org/linphone/LinphoneUtils.java | 2 +- .../org/linphone/activities/LinphoneLauncherActivity.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/android/org/linphone/LinphoneUtils.java b/src/android/org/linphone/LinphoneUtils.java index 13c49a37a..fa576a7e4 100644 --- a/src/android/org/linphone/LinphoneUtils.java +++ b/src/android/org/linphone/LinphoneUtils.java @@ -613,7 +613,7 @@ public final class LinphoneUtils { remoteFile.close(); } catch (IOException e) { - e.printStackTrace(); + Log.e("Enable to get sharing file", e); } return result; diff --git a/src/android/org/linphone/activities/LinphoneLauncherActivity.java b/src/android/org/linphone/activities/LinphoneLauncherActivity.java index 88d8e2ec1..0eb500607 100644 --- a/src/android/org/linphone/activities/LinphoneLauncherActivity.java +++ b/src/android/org/linphone/activities/LinphoneLauncherActivity.java @@ -135,7 +135,7 @@ public class LinphoneLauncherActivity extends Activity { if(("text/plain").equals(type) && (String)intent.getStringExtra(Intent.EXTRA_TEXT)!= null) { stringFileShared = intent.getStringExtra(Intent.EXTRA_TEXT); newIntent.putExtra("msgShared", stringFileShared); - }else { + } else { fileUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); stringUriFileShared = LinphoneUtils.getFilePath(getBaseContext(), fileUri); newIntent.putExtra("fileShared", stringUriFileShared);