/**
   * Install an Application.
   *
   * @param operation - Operation object.
   */
  private void installApplication(JSONObject data, org.wso2.emm.agent.beans.Operation operation)
      throws AndroidAgentException {
    String appUrl;
    String type;
    String name;
    String operationType;
    String schedule = null;

    try {
      if (!data.isNull(getContextResources().getString(R.string.app_type))) {
        type = data.getString(getContextResources().getString(R.string.app_type));

        if (type.equalsIgnoreCase(
            getContextResources().getString(R.string.intent_extra_enterprise))) {
          appUrl = data.getString(getContextResources().getString(R.string.app_url));
          if (data.has(getContextResources().getString(R.string.app_schedule))) {
            schedule = data.getString(getContextResources().getString(R.string.app_schedule));
          }
          operation.setStatus(getContextResources().getString(R.string.operation_value_completed));
          getResultBuilder().build(operation);
          getAppList().installApp(appUrl, schedule);

        } else if (type.equalsIgnoreCase(
            getContextResources().getString(R.string.intent_extra_public))) {
          appUrl = data.getString(getContextResources().getString(R.string.app_identifier));
          operation.setStatus(getContextResources().getString(R.string.operation_value_completed));
          getResultBuilder().build(operation);
          triggerGooglePlayApp(appUrl);

        } else if (type.equalsIgnoreCase(
            getContextResources().getString(R.string.intent_extra_web))) {
          name = data.getString(getContextResources().getString(R.string.intent_extra_name));
          appUrl = data.getString(getContextResources().getString(R.string.app_url));
          operationType = getContextResources().getString(R.string.operation_install);
          JSONObject payload = new JSONObject();
          payload.put(getContextResources().getString(R.string.intent_extra_identity), appUrl);
          payload.put(getContextResources().getString(R.string.intent_extra_title), name);
          payload.put(getContextResources().getString(R.string.operation_type), operationType);
          operation.setPayLoad(payload.toString());
          manageWebClip(operation);

        } else {
          operation.setStatus(getContextResources().getString(R.string.operation_value_error));
          getResultBuilder().build(operation);
          throw new AndroidAgentException("Invalid application details");
        }

        if (Constants.DEBUG_MODE_ENABLED) {
          Log.d(TAG, "Application installation started");
        }
      }
    } catch (JSONException e) {
      operation.setStatus(getContextResources().getString(R.string.operation_value_error));
      getResultBuilder().build(operation);
      throw new AndroidAgentException("Invalid JSON format.", e);
    }
  }
  @Override
  public void wipeDevice(Operation operation) throws AndroidAgentException {
    String inputPin;
    String savedPin =
        Preference.getString(
            getContext(), getContextResources().getString(R.string.shared_pref_pin));
    JSONObject result = new JSONObject();
    String ownershipType = Preference.getString(getContext(), Constants.DEVICE_TYPE);

    try {
      JSONObject wipeKey = new JSONObject(operation.getPayLoad().toString());
      inputPin = (String) wipeKey.get(getContextResources().getString(R.string.shared_pref_pin));
      String status;
      if (Constants.OWNERSHIP_BYOD.equals(ownershipType.trim())
          || (inputPin != null && inputPin.trim().equals(savedPin.trim()))) {
        status = getContextResources().getString(R.string.shared_pref_default_status);
        result.put(getContextResources().getString(R.string.operation_status), status);
      } else {
        status = getContextResources().getString(R.string.shared_pref_false_status);
        result.put(getContextResources().getString(R.string.operation_status), status);
      }

      operation.setPayLoad(result.toString());

      if (status.equals(getContextResources().getString(R.string.shared_pref_default_status))) {
        Toast.makeText(
                getContext(),
                getContextResources().getString(R.string.toast_message_wipe),
                Toast.LENGTH_LONG)
            .show();
        operation.setStatus(getContextResources().getString(R.string.operation_value_completed));
        getResultBuilder().build(operation);

        if (Constants.DEBUG_MODE_ENABLED) {
          Log.d(TAG, "Started to wipe data");
        }
      } else {
        Toast.makeText(
                getContext(),
                getContextResources().getString(R.string.toast_message_wipe_failed),
                Toast.LENGTH_LONG)
            .show();
        operation.setStatus(getContextResources().getString(R.string.operation_value_error));
        getResultBuilder().build(operation);
      }
    } catch (JSONException e) {
      operation.setStatus(getContextResources().getString(R.string.operation_value_error));
      getResultBuilder().build(operation);
      throw new AndroidAgentException("Invalid JSON format.", e);
    }
  }
  @Override
  public void encryptStorage(Operation operation) throws AndroidAgentException {
    boolean doEncrypt = operation.isEnabled();
    JSONObject result = new JSONObject();

    if (doEncrypt
        && getDevicePolicyManager().getStorageEncryptionStatus()
            != DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED
        && (getDevicePolicyManager().getStorageEncryptionStatus()
            == DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE)) {

      getDevicePolicyManager().setStorageEncryption(getCdmDeviceAdmin(), doEncrypt);
      Intent intent = new Intent(DevicePolicyManager.ACTION_START_ENCRYPTION);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      getContext().startActivity(intent);

    } else if (!doEncrypt
        && getDevicePolicyManager().getStorageEncryptionStatus()
            != DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED
        && (getDevicePolicyManager().getStorageEncryptionStatus()
                == DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE
            || getDevicePolicyManager().getStorageEncryptionStatus()
                == DevicePolicyManager.ENCRYPTION_STATUS_ACTIVATING)) {

      getDevicePolicyManager().setStorageEncryption(getCdmDeviceAdmin(), doEncrypt);
    }

    try {
      String status;
      if (getDevicePolicyManager().getStorageEncryptionStatus()
          != DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED) {
        status = getContextResources().getString(R.string.shared_pref_default_status);
        result.put(getContextResources().getString(R.string.operation_status), status);

      } else {
        status = getContextResources().getString(R.string.shared_pref_false_status);
        result.put(getContextResources().getString(R.string.operation_status), status);
      }
    } catch (JSONException e) {
      operation.setStatus(getContextResources().getString(R.string.operation_value_error));
      getResultBuilder().build(operation);
      throw new AndroidAgentException("Issue in parsing json", e);
    }
    operation.setPayLoad(result.toString());
    operation.setStatus(getContextResources().getString(R.string.operation_value_completed));
    getResultBuilder().build(operation);
    if (Constants.DEBUG_MODE_ENABLED) {
      Log.d(TAG, "Encryption process started");
    }
  }