content: package com.uriio.beacons.ble;
  
  import android.annotation.TargetApi;
  import android.bluetooth.le.AdvertiseData;
  import android.os.Build;
  
  /**
  * Advertise as an Apple iBeacon
  */
  @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  public class iBeaconAdvertiser extends Advertiser {
      public static final int FLAG_APPLE = 0;
      public static final int FLAG_ALT_BEACON = 2;
  
      private static final int COMPANY_ID_APPLE    = 0x004C;
  
      // iBeacon - 21 bytes of data follow
      private static final int IBEACON_INDICATOR   = 0x0215;
      private static final int ALTBEACON_INDICATOR = 0xBEAC;
  
      private final AdvertiseData mAdvertiseData;
  
      public iBeaconAdvertiser(SettingsProvider provider, byte[] proximityUUID, int major, int minor, int flags) {
          super(provider);
  
          byte measuredPower = AdvertisersManager.getZeroDistanceTxPower(provider.getTxPowerLevel());
          measuredPower -= 41;
  
          int indicator = FLAG_APPLE == flags ? IBEACON_INDICATOR : ALTBEACON_INDICATOR;
  
          byte[] manufacturerData = new byte[] {
                  (byte) (indicator >>> 8),
                  (byte) (indicator & 0xFF),
  
                  // ProximityUUID, 16 bytes
                  0, 0, 0, 0, 0, 0, 0, 0,
                  0, 0, 0, 0, 0, 0, 0, 0,
  
                  // Major
                  (byte) (major >>> 8), (byte) major,
  
                  // Minor
                  (byte) (minor >>> 8), (byte) minor,
  
                  // Measured Power
                  measuredPower
          };
  
          // set the proximity uuid bytes
          System.arraycopy(proximityUUID, 0, manufacturerData, 2, 16);
  
          // an advertisement packet can have at most 31 bytes; iBeacon uses 30
          mAdvertiseData = new AdvertiseData.Builder()
                  .setIncludeTxPowerLevel(false)
                  .setIncludeDeviceName(false)
                  .addManufacturerData(COMPANY_ID_APPLE, manufacturerData)
                  .build();
      }
  
      @Override
      public AdvertiseData getAdvertiseData() {
          return mAdvertiseData;
      }
  }