package com.ledger.tbase.comm; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.util.Log; import com.btchip.comm.BTChipTransport; import com.btchip.comm.BTChipTransportFactory; import com.btchip.comm.BTChipTransportFactoryCallback; import com.ledger.wallet.service.ILedgerWalletService; public class LedgerTransportTEEProxyFactory implements BTChipTransportFactory { private Context context; private ILedgerWalletService service; private LedgerTransportTEEProxy transport; private BTChipTransportFactoryCallback callback; private final ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder serviceBinder) { Log.d(TAG, "Service connected"); service = ILedgerWalletService.Stub.asInterface(serviceBinder); if (transport != null) { transport.setService(service); } if (callback != null) { BTChipTransportFactoryCallback currentCallback = callback; callback = null; currentCallback.onConnected(true); } } @Override public void onServiceDisconnected(ComponentName name) { Log.d(TAG, "Service disconnected"); if (callback != null) { BTChipTransportFactoryCallback currentCallback = callback; callback = null; currentCallback.onConnected(false); } if (transport != null) { transport.setService(null); } } }; public static final String TAG="LedgerTransportTEEProxyFactory"; public LedgerTransportTEEProxyFactory(Context context) { this.context = context; } @Override public BTChipTransport getTransport() { if (transport == null) { transport = new LedgerTransportTEEProxy(context); } return transport; } @Override public boolean isPluggedIn() { return true; } @Override public boolean connect(final Context context, final BTChipTransportFactoryCallback callback) { if (service != null) { callback.onConnected(true); return true; } this.callback = callback; Log.d(TAG, "Before bind service"); try { Intent intent = new Intent(ILedgerWalletService.class.getName()); intent.setPackage("com.ledger.wallet.service"); boolean result = context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); if (!result) { context.unbindService(serviceConnection); } Log.d(TAG, "Request to bind service " + result); return result; } catch(Exception e) { Log.d(TAG, "Error binding service", e); return false; } } }