synchronized void start() { if (!serviceMgr.isTowerConnected()) throw new IllegalStateException("Service manager must be connected."); IDroneApi droneApi = droneApiRef.get(); if (isStarted(droneApi)) return; try { droneApi = serviceMgr .get3drServices() .registerDroneApi(this.apiListener, serviceMgr.getApplicationId()); droneApi.asBinder().linkToDeath(binderDeathRecipient, 0); } catch (RemoteException e) { throw new IllegalStateException("Unable to retrieve a valid drone handle."); } if (asyncScheduler == null || asyncScheduler.isShutdown()) asyncScheduler = Executors.newFixedThreadPool(1); addAttributesObserver(droneApi, this.droneObserver); resetFlightTimer(); droneApiRef.set(droneApi); }
private void handleRemoteException(RemoteException e) { final IDroneApi droneApi = droneApiRef.get(); if (droneApi != null && !droneApi.asBinder().pingBinder()) { final String errorMsg = e.getMessage(); Log.e(TAG, errorMsg, e); notifyDroneServiceInterrupted(errorMsg); } }
synchronized void destroy() { IDroneApi droneApi = droneApiRef.get(); removeAttributesObserver(droneApi, this.droneObserver); try { if (isStarted(droneApi)) { droneApi.asBinder().unlinkToDeath(binderDeathRecipient, 0); serviceMgr.get3drServices().releaseDroneApi(droneApi); } } catch (RemoteException | NoSuchElementException e) { Log.e(TAG, e.getMessage(), e); } if (asyncScheduler != null) { asyncScheduler.shutdownNow(); asyncScheduler = null; } droneApiRef.set(null); }
private boolean isStarted(IDroneApi droneApi) { return droneApi != null && droneApi.asBinder().pingBinder(); }