Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e1599f6d authored by Charlie Wang's avatar Charlie Wang
Browse files

Update AmbientContextManager with suggestions.

Address comments in ag/20668329.

Bug: 244181656
Test: atest CtsAmbientContextServiceTestCases atest CtsWearableSensingServiceTestCasesi
Ignore-AOSP-First: to prevent new feature leak.
Change-Id: I488682a377ee8fd7714013fc88c4b94d21159c00
parent b0e5c411
Loading
Loading
Loading
Loading
+48 −60
Original line number Diff line number Diff line
@@ -50,6 +50,8 @@ import com.android.server.infra.AbstractMasterSystemService;
import com.android.server.infra.FrameworkResourcesServiceNameResolver;
import com.android.server.pm.KnownPackages;

import com.google.android.collect.Sets;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -67,12 +69,10 @@ public class AmbientContextManagerService extends
                AmbientContextManagerPerUserService> {
    private static final String TAG = AmbientContextManagerService.class.getSimpleName();
    private static final String KEY_SERVICE_ENABLED = "service_enabled";
    private static final Set<Integer> DEFAULT_EVENT_SET = new HashSet<>(){{
            add(AmbientContextEvent.EVENT_COUGH);
            add(AmbientContextEvent.EVENT_SNORE);
            add(AmbientContextEvent.EVENT_BACK_DOUBLE_TAP);
        }
    };
    private static final Set<Integer> DEFAULT_EVENT_SET = Sets.newHashSet(
            AmbientContextEvent.EVENT_COUGH,
            AmbientContextEvent.EVENT_SNORE,
            AmbientContextEvent.EVENT_BACK_DOUBLE_TAP);

    /** Default value in absence of {@link DeviceConfig} override. */
    private static final boolean DEFAULT_SERVICE_ENABLED = true;
@@ -409,14 +409,6 @@ public class AmbientContextManagerService extends
        }
    }

    private Set<Integer> intArrayToIntegerSet(int[] eventTypes) {
        Set<Integer> types = new HashSet<>();
        for (Integer i : eventTypes) {
            types.add(i);
        }
        return types;
    }

    private AmbientContextManagerPerUserService.ServiceType getServiceType(String serviceName) {
        final String wearableService = mContext.getResources()
                .getString(R.string.config_defaultWearableSensingService);
@@ -513,6 +505,14 @@ public class AmbientContextManagerService extends
        return intArray;
    }

    private Set<Integer> intArrayToIntegerSet(int[] eventTypes) {
        Set<Integer> types = new HashSet<>();
        for (Integer i : eventTypes) {
            types.add(i);
        }
        return types;
    }

    @NonNull
    private static Integer[] intArrayToIntegerArray(@NonNull int[] integerSet) {
        Integer[] intArray = new Integer[integerSet.length];
@@ -567,37 +567,24 @@ public class AmbientContextManagerService extends
            mContext.enforceCallingOrSelfPermission(
                    Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT, TAG);
            assertCalledByPackageOwner(packageName);

            AmbientContextManagerPerUserService service =
                    getAmbientContextManagerPerUserServiceForEventTypes(
                            UserHandle.getCallingUserId(),
                            request.getEventTypes());

            if (service == null) {
                Slog.w(TAG, "onRegisterObserver unavailable user_id: "
                        + UserHandle.getCallingUserId());
            }

            if (service.getServiceType() == ServiceType.DEFAULT && !mIsServiceEnabled) {
                Slog.d(TAG, "Service not available.");
                service.completeRegistration(observer,
                        AmbientContextManager.STATUS_SERVICE_UNAVAILABLE);
                return;
            }
            if (service.getServiceType() == ServiceType.WEARABLE && !mIsWearableServiceEnabled) {
                Slog.d(TAG, "Wearable Service not available.");
                service.completeRegistration(observer,
                        AmbientContextManager.STATUS_SERVICE_UNAVAILABLE);
                return;
            }
            if (containsMixedEvents(integerSetToIntArray(request.getEventTypes()))) {
                Slog.d(TAG, "AmbientContextEventRequest contains mixed events,"
                        + " this is not supported.");
                service.completeRegistration(observer,
                        AmbientContextManager.STATUS_NOT_SUPPORTED);
                return;
            }

            int statusCode = checkStatusCode(
                    service, integerSetToIntArray(request.getEventTypes()));
            if (statusCode == AmbientContextManager.STATUS_SUCCESS) {
                service.onRegisterObserver(request, packageName, observer);
            } else {
                service.completeRegistration(observer, statusCode);
            }
        }

        @Override
