/**
   * This method is used to unregister the oauth application that has been registered at the device
   * authentication.
   *
   * @param profile Payload of the unregister request.
   * @param utils Server configurations
   * @return true if unregistration success, else false.
   * @throws AndroidAgentException
   */
  public boolean unregisterClient(UnregisterProfile profile, ServerConfig utils)
      throws AndroidAgentException {

    StringBuilder endPoint = new StringBuilder();
    endPoint.append(utils.getAPIServerURL());
    endPoint.append(Constants.DYNAMIC_CLIENT_REGISTER_ENDPOINT);
    endPoint.append("?" + USER_ID + "=" + profile.getUserId());
    endPoint.append("&" + CONSUMER_KEY + "=" + profile.getConsumerKey());
    endPoint.append("&" + APPLICATION_NAME + "=" + profile.getApplicationName());

    EndPointInfo endPointInfo = new EndPointInfo();
    endPointInfo.setHttpMethod(org.wso2.emm.agent.proxy.utils.Constants.HTTP_METHODS.DELETE);
    endPointInfo.setEndPoint(endPoint.toString());

    try {
      SendRequest sendRequestTask = new SendRequest();
      Map<String, String> responseParams = sendRequestTask.execute(endPointInfo).get();

      String statusCode = responseParams.get(Constants.STATUS);

      if (Constants.Status.ACCEPT.equalsIgnoreCase(statusCode)) {
        return true;
      } else {
        return false;
      }
    } catch (InterruptedException e) {
      String msg = "error occurred due to thread interruption";
      Log.e(TAG, msg);
      throw new AndroidAgentException(msg, e);
    } catch (ExecutionException e) {
      String msg = "error occurred while fetching credentials";
      Log.e(TAG, msg);
      throw new AndroidAgentException(msg, e);
    }
  }
 // Override Send stuff to set the right fee params
 private void setRequestFeeForOutputs(SendRequest req) {
   BigInteger baseFee = MIN_RELAY_TX_FEE;
   req.ensureMinRequiredFee = true;
   req.fee = BigInteger.ZERO;
   req.feePerKb = baseFee;
   /* Dust spam prevention - but this does not count the change, which can also be dust!
    * Have to do it on the main Wallet
   for (TransactionOutput output : req.tx.getOutputs())
       if (output.getValue().compareTo(Utils.CENT.divide(BigInteger.TEN)) < 0)
           req.fee = req.fee.add(baseFee);
   */
   req.dustLimit = Utils.CENT;
   req.dustPrice = baseFee;
 }
 public Transaction createSend(Address address, BigInteger nanocoins)
     throws InsufficientMoneyException {
   SendRequest req = SendRequest.to(address, nanocoins);
   setRequestFeeForOutputs(req);
   completeTx(req);
   return req.tx;
 }
  /**
   * This method is used to register an oauth application in the backend.
   *
   * @param profile Payload of the register request.
   * @param utils Server configurations.
   * @return consumer key and consumer secret.
   * @throws AndroidAgentException
   */
  public String registerClient(RegistrationProfile profile, ServerConfig utils)
      throws AndroidAgentException {

    EndPointInfo endPointInfo = new EndPointInfo();
    String endPoint =
        utils.getAPIServerURL()
            + org.wso2.emm.agent.utils.Constants.DYNAMIC_CLIENT_REGISTER_ENDPOINT;
    endPointInfo.setHttpMethod(org.wso2.emm.agent.proxy.utils.Constants.HTTP_METHODS.POST);
    endPointInfo.setEndPoint(endPoint);
    endPointInfo.setRequestParams(profile.toJSON());

    try {
      SendRequest sendRequestTask = new SendRequest();
      Map<String, String> responseParams = sendRequestTask.execute(endPointInfo).get();

      if (responseParams != null) {
        String statusCode = responseParams.get(Constants.STATUS);
        if (Constants.Status.ACCEPT.equalsIgnoreCase(statusCode)) {
          return responseParams.get(Constants.RESPONSE);
        } else {
          return null;
        }
      } else {
        return null;
      }

    } catch (InterruptedException e) {
      String msg = "error occurred due to thread interruption";
      Log.e(TAG, msg);
      throw new AndroidAgentException(msg, e);
    } catch (ExecutionException e) {
      String msg = "error occurred while fetching credentials";
      Log.e(TAG, msg);
      throw new AndroidAgentException(msg, e);
    }
  }
 public SendResult sendCoins(TransactionBroadcaster broadcaster, Address to, BigInteger value)
     throws InsufficientMoneyException {
   SendRequest request = SendRequest.to(to, value);
   setRequestFeeForOutputs(request);
   return sendCoins(broadcaster, request);
 }