Methods Summary |
---|
public boolean | addListener(TListener listener)
Preconditions.checkNotNull(listener, "Attempted to register a 'null' listener.");
IBinder binder = listener.asBinder();
LinkedListener deathListener = new LinkedListener(listener);
synchronized (mListenerMap) {
if (mListenerMap.containsKey(binder)) {
// listener already added
return true;
}
try {
binder.linkToDeath(deathListener, 0 /* flags */);
} catch (RemoteException e) {
// if the remote process registering the listener is already death, just swallow the
// exception and return
Log.v(mTag, "Remote listener already died.", e);
return false;
}
mListenerMap.put(binder, deathListener);
// update statuses we already know about, starting from the ones that will never change
int result;
if (!isAvailableInPlatform()) {
result = RESULT_NOT_AVAILABLE;
} else if (mHasIsSupported && !mIsSupported) {
result = RESULT_NOT_SUPPORTED;
} else if (!isGpsEnabled()) {
result = RESULT_GPS_LOCATION_DISABLED;
} else if (!tryRegister()) {
// only attempt to register if GPS is enabled, otherwise we will register once GPS
// becomes available
result = RESULT_INTERNAL_ERROR;
} else if (mHasIsSupported && mIsSupported) {
result = RESULT_SUCCESS;
} else {
// at this point if the supported flag is not set, the notification will be sent
// asynchronously in the future
return true;
}
post(listener, getHandlerOperation(result));
}
return true;
|
protected void | foreach(com.android.server.location.RemoteListenerHelper$ListenerOperation operation)
synchronized (mListenerMap) {
foreachUnsafe(operation);
}
|
private void | foreachUnsafe(com.android.server.location.RemoteListenerHelper$ListenerOperation operation)
for (LinkedListener linkedListener : mListenerMap.values()) {
post(linkedListener.getUnderlyingListener(), operation);
}
|
protected abstract com.android.server.location.RemoteListenerHelper$ListenerOperation | getHandlerOperation(int result)
|
protected abstract void | handleGpsEnabledChanged(boolean enabled)
|
protected abstract boolean | isAvailableInPlatform()
|
protected abstract boolean | isGpsEnabled()
|
public void | onGpsEnabledChanged(boolean enabled)
// handle first the sub-class implementation, so any error in registration can take
// precedence
handleGpsEnabledChanged(enabled);
synchronized (mListenerMap) {
if (!enabled) {
tryUnregister();
return;
}
if (mListenerMap.isEmpty()) {
return;
}
if (tryRegister()) {
// registration was successful, there is no need to update the state
return;
}
ListenerOperation<TListener> operation = getHandlerOperation(RESULT_INTERNAL_ERROR);
foreachUnsafe(operation);
}
|
private void | post(TListener listener, com.android.server.location.RemoteListenerHelper$ListenerOperation operation)
if (operation != null) {
mHandler.post(new HandlerRunnable(listener, operation));
}
|
protected abstract boolean | registerWithService()
|
public void | removeListener(TListener listener)
Preconditions.checkNotNull(listener, "Attempted to remove a 'null' listener.");
IBinder binder = listener.asBinder();
LinkedListener linkedListener;
synchronized (mListenerMap) {
linkedListener = mListenerMap.remove(binder);
if (mListenerMap.isEmpty()) {
tryUnregister();
}
}
if (linkedListener != null) {
binder.unlinkToDeath(linkedListener, 0 /* flags */);
}
|
protected void | setSupported(boolean value, com.android.server.location.RemoteListenerHelper$ListenerOperation notifier)
synchronized (mListenerMap) {
mHasIsSupported = true;
mIsSupported = value;
foreachUnsafe(notifier);
}
|
private boolean | tryRegister()
if (!mIsRegistered) {
mIsRegistered = registerWithService();
}
return mIsRegistered;
|
private void | tryUnregister()
if (!mIsRegistered) {
return;
}
unregisterFromService();
mIsRegistered = false;
|
protected abstract void | unregisterFromService()
|