content: /*
   * Copyright (C) 2013 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 android.hardware.location;
  
  import android.annotation.SystemApi;
  
  /**
   * This class represents the characteristics of the geofence.
   *
   * <p> Use this in conjunction with {@link GeofenceHardware} APIs.
   *
   * @hide
   */
  @SystemApi
  public final class GeofenceHardwareRequest {
      static final int GEOFENCE_TYPE_CIRCLE = 0;
      private int mType;
      private double mLatitude;
      private double mLongitude;
      private double mRadius;
      private int mLastTransition = GeofenceHardware.GEOFENCE_UNCERTAIN;
      private int mUnknownTimer = 30000; // 30 secs
      private int mMonitorTransitions = GeofenceHardware.GEOFENCE_UNCERTAIN |
          GeofenceHardware.GEOFENCE_ENTERED | GeofenceHardware.GEOFENCE_EXITED;
      private int mNotificationResponsiveness = 5000; // 5 secs
      private int mSourceTechnologies = GeofenceHardware.SOURCE_TECHNOLOGY_GNSS;
  
      private void setCircularGeofence(double latitude, double longitude, double radius) {
          mLatitude = latitude;
          mLongitude = longitude;
          mRadius = radius;
          mType  = GEOFENCE_TYPE_CIRCLE;
      }
  
      /**
       * Create a circular geofence.
       *
       * @param latitude Latitude of the geofence
       * @param longitude Longitude of the geofence
       * @param radius Radius of the geofence (in meters)
       */
      public static GeofenceHardwareRequest createCircularGeofence(double latitude,
              double longitude, double radius) {
          GeofenceHardwareRequest geofenceRequest = new GeofenceHardwareRequest();
          geofenceRequest.setCircularGeofence(latitude, longitude, radius);
          return geofenceRequest;
      }
  
      /**
       * Set the last known transition of the geofence.
       *
       * @param lastTransition The current state of the geofence. Can be one of
       *        {@link GeofenceHardware#GEOFENCE_ENTERED}, {@link GeofenceHardware#GEOFENCE_EXITED},
       *        {@link GeofenceHardware#GEOFENCE_UNCERTAIN}.
       */
      public void setLastTransition(int lastTransition) {
          mLastTransition = lastTransition;
      }
  
      /**
       * Set the unknown timer for this geofence.
       *
       * @param unknownTimer  The time limit after which the
       *        {@link GeofenceHardware#GEOFENCE_UNCERTAIN} transition
       *        should be triggered. This paramter is defined in milliseconds.
       */
      public void setUnknownTimer(int unknownTimer) {
          mUnknownTimer = unknownTimer;
      }
  
      /**
       * Set the transitions to be monitored.
       *
       * @param monitorTransitions Bitwise OR of {@link GeofenceHardware#GEOFENCE_ENTERED},
       *        {@link GeofenceHardware#GEOFENCE_EXITED}, {@link GeofenceHardware#GEOFENCE_UNCERTAIN}
       */
      public void setMonitorTransitions(int monitorTransitions) {
          mMonitorTransitions = monitorTransitions;
      }
  
      /**
       * Set the notification responsiveness of the geofence.
       *
       * @param notificationResponsiveness (milliseconds) Defines the best-effort description
       *        of how soon should the callback be called when the transition
       *        associated with the Geofence is triggered. For instance, if
       *        set to 1000 millseconds with {@link GeofenceHardware#GEOFENCE_ENTERED},
       *        the callback will be called 1000 milliseconds within entering
       *        the geofence.
       */
      public void setNotificationResponsiveness(int notificationResponsiveness) {
         mNotificationResponsiveness = notificationResponsiveness;
      }
  
      /**
       * Set the source technologies to use while tracking the geofence.
       * The value is the bit-wise of one or several source fields defined in
       * {@link GeofenceHardware}.
       *
       * @param sourceTechnologies The set of source technologies to use.
       */
      public void setSourceTechnologies(int sourceTechnologies) {
          int sourceTechnologiesAll = GeofenceHardware.SOURCE_TECHNOLOGY_GNSS
                  | GeofenceHardware.SOURCE_TECHNOLOGY_WIFI
                  | GeofenceHardware.SOURCE_TECHNOLOGY_SENSORS
                  | GeofenceHardware.SOURCE_TECHNOLOGY_CELL
                  | GeofenceHardware.SOURCE_TECHNOLOGY_BLUETOOTH;
  
          int sanitizedSourceTechnologies = (sourceTechnologies & sourceTechnologiesAll);
          if (sanitizedSourceTechnologies == 0) {
              throw new IllegalArgumentException("At least one valid source technology must be set.");
          }
  
          mSourceTechnologies = sanitizedSourceTechnologies;
      }
  
      /**
       * Returns the latitude of this geofence.
       */
      public double getLatitude() {
          return mLatitude;
      }
  
      /**
       * Returns the longitude of this geofence.
       */
      public double getLongitude() {
          return mLongitude;
      }
  
      /**
       * Returns the radius of this geofence.
       */
      public double getRadius() {
          return mRadius;
      }
  
      /**
       * Returns transitions monitored for this geofence.
       */
      public int getMonitorTransitions() {
          return mMonitorTransitions;
      }
  
      /**
       * Returns the unknownTimer of this geofence.
       */
      public int getUnknownTimer() {
          return mUnknownTimer;
      }
  
      /**
       * Returns the notification responsiveness of this geofence.
       */
      public int getNotificationResponsiveness() {
          return mNotificationResponsiveness;
      }
  
      /**
       * Returns the last transition of this geofence.
       */
      public int getLastTransition() {
          return mLastTransition;
      }
  
      /**
       * Returns the source technologies to track this geofence.
       */
      public int getSourceTechnologies() {
          return mSourceTechnologies;
      }
  
      int getType() {
          return mType;
      }
  }
  