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