aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain/src/main/java/org/sufficientlysecure
diff options
context:
space:
mode:
authorNikita Mikhailov <nikita.s.mikhailov@gmail.com>2016-04-15 00:13:33 +0600
committerNikita Mikhailov <nikita.s.mikhailov@gmail.com>2016-04-15 01:54:09 +0600
commit263799ec965669ab027db6b1ad62a26fd6af3bac (patch)
tree22597cb0cc153940eb4d1a160ea433db1a28da8b /OpenKeychain/src/main/java/org/sufficientlysecure
parent784bf2322cc37befb4857f0c440f889d43f89a48 (diff)
downloadopen-keychain-263799ec965669ab027db6b1ad62a26fd6af3bac.tar.gz
open-keychain-263799ec965669ab027db6b1ad62a26fd6af3bac.tar.bz2
open-keychain-263799ec965669ab027db6b1ad62a26fd6af3bac.zip
OTG: Fix connection issues
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/UsbTransport.java7
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseSecurityTokenNfcActivity.java13
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/UsbConnectionDispatcher.java21
3 files changed, 17 insertions, 24 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/UsbTransport.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/UsbTransport.java
index 10043e675..dfe91427e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/UsbTransport.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/UsbTransport.java
@@ -66,7 +66,7 @@ public class UsbTransport implements Transport {
* @param on true to turn ICC on, false to turn it off
* @throws UsbTransportException
*/
- private void iccPowerSet(boolean on) throws UsbTransportException {
+ private void setIccPower(boolean on) throws UsbTransportException {
final byte[] iccPowerCommand = {
(byte) (on ? 0x62 : 0x63),
0x00, 0x00, 0x00, 0x00,
@@ -145,7 +145,8 @@ public class UsbTransport implements Transport {
*/
@Override
public boolean isConnected() {
- return mConnection != null && mUsbManager.getDeviceList().containsValue(mUsbDevice);
+ return mConnection != null && mUsbManager.getDeviceList().containsValue(mUsbDevice) &&
+ mConnection.getSerial() != null;
}
/**
@@ -188,7 +189,7 @@ public class UsbTransport implements Transport {
throw new UsbTransportException("USB error - failed to claim interface");
}
- iccPowerSet(true);
+ setIccPower(true);
Log.d(Constants.TAG, "Usb transport connected");
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseSecurityTokenNfcActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseSecurityTokenNfcActivity.java
index 4aaf2aba0..dbb234977 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseSecurityTokenNfcActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseSecurityTokenNfcActivity.java
@@ -22,8 +22,11 @@
package org.sufficientlysecure.keychain.ui.base;
import android.app.Activity;
+import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbManager;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.TagLostException;
@@ -142,12 +145,13 @@ public abstract class BaseSecurityTokenNfcActivity extends BaseActivity
securityTokenDiscovered(new NfcTransport(tag));
}
- public void usbDeviceDiscovered(final UsbTransport transport) {
+ public void usbDeviceDiscovered(final UsbDevice usbDevice) {
// Actual USB operations are executed in doInBackground to not block the UI thread
if (!mTagHandlingEnabled)
return;
- securityTokenDiscovered(transport);
+ UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
+ securityTokenDiscovered(new UsbTransport(usbDevice, usbManager));
}
public void securityTokenDiscovered(final Transport transport) {
@@ -401,7 +405,8 @@ public abstract class BaseSecurityTokenNfcActivity extends BaseActivity
protected void handleSmartcard(Transport transport) throws IOException {
// Don't reconnect if device was already connected
- if (!(mSecurityTokenHelper.isConnected()
+ if (!(mSecurityTokenHelper.isPersistentConnectionAllowed()
+ && mSecurityTokenHelper.isConnected()
&& mSecurityTokenHelper.getTransport().equals(transport))) {
mSecurityTokenHelper.setTransport(transport);
mSecurityTokenHelper.connectToDevice();
@@ -477,7 +482,7 @@ public abstract class BaseSecurityTokenNfcActivity extends BaseActivity
* Run smartcard routines if last used token is connected and supports
* persistent connections
*/
- protected void checkDeviceConnection() {
+ public void checkDeviceConnection() {
mUsbDispatcher.rescanDevices();
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/UsbConnectionDispatcher.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/UsbConnectionDispatcher.java
index 7055b2633..60fc84dba 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/UsbConnectionDispatcher.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/UsbConnectionDispatcher.java
@@ -33,7 +33,6 @@ public class UsbConnectionDispatcher {
private Activity mActivity;
private OnDiscoveredUsbDeviceListener mListener;
- private UsbTransport mLastUsedUsbTransport;
private UsbManager mUsbManager;
/**
* Receives broadcast when a supported USB device get permission.
@@ -45,23 +44,12 @@ public class UsbConnectionDispatcher {
switch (action) {
case UsbEventReceiverActivity.ACTION_USB_PERMISSION: {
- UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
+ android.hardware.usb.UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
boolean permission = intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED,
false);
if (permission) {
Log.d(Constants.TAG, "Got permission for " + usbDevice.getDeviceName());
-
- mLastUsedUsbTransport = new UsbTransport(usbDevice, mUsbManager);
- mListener.usbDeviceDiscovered(mLastUsedUsbTransport);
- }
- break;
- }
- case UsbManager.ACTION_USB_DEVICE_DETACHED: {
- UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
-
- if (mLastUsedUsbTransport != null && mLastUsedUsbTransport.getUsbDevice().equals(usbDevice)) {
- mLastUsedUsbTransport.release();
- mLastUsedUsbTransport = null;
+ mListener.usbDeviceDiscovered(usbDevice);
}
break;
}
@@ -78,7 +66,6 @@ public class UsbConnectionDispatcher {
public void onStart() {
final IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(UsbEventReceiverActivity.ACTION_USB_PERMISSION);
- intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
mActivity.registerReceiver(mUsbReceiver, intentFilter);
}
@@ -97,7 +84,7 @@ public class UsbConnectionDispatcher {
for (UsbDevice device : mUsbManager.getDeviceList().values()) {
if (mUsbManager.hasPermission(device)) {
if (mListener != null) {
- mListener.usbDeviceDiscovered(new UsbTransport(device, mUsbManager));
+ mListener.usbDeviceDiscovered(device);
}
break;
}
@@ -105,6 +92,6 @@ public class UsbConnectionDispatcher {
}
public interface OnDiscoveredUsbDeviceListener {
- void usbDeviceDiscovered(UsbTransport usbTransport);
+ void usbDeviceDiscovered(UsbDevice usbDevice);
}
}