content: /*
   * Copyright 2017 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package com.android.server.location;
  
  import android.hardware.location.ContextHubTransaction;
  import android.hardware.location.NanoAppState;
  
  import java.util.List;
  import java.util.concurrent.TimeUnit;
  
  /**
   * An abstract class representing transactions requested to the Context Hub Service.
   *
   * @hide
   */
  /* package */ abstract class ContextHubServiceTransaction {
      private final int mTransactionId;
      @ContextHubTransaction.Type
      private final int mTransactionType;
  
      /*
       * true if the transaction has already completed, false otherwise
       */
      private boolean mIsComplete = false;
  
      /* package */ ContextHubServiceTransaction(int id, int type) {
          mTransactionId = id;
          mTransactionType = type;
      }
  
      /**
       * Starts this transaction with a Context Hub.
       *
       * All instances of this class must implement this method by making an asynchronous request to
       * a hub.
       *
       * @return the synchronous error code of the transaction start
       */
      /* package */
      abstract int onTransact();
  
      /**
       * A function to invoke when the transaction completes.
       *
       * For transactions with expected contents (such as a query), the class instance should
       * implement the appropriate behavior (e.g. invoke onQueryResponse with an empty list).
       *
       * @param result the result of the transaction
       */
      /* package */ void onTransactionComplete(@ContextHubTransaction.Result int result) {
      }
  
      /**
       * A function to invoke when a query transaction completes.
       *
       * Only relevant for query transactions.
       *
       * @param result           the result of the query
       * @param nanoAppStateList the list of nanoapps given by the query response
       */
      /* package */ void onQueryResponse(
              @ContextHubTransaction.Result int result, List<NanoAppState> nanoAppStateList) {
      }
  
      /**
       * @return the ID of this transaction
       */
      /* package */ int getTransactionId() {
          return mTransactionId;
      }
  
      /**
       * @return the type of this transaction
       * @see ContextHubTransaction.Type
       */
      @ContextHubTransaction.Type
      /* package */ int getTransactionType() {
          return mTransactionType;
      }
  
      /**
       * Gets the timeout period as defined in IContexthub.hal
       *
       * @return the timeout of this transaction in the specified time unit
       */
      /* package */ long getTimeout(TimeUnit unit) {
          switch (mTransactionType) {
              case ContextHubTransaction.TYPE_LOAD_NANOAPP:
                  return unit.convert(30L, TimeUnit.SECONDS);
              case ContextHubTransaction.TYPE_UNLOAD_NANOAPP:
              case ContextHubTransaction.TYPE_ENABLE_NANOAPP:
              case ContextHubTransaction.TYPE_DISABLE_NANOAPP:
              case ContextHubTransaction.TYPE_QUERY_NANOAPPS:
                  // Note: query timeout is not specified at the HAL
              default: /* fall through */
                  return unit.convert(5L, TimeUnit.SECONDS);
          }
      }
  
      /**
       * Marks the transaction as complete.
       *
       * Should only be called as a result of a response from a Context Hub callback
       */
      /* package */ void setComplete() {
          mIsComplete = true;
      }
  
      /**
       * @return true if the transaction has already completed, false otherwise
       */
      /* package */ boolean isComplete() {
          return mIsComplete;
      }
  
      @Override
      public String toString() {
          return ContextHubTransaction.typeToString(mTransactionType, true /* upperCase */)
                  + " transaction (ID = " + mTransactionId + ")";
      }
  }
  