diff options
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);      }  }  | 
