Skip to content

Commit

Permalink
Android O fixes to allow update period shorter than scan rate.
Browse files Browse the repository at this point in the history
  • Loading branch information
MadisonBlake committed Jun 5, 2018
1 parent e6a6ffa commit 7ab59b3
Show file tree
Hide file tree
Showing 7 changed files with 37 additions and 57 deletions.
58 changes: 5 additions & 53 deletions src/main/java/org/altbeacon/beacon/BeaconManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -886,19 +886,7 @@ public void stopRangingBeaconsInRegion(@NonNull Region region) throws RemoteExce
if (determineIfCalledFromSeparateScannerProcess()) {
return;
}
//<<<<<<< HEAD
// Message msg = Message.obtain(null, BeaconService.MSG_STOP_RANGING, 0, 0);
// StartRMData obj;
// if (this.isRangeUpdateMidCycle()) {
// obj = new StartRMData(region, callbackPackageName(), this.getScanPeriod(), this.getBetweenScanPeriod(), this.mBackgroundMode, this.getRangeUpdatePeriod(), this.getBetweenRangeUpdatePeriod());
// }
// else {
// obj = new StartRMData(region, callbackPackageName(), this.getScanPeriod(), this.getBetweenScanPeriod(), this.mBackgroundMode);
// }
// msg.obj = obj;
// serviceMessenger.send(msg);
//=======
//>>>>>>> f350af4e40d96d8538ccefae5f24a9029f6ad5ed

synchronized (rangedRegions) {
Region regionToRemove = null;
for (Region rangedRegion : rangedRegions) {
Expand Down Expand Up @@ -970,20 +958,8 @@ public void startMonitoringBeaconsInRegion(@NonNull Region region) throws Remote
if (isScannerInDifferentProcess()) {
MonitoringStatus.getInstanceForApplication(mContext).addLocalRegion(region);
}
//<<<<<<< HEAD
LogManager.d(TAG, "Starting monitoring region "+region+" with uniqueID: "+region.getUniqueId());
// Message msg = Message.obtain(null, BeaconService.MSG_START_MONITORING, 0, 0);
// StartRMData obj = null;
// if (this.isRangeUpdateMidCycle()) {
// obj = new StartRMData(region, callbackPackageName(), this.getScanPeriod(), this.getBetweenScanPeriod(), this.mBackgroundMode, this.getRangeUpdatePeriod(), this.getBetweenRangeUpdatePeriod());
// }
// else {
// obj = new StartRMData(region, callbackPackageName(), this.getScanPeriod(), this.getBetweenScanPeriod(), this.mBackgroundMode);
// }
// msg.obj = obj;
// serviceMessenger.send(msg);
//=======
//>>>>>>> f350af4e40d96d8538ccefae5f24a9029f6ad5ed

this.requestStateForRegion(region);
}

Expand Down Expand Up @@ -1014,19 +990,6 @@ public void stopMonitoringBeaconsInRegion(@NonNull Region region) throws RemoteE
if (isScannerInDifferentProcess()) {
MonitoringStatus.getInstanceForApplication(mContext).removeLocalRegion(region);
}
//<<<<<<< HEAD
// Message msg = Message.obtain(null, BeaconService.MSG_STOP_MONITORING, 0, 0);
// StartRMData obj;
// if (this.isRangeUpdateMidCycle()) {
// obj = new StartRMData(region, callbackPackageName(), this.getScanPeriod(), this.getBetweenScanPeriod(), this.mBackgroundMode, this.getRangeUpdatePeriod(), this.getBetweenRangeUpdatePeriod());
// }
// else {
// obj = new StartRMData(region, callbackPackageName(), this.getScanPeriod(), this.getBetweenScanPeriod(), this.mBackgroundMode);
// }
// msg.obj = obj;
// serviceMessenger.send(msg);
//=======
//>>>>>>> f350af4e40d96d8538ccefae5f24a9029f6ad5ed
}