@@ -606,10 +593,10 @@ public class AmbientContextManagerService extends
                    Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT, TAG);
            assertCalledByPackageOwner(callingPackage);

            AmbientContextManagerPerUserService service = null;
            for (ClientRequest cr : mExistingClientRequests) {
                if (cr.getPackageName().equals(callingPackage)) {
                    service = getAmbientContextManagerPerUserServiceForEventTypes(
                    AmbientContextManagerPerUserService service =
                            getAmbientContextManagerPerUserServiceForEventTypes(
                            UserHandle.getCallingUserId(), cr.getRequest().getEventTypes());
                    if (service != null) {
                        service.onUnregisterObserver(callingPackage);
@@ -635,34 +622,18 @@ public class AmbientContextManagerService extends
                        getAmbientContextManagerPerUserServiceForEventTypes(
                                UserHandle.getCallingUserId(), intArrayToIntegerSet(eventTypes));
                if (service == null) {
                    Slog.w(TAG, "onQueryServiceStatus unavailable user_id: "
                    Slog.w(TAG, "queryServiceStatus unavailable user_id: "
                            + UserHandle.getCallingUserId());
                }

                if (service.getServiceType() == ServiceType.DEFAULT && !mIsServiceEnabled) {
                    Slog.d(TAG, "Service not available.");
                    service.sendStatusCallback(statusCallback,
                            AmbientContextManager.STATUS_SERVICE_UNAVAILABLE);
                    return;
                }
                if (service.getServiceType() == ServiceType.WEARABLE
                        && !mIsWearableServiceEnabled) {
                    Slog.d(TAG, "Wearable Service not available.");
                    service.sendStatusCallback(statusCallback,
                            AmbientContextManager.STATUS_SERVICE_UNAVAILABLE);
                    return;
                }

                if (containsMixedEvents(eventTypes)) {
                    Slog.d(TAG, "AmbientContextEventRequest contains mixed events,"
                            + " this is not supported.");
                    service.sendStatusCallback(statusCallback,
                            AmbientContextManager.STATUS_NOT_SUPPORTED);
                    return;
                }

                int statusCode = checkStatusCode(service, eventTypes);
                if (statusCode == AmbientContextManager.STATUS_SUCCESS) {
                    service.onQueryServiceStatus(eventTypes, callingPackage,
                            statusCallback);
                } else {
                    service.sendStatusCallback(statusCallback, statusCode);
                }
            }
        }

@@ -708,5 +679,22 @@ public class AmbientContextManagerService extends
            new AmbientContextShellCommand(AmbientContextManagerService.this).exec(
                    this, in, out, err, args, callback, resultReceiver);
        }

        private int checkStatusCode(AmbientContextManagerPerUserService service, int[] eventTypes) {
            if (service.getServiceType() == ServiceType.DEFAULT && !mIsServiceEnabled) {
                Slog.d(TAG, "Service not enabled.");
                return AmbientContextManager.STATUS_SERVICE_UNAVAILABLE;
            }
            if (service.getServiceType() == ServiceType.WEARABLE && !mIsWearableServiceEnabled) {
                Slog.d(TAG, "Wearable Service not available.");
                return AmbientContextManager.STATUS_SERVICE_UNAVAILABLE;
            }
            if (containsMixedEvents(eventTypes)) {
                Slog.d(TAG, "AmbientContextEventRequest contains mixed events,"
                        + " this is not supported.");
                return AmbientContextManager.STATUS_NOT_SUPPORTED;
            }
            return AmbientContextManager.STATUS_SUCCESS;
        }
    }
}