Merge "Add TestApi to suppress other LightsSession clients" into sc-dev

This commit is contained in:
Philip Junker
2021-04-22 08:04:21 +00:00
committed by Android (Google) Code Review
6 changed files with 67 additions and 9 deletions

View File

@@ -1240,6 +1240,14 @@ package android.hardware.input {
}
package android.hardware.lights {
public abstract class LightsManager {
method @NonNull public abstract android.hardware.lights.LightsManager.LightsSession openSession(int);
}
}
package android.hardware.soundtrigger {
public class KeyphraseEnrollmentInfo {

View File

@@ -81,6 +81,11 @@ class InputDeviceLightsManager extends LightsManager {
return session;
}
@Override
public @NonNull LightsSession openSession(int priority) {
throw new UnsupportedOperationException();
}
/**
* Encapsulates a session that can be used to control device lights and represents the lifetime
* of the requests.

View File

@@ -27,7 +27,7 @@ import android.hardware.lights.LightState;
interface ILightsManager {
List<Light> getLights();
LightState getLightState(int lightId);
void openSession(in IBinder sessionToken);
void openSession(in IBinder sessionToken, in int priority);
void closeSession(in IBinder sessionToken);
void setLightStates(in IBinder sessionToken, in int[] lightIds, in LightState[] states);
}

View File

@@ -20,6 +20,7 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.TestApi;
import android.content.Context;
import android.os.Binder;
import android.os.IBinder;
@@ -83,12 +84,25 @@ public abstract class LightsManager {
*/
public abstract @NonNull LightsSession openSession();
/**
*
* Creates a new {@link LightsSession}
*
* @param priority the larger this number, the higher the priority of this session when multiple
* light state requests arrive simultaneously.
*
* @hide
*/
@TestApi
public abstract @NonNull LightsSession openSession(int priority);
/**
* Encapsulates a session that can be used to control device lights and represents the lifetime
* of the requests.
*/
public abstract static class LightsSession implements AutoCloseable {
private final IBinder mToken = new Binder();
/**
* Sends a request to modify the states of multiple lights.
*

View File

@@ -102,7 +102,28 @@ public final class SystemLightsManager extends LightsManager {
public @NonNull LightsSession openSession() {
try {
final LightsSession session = new SystemLightsSession();
mService.openSession(session.getToken());
mService.openSession(session.getToken(), 0);
return session;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
*
* Creates a new {@link LightsSession}
*
* @param priority the larger this number, the higher the priority of this session when multiple
* light state requests arrive simultaneously.
*
* @hide
*/
@RequiresPermission(Manifest.permission.CONTROL_DEVICE_LIGHTS)
@Override
public @NonNull LightsSession openSession(int priority) {
try {
final LightsSession session = new SystemLightsSession();
mService.openSession(session.getToken(), priority);
return session;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();

View File

@@ -46,6 +46,7 @@ import com.android.server.SystemService;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -68,12 +69,14 @@ public class LightsService extends SystemService {
private final class LightsManagerBinderService extends ILightsManager.Stub {
private final class Session {
private final class Session implements Comparable<Session> {
final IBinder mToken;
final SparseArray<LightState> mRequests = new SparseArray<>();
final int mPriority;
Session(IBinder token) {
Session(IBinder token, int priority) {
mToken = token;
mPriority = priority;
}
void setRequest(int lightId, LightState state) {
@@ -83,6 +86,12 @@ public class LightsService extends SystemService {
mRequests.remove(lightId);
}
}
@Override
public int compareTo(Session otherSession) {
// Sort descending by priority
return Integer.compare(otherSession.mPriority, mPriority);
}
}
@GuardedBy("LightsService.this")
@@ -150,7 +159,7 @@ public class LightsService extends SystemService {
}
@Override
public void openSession(IBinder token) {
public void openSession(IBinder token, int priority) {
getContext().enforceCallingOrSelfPermission(Manifest.permission.CONTROL_DEVICE_LIGHTS,
"openSession requires CONTROL_DEVICE_LIGHTS permission");
Preconditions.checkNotNull(token);
@@ -159,7 +168,8 @@ public class LightsService extends SystemService {
Preconditions.checkState(getSessionLocked(token) == null, "already registered");
try {
token.linkToDeath(() -> closeSessionInternal(token), 0);
mSessions.add(new Session(token));
mSessions.add(new Session(token, priority));
Collections.sort(mSessions);
} catch (RemoteException e) {
Slog.e(TAG, "Couldn't open session, client already died" , e);
throw new IllegalArgumentException("Client is already dead.");
@@ -216,10 +226,10 @@ public class LightsService extends SystemService {
}
private void checkRequestIsValid(int[] lightIds) {
for (int i = 0; i < lightIds.length; i++) {
final LightImpl light = mLightsById.get(lightIds[i]);
for (int lightId : lightIds) {
final LightImpl light = mLightsById.get(lightId);
Preconditions.checkState(light != null && !light.isSystemLight(),
"Invalid lightId " + lightIds[i]);
"Invalid lightId " + lightId);
}
}