content: /*
   * Copyright (C) 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.wifi;
  
  import android.net.NetworkAgent;
  import android.net.wifi.WifiInfo;
  
  /**
   * Base class for connection scoring
   */
  public abstract class ConnectedScore {
  
      /** Maximum NetworkAgent score that should be generated by wifi */
      public static final int WIFI_MAX_SCORE = NetworkAgent.WIFI_BASE_SCORE;
  
      /** Score at which wifi is considered poor enough to give up ant try something else */
      public static final int WIFI_TRANSITION_SCORE = NetworkAgent.WIFI_BASE_SCORE - 10;
  
      public static final int WIFI_MIN_SCORE = 0;
  
      final Clock mClock;
  
      /** This is a typical STD for the connected RSSI for a phone sitting still */
      public double mDefaultRssiStandardDeviation = 2.0;
  
      /**
       *
       * @param clock is the time source for getMillis()
       */
      public ConnectedScore(Clock clock) {
          mClock = clock;
      }
  
      /**
       * Returns the current time in milliseconds
       *
       * This time is to be passed into the update methods.
       * The scoring methods generally don't need a particular epoch, depending
       * only on deltas. So a different time source may be used, as long as it is consistent.
       *
       * Note that when there are long intervals between updates, it is unlikely to matter much
       * how large the interval is, so a time source that does not update while the processor is
       * asleep could be just fine.
       *
       * @return millisecond-resolution time.
       */
      public long getMillis() {
          return mClock.getWallClockMillis();
      }
  
      /**
       * Updates scoring state using RSSI alone
       *
       * @param rssi signal strength (dB).
       * @param millis millisecond-resolution time.
       */
      public void updateUsingRssi(int rssi, long millis) {
          updateUsingRssi(rssi, millis, mDefaultRssiStandardDeviation);
      }
  
      /**
       * Updates scoring state using RSSI and noise estimate
       *
       * This is useful if an RSSI comes from another source (e.g. scan results) and the
       * expected noise varies by source.
       *
       * @param rssi signal strength (dB).
       * @param millis millisecond-resolution time.
       * @param standardDeviation of the RSSI.
       */
      public abstract void updateUsingRssi(int rssi, long millis, double standardDeviation);
  
      /**
       * Updates the score using relevant parts of WifiInfo
       *
       * @param wifiInfo object holding relevant values.
       * @param millis millisecond-resolution time.
       */
      public void updateUsingWifiInfo(WifiInfo wifiInfo, long millis) {
          updateUsingRssi(wifiInfo.getRssi(), millis);
      }
  
      /**
       * Generates a score based on the current state
       *
       * @return network score - on NetworkAgent scale.
       */
      public abstract int generateScore();
  
      /**
       * Clears out state associated with the connection
       */
      public abstract void reset();
  }
  