private void clearSatellites() {
   int satellitesCount = mSatellites.size();
   for (int i = 0; i < satellitesCount; i++) {
     GpsSatellite satellite = mSatellites.valueAt(i);
     satellite.mValid = false;
   }
 }
  /**
   * Used internally within {@link LocationManager} to copy GPS status data from the Location
   * Manager Service to its cached GpsStatus instance. Is synchronized to ensure that GPS status
   * updates are atomic.
   */
  synchronized void setStatus(
      int svCount,
      int[] prns,
      float[] snrs,
      float[] elevations,
      float[] azimuths,
      int ephemerisMask,
      int almanacMask,
      int usedInFixMask) {
    int i;

    for (i = 0; i < mSatellites.length; i++) {
      mSatellites[i].mValid = false;
    }

    for (i = 0; i < svCount; i++) {
      int prn = prns[i] - 1;
      int prnShift = (1 << prn);
      GpsSatellite satellite = mSatellites[prn];

      satellite.mValid = true;
      satellite.mSnr = snrs[i];
      satellite.mElevation = elevations[i];
      satellite.mAzimuth = azimuths[i];
      satellite.mHasEphemeris = ((ephemerisMask & prnShift) != 0);
      satellite.mHasAlmanac = ((almanacMask & prnShift) != 0);
      satellite.mUsedInFix = ((usedInFixMask & prnShift) != 0);
    }
  }
  /**
   * Used by {@link LocationManager#getGpsStatus} to copy LocationManager's cached GpsStatus
   * instance to the client's copy. Since this method is only used within {@link
   * LocationManager#getGpsStatus}, it does not need to be synchronized.
   */
  void setStatus(GpsStatus status) {
    mTimeToFirstFix = status.getTimeToFirstFix();
    clearSatellites();

    SparseArray<GpsSatellite> otherSatellites = status.mSatellites;
    int otherSatellitesCount = otherSatellites.size();
    int satelliteIndex = 0;
    // merge both sparse arrays, note that we have already invalidated the elements in the
    // receiver array
    for (int i = 0; i < otherSatellitesCount; ++i) {
      GpsSatellite otherSatellite = otherSatellites.valueAt(i);
      int otherSatellitePrn = otherSatellite.getPrn();

      int satellitesCount = mSatellites.size();
      while (satelliteIndex < satellitesCount
          && mSatellites.valueAt(satelliteIndex).getPrn() < otherSatellitePrn) {
        ++satelliteIndex;
      }

      if (satelliteIndex < mSatellites.size()) {
        GpsSatellite satellite = mSatellites.valueAt(satelliteIndex);
        if (satellite.getPrn() == otherSatellitePrn) {
          satellite.setStatus(otherSatellite);
        } else {
          satellite = new GpsSatellite(otherSatellitePrn);
          satellite.setStatus(otherSatellite);
          mSatellites.put(otherSatellitePrn, satellite);
        }
      } else {
        GpsSatellite satellite = new GpsSatellite(otherSatellitePrn);
        satellite.setStatus(otherSatellite);
        mSatellites.append(otherSatellitePrn, satellite);
      }
    }
  }
  /**
   * Used internally within {@link LocationManager} to copy GPS status data from the Location
   * Manager Service to its cached GpsStatus instance. Is synchronized to ensure that GPS status
   * updates are atomic.
   */
  synchronized void setStatus(
      int svCount,
      int[] prns,
      float[] snrs,
      float[] elevations,
      float[] azimuths,
      int ephemerisMask,
      int almanacMask,
      int usedInFixMask) {
    clearSatellites();
    for (int i = 0; i < svCount; i++) {
      int prn = prns[i];
      int prnShift = (1 << (prn - 1));
      if (prn > 0 && prn <= NUM_SATELLITES) {
        GpsSatellite satellite = mSatellites.get(prn);
        if (satellite == null) {
          satellite = new GpsSatellite(prn);
          mSatellites.put(prn, satellite);
        }

        satellite.mValid = true;
        satellite.mSnr = snrs[i];
        satellite.mElevation = elevations[i];
        satellite.mAzimuth = azimuths[i];
        satellite.mHasEphemeris = ((ephemerisMask & prnShift) != 0);
        satellite.mHasAlmanac = ((almanacMask & prnShift) != 0);
        satellite.mUsedInFix = ((usedInFixMask & prnShift) != 0);
      }
    }
  }