/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.car.evs;
import static android.car.evs.CarEvsManager.SERVICE_TYPE_REARVIEW;
import static android.car.evs.CarEvsManager.SERVICE_TYPE_SURROUNDVIEW;
import static android.car.evs.CarEvsManager.SERVICE_TYPE_FRONTVIEW;
import static android.car.evs.CarEvsManager.SERVICE_TYPE_LEFTVIEW;
import static android.car.evs.CarEvsManager.SERVICE_TYPE_RIGHTVIEW;
import static android.car.evs.CarEvsManager.SERVICE_TYPE_DRIVERVIEW;
import static android.car.evs.CarEvsManager.SERVICE_TYPE_FRONT_PASSENGERSVIEW;
import static android.car.evs.CarEvsManager.SERVICE_TYPE_REAR_PASSENGERSVIEW;
import static android.car.evs.CarEvsManager.SERVICE_TYPE_USER_DEFINED;
import android.annotation.SystemApi;
import android.content.ComponentName;
import android.car.builtin.util.Slogf;
import android.car.evs.CarEvsManager;
import android.car.evs.CarEvsManager.CarEvsServiceType;
import android.car.evs.CarEvsManager.CarEvsStreamEvent;
import com.android.car.internal.evs.CarEvsUtils;
/**
* Utility class for CarEvsService
*
* @hide
*/
@SystemApi
public final class CarEvsServiceUtils {
private static final String TAG = CarEvsServiceUtils.class.getSimpleName();
private static final int INVALID_SERVICE_TYPE = -1;
private static String INVALID_CAMERA_ID = "";
private CarEvsServiceUtils() {}
/**
* Converts EvsEvent to CarEvsManager.CarEvsStreamEvent.
*
* See the definition of EvsEventType in hardware/interfaces/automotive/evs/1.1/types.hal
*/
static @CarEvsStreamEvent int convertToStreamEvent(int inputEvent) {
@CarEvsStreamEvent int outputStatus = CarEvsManager.STREAM_EVENT_NONE;
switch (inputEvent) {
case 0: // EvsEventType.STREAM_STARTED
outputStatus = CarEvsManager.STREAM_EVENT_STREAM_STARTED;
break;
case 1: // EvsEventType.STREAM_STOPPED
outputStatus = CarEvsManager.STREAM_EVENT_STREAM_STOPPED;
break;
case 2: // EvsEventType.FRAME_DROPPED
outputStatus = CarEvsManager.STREAM_EVENT_FRAME_DROPPED;
break;
case 3: // EvsEventType.TIMEOUT
outputStatus = CarEvsManager.STREAM_EVENT_TIMEOUT;
break;
case 4: // EvsEventType.PARAMETER_CHANGED
outputStatus = CarEvsManager.STREAM_EVENT_PARAMETER_CHANGED;
break;
case 5: // EvsEventType.MASTER_RELEASED
outputStatus = CarEvsManager.STREAM_EVENT_PRIMARY_OWNER_CHANGED;
break;
case 6: // EvsEventType.STREAM_ERROR
outputStatus = CarEvsManager.STREAM_EVENT_OTHER_ERRORS;
break;
default:
Slogf.w(TAG, "Invalid event type: " + inputEvent);
break;
}
return outputStatus;
}
final static class Parameters {
private final @CarEvsServiceType int mServiceType;
private final ComponentName mActivityName;
private String mCameraId;
private Parameters(int type, String cameraId, String activityName) {
mServiceType = type;
mCameraId = cameraId;
if (activityName != null && !activityName.isEmpty()) {
mActivityName = ComponentName.unflattenFromString(activityName);
} else {
mActivityName = null;
}
}
static Parameters create(int type, String cameraId, String activityName) {
return new Parameters(type, cameraId, activityName);
}
@CarEvsServiceType int getType() { return mServiceType; }
String getCameraId() { return mCameraId; }
void setCameraId(String cameraId) { mCameraId = cameraId; }
ComponentName getActivityComponentName() { return mActivityName; }
@Override
public String toString() {
return "Parameter serviceType=" + CarEvsUtils.convertToString(mServiceType) +
", cameraId=" + mCameraId + ", activityName=" + mActivityName;
}
}
static Parameters parse(String rawString) {
@CarEvsServiceType int serviceType = INVALID_SERVICE_TYPE;
String activityName = null;
String cameraId = INVALID_CAMERA_ID;
// Example a service configuration string:
// - serviceType=REARVIEW,cameraId=/dev/video0,
// activityName=com.android.car/com.google.android.car.evs.CarEvsCameraPreviewActivity
//
// - serviceType=FRONTVIEW,cameraId=/dev/video1
String[] tokens = rawString.split(",");
for (String token : tokens) {
String[] keyValuePair = token.split("=");
if (keyValuePair.length != 2) {
Slogf.w(TAG, "Skip a key-value pair in incorrect format, " + token);
continue;
}
switch (keyValuePair[0]) {
case "serviceType":
serviceType = CarEvsUtils.convertToServiceType(keyValuePair[1]);
break;
case "cameraId":
cameraId = keyValuePair[1];
break;
case "activityName":
activityName = keyValuePair[1];
break;
default:
Slogf.e(TAG, "Unknown parameter: " + token);
break;
}
}
return Parameters.create(serviceType, cameraId, activityName);
}
}