From 3b2a16b6fcbce8421c9d220c7f48da05c0ffe620 Mon Sep 17 00:00:00 2001 From: Daniel Dakhno Date: Fri, 16 Oct 2020 01:50:44 +0200 Subject: [PATCH] Fossil Hybrid: added manual file down/upload --- app/src/main/AndroidManifest.xml | 3 + .../qhybrid/FileManagementActivity.java | 124 ++++++++++++++++++ .../devices/qhybrid/HRConfigActivity.java | 4 + .../devices/qhybrid/QHybridSupport.java | 24 ++++ .../devices/qhybrid/adapter/WatchAdapter.java | 7 + .../adapter/fossil/FossilWatchAdapter.java | 5 +- .../fossil_hr/FossilHRWatchAdapter.java | 83 ++++++++++-- .../activity_qhybrid_file_management.xml | 43 ++++++ .../layout/activity_qhybrid_hr_settings.xml | 7 + 9 files changed, 289 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/FileManagementActivity.java create mode 100644 app/src/main/res/layout/activity_qhybrid_file_management.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a7187c8b0..9e0131889 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -570,5 +570,8 @@ + \ No newline at end of file diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/FileManagementActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/FileManagementActivity.java new file mode 100644 index 000000000..eb30d921d --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/FileManagementActivity.java @@ -0,0 +1,124 @@ +package nodomain.freeyourgadget.gadgetbridge.devices.qhybrid; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Bundle; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.ExpandableListView; +import android.widget.Spinner; +import android.widget.Switch; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + +import java.io.Serializable; +import java.nio.file.attribute.FileTime; + +import no.nordicsemi.android.dfu.FileType; +import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBActivity; +import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport; +import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.file.FileHandle; + +public class FileManagementActivity extends AbstractGBActivity implements View.OnClickListener { + private final int REQUEST_CODE_PICK_UPLOAD_FILE = 0; + + private Spinner fileTypesSpinner; + private Switch encryptedFile; + + BroadcastReceiver fileResultReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(QHybridSupport.QHYBRID_ACTION_DOWNLOADED_FILE)) { + boolean success = intent.getBooleanExtra("EXTRA_SUCCESS", false); + if (!success) { + Toast.makeText(FileManagementActivity.this, "error downloading file, check logcat", Toast.LENGTH_LONG).show(); + return; + } + String path = intent.getStringExtra("EXTRA_PATH"); + Toast.makeText(FileManagementActivity.this, "downloaded file " + path, Toast.LENGTH_LONG).show(); + }else if(intent.getAction().equals(QHybridSupport.QHYBRID_ACTION_UPLOADED_FILE)) { + boolean success = intent.getBooleanExtra("EXTRA_SUCCESS", false); + if (!success) { + Toast.makeText(FileManagementActivity.this, "error uploading file, check logcat", Toast.LENGTH_LONG).show(); + return; + } + Toast.makeText(FileManagementActivity.this, "uploaded file", Toast.LENGTH_LONG).show(); + } + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_qhybrid_file_management); + + initViews(); + } + + @Override + protected void onResume() { + super.onResume(); + IntentFilter filter = new IntentFilter(); + filter.addAction(QHybridSupport.QHYBRID_ACTION_DOWNLOADED_FILE); + filter.addAction(QHybridSupport.QHYBRID_ACTION_UPLOADED_FILE); + LocalBroadcastManager.getInstance(this).registerReceiver(fileResultReceiver, filter); + } + + @Override + protected void onPause() { + super.onPause(); + LocalBroadcastManager.getInstance(this).unregisterReceiver(fileResultReceiver); + } + + private void initViews() { + FileHandle[] handles = FileHandle.values(); + fileTypesSpinner = findViewById(R.id.qhybrid_file_types); + fileTypesSpinner.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, handles)); + + encryptedFile = findViewById(R.id.qhybrid_switch_encrypted_file); + + findViewById(R.id.qhybrid_button_download_file).setOnClickListener(this); + findViewById(R.id.qhybrid_button_upload_file).setOnClickListener(this); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(requestCode != REQUEST_CODE_PICK_UPLOAD_FILE) return; + if(resultCode != RESULT_OK) return; + + Intent callIntent = new Intent(QHybridSupport.QHYBRID_COMMAND_UPLOAD_FILE); + callIntent.putExtra("EXTRA_HANDLE", (FileHandle) fileTypesSpinner.getSelectedItem()); + callIntent.putExtra("EXTRA_ENCRYPTED", encryptedFile.isChecked()); + callIntent.putExtra("EXTRA_PATH", data.getData().getPath()); + // callIntent.setData(data.getData()); + + LocalBroadcastManager.getInstance(this).sendBroadcast(callIntent); + } + + @Override + public void onClick(View v) { + boolean isEncrypted = encryptedFile.isChecked(); + + if (v.getId() == R.id.qhybrid_button_download_file) { + Intent fileIntent = new Intent(); + fileIntent.putExtra("EXTRA_ENCRYPTED", isEncrypted); + fileIntent.setAction(QHybridSupport.QHYBRID_COMMAND_DOWNLOAD_FILE); + fileIntent.putExtra("EXTRA_HANDLE", (FileHandle) fileTypesSpinner.getSelectedItem()); + LocalBroadcastManager.getInstance(this).sendBroadcast(fileIntent); + } else if (v.getId() == R.id.qhybrid_button_upload_file) { + Intent chooserIntent = new Intent() + .setType("*/*") + .setAction(Intent.ACTION_GET_CONTENT); + + Intent intent = Intent.createChooser(chooserIntent, "Select a file"); + + startActivityForResult(intent, REQUEST_CODE_PICK_UPLOAD_FILE); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HRConfigActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HRConfigActivity.java index 878fd8a32..9c35bb33b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HRConfigActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/HRConfigActivity.java @@ -68,6 +68,7 @@ public class HRConfigActivity extends AbstractGBActivity implements View.OnClick setContentView(R.layout.activity_qhybrid_hr_settings); findViewById(R.id.qhybrid_action_add).setOnClickListener(this); + findViewById(R.id.qhybrid_file_management_trigger).setOnClickListener(this); sharedPreferences = GBApplication.getPrefs().getPreferences(); @@ -401,6 +402,9 @@ public class HRConfigActivity extends AbstractGBActivity implements View.OnClick .setPositiveButton("ok", this) .setTitle("create action") .show(); + } else if(v.getId() == R.id.qhybrid_file_management_trigger) { + finish(); + startActivity(new Intent(getApplicationContext(), FileManagementActivity.class)); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/QHybridSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/QHybridSupport.java index 58c10f345..8dd76b685 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/QHybridSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/QHybridSupport.java @@ -70,6 +70,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.Watc import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.WatchAdapterFactory; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil_hr.FossilHRWatchAdapter; +import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.file.FileHandle; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.DownloadFileRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.PlayNotificationRequest; import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; @@ -91,6 +92,12 @@ public class QHybridSupport extends QHybridBaseSupport { public static final String QHYBRID_COMMAND_SET_WIDGET_CONTENT = "nodomain.freeyourgadget.gadgetbridge.Q_SET_WIDGET_CONTENT"; public static final String QHYBRID_COMMAND_SET_BACKGROUND_IMAGE = "nodomain.freeyourgadget.gadgetbridge.Q_SET_BACKGROUND_IMAGE"; + public static final String QHYBRID_COMMAND_DOWNLOAD_FILE = "nodomain.freeyourgadget.gadgetbridge.Q_DOWNLOAD_FILE"; + public static final String QHYBRID_COMMAND_UPLOAD_FILE = "nodomain.freeyourgadget.gadgetbridge.Q_UPLOAD_FILE"; + + public static final String QHYBRID_ACTION_DOWNLOADED_FILE = "nodomain.freeyourgadget.gadgetbridge.Q_DOWNLOADED_FILE"; + public static final String QHYBRID_ACTION_UPLOADED_FILE = "nodomain.freeyourgadget.gadgetbridge.Q_UPLOADED_FILE"; + private static final String QHYBRID_ACTION_SET_ACTIVITY_HAND = "nodomain.freeyourgadget.gadgetbridge.Q_SET_ACTIVITY_HAND"; public static final String QHYBRID_EVENT_SETTINGS_UPDATED = "nodomain.freeyourgadget.gadgetbridge.Q_SETTINGS_UPDATED"; @@ -146,6 +153,8 @@ public class QHybridSupport extends QHybridBaseSupport { commandFilter.addAction(QHYBRID_COMMAND_UPDATE_WIDGETS); commandFilter.addAction(QHYBRID_COMMAND_SEND_MENU_ITEMS); commandFilter.addAction(QHYBRID_COMMAND_SET_BACKGROUND_IMAGE); + commandFilter.addAction(QHYBRID_COMMAND_UPLOAD_FILE); + commandFilter.addAction(QHYBRID_COMMAND_DOWNLOAD_FILE); commandReceiver = new BroadcastReceiver() { @Override @@ -237,6 +246,21 @@ public class QHybridSupport extends QHybridBaseSupport { watchAdapter.setBackgroundImage(pixels); break; } + case QHYBRID_COMMAND_DOWNLOAD_FILE:{ + Object handleObject = intent.getSerializableExtra("EXTRA_HANDLE"); + if(handleObject == null || !(handleObject instanceof FileHandle)) return; + FileHandle handle = (FileHandle) handleObject; + watchAdapter.downloadFile(handle, intent.getBooleanExtra("EXTRA_ENCRYPTED", false)); + break; + } + case QHYBRID_COMMAND_UPLOAD_FILE:{ + Object handleObject = intent.getSerializableExtra("EXTRA_HANDLE"); + if(handleObject == null || !(handleObject instanceof FileHandle)) return; + FileHandle handle = (FileHandle) handleObject; + String filePath = intent.getStringExtra("EXTRA_PATH"); + watchAdapter.uploadFile(handle, filePath, intent.getBooleanExtra("EXTRA_ENCRYPTED", false)); + break; + } } } }; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/WatchAdapter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/WatchAdapter.java index a6de268f5..68abc1ebd 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/WatchAdapter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/WatchAdapter.java @@ -30,6 +30,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec; import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec; import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport; +import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.file.FileHandle; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.PlayNotificationRequest; public abstract class WatchAdapter { @@ -138,4 +139,10 @@ public abstract class WatchAdapter { public void onDeleteNotification(int id) { } + + public void downloadFile(FileHandle handle, boolean fileIsEncrypted) { + } + + public void uploadFile(FileHandle handle, String filePath, boolean fileIsEncrypted) { + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil/FossilWatchAdapter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil/FossilWatchAdapter.java index e831800bb..a3638414f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil/FossilWatchAdapter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil/FossilWatchAdapter.java @@ -46,6 +46,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSuppo import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.WatchAdapter; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.buttonconfig.ConfigFileBuilder; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.buttonconfig.ConfigPayload; +import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.file.FileHandle; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.Request; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.FossilRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.RequestMtuRequest; @@ -241,7 +242,7 @@ public class FossilWatchAdapter extends WatchAdapter { ConfigFileBuilder builder = new ConfigFileBuilder(payloads); - FilePutRequest fileUploadRequets = new FilePutRequest((short) 0x0600, builder.build(true), this) { + FilePutRequest fileUploadRequets = new FilePutRequest(FileHandle.SETTINGS_BUTTONS, builder.build(true), this) { @Override public void onFilePut(boolean success) { if (success) @@ -361,7 +362,7 @@ public class FossilWatchAdapter extends WatchAdapter { @Override public void onTestNewFunction() { queueWrite(new FilePutRequest( - (short) 0x0600, + FileHandle.HAND_ACTIONS, new byte[]{ (byte) 0x01, (byte) 0x00, (byte) 0x08, (byte) 0x01, (byte) 0x01, (byte) 0x24, (byte) 0x00, (byte) 0x85, (byte) 0x01, (byte) 0x30, (byte) 0x52, (byte) 0xFF, (byte) 0x26, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x09, (byte) 0x04, (byte) 0x01, (byte) 0x03, (byte) 0xA0, (byte) 0x00, (byte) 0x00, (byte) 0xA0, (byte) 0x00, (byte) 0x00, (byte) 0x08, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x93, (byte) 0x00, (byte) 0x02, (byte) 0x09, (byte) 0x04, (byte) 0x01, (byte) 0x03, (byte) 0x00, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0x24, (byte) 0x00, (byte) 0x08, (byte) 0x01, (byte) 0x50, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x1F, (byte) 0xBE, (byte) 0xB4, (byte) 0x1B }, diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil_hr/FossilHRWatchAdapter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil_hr/FossilHRWatchAdapter.java index 63d75b90b..9db26be09 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil_hr/FossilHRWatchAdapter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil_hr/FossilHRWatchAdapter.java @@ -3,7 +3,6 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fos import android.bluetooth.BluetoothGattCharacteristic; import android.content.Intent; import android.content.SharedPreferences; -import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -13,14 +12,19 @@ import android.graphics.Paint; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; +import android.os.Handler; +import android.os.Looper; import android.widget.Toast; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.File; +import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; @@ -29,11 +33,8 @@ import java.io.InputStream; import java.nio.BufferOverflowException; import java.util.ArrayList; import java.util.Calendar; -import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Iterator; -import java.util.List; -import java.util.TimeZone; import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -60,26 +61,26 @@ import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter; +import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.file.FileHandle; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.parser.ActivityEntry; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.parser.ActivityFileParser; -import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.Request; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.RequestMtuRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.SetDeviceStateRequest; -import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.configuration.ConfigurationPutRequest.TimeConfigItem; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FileDeleteRequest; +import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FileGetRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FileLookupRequest; +import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FilePutRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.PlayCallNotificationRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.PlayTextNotificationRequest; -import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.activity.ActivityFilesGetRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.async.ConfirmAppStatusRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.authentication.VerifyPrivateKeyRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.buttons.ButtonConfiguration; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.buttons.ButtonConfigurationPutRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.configuration.ConfigurationGetRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.configuration.ConfigurationPutRequest; -import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.file.AssetFile; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.file.AssetFilePutRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.file.FileEncryptedGetRequest; +import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.file.FilePutRawRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.file.FirmwareFilePutRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.image.AssetImage; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.image.AssetImageFactory; @@ -478,7 +479,7 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter { if (pushFiles.size() > 0) { queueWrite(new AssetFilePutRequest( pushFiles.toArray(new AssetImage[0]), - (byte) 0x00, + FileHandle.ASSET_BACKGROUND_IMAGES, this )); } @@ -492,6 +493,70 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter { } } + private void handleFileDownload(FileHandle handle, byte[] file){ + Intent resultIntent = new Intent(QHybridSupport.QHYBRID_ACTION_DOWNLOADED_FILE); + File outputFile = new File(getContext().getExternalFilesDir("download"), handle.name() + "_" + System.currentTimeMillis() + ".bin"); + try { + FileOutputStream fos = new FileOutputStream(outputFile); + fos.write(file); + fos.close(); + resultIntent.putExtra("EXTRA_SUCCESS", true); + resultIntent.putExtra("EXTRA_PATH", outputFile.getAbsolutePath()); + } catch (IOException e) { + e.printStackTrace(); + resultIntent.putExtra("EXTRA_SUCCESS", false); + } + LocalBroadcastManager.getInstance(getContext()).sendBroadcast(resultIntent); + } + + @Override + public void uploadFile(FileHandle handle, String filePath, boolean fileIsEncrypted) { + final Intent resultIntent = new Intent(QHybridSupport.QHYBRID_ACTION_UPLOADED_FILE); + byte[] fileData; + + try { + FileInputStream fis = new FileInputStream(filePath); + fileData = new byte[fis.available()]; + fis.read(fileData); + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + resultIntent.putExtra("EXTRA_SUCCESS", false); + LocalBroadcastManager.getInstance(getContext()).sendBroadcast(resultIntent); + return; + } + + queueWrite(new FilePutRawRequest(handle, fileData, this){ + @Override + public void onFilePut(boolean success) { + resultIntent.putExtra("EXTRA_SUCCESS", success); + LocalBroadcastManager.getInstance(getContext()).sendBroadcast(resultIntent); + } + }); + } + + @Override + public void downloadFile(final FileHandle handle, boolean fileIsEncrypted) { + if(fileIsEncrypted){ + negotiateSymmetricKey(); + queueWrite(new FileEncryptedGetRequest(handle, this) { + @Override + public void handleFileData(byte[] fileData) { + logger.debug("downloaded encrypted file"); + handleFileDownload(handle, fileData); + } + }); + }else{ + queueWrite(new FileGetRequest(handle, this) { + @Override + public void handleFileData(byte[] fileData) { + logger.debug("downloaded regular file"); + handleFileDownload(handle, fileData); + } + }); + } + } + @Override public void setWidgetContent(String widgetID, String content, boolean renderOnWatch) { boolean update = false; diff --git a/app/src/main/res/layout/activity_qhybrid_file_management.xml b/app/src/main/res/layout/activity_qhybrid_file_management.xml new file mode 100644 index 000000000..6fd1fe1f1 --- /dev/null +++ b/app/src/main/res/layout/activity_qhybrid_file_management.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + +