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 import static com.android.car.internal.ExcludeFromCodeCoverageGeneratedReport.DUMP_INFO; 28 29 import android.annotation.SystemApi; 30 import android.content.ComponentName; 31 import android.car.builtin.util.Slogf; 32 import android.car.evs.CarEvsManager; 33 import android.car.evs.CarEvsManager.CarEvsServiceType; 34 import android.car.evs.CarEvsManager.CarEvsStreamEvent; 35 36 import com.android.car.internal.ExcludeFromCodeCoverageGeneratedReport; 37 import com.android.car.internal.evs.CarEvsUtils; 38 39 /** 40 * Utility class for CarEvsService 41 * 42 * @hide 43 */ 44 @SystemApi 45 public final class CarEvsServiceUtils { 46 private static final String TAG = CarEvsServiceUtils.class.getSimpleName(); 47 48 private static final int INVALID_SERVICE_TYPE = -1; 49 50 private static String INVALID_CAMERA_ID = ""; 51 CarEvsServiceUtils()52 private CarEvsServiceUtils() {} 53 54 /** 55 * Converts EvsEvent to CarEvsManager.CarEvsStreamEvent. 56 * 57 * See the definition of EvsEventType in hardware/interfaces/automotive/evs/1.1/types.hal 58 */ convertToStreamEvent(int inputEvent)59 static @CarEvsStreamEvent int convertToStreamEvent(int inputEvent) { 60 @CarEvsStreamEvent int outputStatus = CarEvsManager.STREAM_EVENT_NONE; 61 62 switch (inputEvent) { 63 case 0: // EvsEventType.STREAM_STARTED 64 outputStatus = CarEvsManager.STREAM_EVENT_STREAM_STARTED; 65 break; 66 case 1: // EvsEventType.STREAM_STOPPED 67 outputStatus = CarEvsManager.STREAM_EVENT_STREAM_STOPPED; 68 break; 69 case 2: // EvsEventType.FRAME_DROPPED 70 outputStatus = CarEvsManager.STREAM_EVENT_FRAME_DROPPED; 71 break; 72 case 3: // EvsEventType.TIMEOUT 73 outputStatus = CarEvsManager.STREAM_EVENT_TIMEOUT; 74 break; 75 case 4: // EvsEventType.PARAMETER_CHANGED 76 outputStatus = CarEvsManager.STREAM_EVENT_PARAMETER_CHANGED; 77 break; 78 case 5: // EvsEventType.MASTER_RELEASED 79 outputStatus = CarEvsManager.STREAM_EVENT_PRIMARY_OWNER_CHANGED; 80 break; 81 case 6: // EvsEventType.STREAM_ERROR 82 outputStatus = CarEvsManager.STREAM_EVENT_OTHER_ERRORS; 83 break; 84 default: 85 Slogf.w(TAG, "Invalid event type: " + inputEvent); 86 break; 87 } 88 89 return outputStatus; 90 } 91 92 final static class Parameters { 93 private final @CarEvsServiceType int mServiceType; 94 private final ComponentName mActivityName; 95 private String mCameraId; 96 Parameters(int type, String cameraId, String activityName)97 private Parameters(int type, String cameraId, String activityName) { 98 mServiceType = type; 99 mCameraId = cameraId; 100 if (activityName != null && !activityName.isEmpty()) { 101 mActivityName = ComponentName.unflattenFromString(activityName); 102 } else { 103 mActivityName = null; 104 } 105 } 106 create(int type, String cameraId, String activityName)107 static Parameters create(int type, String cameraId, String activityName) { 108 return new Parameters(type, cameraId, activityName); 109 } 110 getType()111 @CarEvsServiceType int getType() { return mServiceType; } getCameraId()112 String getCameraId() { return mCameraId; } getActivityComponentName()113 ComponentName getActivityComponentName() { return mActivityName; } 114 115 @Override 116 @ExcludeFromCodeCoverageGeneratedReport(reason = DUMP_INFO) toString()117 public String toString() { 118 return "Parameter serviceType=" + CarEvsUtils.convertToString(mServiceType) + 119 ", cameraId=" + mCameraId + ", activityName=" + mActivityName; 120 } 121 } 122 parse(String rawString)123 static Parameters parse(String rawString) { 124 @CarEvsServiceType int serviceType = INVALID_SERVICE_TYPE; 125 String activityName = null; 126 String cameraId = INVALID_CAMERA_ID; 127 128 // Example a service configuration string: 129 // <item>serviceType=REARVIEW,cameraId=/dev/video0, 130 // activityName=com.android.car/com.google.android.car.evs.CarEvsCameraPreviewActivity 131 // </item> 132 // <item>serviceType=FRONTVIEW,cameraId=/dev/video1</item> 133 String[] tokens = rawString.split(","); 134 for (String token : tokens) { 135 String[] keyValuePair = token.split("="); 136 if (keyValuePair.length != 2) { 137 Slogf.w(TAG, "Skip a key-value pair in incorrect format, " + token); 138 continue; 139 } 140 141 switch (keyValuePair[0]) { 142 case "serviceType": 143 serviceType = CarEvsUtils.convertToServiceType(keyValuePair[1]); 144 break; 145 146 case "cameraId": 147 cameraId = keyValuePair[1]; 148 break; 149 150 case "activityName": 151 activityName = keyValuePair[1]; 152 break; 153 154 default: 155 Slogf.e(TAG, "Unknown parameter: " + token); 156 break; 157 } 158 } 159 160 return Parameters.create(serviceType, cameraId, activityName); 161 } 162 } 163