class RemoteCall {

    @WorkerThread
    public RemoteResult call() throws RemoteException {
        // If called on the main-thread we would never get a time-out != 0
        Preconditions.checkState(
                !Looper.getMainLooper().isCurrentThread(), "Can't call call() on main thread");

        if (!mFuture.isDone()) {
            if (mTimeoutMs == 0L) {
                timeOut();
            } else {
                Handler.getMain().postDelayed(this::timeOut, mTimeoutMs);
                mCallable.call(new FutureBackupCallback(mFuture));
            }
        }
        try {
            return mFuture.get();
        } catch (InterruptedException e) {
            return RemoteResult.FAILED_THREAD_INTERRUPTED;
        } catch (ExecutionException e) {
            throw new IllegalStateException("Future unexpectedly completed with an exception");
        }
    }

    public  RemoteCall(RemoteCallable<IBackupCallback> callable, long timeoutMs);
    public  RemoteCall(boolean cancelled, RemoteCallable<IBackupCallback> callable, long timeoutMs);

}