From 37c2a0e112b06cbb89045ba36b273708e944ab0f Mon Sep 17 00:00:00 2001 From: Albert Vaca Date: Fri, 27 Sep 2013 02:58:16 +0200 Subject: [PATCH] Added multi-file transfer and query for filename and file size --- KdeConnect/src/main/AndroidManifest.xml | 5 + .../Backends/LanBackend/LanLink.java | 2 +- .../main/java/org/kde/kdeconnect/Device.java | 66 +++++++----- .../UserInterface/ShareToReceiver.java | 101 ++++++++++++++++-- 4 files changed, 136 insertions(+), 38 deletions(-) diff --git a/KdeConnect/src/main/AndroidManifest.xml b/KdeConnect/src/main/AndroidManifest.xml index b9e13acc..c4eb6fe6 100644 --- a/KdeConnect/src/main/AndroidManifest.xml +++ b/KdeConnect/src/main/AndroidManifest.xml @@ -127,6 +127,11 @@ + + + + + uriList; + if (!Intent.ACTION_SEND.equals(intent.getAction())) { + uriList = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); + } else { + Uri uri = extras.getParcelable(Intent.EXTRA_STREAM); + uriList = new ArrayList(); + uriList.add(uri); + } - InputStream inputStream = cr.openInputStream(uri); - - //TODO: Figure out a way to find the file size, so we can show a progress bar in KDE - np.setPayload(inputStream, -1); + queuedSendUriList(device, uriList); } catch (Exception e) { Log.e(this.getClass().getName(), e.toString()); } + } else if (extras.containsKey(Intent.EXTRA_TEXT)) { - np.set("text",extras.getString(Intent.EXTRA_TEXT)); + String text = extras.getString(Intent.EXTRA_TEXT); + boolean isUrl; + try { + new URL(text); + isUrl = true; + } catch(Exception e) { + isUrl = false; + } + NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_FILETRANSFER); + if (isUrl) { + np.set("url", text); + } else { + np.set("text", text); + } + device.sendPackage(np); } - device.sendPackage(np); + finish(); } @@ -150,6 +170,65 @@ public class ShareToReceiver extends ActionBarActivity { }); } + private void queuedSendUriList(final Device device, final ArrayList uriList) { + try { + Uri uri = uriList.remove(0); + ContentResolver cr = getContentResolver(); + InputStream inputStream = cr.openInputStream(uri); + + NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_FILETRANSFER); + + String[] proj = { MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.SIZE, MediaStore.MediaColumns.DISPLAY_NAME }; + Cursor cursor = managedQuery(uri, proj, null, null, null); + + int size = -1; + try { + int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.SIZE); + cursor.moveToFirst(); + size = cursor.getInt(column_index); + } catch(Exception e) { + e.printStackTrace(); + Log.e("ShareToReceiver", "Could not obtain file size"); + } + + //Log.e("ShareToReceiver", "Size "+size); + np.setPayload(inputStream, size); + + try { + int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); + cursor.moveToFirst(); + String path = cursor.getString(column_index); + np.set("filename", Uri.parse(path).getLastPathSegment()); + } catch(Exception _) { + try { + int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME); + cursor.moveToFirst(); + String name = cursor.getString(column_index); + np.set("filename", name); + } catch (Exception e) { + e.printStackTrace(); + Log.e("ShareToReceiver", "Could not obtain file name"); + } + } + + device.sendPackage(np, new Device.SendPackageFinishedCallback() { + @Override + public void sendSuccessful() { + if (!uriList.isEmpty()) queuedSendUriList(device, uriList); + else Log.e("ShareToReceiver", "All files sent"); + } + + @Override + public void sendFailed() { + Log.e("ShareToReceiver", "Failed to send attachment"); + } + }); + } catch (Exception e) { + e.printStackTrace(); + Log.e("ShareToReceiver", "Failed to send attachment"); + } + + } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);