docs: @NonNull
      @Override
      protected Single<RxBleDeviceServices> timeoutFallbackProcedure(
              final BluetoothGatt bluetoothGatt,
              final RxBleGattCallback rxBleGattCallback,
              final Scheduler timeoutScheduler
      ) {
          return Single.defer(new Callable<SingleSource<? extends RxBleDeviceServices>>() {
              @Override
              public SingleSource<? extends RxBleDeviceServices> call() throws Exception {
                  final List<BluetoothGattService> services = bluetoothGatt.getServices();
                  if (services.size() == 0) {
                      // if after the timeout services are empty we have no other option to declare a failed discovery
                      return Single.error(new BleGattCallbackTimeoutException(bluetoothGatt, BleGattOperationType.SERVICE_DISCOVERY));
                  } else {
                  /*
                  it is observed that usually the Android OS is returning services, characteristics and descriptors in a short period of time
                  if there are some services available we will wait for 5 more seconds just to be sure that
                  the timeout was not triggered right in the moment of filling the services and then emit a value.
                   */
                      return Single
                              .timer(5, TimeUnit.SECONDS, timeoutScheduler)
                              .flatMap(new Function<Long, Single<RxBleDeviceServices>>() {
                                  @Override
                                  public Single<RxBleDeviceServices> apply(Long delayedSeconds) {
                                      return Single.fromCallable(new Callable<RxBleDeviceServices>() {
                                          @Override
                                          public RxBleDeviceServices call() throws Exception {
                                              return new RxBleDeviceServices(bluetoothGatt.getServices());
                                          }
                                      });
                                  }
                              });
                  }
              }
          });
      }