Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HW filter background time optimization #974

Merged
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions lib/src/main/java/org/altbeacon/beacon/BeaconManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ public class BeaconManager {
private boolean mRegionStatePersistenceEnabled = true;
private boolean mBackgroundMode = false;
private boolean mBackgroundModeUninitialized = true;
private boolean mBackgroundScanJobFirstRun = true;
private boolean mMainProcess = false;
@Nullable
private Boolean mScannerInSameProcess = null;
Expand Down Expand Up @@ -604,6 +605,9 @@ public boolean getScheduledScanJobsEnabled() {
public boolean getBackgroundMode() {
return mBackgroundMode;
}
public boolean getBackgroundScanJobFirstRun() {
return mBackgroundScanJobFirstRun;
}
public long getBackgroundScanPeriod() {
return backgroundScanPeriod;
}
Expand All @@ -617,6 +621,10 @@ public long getForegroundBetweenScanPeriod() {
return foregroundBetweenScanPeriod;
}

public void setBackgroundScanJobFirstRun(Boolean BackgroundScanJobFirstRun) {
vladvladau marked this conversation as resolved.
Show resolved Hide resolved
mBackgroundScanJobFirstRun = BackgroundScanJobFirstRun;
}

/**
* @return indicator of whether any calls have yet been made to set the
* background mode
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,21 @@ List<ScanResult> dumpBackgroundScanResultQueue() {
private void applySettingsToScheduledJob(Context context, BeaconManager beaconManager, ScanState scanState) {
scanState.applyChanges(beaconManager);
LogManager.d(TAG, "Applying scan job settings with background mode "+scanState.getBackgroundMode());
schedule(context, scanState, false);

// if this is the first time we want to schedule a job and we are in background mode
// trigger an immediate scan job in order to install the hw filter
boolean startBackgroundImmediateScan = false;
if (scanState.getBackgroundScanJobFirstRun() && scanState.getBackgroundMode()) {
LogManager.d(TAG, "This is the first time we schedule a job and we are in background, set immediate scan flag to true in order to trigger the HW filter install.");
startBackgroundImmediateScan = true;
}

schedule(context, scanState, startBackgroundImmediateScan);

if (!scanState.getBackgroundScanJobFirstRun() && beaconManager.getBackgroundScanJobFirstRun()) {
LogManager.d(TAG, "Notify beacon manager that the immediate scan job in background was scheduled successful.");
beaconManager.setBackgroundScanJobFirstRun(false);
}
}

public void applySettingsToScheduledJob(Context context, BeaconManager beaconManager) {
Expand Down Expand Up @@ -133,7 +147,7 @@ private void schedule(Context context, ScanState scanState, boolean backgroundWa

long millisToNextJobStart;
if (backgroundWakeup) {
LogManager.d(TAG, "We just woke up in the background based on a new scan result. Start scan job immediately.");
LogManager.d(TAG, "We just woke up in the background based on a new scan result or first run of the app. Start scan job immediately.");
millisToNextJobStart = 0;
}
else {
Expand Down Expand Up @@ -170,7 +184,10 @@ private void schedule(Context context, ScanState scanState, boolean backgroundWa
.setOverrideDeadline(millisToNextJobStart).build();
int error = jobScheduler.schedule(immediateJob);
if (error < 0) {
LogManager.e(TAG, "Failed to schedule scan job. Beacons will not be detected. Error: "+error);
LogManager.e(TAG, "Failed to schedule an immediate scan job. Beacons will not be detected. Error: "+error);
} else if (scanState.getBackgroundScanJobFirstRun() == true) {
LogManager.d(TAG, "First immediate scan job scheduled successful, change the flag to false.");
scanState.setBackgroundScanJobFirstRun(false);
}
} else {
LogManager.d(TAG, "Not scheduling immediate scan, assuming periodic is about to run");
Expand All @@ -194,10 +211,10 @@ private void schedule(Context context, ScanState scanState, boolean backgroundWa
periodicJobBuilder.setPeriodic(scanState.getScanJobIntervalMillis()).build();
}
final JobInfo jobInfo = periodicJobBuilder.build();
LogManager.d(TAG, "Scheduling ScanJob " + jobInfo + " to run every "+scanState.getScanJobIntervalMillis()+" millis");
LogManager.d(TAG, "Scheduling periodic ScanJob " + jobInfo + " to run every "+scanState.getScanJobIntervalMillis()+" millis");
int error = jobScheduler.schedule(jobInfo);
if (error < 0) {
LogManager.e(TAG, "Failed to schedule scan job. Beacons will not be detected. Error: "+error);
LogManager.e(TAG, "Failed to schedule a periodic scan job. Beacons will not be detected. Error: "+error);
}

}
Expand Down
10 changes: 10 additions & 0 deletions lib/src/main/java/org/altbeacon/beacon/service/ScanState.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public class ScanState implements Serializable {
private long mForegroundScanPeriod;
private long mBackgroundScanPeriod;
private boolean mBackgroundMode;
private boolean mBackgroundScanJobFirstRun;
private long mLastScanStartTimeMillis = 0l;
private transient Context mContext;

Expand All @@ -59,6 +60,14 @@ public void setBackgroundMode(Boolean backgroundMode) {
mBackgroundMode = backgroundMode;
}

public Boolean getBackgroundScanJobFirstRun() {
return mBackgroundScanJobFirstRun;
}

public void setBackgroundScanJobFirstRun(Boolean BackgroundScanJobFirstRun) {
mBackgroundScanJobFirstRun = BackgroundScanJobFirstRun;
}

public Long getBackgroundBetweenScanPeriod() {
return mBackgroundBetweenScanPeriod;
}
Expand Down Expand Up @@ -266,6 +275,7 @@ public void applyChanges(BeaconManager beaconManager) {
mBackgroundScanPeriod = beaconManager.getBackgroundScanPeriod();
mBackgroundBetweenScanPeriod = beaconManager.getBackgroundBetweenScanPeriod();
mBackgroundMode = beaconManager.getBackgroundMode();
mBackgroundScanJobFirstRun = beaconManager.getBackgroundScanJobFirstRun();

ArrayList<Region> existingMonitoredRegions = new ArrayList<>(mMonitoringStatus.regions());
ArrayList<Region> existingRangedRegions = new ArrayList<>(mRangedRegionState.keySet());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ public RegionBootstrap(final Context context, final MonitorNotifier monitorNotif

beaconManager = BeaconManager.getInstanceForApplication(context);
beaconConsumer = new InternalBeaconConsumer();
if (beaconManager.isBackgroundModeUninitialized()) {
beaconManager.setBackgroundMode(true);
}
beaconManager.bind(beaconConsumer);
LogManager.d(TAG, "Waiting for BeaconService connection");
}
Expand All @@ -82,6 +85,9 @@ public RegionBootstrap(final Context context, final MonitorNotifier monitorNotif

beaconManager = BeaconManager.getInstanceForApplication(context);
beaconConsumer = new InternalBeaconConsumer();
if (beaconManager.isBackgroundModeUninitialized()) {
beaconManager.setBackgroundMode(true);
}
beaconManager.bind(beaconConsumer);
LogManager.d(TAG, "Waiting for BeaconService connection");
}
Expand All @@ -102,6 +108,9 @@ public RegionBootstrap(BootstrapNotifier application, Region region) {
this.monitorNotifier = application;
beaconManager = BeaconManager.getInstanceForApplication(context);
beaconConsumer = new InternalBeaconConsumer();
if (beaconManager.isBackgroundModeUninitialized()) {
beaconManager.setBackgroundMode(true);
}
beaconManager.bind(beaconConsumer);
LogManager.d(TAG, "Waiting for BeaconService connection");
}
Expand All @@ -122,6 +131,9 @@ public RegionBootstrap(BootstrapNotifier application, List<Region> regions) {
this.monitorNotifier = application;
beaconManager = BeaconManager.getInstanceForApplication(context);
beaconConsumer = new InternalBeaconConsumer();
if (beaconManager.isBackgroundModeUninitialized()) {
beaconManager.setBackgroundMode(true);
}
beaconManager.bind(beaconConsumer);
LogManager.d(TAG, "Waiting for BeaconService connection");
}
Expand Down Expand Up @@ -201,9 +213,6 @@ public void onBeaconServiceConnect() {
for (Region region : regions) {
LogManager.d(TAG, "Background region monitoring activated for region %s", region);
beaconManager.startMonitoringBeaconsInRegion(region);
if (beaconManager.isBackgroundModeUninitialized()) {
beaconManager.setBackgroundMode(true);
}
}
} catch (RemoteException e) {
LogManager.e(e, TAG, "Can't set up bootstrap regions");
Expand Down