Loading core/java/android/app/supervision/SupervisionManager.java +2 −2 Original line number Diff line number Diff line Loading @@ -69,7 +69,7 @@ public class SupervisionManager { * @param userId Int ID of the user for whom supervision was enabled. * @hide */ public abstract void onSupervisionEnabled(@UserIdInt int userId); public void onSupervisionEnabled(@UserIdInt int userId) {} /** * Called after supervision has been enabled for a given user. Loading @@ -77,7 +77,7 @@ public class SupervisionManager { * @param userId Int ID of the user for whom supervision was enabled. * @hide */ public abstract void onSupervisionDisabled(@UserIdInt int userId); public void onSupervisionDisabled(@UserIdInt int userId) {} } private final Context mContext; Loading services/core/java/com/android/server/appbinding/AppBindingService.java +23 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.appbinding; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AppGlobals; import android.app.supervision.SupervisionManager; import android.app.supervision.flags.Flags; import android.content.BroadcastReceiver; import android.content.ContentResolver; Loading Loading @@ -214,6 +215,28 @@ public class AppBindingService extends Binder { case SystemService.PHASE_THIRD_PARTY_APPS_CAN_START: onPhaseThirdPartyAppsCanStart(); break; case SystemService.PHASE_SYSTEM_SERVICES_READY: if (Flags.enableSupervisionAppService()) { registerSupervisionListener(); } break; } } private void registerSupervisionListener() { SupervisionManager supervisionManager = mContext.getSystemService(SupervisionManager.class); if (supervisionManager != null) { SupervisionManager.SupervisionListener listener = new SupervisionManager.SupervisionListener() { @Override public void onSupervisionDisabled(int userId) { synchronized (mLock) { unbindServicesLocked(userId, null, "supervision disabled"); } } }; supervisionManager.registerSupervisionListener(listener); } } Loading services/core/java/com/android/server/appbinding/AppServiceConnection.java +49 −1 Original line number Diff line number Diff line Loading @@ -25,6 +25,10 @@ import android.os.IInterface; import com.android.server.am.PersistentConnection; import com.android.server.appbinding.finders.AppServiceFinder; import com.android.server.utils.Slogf; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * Establishes a persistent connection to a given service component for a given user Loading @@ -36,6 +40,19 @@ public class AppServiceConnection extends PersistentConnection<IInterface> { private final AppBindingConstants mConstants; private final AppServiceFinder mFinder; /** * Listener for connection status updates * TODO: Refactor this (b/423644620) */ public interface ConnectionStatusListener { void onConnected(@NonNull AppServiceConnection connection, @NonNull IInterface service); void onDisconnected(@NonNull AppServiceConnection connection); void onBinderDied(@NonNull AppServiceConnection connection); } private final List<ConnectionStatusListener> mConnectionListeners = new CopyOnWriteArrayList<>(); AppServiceConnection(Context context, int userId, AppBindingConstants constants, Handler handler, AppServiceFinder finder, @NonNull ComponentName componentName) { Loading @@ -55,10 +72,41 @@ public class AppServiceConnection extends PersistentConnection<IInterface> { @Override protected IInterface asInterface(IBinder obj) { return mFinder.asInterface(obj); final IInterface service = mFinder.asInterface(obj); if (service != null) { // Notify all listeners. Slogf.d(TAG, "Service for %s is connected. Notifying listeners.", getComponentName()); for (ConnectionStatusListener listener : mConnectionListeners) { listener.onConnected(this, service); } } else { Slogf.w(TAG, "Service for %s is null.", getComponentName()); } return service; } public AppServiceFinder getFinder() { return mFinder; } /** * Adds a listener to be notified of connection changes. * If service is already connected, notify immediately. */ public void addConnectionStatusListener(@NonNull ConnectionStatusListener listener) { mConnectionListeners.add(listener); final IInterface service = getServiceBinder(); if (isConnected() && service != null) { listener.onConnected(this, service); } } /** * Removes an existing listener. */ public void removeConnectionStatusListener(@NonNull ConnectionStatusListener listener) { mConnectionListeners.remove(listener); } } services/core/java/com/android/server/appbinding/finders/AppServiceFinder.java +2 −2 Original line number Diff line number Diff line Loading @@ -70,7 +70,7 @@ public abstract class AppServiceFinder<TServiceType, TServiceInterfaceType exten } /** Whether this service should really be enabled. */ protected boolean isEnabled(AppBindingConstants constants) { protected boolean isEnabled(AppBindingConstants constants, int userId) { return true; } Loading Loading @@ -102,7 +102,7 @@ public abstract class AppServiceFinder<TServiceType, TServiceInterfaceType exten mTargetServices.put(userId, null); mLastMessages.put(userId, null); if (!isEnabled(constants)) { if (!isEnabled(constants, userId)) { final String message = "feature disabled"; mLastMessages.put(userId, message); Slog.i(TAG, getAppDescription() + " " + message); Loading services/core/java/com/android/server/appbinding/finders/CarrierMessagingClientServiceFinder.java +1 −1 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ public class CarrierMessagingClientServiceFinder } @Override protected boolean isEnabled(AppBindingConstants constants) { protected boolean isEnabled(AppBindingConstants constants, int userId) { return constants.SMS_SERVICE_ENABLED && mContext.getResources().getBoolean(R.bool.config_useSmsAppService); } Loading Loading
core/java/android/app/supervision/SupervisionManager.java +2 −2 Original line number Diff line number Diff line Loading @@ -69,7 +69,7 @@ public class SupervisionManager { * @param userId Int ID of the user for whom supervision was enabled. * @hide */ public abstract void onSupervisionEnabled(@UserIdInt int userId); public void onSupervisionEnabled(@UserIdInt int userId) {} /** * Called after supervision has been enabled for a given user. Loading @@ -77,7 +77,7 @@ public class SupervisionManager { * @param userId Int ID of the user for whom supervision was enabled. * @hide */ public abstract void onSupervisionDisabled(@UserIdInt int userId); public void onSupervisionDisabled(@UserIdInt int userId) {} } private final Context mContext; Loading
services/core/java/com/android/server/appbinding/AppBindingService.java +23 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.appbinding; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AppGlobals; import android.app.supervision.SupervisionManager; import android.app.supervision.flags.Flags; import android.content.BroadcastReceiver; import android.content.ContentResolver; Loading Loading @@ -214,6 +215,28 @@ public class AppBindingService extends Binder { case SystemService.PHASE_THIRD_PARTY_APPS_CAN_START: onPhaseThirdPartyAppsCanStart(); break; case SystemService.PHASE_SYSTEM_SERVICES_READY: if (Flags.enableSupervisionAppService()) { registerSupervisionListener(); } break; } } private void registerSupervisionListener() { SupervisionManager supervisionManager = mContext.getSystemService(SupervisionManager.class); if (supervisionManager != null) { SupervisionManager.SupervisionListener listener = new SupervisionManager.SupervisionListener() { @Override public void onSupervisionDisabled(int userId) { synchronized (mLock) { unbindServicesLocked(userId, null, "supervision disabled"); } } }; supervisionManager.registerSupervisionListener(listener); } } Loading
services/core/java/com/android/server/appbinding/AppServiceConnection.java +49 −1 Original line number Diff line number Diff line Loading @@ -25,6 +25,10 @@ import android.os.IInterface; import com.android.server.am.PersistentConnection; import com.android.server.appbinding.finders.AppServiceFinder; import com.android.server.utils.Slogf; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * Establishes a persistent connection to a given service component for a given user Loading @@ -36,6 +40,19 @@ public class AppServiceConnection extends PersistentConnection<IInterface> { private final AppBindingConstants mConstants; private final AppServiceFinder mFinder; /** * Listener for connection status updates * TODO: Refactor this (b/423644620) */ public interface ConnectionStatusListener { void onConnected(@NonNull AppServiceConnection connection, @NonNull IInterface service); void onDisconnected(@NonNull AppServiceConnection connection); void onBinderDied(@NonNull AppServiceConnection connection); } private final List<ConnectionStatusListener> mConnectionListeners = new CopyOnWriteArrayList<>(); AppServiceConnection(Context context, int userId, AppBindingConstants constants, Handler handler, AppServiceFinder finder, @NonNull ComponentName componentName) { Loading @@ -55,10 +72,41 @@ public class AppServiceConnection extends PersistentConnection<IInterface> { @Override protected IInterface asInterface(IBinder obj) { return mFinder.asInterface(obj); final IInterface service = mFinder.asInterface(obj); if (service != null) { // Notify all listeners. Slogf.d(TAG, "Service for %s is connected. Notifying listeners.", getComponentName()); for (ConnectionStatusListener listener : mConnectionListeners) { listener.onConnected(this, service); } } else { Slogf.w(TAG, "Service for %s is null.", getComponentName()); } return service; } public AppServiceFinder getFinder() { return mFinder; } /** * Adds a listener to be notified of connection changes. * If service is already connected, notify immediately. */ public void addConnectionStatusListener(@NonNull ConnectionStatusListener listener) { mConnectionListeners.add(listener); final IInterface service = getServiceBinder(); if (isConnected() && service != null) { listener.onConnected(this, service); } } /** * Removes an existing listener. */ public void removeConnectionStatusListener(@NonNull ConnectionStatusListener listener) { mConnectionListeners.remove(listener); } }
services/core/java/com/android/server/appbinding/finders/AppServiceFinder.java +2 −2 Original line number Diff line number Diff line Loading @@ -70,7 +70,7 @@ public abstract class AppServiceFinder<TServiceType, TServiceInterfaceType exten } /** Whether this service should really be enabled. */ protected boolean isEnabled(AppBindingConstants constants) { protected boolean isEnabled(AppBindingConstants constants, int userId) { return true; } Loading Loading @@ -102,7 +102,7 @@ public abstract class AppServiceFinder<TServiceType, TServiceInterfaceType exten mTargetServices.put(userId, null); mLastMessages.put(userId, null); if (!isEnabled(constants)) { if (!isEnabled(constants, userId)) { final String message = "feature disabled"; mLastMessages.put(userId, message); Slog.i(TAG, getAppDescription() + " " + message); Loading
services/core/java/com/android/server/appbinding/finders/CarrierMessagingClientServiceFinder.java +1 −1 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ public class CarrierMessagingClientServiceFinder } @Override protected boolean isEnabled(AppBindingConstants constants) { protected boolean isEnabled(AppBindingConstants constants, int userId) { return constants.SMS_SERVICE_ENABLED && mContext.getResources().getBoolean(R.bool.config_useSmsAppService); } Loading