Merge "Fixed b/10512887." into klp-dev
This commit is contained in:
@ -41,11 +41,15 @@ public final class GeofenceProxy {
|
||||
private static final String TAG = "GeofenceProxy";
|
||||
private static final String SERVICE_ACTION =
|
||||
"com.android.location.service.GeofenceProvider";
|
||||
private ServiceWatcher mServiceWatcher;
|
||||
private Context mContext;
|
||||
private final ServiceWatcher mServiceWatcher;
|
||||
private final Context mContext;
|
||||
private final IGpsGeofenceHardware mGpsGeofenceHardware;
|
||||
private final IFusedGeofenceHardware mFusedGeofenceHardware;
|
||||
|
||||
private final Object mLock = new Object();
|
||||
|
||||
// Access to mGeofenceHardware needs to be synchronized by mLock.
|
||||
private IGeofenceHardware mGeofenceHardware;
|
||||
private IGpsGeofenceHardware mGpsGeofenceHardware;
|
||||
private IFusedGeofenceHardware mFusedGeofenceHardware;
|
||||
|
||||
private static final int GEOFENCE_PROVIDER_CONNECTED = 1;
|
||||
private static final int GEOFENCE_HARDWARE_CONNECTED = 2;
|
||||
@ -90,10 +94,6 @@ public final class GeofenceProxy {
|
||||
return mServiceWatcher.start();
|
||||
}
|
||||
|
||||
private IGeofenceProvider getGeofenceProviderService() {
|
||||
return IGeofenceProvider.Stub.asInterface(mServiceWatcher.getBinder());
|
||||
}
|
||||
|
||||
private void bindHardwareGeofence() {
|
||||
mContext.bindServiceAsUser(new Intent(mContext, GeofenceHardwareService.class),
|
||||
mServiceConnection, Context.BIND_AUTO_CREATE, UserHandle.OWNER);
|
||||
@ -102,26 +102,34 @@ public final class GeofenceProxy {
|
||||
private ServiceConnection mServiceConnection = new ServiceConnection() {
|
||||
@Override
|
||||
public void onServiceConnected(ComponentName name, IBinder service) {
|
||||
mGeofenceHardware = IGeofenceHardware.Stub.asInterface(service);
|
||||
mHandler.sendEmptyMessage(GEOFENCE_HARDWARE_CONNECTED);
|
||||
synchronized (mLock) {
|
||||
mGeofenceHardware = IGeofenceHardware.Stub.asInterface(service);
|
||||
mHandler.sendEmptyMessage(GEOFENCE_HARDWARE_CONNECTED);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceDisconnected(ComponentName name) {
|
||||
mGeofenceHardware = null;
|
||||
mHandler.sendEmptyMessage(GEOFENCE_HARDWARE_DISCONNECTED);
|
||||
synchronized (mLock) {
|
||||
mGeofenceHardware = null;
|
||||
mHandler.sendEmptyMessage(GEOFENCE_HARDWARE_DISCONNECTED);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private void setGeofenceHardwareInProvider() {
|
||||
private void setGeofenceHardwareInProviderLocked() {
|
||||
try {
|
||||
getGeofenceProviderService().setGeofenceHardware(mGeofenceHardware);
|
||||
IGeofenceProvider provider = IGeofenceProvider.Stub.asInterface(
|
||||
mServiceWatcher.getBinder());
|
||||
if (provider != null) {
|
||||
provider.setGeofenceHardware(mGeofenceHardware);
|
||||
}
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Remote Exception: setGeofenceHardwareInProvider: " + e);
|
||||
Log.e(TAG, "Remote Exception: setGeofenceHardwareInProviderLocked: " + e);
|
||||
}
|
||||
}
|
||||
|
||||
private void setGpsGeofence() {
|
||||
private void setGpsGeofenceLocked() {
|
||||
try {
|
||||
mGeofenceHardware.setGpsGeofenceHardware(mGpsGeofenceHardware);
|
||||
} catch (RemoteException e) {
|
||||
@ -129,7 +137,7 @@ public final class GeofenceProxy {
|
||||
}
|
||||
}
|
||||
|
||||
private void setFusedGeofence() {
|
||||
private void setFusedGeofenceLocked() {
|
||||
try {
|
||||
mGeofenceHardware.setFusedGeofenceHardware(mFusedGeofenceHardware);
|
||||
} catch(RemoteException e) {
|
||||
@ -140,30 +148,37 @@ public final class GeofenceProxy {
|
||||
// This needs to be reworked, when more services get added,
|
||||
// Might need a state machine or add a framework utility class,
|
||||
private Handler mHandler = new Handler() {
|
||||
private boolean mGeofenceHardwareConnected = false;
|
||||
private boolean mGeofenceProviderConnected = false;
|
||||
|
||||
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
switch (msg.what) {
|
||||
case GEOFENCE_PROVIDER_CONNECTED:
|
||||
mGeofenceProviderConnected = true;
|
||||
if (mGeofenceHardwareConnected) {
|
||||
setGeofenceHardwareInProvider();
|
||||
synchronized (mLock) {
|
||||
if (mGeofenceHardware != null) {
|
||||
setGeofenceHardwareInProviderLocked();
|
||||
}
|
||||
// else: the geofence provider will be notified when the connection to
|
||||
// GeofenceHardwareService is established.
|
||||
}
|
||||
break;
|
||||
case GEOFENCE_HARDWARE_CONNECTED:
|
||||
setGpsGeofence();
|
||||
setFusedGeofence();
|
||||
mGeofenceHardwareConnected = true;
|
||||
if (mGeofenceProviderConnected) {
|
||||
setGeofenceHardwareInProvider();
|
||||
synchronized (mLock) {
|
||||
// Theoretically this won't happen because once the GeofenceHardwareService
|
||||
// is connected to, we won't lose connection to it because it's a system
|
||||
// service. But this check does make the code more robust.
|
||||
if (mGeofenceHardware != null) {
|
||||
setGpsGeofenceLocked();
|
||||
setFusedGeofenceLocked();
|
||||
setGeofenceHardwareInProviderLocked();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GEOFENCE_HARDWARE_DISCONNECTED:
|
||||
mGeofenceHardwareConnected = false;
|
||||
setGeofenceHardwareInProvider();
|
||||
synchronized (mLock) {
|
||||
if (mGeofenceHardware == null) {
|
||||
setGeofenceHardwareInProviderLocked();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user