android/usb: simply restart the download after receiving permission

If the user tries to download from a device that he hasn't given the app
permission to read from, Android will pop up a dialogue asking for that
permission. With this after giving the permission we continue (well,
technically, restart) the download which is likely the expected behavior.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2020-03-15 12:27:10 -07:00
parent 4619b4932e
commit 0b72495413
5 changed files with 70 additions and 12 deletions

View file

@ -28,6 +28,7 @@ public class SubsurfaceMobileActivity extends QtActivity
public static boolean isInitialized; public static boolean isInitialized;
private static final String TAG = "subsurfacedivelog.mobile"; private static final String TAG = "subsurfacedivelog.mobile";
public static native void setUsbDevice(UsbDevice usbDevice); public static native void setUsbDevice(UsbDevice usbDevice);
public static native void restartDownload(UsbDevice usbDevice);
private static Context appContext; private static Context appContext;
// we need to provide two endpoints: // we need to provide two endpoints:
@ -116,8 +117,13 @@ public class SubsurfaceMobileActivity extends QtActivity
if ("org.subsurfacedivelog.mobile.USB_PERMISSION".equals(action)) { if ("org.subsurfacedivelog.mobile.USB_PERMISSION".equals(action)) {
synchronized (this) { synchronized (this) {
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
Log.d(TAG, "USB device permission granted"); UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
setUsbDevice(null); if (device == null) {
Log.i(TAG, " permission granted but null device");
return;
}
Log.d(TAG, "USB device permission granted for " + device.getDeviceName());
restartDownload(device);
} else { } else {
Log.d(TAG, "USB device permission denied"); Log.d(TAG, "USB device permission denied");
} }

View file

@ -181,7 +181,7 @@ Java_org_subsurfacedivelog_mobile_SubsurfaceMobileActivity_setUsbDevice(JNIEnv *
if (usbDevice.isValid()) { if (usbDevice.isValid()) {
android_usb_serial_device_descriptor descriptor = getDescriptor(usbDevice); android_usb_serial_device_descriptor descriptor = getDescriptor(usbDevice);
LOG(QString("called by intent for device %1").arg(QString::fromStdString(descriptor.uiRepresentation))); LOG(QString("called by connect intent for device %1").arg(QString::fromStdString(descriptor.uiRepresentation)));
} }
#if defined(SUBSURFACE_MOBILE) #if defined(SUBSURFACE_MOBILE)
QMLManager::instance()->showDownloadPage(usbDevice); QMLManager::instance()->showDownloadPage(usbDevice);
@ -189,6 +189,25 @@ Java_org_subsurfacedivelog_mobile_SubsurfaceMobileActivity_setUsbDevice(JNIEnv *
return; return;
} }
JNIEXPORT void JNICALL
Java_org_subsurfacedivelog_mobile_SubsurfaceMobileActivity_restartDownload(JNIEnv *env,
jobject obj,
jobject javaUsbDevice)
{
Q_UNUSED (obj)
Q_UNUSED (env)
QAndroidJniObject usbDevice(javaUsbDevice);
if (usbDevice.isValid()) {
android_usb_serial_device_descriptor descriptor = getDescriptor(usbDevice);
LOG(QString("called by permission granted intent for device %1").arg(QString::fromStdString(descriptor.uiRepresentation)));
}
#if defined(SUBSURFACE_MOBILE)
QMLManager::instance()->restartDownload(usbDevice);
#endif
return;
}
/* NOP wrappers to comform with windows.c */ /* NOP wrappers to comform with windows.c */
int subsurface_rename(const char *path, const char *newpath) int subsurface_rename(const char *path, const char *newpath)
{ {

View file

@ -293,6 +293,24 @@ Kirigami.Page {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: Kirigami.Units.smallSpacing Layout.topMargin: Kirigami.Units.smallSpacing
spacing: Kirigami.Units.smallSpacing spacing: Kirigami.Units.smallSpacing
function doDownload() {
var message = "DCDownloadThread started for " + manager.DC_vendor + " " + manager.DC_product + " on " + manager.DC_devName;
message += " downloading " + (manager.DC_forceDownload ? "all" : "only new" ) + " dives";
manager.appendTextToLog(message)
progressBar.visible = true
divesDownloaded = false // this allows the progressMessage to be displayed
importModel.startDownload()
}
Connections {
target: manager
onRestartDownloadSignal: {
buttonBar.doDownload()
}
}
TemplateButton { TemplateButton {
id: download id: download
text: qsTr("Download") text: qsTr("Download")
@ -322,12 +340,7 @@ Kirigami.Page {
manager.DC_bluetoothMode = false; manager.DC_bluetoothMode = false;
manager.DC_devName = connectionString; manager.DC_devName = connectionString;
} }
var message = "DCDownloadThread started for " + manager.DC_vendor + " " + manager.DC_product + " on " + manager.DC_devName; buttonBar.doDownload()
message += " downloading " + (manager.DC_forceDownload ? "all" : "only new" ) + " dives";
manager.appendTextToLog(message)
progressBar.visible = true
divesDownloaded = false // this allows the progressMessage to be displayed
importModel.startDownload()
} }
} }
TemplateButton { TemplateButton {

View file

@ -2120,9 +2120,8 @@ void QMLManager::androidUsbPopoulateConnections()
void QMLManager::showDownloadPage(QAndroidJniObject usbDevice) void QMLManager::showDownloadPage(QAndroidJniObject usbDevice)
{ {
if (!usbDevice.isValid()) { if (!usbDevice.isValid()) {
// this happens if we get called by the permission granted intent // this really shouldn't happen anymore, but just in case...
// if that happens, just make sure the DownloadPage is reopened m_pluggedInDeviceName = "";
m_pluggedInDeviceName = QString("reopen");
} else { } else {
// repopulate the connection list // repopulate the connection list
rescanConnections(); rescanConnections();
@ -2135,6 +2134,25 @@ void QMLManager::showDownloadPage(QAndroidJniObject usbDevice)
} }
emit pluggedInDeviceNameChanged(); emit pluggedInDeviceNameChanged();
} }
void QMLManager::restartDownload(QAndroidJniObject usbDevice)
{
// this gets called if we received a permission intent after
// already trying to download from USB
if (!usbDevice.isValid()) {
appendTextToLog("permission intent with invalid UsbDevice - ignoring");
} else {
// inform that QML code that it should retry downloading
// we get the usbDevice again and could verify that this is
// still the same - but I don't see how this could change while we are waiting
// for permission
android_usb_serial_device_descriptor usbDeviceDescriptor = getDescriptor(usbDevice);
appendTextToLog(QString("got permission from Android, restarting download for %1")
.arg(QString::fromStdString(usbDeviceDescriptor.uiRepresentation)));
emit restartDownloadSignal();
}
}
#endif #endif
void QMLManager::setFilter(const QString filterText, int index) void QMLManager::setFilter(const QString filterText, int index)

View file

@ -235,6 +235,7 @@ public slots:
void rescanConnections(); void rescanConnections();
#if defined(Q_OS_ANDROID) #if defined(Q_OS_ANDROID)
void showDownloadPage(QAndroidJniObject usbDevice); void showDownloadPage(QAndroidJniObject usbDevice);
void restartDownload(QAndroidJniObject usbDevice);
void androidUsbPopoulateConnections(); void androidUsbPopoulateConnections();
QString getProductVendorConnectionIdx(android_usb_serial_device_descriptor descriptor); QString getProductVendorConnectionIdx(android_usb_serial_device_descriptor descriptor);
#endif #endif
@ -307,6 +308,7 @@ signals:
void oldStatusChanged(); void oldStatusChanged();
void undoTextChanged(); void undoTextChanged();
void redoTextChanged(); void redoTextChanged();
void restartDownloadSignal();
// From upload process // From upload process
void uploadFinish(bool success, const QString &text); void uploadFinish(bool success, const QString &text);