Merge "Fix projection status distribution" into qt-dev
diff --git a/service/src/com/android/car/CarProjectionService.java b/service/src/com/android/car/CarProjectionService.java
index 144804e..25edc79 100644
--- a/service/src/com/android/car/CarProjectionService.java
+++ b/service/src/com/android/car/CarProjectionService.java
@@ -67,6 +67,7 @@
import android.text.TextUtils;
import android.util.Log;
+import com.android.car.BinderInterfaceContainer.BinderInterface;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.Preconditions;
@@ -80,7 +81,6 @@
import java.util.HashMap;
import java.util.List;
import java.util.Random;
-import java.util.concurrent.CopyOnWriteArrayList;
/**
* Car projection service allows to bound to projected app to boost it prioirity.
@@ -128,8 +128,8 @@
@GuardedBy("mLock")
private @Nullable String mCurrentProjectionPackage;
- private final List<ICarProjectionStatusListener> mProjectionStatusListeners =
- new CopyOnWriteArrayList<>();
+ private final BinderInterfaceContainer<ICarProjectionStatusListener>
+ mProjectionStatusListeners = new BinderInterfaceContainer<>();
@GuardedBy("mLock")
private final ProjectionKeyEventHandlerContainer mKeyEventHandlers;
@@ -431,7 +431,7 @@
public void registerProjectionStatusListener(ICarProjectionStatusListener listener)
throws RemoteException {
ICarImpl.assertProjectionStatusPermission(mContext);
- mProjectionStatusListeners.add(listener);
+ mProjectionStatusListeners.addBinder(listener);
// Immediately notify listener with the current status.
notifyProjectionStatusChanged(listener);
@@ -441,7 +441,7 @@
public void unregisterProjectionStatusListener(ICarProjectionStatusListener listener)
throws RemoteException {
ICarImpl.assertProjectionStatusPermission(mContext);
- mProjectionStatusListeners.remove(listener);
+ mProjectionStatusListeners.removeBinder(listener);
}
private ProjectionReceiverClient getOrCreateProjectionReceiverClientLocked(
@@ -488,8 +488,14 @@
}
if (singleListenerToNotify == null) {
- for (ICarProjectionStatusListener listener : mProjectionStatusListeners) {
- listener.onProjectionStatusChanged(currentState, currentPackage, statuses);
+ for (BinderInterface<ICarProjectionStatusListener> listener :
+ mProjectionStatusListeners.getInterfaces()) {
+ try {
+ listener.binderInterface.onProjectionStatusChanged(
+ currentState, currentPackage, statuses);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "Error calling to projection status listener", ex);
+ }
}
} else {
singleListenerToNotify.onProjectionStatusChanged(
@@ -793,6 +799,8 @@
writer.println("Current projection state: " + mCurrentProjectionState);
writer.println("Current projection package: " + mCurrentProjectionPackage);
writer.println("Projection status: " + mProjectionReceiverClients);
+ writer.println("Projection status listeners: "
+ + mProjectionStatusListeners.getInterfaces());
writer.println("WifiScanner: " + mWifiScanner);
}
}