1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.car.evs; 17 18 import static android.car.evs.CarEvsManager.SERVICE_TYPE_REARVIEW; 19 import static android.car.evs.CarEvsManager.SERVICE_TYPE_SURROUNDVIEW; 20 import static android.car.evs.CarEvsManager.SERVICE_TYPE_FRONTVIEW; 21 import static android.car.evs.CarEvsManager.SERVICE_TYPE_LEFTVIEW; 22 import static android.car.evs.CarEvsManager.SERVICE_TYPE_RIGHTVIEW; 23 import static android.car.evs.CarEvsManager.SERVICE_TYPE_DRIVERVIEW; 24 import static android.car.evs.CarEvsManager.SERVICE_TYPE_FRONT_PASSENGERSVIEW; 25 import static android.car.evs.CarEvsManager.SERVICE_TYPE_REAR_PASSENGERSVIEW; 26 import static android.car.evs.CarEvsManager.SERVICE_TYPE_USER_DEFINED; 27 28 import android.annotation.SystemApi; 29 import android.content.ComponentName; 30 import android.car.builtin.util.Slogf; 31 import android.car.evs.CarEvsManager; 32 import android.car.evs.CarEvsManager.CarEvsServiceType; 33 import android.car.evs.CarEvsManager.CarEvsStreamEvent; 34 35 import com.android.car.internal.evs.CarEvsUtils; 36 37 /** 38 * Utility class for CarEvsService 39 * 40 * @hide 41 */ 42 @SystemApi 43 public final class CarEvsServiceUtils { 44 private static final String TAG = CarEvsServiceUtils.class.getSimpleName(); 45 46 private static final int INVALID_SERVICE_TYPE = -1; 47 48 private static String INVALID_CAMERA_ID = ""; 49 CarEvsServiceUtils()50 private CarEvsServiceUtils() {} 51 52 /** 53 * Converts EvsEvent to CarEvsManager.CarEvsStreamEvent. 54 * 55 * See the definition of EvsEventType in hardware/interfaces/automotive/evs/1.1/types.hal 56 */ convertToStreamEvent(int inputEvent)57 static @CarEvsStreamEvent int convertToStreamEvent(int inputEvent) { 58 @CarEvsStreamEvent int outputStatus = CarEvsManager.STREAM_EVENT_NONE; 59 60 switch (inputEvent) { 61 case 0: // EvsEventType.STREAM_STARTED 62 outputStatus = CarEvsManager.STREAM_EVENT_STREAM_STARTED; 63 break; 64 case 1: // EvsEventType.STREAM_STOPPED 65 outputStatus = CarEvsManager.STREAM_EVENT_STREAM_STOPPED; 66 break; 67 case 2: // EvsEventType.FRAME_DROPPED 68 outputStatus = CarEvsManager.STREAM_EVENT_FRAME_DROPPED; 69 break; 70 case 3: // EvsEventType.TIMEOUT 71 outputStatus = CarEvsManager.STREAM_EVENT_TIMEOUT; 72 break; 73 case 4: // EvsEventType.PARAMETER_CHANGED 74 outputStatus = CarEvsManager.STREAM_EVENT_PARAMETER_CHANGED; 75 break; 76 case 5: // EvsEventType.MASTER_RELEASED 77 outputStatus = CarEvsManager.STREAM_EVENT_PRIMARY_OWNER_CHANGED; 78 break; 79 case 6: // EvsEventType.STREAM_ERROR 80 outputStatus = CarEvsManager.STREAM_EVENT_OTHER_ERRORS; 81 break; 82 default: 83 Slogf.w(TAG, "Invalid event type: " + inputEvent); 84 break; 85 } 86 87 return outputStatus; 88 } 89 90 final static class Parameters { 91 private final @CarEvsServiceType int mServiceType; 92 private final ComponentName mActivityName; 93 private String mCameraId; 94 Parameters(int type, String cameraId, String activityName)95 private Parameters(int type, String cameraId, String activityName) { 96 mServiceType = type; 97 mCameraId = cameraId; 98 if (activityName != null && !activityName.isEmpty()) { 99 mActivityName = ComponentName.unflattenFromString(activityName); 100 } else { 101 mActivityName = null; 102 } 103 } 104 create(int type, String cameraId, String activityName)105 static Parameters create(int type, String cameraId, String activityName) { 106 return new Parameters(type, cameraId, activityName); 107 } 108 getType()109 @CarEvsServiceType int getType() { return mServiceType; } getCameraId()110 String getCameraId() { return mCameraId; } setCameraId(String cameraId)111 void setCameraId(String cameraId) { mCameraId = cameraId; } getActivityComponentName()112 ComponentName getActivityComponentName() { return mActivityName; } 113 114 @Override toString()115 public String toString() { 116 return "Parameter serviceType=" + CarEvsUtils.convertToString(mServiceType) + 117 ", cameraId=" + mCameraId + ", activityName=" + mActivityName; 118 } 119 } 120 parse(String rawString)121 static Parameters parse(String rawString) { 122 @CarEvsServiceType int serviceType = INVALID_SERVICE_TYPE; 123 String activityName = null; 124 String cameraId = INVALID_CAMERA_ID; 125 126 // Example a service configuration string: 127 // <item>serviceType=REARVIEW,cameraId=/dev/video0, 128 // activityName=com.android.car/com.google.android.car.evs.CarEvsCameraPreviewActivity 129 // </item> 130 // <item>serviceType=FRONTVIEW,cameraId=/dev/video1</item> 131 String[] tokens = rawString.split(","); 132 for (String token : tokens) { 133 String[] keyValuePair = token.split("="); 134 if (keyValuePair.length != 2) { 135 Slogf.w(TAG, "Skip a key-value pair in incorrect format, " + token); 136 continue; 137 } 138 139 switch (keyValuePair[0]) { 140 case "serviceType": 141 serviceType = CarEvsUtils.convertToServiceType(keyValuePair[1]); 142 break; 143 144 case "cameraId": 145 cameraId = keyValuePair[1]; 146 break; 147 148 case "activityName": 149 activityName = keyValuePair[1]; 150 break; 151 152 default: 153 Slogf.e(TAG, "Unknown parameter: " + token); 154 break; 155 } 156 } 157 158 return Parameters.create(serviceType, cameraId, activityName); 159 } 160 } 161