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

Commit 66e33150 authored by Chaitanya Cheemala (xWF)'s avatar Chaitanya Cheemala (xWF) Committed by Android (Google) Code Review
Browse files

Merge "Revert "Add device state Hal service"" into main

parents e82b3e2e fded36e3
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -178,7 +178,6 @@ java_library_static {

    static_libs: [
        "android.frameworks.vibrator-V1-java", // AIDL
        "android.frameworks.devicestate-V1-java", // AIDL
        "android.hardware.authsecret-V1.0-java",
        "android.hardware.authsecret-V1-java",
        "android.hardware.boot-V1.0-java", // HIDL
+2 −149
Original line number Diff line number Diff line
@@ -19,16 +19,7 @@ package com.android.server.devicestate;
import static android.Manifest.permission.CONTROL_DEVICE_STATE;
import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.frameworks.devicestate.DeviceStateConfiguration.DeviceStatePropertyValue.FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_CLOSED;
import static android.frameworks.devicestate.DeviceStateConfiguration.DeviceStatePropertyValue.FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_HALF_OPEN;
import static android.frameworks.devicestate.DeviceStateConfiguration.DeviceStatePropertyValue.FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_OPEN;
import static android.frameworks.devicestate.DeviceStateConfiguration.DeviceStatePropertyValue.FEATURE_DUAL_DISPLAY;
import static android.frameworks.devicestate.DeviceStateConfiguration.DeviceStatePropertyValue.FEATURE_REAR_DISPLAY;
import static android.frameworks.devicestate.DeviceStateConfiguration.DeviceStatePropertyValue.FOLDABLE_DISPLAY_CONFIGURATION_INNER_PRIMARY;
import static android.frameworks.devicestate.DeviceStateConfiguration.DeviceStatePropertyValue.FOLDABLE_DISPLAY_CONFIGURATION_OUTER_PRIMARY;
import static android.hardware.devicestate.DeviceState.PROPERTY_FEATURE_DUAL_DISPLAY_INTERNAL_DEFAULT;
import static android.hardware.devicestate.DeviceState.PROPERTY_FEATURE_REAR_DISPLAY;
import static android.hardware.devicestate.DeviceState.PROPERTY_FOLDABLE_DISPLAY_CONFIGURATION_INNER_PRIMARY;
import static android.hardware.devicestate.DeviceState.PROPERTY_FOLDABLE_DISPLAY_CONFIGURATION_OUTER_PRIMARY;
import static android.hardware.devicestate.DeviceState.PROPERTY_POLICY_AVAILABLE_FOR_APP_REQUEST;
import static android.hardware.devicestate.DeviceState.PROPERTY_POLICY_CANCEL_OVERRIDE_REQUESTS;
@@ -53,10 +44,6 @@ import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.IProcessObserver;
import android.content.Context;
import android.frameworks.devicestate.DeviceStateConfiguration;
import android.frameworks.devicestate.ErrorCode;
import android.frameworks.devicestate.IDeviceStateListener;
import android.frameworks.devicestate.IDeviceStateService;
import android.hardware.devicestate.DeviceState;
import android.hardware.devicestate.DeviceStateInfo;
import android.hardware.devicestate.DeviceStateManager;
@@ -69,12 +56,9 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ServiceManager;
import android.os.ServiceSpecificException;
import android.os.ShellCallback;
import android.os.SystemProperties;
import android.os.Trace;
import android.util.LongSparseLongArray;
import android.util.Slog;
import android.util.SparseArray;

@@ -98,7 +82,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.WeakHashMap;
@@ -147,8 +130,6 @@ public final class DeviceStateManagerService extends SystemService {
    @NonNull
    private final BinderService mBinderService;
    @NonNull
    private final HalService mHalService;
    @NonNull
    private final OverrideRequestController mOverrideRequestController;
    @NonNull
    private final DeviceStateProviderListener mDeviceStateProviderListener;
@@ -158,7 +139,7 @@ public final class DeviceStateManagerService extends SystemService {

    // All supported device states keyed by identifier.
    @GuardedBy("mLock")
    private final SparseArray<DeviceState> mDeviceStates = new SparseArray<>();
    private SparseArray<DeviceState> mDeviceStates = new SparseArray<>();

    // The current committed device state. Will be empty until the first device state provided by
    // the DeviceStateProvider is committed.
@@ -196,7 +177,7 @@ public final class DeviceStateManagerService extends SystemService {
    @GuardedBy("mLock")
    private final SparseArray<ProcessRecord> mProcessRecords = new SparseArray<>();

    private final Set<Integer> mDeviceStatesAvailableForAppRequests = new HashSet<>();
    private Set<Integer> mDeviceStatesAvailableForAppRequests = new HashSet<>();

    private Set<Integer> mFoldedDeviceStates = new HashSet<>();

@@ -278,7 +259,6 @@ public final class DeviceStateManagerService extends SystemService {
        mDeviceStateProviderListener = new DeviceStateProviderListener();
        mDeviceStatePolicy.getDeviceStateProvider().setListener(mDeviceStateProviderListener);
        mBinderService = new BinderService();
        mHalService = new HalService();
        mActivityTaskManagerInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
        mDeviceStateNotificationController = new DeviceStateNotificationController(
                context, mHandler,
@@ -292,10 +272,6 @@ public final class DeviceStateManagerService extends SystemService {
    @Override
    public void onStart() {
        publishBinderService(Context.DEVICE_STATE_SERVICE, mBinderService);
        String halServiceName = IDeviceStateService.DESCRIPTOR + "/default";
        if (ServiceManager.isDeclared(halServiceName)) {
            publishBinderService(halServiceName, mHalService);
        }
        publishLocalService(DeviceStateManagerInternal.class, new LocalService());

        if (!Flags.deviceStatePropertyMigration()) {
@@ -464,11 +440,6 @@ public final class DeviceStateManagerService extends SystemService {
        return mBinderService;
    }

    @VisibleForTesting
    IDeviceStateService getHalBinderService() {
        return mHalService;
    }

    private void updateSupportedStates(DeviceState[] supportedDeviceStates,
            @DeviceStateProvider.SupportedStatesUpdatedReason int reason) {
        synchronized (mLock) {
@@ -1311,124 +1282,6 @@ public final class DeviceStateManagerService extends SystemService {
        }
    }

    private final class HalService extends IDeviceStateService.Stub {
        private final LongSparseLongArray mPublicProperties = new LongSparseLongArray();
        public HalService() {
            mPublicProperties.put(
                    DeviceState.PROPERTY_FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_CLOSED,
                    FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_CLOSED);
            mPublicProperties.put(
                    DeviceState.PROPERTY_FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_HALF_OPEN,
                    FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_HALF_OPEN);
            mPublicProperties.put(
                    DeviceState.PROPERTY_FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_OPEN,
                    FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_OPEN);
            mPublicProperties.put(
                    PROPERTY_FOLDABLE_DISPLAY_CONFIGURATION_OUTER_PRIMARY,
                    FOLDABLE_DISPLAY_CONFIGURATION_OUTER_PRIMARY);
            mPublicProperties.put(
                    PROPERTY_FOLDABLE_DISPLAY_CONFIGURATION_INNER_PRIMARY,
                    FOLDABLE_DISPLAY_CONFIGURATION_INNER_PRIMARY);
            mPublicProperties.put(
                    PROPERTY_FEATURE_REAR_DISPLAY,
                    FEATURE_REAR_DISPLAY);
            mPublicProperties.put(
                    PROPERTY_FEATURE_DUAL_DISPLAY_INTERNAL_DEFAULT,
                    FEATURE_DUAL_DISPLAY);
        }

        private final class HalBinderCallback implements IDeviceStateManagerCallback {
            private final IDeviceStateListener mListener;

            private HalBinderCallback(@NonNull IDeviceStateListener listener) {
                mListener = listener;
            }

            @Override
            public void onDeviceStateInfoChanged(DeviceStateInfo info) throws RemoteException {
                DeviceStateConfiguration config = new DeviceStateConfiguration();
                Set<Integer> systemProperties = new HashSet<>(
                        info.currentState.getConfiguration().getSystemProperties());
                Set<Integer> physicalProperties = new HashSet<>(
                        info.currentState.getConfiguration().getPhysicalProperties());
                config.deviceProperties = 0;
                for (Integer prop : systemProperties) {
                    Long publicProperty = mPublicProperties.get(prop);
                    if (publicProperty != null) {
                        config.deviceProperties |= publicProperty.longValue();
                    }
                }
                for (Integer prop : physicalProperties) {
                    Long publicProperty = mPublicProperties.get(prop);
                    if (publicProperty != null) {
                        config.deviceProperties |= publicProperty.longValue();
                    }
                }
                mListener.onDeviceStateChanged(config);
            }

            @Override
            public void onRequestActive(IBinder token) {
                //No-op
            }

            @Override
            public void onRequestCanceled(IBinder token) {
                //No-op
            }

            @Override
            public IBinder asBinder() {
                return mListener.asBinder();
            }
        }

        @Override
        public void registerListener(IDeviceStateListener listener) throws RemoteException {
            if (listener == null) {
                throw new ServiceSpecificException(ErrorCode.BAD_INPUT);
            }

            final int callingPid = Binder.getCallingPid();
            final long token = Binder.clearCallingIdentity();
            try {
                HalBinderCallback callback = new HalBinderCallback(listener);
                DeviceStateInfo info = registerProcess(callingPid, callback);
                if (info != null)  {
                    callback.onDeviceStateInfoChanged(info);
                }
            } catch (SecurityException e) {
                throw new ServiceSpecificException(ErrorCode.ALREADY_EXISTS);
            } finally {
                Binder.restoreCallingIdentity(token);
            }
        }

        @Override
        public void unregisterListener(IDeviceStateListener listener) throws RemoteException {
            final int callingPid = Binder.getCallingPid();

            synchronized (mLock) {
                if (mProcessRecords.contains(callingPid)) {
                    mProcessRecords.remove(callingPid);
                    return;
                }
            }

            throw new ServiceSpecificException(ErrorCode.BAD_INPUT);
        }

        @Override
        public int getInterfaceVersion() throws RemoteException {
            return IDeviceStateService.VERSION;
        }

        @Override
        public String getInterfaceHash() throws RemoteException {
            return IDeviceStateService.HASH;
        }
    }

    /** Implementation of {@link IDeviceStateManager} published as a binder service. */
    private final class BinderService extends IDeviceStateManager.Stub {

+0 −5
Original line number Diff line number Diff line
@@ -4,9 +4,4 @@
        <version>2</version>
        <fqname>IAltitudeService/default</fqname>
    </hal>
    <hal format="aidl">
        <name>android.frameworks.devicestate</name>
        <version>1</version>
        <fqname>IDeviceStateService/default</fqname>
    </hal>
</manifest>
+0 −53
Original line number Diff line number Diff line
@@ -24,14 +24,9 @@ import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertThrows;

import android.content.Context;
import android.frameworks.devicestate.DeviceStateConfiguration;
import android.frameworks.devicestate.ErrorCode;
import android.frameworks.devicestate.IDeviceStateListener;
import android.frameworks.devicestate.IDeviceStateService;
import android.hardware.devicestate.DeviceState;
import android.hardware.devicestate.DeviceStateInfo;
import android.hardware.devicestate.DeviceStateRequest;
@@ -39,7 +34,6 @@ import android.hardware.devicestate.IDeviceStateManagerCallback;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.platform.test.annotations.Presubmit;
import android.platform.test.flag.junit.FlagsParameterization;
import android.platform.test.flag.junit.SetFlagsRule;
@@ -341,53 +335,6 @@ public final class DeviceStateManagerServiceTest {
        assertThat(info.currentState.getIdentifier()).isEqualTo(INVALID_DEVICE_STATE_IDENTIFIER);
    }

    @Test
    public void halRegisterUnregisterCallback() throws RemoteException {
        IDeviceStateService halService = mService.getHalBinderService();
        IDeviceStateListener halListener = new IDeviceStateListener.Stub() {
            @Override
            public void onDeviceStateChanged(DeviceStateConfiguration deviceState) { }

            @Override
            public int getInterfaceVersion() {
                return IDeviceStateListener.VERSION;
            }

            @Override
            public String getInterfaceHash() {
                return IDeviceStateListener.HASH;
            }
        };

        int errorCode = ErrorCode.OK;
        try {
            halService.unregisterListener(halListener);
        } catch(ServiceSpecificException e) {
            errorCode = e.errorCode;
        }
        assertEquals(errorCode, ErrorCode.BAD_INPUT);

        errorCode = ErrorCode.OK;
        try {
            halService.unregisterListener(null);
        } catch(ServiceSpecificException e) {
            errorCode = e.errorCode;
        }
        assertEquals(errorCode, ErrorCode.BAD_INPUT);

        halService.registerListener(halListener);

        errorCode = ErrorCode.OK;
        try {
            halService.registerListener(halListener);
        } catch (ServiceSpecificException e) {
            errorCode = e.errorCode;
        }
        assertEquals(errorCode, ErrorCode.ALREADY_EXISTS);

        halService.unregisterListener(halListener);
    }

    @Test
    public void registerCallback() throws RemoteException {
        final TestDeviceStateManagerCallback callback = new TestDeviceStateManagerCallback();