/**
Expand All @@ -1046,17 +1009,7 @@ public void updateScanPeriods() throws RemoteException {
}
LogManager.d(TAG, "updating background flag to %s", mBackgroundMode);
LogManager.d(TAG, "updating scan period to %s, %s", this.getScanPeriod(), this.getBetweenScanPeriod());
//<<<<<<< HEAD
// StartRMData obj;
// if (this.isRangeUpdateMidCycle()) {
// obj = new StartRMData(this.getScanPeriod(), this.getBetweenScanPeriod(), this.mBackgroundMode, this.getRangeUpdatePeriod(), this.getBetweenRangeUpdatePeriod());
// }
// else
// {
// obj = new StartRMData(this.getScanPeriod(), this.getBetweenScanPeriod(), this.mBackgroundMode);
// }
// msg.obj = obj;
//=======

applyChangesToServices(BeaconService.MSG_SET_SCAN_PERIODS, null);
}

Expand Down Expand Up @@ -1090,7 +1043,6 @@ else if (type == BeaconService.MSG_SYNC_SETTINGS) {
msg.setData(new StartRMData(region, callbackPackageName(), getScanPeriod(), getBetweenScanPeriod(), mBackgroundMode).toBundle());
}
}
//>>>>>>> f350af4e40d96d8538ccefae5f24a9029f6ad5ed
serviceMessenger.send(msg);
}

Expand Down Expand Up @@ -1319,7 +1271,7 @@ private long getBetweenScanPeriod() {
}
}

private boolean isRangeUpdateMidCycle() {
public boolean isRangeUpdateMidCycle() {
if(mBackgroundMode) {
return backgroundRangeMidScan;
}
Expand All @@ -1328,7 +1280,7 @@ private boolean isRangeUpdateMidCycle() {
}
}

private long getRangeUpdatePeriod() {
public long getRangeUpdatePeriod() {
if(mBackgroundMode) {
return backgroundRangeUpdatePeriod;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,7 @@ public void setScanPeriods(long scanPeriod, long betweenScanPeriod, boolean back
}

public void setRangeUpdatePeriods(long rangeUpdatePeriod, long betweenRangeUpdatePeriod) {
mScanHelper.getCycledScanner().setRangeUpdatePeriods(rangeUpdatePeriod, betweenRangeUpdatePeriod);
mScanHelper.getCycledScanner().setRangeUpdatePeriods(rangeUpdatePeriod);
}

// protected final CycledLeScanCallback mCycledLeScanCallback = new CycledLeScanCallback() {
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/org/altbeacon/beacon/service/ScanJob.java
Original file line number Diff line number Diff line change
Expand Up @@ -188,9 +188,19 @@ private boolean restartScanning() {
}
long scanPeriod = mScanState.getBackgroundMode() ? mScanState.getBackgroundScanPeriod() : mScanState.getForegroundScanPeriod();
long betweenScanPeriod = mScanState.getBackgroundMode() ? mScanState.getBackgroundBetweenScanPeriod() : mScanState.getForegroundBetweenScanPeriod();

//MTB - No distintion between background and foreground here
boolean hasRangeUpdatedPeriod = mScanState.hasMidRangePeriod();
long rangeUpdatedPeriod = mScanState.getBackgroundMode() ? mScanState.GetRangeUpdatePeriod() : mScanState.GetRangeUpdatePeriod();

mScanHelper.getCycledScanner().setScanPeriods(scanPeriod,
betweenScanPeriod,
mScanState.getBackgroundMode());

if(hasRangeUpdatedPeriod == true) {
mScanHelper.getCycledScanner().setRangeUpdatePeriods(rangeUpdatedPeriod);
}

mInitialized = true;
if (scanPeriod <= 0) {
LogManager.w(TAG, "Starting scan with scan period of zero. Exiting ScanJob.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,13 +175,18 @@ private void schedule(Context context, ScanState scanState, boolean backgroundWa
.setPersisted(true) // This makes it restart after reboot
.setExtras(new PersistableBundle());


//Madison Blake Modification
int scanJobIntervalMillis = scanState.getScanJobIntervalMillis();
//End Madison Blake Added. scanState.getScanJobIntervalMillis() now replaced with scanJobIntervalMillis

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// ON Android N+ we specify a tolerance of 0ms (capped at 5% by the OS) to ensure
// our scans happen within 5% of the schduled time.
periodicJobBuilder.setPeriodic(scanState.getScanJobIntervalMillis(), 0L).build();
periodicJobBuilder.setPeriodic(scanJobIntervalMillis, 0L).build();
}
else {
periodicJobBuilder.setPeriodic(scanState.getScanJobIntervalMillis()).build();
periodicJobBuilder.setPeriodic(scanJobIntervalMillis).build();
}
// On Android O I see this:
//
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/org/altbeacon/beacon/service/ScanState.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,12 @@ public class ScanState implements Serializable {
private long mLastScanStartTimeMillis = 0l;
private transient Context mContext;

private boolean mHasMidRangeUpdate;
private long mMidRangeUpdatePeriod;

public Boolean hasMidRangePeriod() { return mHasMidRangeUpdate; }
public Long GetRangeUpdatePeriod() { return mMidRangeUpdatePeriod; }

public Boolean getBackgroundMode() {
return mBackgroundMode;
}
Expand Down Expand Up @@ -267,6 +273,9 @@ public void applyChanges(BeaconManager beaconManager) {
mBackgroundBetweenScanPeriod = beaconManager.getBackgroundBetweenScanPeriod();
mBackgroundMode = beaconManager.getBackgroundMode();

mHasMidRangeUpdate = beaconManager.isRangeUpdateMidCycle();
mMidRangeUpdatePeriod = beaconManager.getRangeUpdatePeriod();

ArrayList<Region> existingMonitoredRegions = new ArrayList<>(mMonitoringStatus.regions());
ArrayList<Region> existingRangedRegions = new ArrayList<>(mRangedRegionState.keySet());
ArrayList<Region> newMonitoredRegions = new ArrayList<>(beaconManager.getMonitoredRegions());
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/org/altbeacon/beacon/service/StartRMData.java
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,9 @@ public Bundle toBundle() {
bundle.putLong(BETWEEN_SCAN_PERIOD_KEY, this.mBetweenScanPeriod);
bundle.putBoolean(BACKGROUND_FLAG_KEY, this.mBackgroundFlag);
bundle.putString(CALLBACK_PACKAGE_NAME_KEY, this.mCallbackPackageName);
bundle.putBoolean(HAS_MIDCYCLE_RANG_UPDATE_KEY, this.hasMidCycleRangUpdate);
bundle.putLong(BETWEEN_RANGE_UPDATE_PERIOD_KEY, this.betweenRangeUpdatePeriod);
bundle.putLong(RANGE_UPDATE_PERIOD_KEY, this.rangeUpdatePeriod);
if (mRegion != null) {
bundle.putSerializable(REGION_KEY, mRegion);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ public void setLongScanForcingEnabled(boolean enabled) {
mLongScanForcingEnabled = enabled;
}

public void setRangeUpdatePeriods(long rangeUpdatePeriod, long betweenRangeUpdate) {
public void setRangeUpdatePeriods(long rangeUpdatePeriod) {
mMidScanRangeUpdatePeriod = rangeUpdatePeriod;
mIsMidScanRangeUpdate = true;
}
Expand All @@ -198,6 +198,7 @@ public void setScanPeriods(long scanPeriod, long betweenScanPeriod, boolean back
mBackgroundFlag = backgroundFlag;
mScanPeriod = scanPeriod;
mBetweenScanPeriod = betweenScanPeriod;

if (mBackgroundFlag) {
LogManager.d(TAG, "We are in the background. Setting wakeup alarm");
setWakeUpAlarm();
Expand Down

0 comments on commit 7ab59b3

Please sign in to comment.