• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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