xref: /aosp_15_r20/frameworks/native/services/inputflinger/tests/FakeEventHub.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright 2022 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #pragma once
18*38e8c45fSAndroid Build Coastguard Worker 
19*38e8c45fSAndroid Build Coastguard Worker #include <condition_variable>
20*38e8c45fSAndroid Build Coastguard Worker #include <mutex>
21*38e8c45fSAndroid Build Coastguard Worker #include <optional>
22*38e8c45fSAndroid Build Coastguard Worker #include <unordered_map>
23*38e8c45fSAndroid Build Coastguard Worker #include <vector>
24*38e8c45fSAndroid Build Coastguard Worker 
25*38e8c45fSAndroid Build Coastguard Worker #include <EventHub.h>
26*38e8c45fSAndroid Build Coastguard Worker #include <InputDevice.h>
27*38e8c45fSAndroid Build Coastguard Worker #include <ftl/flags.h>
28*38e8c45fSAndroid Build Coastguard Worker #include <input/PropertyMap.h>
29*38e8c45fSAndroid Build Coastguard Worker #include <input/VirtualKeyMap.h>
30*38e8c45fSAndroid Build Coastguard Worker #include <utils/Errors.h>
31*38e8c45fSAndroid Build Coastguard Worker #include <utils/KeyedVector.h>
32*38e8c45fSAndroid Build Coastguard Worker 
33*38e8c45fSAndroid Build Coastguard Worker namespace android {
34*38e8c45fSAndroid Build Coastguard Worker 
35*38e8c45fSAndroid Build Coastguard Worker class FakeEventHub : public EventHubInterface {
36*38e8c45fSAndroid Build Coastguard Worker     struct KeyInfo {
37*38e8c45fSAndroid Build Coastguard Worker         int32_t keyCode;
38*38e8c45fSAndroid Build Coastguard Worker         uint32_t flags;
39*38e8c45fSAndroid Build Coastguard Worker     };
40*38e8c45fSAndroid Build Coastguard Worker 
41*38e8c45fSAndroid Build Coastguard Worker     struct SensorInfo {
42*38e8c45fSAndroid Build Coastguard Worker         InputDeviceSensorType sensorType;
43*38e8c45fSAndroid Build Coastguard Worker         int32_t sensorDataIndex;
44*38e8c45fSAndroid Build Coastguard Worker     };
45*38e8c45fSAndroid Build Coastguard Worker 
46*38e8c45fSAndroid Build Coastguard Worker     struct Device {
47*38e8c45fSAndroid Build Coastguard Worker         InputDeviceIdentifier identifier;
48*38e8c45fSAndroid Build Coastguard Worker         ftl::Flags<InputDeviceClass> classes;
49*38e8c45fSAndroid Build Coastguard Worker         PropertyMap configuration;
50*38e8c45fSAndroid Build Coastguard Worker         KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes;
51*38e8c45fSAndroid Build Coastguard Worker         KeyedVector<int, bool> relativeAxes;
52*38e8c45fSAndroid Build Coastguard Worker         KeyedVector<int32_t, int32_t> keyCodeStates;
53*38e8c45fSAndroid Build Coastguard Worker         KeyedVector<int32_t, int32_t> scanCodeStates;
54*38e8c45fSAndroid Build Coastguard Worker         KeyedVector<int32_t, int32_t> switchStates;
55*38e8c45fSAndroid Build Coastguard Worker         KeyedVector<int32_t, int32_t> absoluteAxisValue;
56*38e8c45fSAndroid Build Coastguard Worker         KeyedVector<int32_t, KeyInfo> keysByScanCode;
57*38e8c45fSAndroid Build Coastguard Worker         KeyedVector<int32_t, KeyInfo> keysByUsageCode;
58*38e8c45fSAndroid Build Coastguard Worker         std::map<int32_t, int32_t> keyRemapping;
59*38e8c45fSAndroid Build Coastguard Worker         KeyedVector<int32_t, bool> leds;
60*38e8c45fSAndroid Build Coastguard Worker         // fake mapping which would normally come from keyCharacterMap
61*38e8c45fSAndroid Build Coastguard Worker         std::unordered_map<int32_t, int32_t> keyCodeMapping;
62*38e8c45fSAndroid Build Coastguard Worker         std::unordered_map<int32_t, SensorInfo> sensorsByAbsCode;
63*38e8c45fSAndroid Build Coastguard Worker         BitArray<MSC_MAX> mscBitmask;
64*38e8c45fSAndroid Build Coastguard Worker         std::vector<VirtualKeyDefinition> virtualKeys;
65*38e8c45fSAndroid Build Coastguard Worker         bool enabled;
66*38e8c45fSAndroid Build Coastguard Worker         std::optional<RawLayoutInfo> layoutInfo;
67*38e8c45fSAndroid Build Coastguard Worker         std::string sysfsRootPath;
68*38e8c45fSAndroid Build Coastguard Worker         std::unordered_map<int32_t, std::vector<int32_t>> mtSlotValues;
69*38e8c45fSAndroid Build Coastguard Worker 
enableDevice70*38e8c45fSAndroid Build Coastguard Worker         status_t enable() {
71*38e8c45fSAndroid Build Coastguard Worker             enabled = true;
72*38e8c45fSAndroid Build Coastguard Worker             return OK;
73*38e8c45fSAndroid Build Coastguard Worker         }
74*38e8c45fSAndroid Build Coastguard Worker 
disableDevice75*38e8c45fSAndroid Build Coastguard Worker         status_t disable() {
76*38e8c45fSAndroid Build Coastguard Worker             enabled = false;
77*38e8c45fSAndroid Build Coastguard Worker             return OK;
78*38e8c45fSAndroid Build Coastguard Worker         }
79*38e8c45fSAndroid Build Coastguard Worker 
DeviceDevice80*38e8c45fSAndroid Build Coastguard Worker         explicit Device(ftl::Flags<InputDeviceClass> classes) : classes(classes), enabled(true) {}
81*38e8c45fSAndroid Build Coastguard Worker     };
82*38e8c45fSAndroid Build Coastguard Worker 
83*38e8c45fSAndroid Build Coastguard Worker     std::mutex mLock;
84*38e8c45fSAndroid Build Coastguard Worker     std::condition_variable mEventsCondition;
85*38e8c45fSAndroid Build Coastguard Worker 
86*38e8c45fSAndroid Build Coastguard Worker     KeyedVector<int32_t, Device*> mDevices;
87*38e8c45fSAndroid Build Coastguard Worker     std::vector<std::string> mExcludedDevices;
88*38e8c45fSAndroid Build Coastguard Worker     std::vector<RawEvent> mEvents GUARDED_BY(mLock);
89*38e8c45fSAndroid Build Coastguard Worker     std::unordered_map<int32_t /*deviceId*/, std::vector<TouchVideoFrame>> mVideoFrames;
90*38e8c45fSAndroid Build Coastguard Worker     std::vector<int32_t> mVibrators = {0, 1};
91*38e8c45fSAndroid Build Coastguard Worker     std::unordered_map<int32_t, RawLightInfo> mRawLightInfos;
92*38e8c45fSAndroid Build Coastguard Worker     // Simulates a device light brightness, from light id to light brightness.
93*38e8c45fSAndroid Build Coastguard Worker     std::unordered_map<int32_t /* lightId */, int32_t /* brightness*/> mLightBrightness;
94*38e8c45fSAndroid Build Coastguard Worker     // Simulates a device light intensities, from light id to light intensities map.
95*38e8c45fSAndroid Build Coastguard Worker     std::unordered_map<int32_t /* lightId */, std::unordered_map<LightColor, int32_t>>
96*38e8c45fSAndroid Build Coastguard Worker             mLightIntensities;
97*38e8c45fSAndroid Build Coastguard Worker     // fake sysfs node path and value.
98*38e8c45fSAndroid Build Coastguard Worker     std::unordered_map<int32_t /*deviceId*/, bool /* wakeupNode*/> mKernelWakeup;
99*38e8c45fSAndroid Build Coastguard Worker 
100*38e8c45fSAndroid Build Coastguard Worker public:
101*38e8c45fSAndroid Build Coastguard Worker     static constexpr int32_t DEFAULT_BATTERY = 1;
102*38e8c45fSAndroid Build Coastguard Worker     static constexpr int32_t BATTERY_STATUS = 4;
103*38e8c45fSAndroid Build Coastguard Worker     static constexpr int32_t BATTERY_CAPACITY = 66;
104*38e8c45fSAndroid Build Coastguard Worker     static const std::string BATTERY_DEVPATH;
105*38e8c45fSAndroid Build Coastguard Worker 
106*38e8c45fSAndroid Build Coastguard Worker     virtual ~FakeEventHub();
FakeEventHub()107*38e8c45fSAndroid Build Coastguard Worker     FakeEventHub() {}
108*38e8c45fSAndroid Build Coastguard Worker 
109*38e8c45fSAndroid Build Coastguard Worker     void addDevice(int32_t deviceId, const std::string& name, ftl::Flags<InputDeviceClass> classes,
110*38e8c45fSAndroid Build Coastguard Worker                    int bus = 0);
111*38e8c45fSAndroid Build Coastguard Worker     void removeDevice(int32_t deviceId);
112*38e8c45fSAndroid Build Coastguard Worker 
113*38e8c45fSAndroid Build Coastguard Worker     bool isDeviceEnabled(int32_t deviceId) const override;
114*38e8c45fSAndroid Build Coastguard Worker     status_t enableDevice(int32_t deviceId) override;
115*38e8c45fSAndroid Build Coastguard Worker     status_t disableDevice(int32_t deviceId) override;
116*38e8c45fSAndroid Build Coastguard Worker 
117*38e8c45fSAndroid Build Coastguard Worker     void addConfigurationProperty(int32_t deviceId, const char* key, const char* value);
118*38e8c45fSAndroid Build Coastguard Worker     void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration);
119*38e8c45fSAndroid Build Coastguard Worker 
120*38e8c45fSAndroid Build Coastguard Worker     void addAbsoluteAxis(int32_t deviceId, int axis, int32_t minValue, int32_t maxValue, int flat,
121*38e8c45fSAndroid Build Coastguard Worker                          int fuzz, int resolution = 0);
122*38e8c45fSAndroid Build Coastguard Worker     void addRelativeAxis(int32_t deviceId, int32_t axis);
123*38e8c45fSAndroid Build Coastguard Worker     void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value);
124*38e8c45fSAndroid Build Coastguard Worker 
125*38e8c45fSAndroid Build Coastguard Worker     void setRawLayoutInfo(int32_t deviceId, RawLayoutInfo info);
126*38e8c45fSAndroid Build Coastguard Worker 
127*38e8c45fSAndroid Build Coastguard Worker     void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state);
128*38e8c45fSAndroid Build Coastguard Worker     void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state);
129*38e8c45fSAndroid Build Coastguard Worker     void setSwitchState(int32_t deviceId, int32_t switchCode, int32_t state);
130*38e8c45fSAndroid Build Coastguard Worker 
131*38e8c45fSAndroid Build Coastguard Worker     void addKey(int32_t deviceId, int32_t scanCode, int32_t usageCode, int32_t keyCode,
132*38e8c45fSAndroid Build Coastguard Worker                 uint32_t flags);
133*38e8c45fSAndroid Build Coastguard Worker     void addKeyCodeMapping(int32_t deviceId, int32_t fromKeyCode, int32_t toKeyCode);
134*38e8c45fSAndroid Build Coastguard Worker     void setKeyRemapping(int32_t deviceId, const std::map<int32_t, int32_t>& keyRemapping) const;
135*38e8c45fSAndroid Build Coastguard Worker     void addVirtualKeyDefinition(int32_t deviceId, const VirtualKeyDefinition& definition);
136*38e8c45fSAndroid Build Coastguard Worker 
137*38e8c45fSAndroid Build Coastguard Worker     void addSensorAxis(int32_t deviceId, int32_t absCode, InputDeviceSensorType sensorType,
138*38e8c45fSAndroid Build Coastguard Worker                        int32_t sensorDataIndex);
139*38e8c45fSAndroid Build Coastguard Worker 
140*38e8c45fSAndroid Build Coastguard Worker     void setMscEvent(int32_t deviceId, int32_t mscEvent);
141*38e8c45fSAndroid Build Coastguard Worker 
142*38e8c45fSAndroid Build Coastguard Worker     void addLed(int32_t deviceId, int32_t led, bool initialState);
143*38e8c45fSAndroid Build Coastguard Worker     void addRawLightInfo(int32_t rawId, RawLightInfo&& info);
144*38e8c45fSAndroid Build Coastguard Worker     void fakeLightBrightness(int32_t rawId, int32_t brightness);
145*38e8c45fSAndroid Build Coastguard Worker     void fakeLightIntensities(int32_t rawId,
146*38e8c45fSAndroid Build Coastguard Worker                               const std::unordered_map<LightColor, int32_t> intensities);
147*38e8c45fSAndroid Build Coastguard Worker     bool getLedState(int32_t deviceId, int32_t led);
148*38e8c45fSAndroid Build Coastguard Worker 
149*38e8c45fSAndroid Build Coastguard Worker     std::vector<std::string>& getExcludedDevices();
150*38e8c45fSAndroid Build Coastguard Worker 
151*38e8c45fSAndroid Build Coastguard Worker     void setVideoFrames(
152*38e8c45fSAndroid Build Coastguard Worker             std::unordered_map<int32_t /*deviceId*/, std::vector<TouchVideoFrame>> videoFrames);
153*38e8c45fSAndroid Build Coastguard Worker 
154*38e8c45fSAndroid Build Coastguard Worker     void enqueueEvent(nsecs_t when, nsecs_t readTime, int32_t deviceId, int32_t type, int32_t code,
155*38e8c45fSAndroid Build Coastguard Worker                       int32_t value);
156*38e8c45fSAndroid Build Coastguard Worker     void assertQueueIsEmpty();
157*38e8c45fSAndroid Build Coastguard Worker     void setSysfsRootPath(int32_t deviceId, std::string sysfsRootPath) const;
158*38e8c45fSAndroid Build Coastguard Worker     // Populate fake slot values to be returned by the getter, size of the values should be equal to
159*38e8c45fSAndroid Build Coastguard Worker     // the slot count
160*38e8c45fSAndroid Build Coastguard Worker     void setMtSlotValues(int32_t deviceId, int32_t axis, const std::vector<int32_t>& values);
161*38e8c45fSAndroid Build Coastguard Worker     base::Result<std::vector<int32_t>> getMtSlotValues(int32_t deviceId, int32_t axis,
162*38e8c45fSAndroid Build Coastguard Worker                                                        size_t slotCount) const override;
163*38e8c45fSAndroid Build Coastguard Worker     bool setKernelWakeEnabled(int32_t deviceId, bool enabled) override;
164*38e8c45fSAndroid Build Coastguard Worker     bool fakeReadKernelWakeup(int32_t deviceId) const;
165*38e8c45fSAndroid Build Coastguard Worker 
166*38e8c45fSAndroid Build Coastguard Worker private:
167*38e8c45fSAndroid Build Coastguard Worker     Device* getDevice(int32_t deviceId) const;
168*38e8c45fSAndroid Build Coastguard Worker 
169*38e8c45fSAndroid Build Coastguard Worker     ftl::Flags<InputDeviceClass> getDeviceClasses(int32_t deviceId) const override;
170*38e8c45fSAndroid Build Coastguard Worker     InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const override;
171*38e8c45fSAndroid Build Coastguard Worker     int32_t getDeviceControllerNumber(int32_t) const override;
172*38e8c45fSAndroid Build Coastguard Worker     std::optional<PropertyMap> getConfiguration(int32_t deviceId) const override;
173*38e8c45fSAndroid Build Coastguard Worker     std::optional<RawAbsoluteAxisInfo> getAbsoluteAxisInfo(int32_t deviceId,
174*38e8c45fSAndroid Build Coastguard Worker                                                            int axis) const override;
175*38e8c45fSAndroid Build Coastguard Worker     bool hasRelativeAxis(int32_t deviceId, int axis) const override;
176*38e8c45fSAndroid Build Coastguard Worker     bool hasInputProperty(int32_t, int) const override;
177*38e8c45fSAndroid Build Coastguard Worker     bool hasMscEvent(int32_t deviceId, int mscEvent) const override final;
178*38e8c45fSAndroid Build Coastguard Worker     status_t mapKey(int32_t deviceId, int32_t scanCode, int32_t usageCode, int32_t metaState,
179*38e8c45fSAndroid Build Coastguard Worker                     int32_t* outKeycode, int32_t* outMetaState, uint32_t* outFlags) const override;
180*38e8c45fSAndroid Build Coastguard Worker     const KeyInfo* getKey(Device* device, int32_t scanCode, int32_t usageCode) const;
181*38e8c45fSAndroid Build Coastguard Worker 
182*38e8c45fSAndroid Build Coastguard Worker     status_t mapAxis(int32_t, int32_t, AxisInfo*) const override;
183*38e8c45fSAndroid Build Coastguard Worker     base::Result<std::pair<InputDeviceSensorType, int32_t>> mapSensor(
184*38e8c45fSAndroid Build Coastguard Worker             int32_t deviceId, int32_t absCode) const override;
185*38e8c45fSAndroid Build Coastguard Worker     void setExcludedDevices(const std::vector<std::string>& devices) override;
186*38e8c45fSAndroid Build Coastguard Worker     std::vector<RawEvent> getEvents(int) override;
187*38e8c45fSAndroid Build Coastguard Worker     std::vector<TouchVideoFrame> getVideoFrames(int32_t deviceId) override;
188*38e8c45fSAndroid Build Coastguard Worker     int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const override;
189*38e8c45fSAndroid Build Coastguard Worker     std::optional<RawLayoutInfo> getRawLayoutInfo(int32_t deviceId) const override;
190*38e8c45fSAndroid Build Coastguard Worker     int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const override;
191*38e8c45fSAndroid Build Coastguard Worker     int32_t getSwitchState(int32_t deviceId, int32_t sw) const override;
192*38e8c45fSAndroid Build Coastguard Worker     std::optional<int32_t> getAbsoluteAxisValue(int32_t deviceId, int32_t axis) const override;
193*38e8c45fSAndroid Build Coastguard Worker     int32_t getKeyCodeForKeyLocation(int32_t deviceId, int32_t locationKeyCode) const override;
194*38e8c45fSAndroid Build Coastguard Worker 
195*38e8c45fSAndroid Build Coastguard Worker     // Return true if the device has non-empty key layout.
196*38e8c45fSAndroid Build Coastguard Worker     bool markSupportedKeyCodes(int32_t deviceId, const std::vector<int32_t>& keyCodes,
197*38e8c45fSAndroid Build Coastguard Worker                                uint8_t* outFlags) const override;
198*38e8c45fSAndroid Build Coastguard Worker     bool hasScanCode(int32_t deviceId, int32_t scanCode) const override;
199*38e8c45fSAndroid Build Coastguard Worker     bool hasKeyCode(int32_t deviceId, int32_t keyCode) const override;
200*38e8c45fSAndroid Build Coastguard Worker     bool hasLed(int32_t deviceId, int32_t led) const override;
201*38e8c45fSAndroid Build Coastguard Worker     void setLedState(int32_t deviceId, int32_t led, bool on) override;
202*38e8c45fSAndroid Build Coastguard Worker     void getVirtualKeyDefinitions(int32_t deviceId,
203*38e8c45fSAndroid Build Coastguard Worker                                   std::vector<VirtualKeyDefinition>& outVirtualKeys) const override;
204*38e8c45fSAndroid Build Coastguard Worker     const std::shared_ptr<KeyCharacterMap> getKeyCharacterMap(int32_t) const override;
205*38e8c45fSAndroid Build Coastguard Worker     bool setKeyboardLayoutOverlay(int32_t, std::shared_ptr<KeyCharacterMap>) override;
206*38e8c45fSAndroid Build Coastguard Worker 
vibrate(int32_t,const VibrationElement &)207*38e8c45fSAndroid Build Coastguard Worker     void vibrate(int32_t, const VibrationElement&) override {}
cancelVibrate(int32_t)208*38e8c45fSAndroid Build Coastguard Worker     void cancelVibrate(int32_t) override {}
209*38e8c45fSAndroid Build Coastguard Worker     std::vector<int32_t> getVibratorIds(int32_t deviceId) const override;
210*38e8c45fSAndroid Build Coastguard Worker 
211*38e8c45fSAndroid Build Coastguard Worker     std::optional<int32_t> getBatteryCapacity(int32_t, int32_t) const override;
212*38e8c45fSAndroid Build Coastguard Worker     std::optional<int32_t> getBatteryStatus(int32_t, int32_t) const override;
213*38e8c45fSAndroid Build Coastguard Worker     std::vector<int32_t> getRawBatteryIds(int32_t deviceId) const override;
214*38e8c45fSAndroid Build Coastguard Worker     std::optional<RawBatteryInfo> getRawBatteryInfo(int32_t deviceId,
215*38e8c45fSAndroid Build Coastguard Worker                                                     int32_t batteryId) const override;
216*38e8c45fSAndroid Build Coastguard Worker 
217*38e8c45fSAndroid Build Coastguard Worker     std::vector<int32_t> getRawLightIds(int32_t deviceId) const override;
218*38e8c45fSAndroid Build Coastguard Worker     std::optional<RawLightInfo> getRawLightInfo(int32_t deviceId, int32_t lightId) const override;
219*38e8c45fSAndroid Build Coastguard Worker     void setLightBrightness(int32_t deviceId, int32_t lightId, int32_t brightness) override;
220*38e8c45fSAndroid Build Coastguard Worker     void setLightIntensities(int32_t deviceId, int32_t lightId,
221*38e8c45fSAndroid Build Coastguard Worker                              std::unordered_map<LightColor, int32_t> intensities) override;
222*38e8c45fSAndroid Build Coastguard Worker     std::optional<int32_t> getLightBrightness(int32_t deviceId, int32_t lightId) const override;
223*38e8c45fSAndroid Build Coastguard Worker     std::optional<std::unordered_map<LightColor, int32_t>> getLightIntensities(
224*38e8c45fSAndroid Build Coastguard Worker             int32_t deviceId, int32_t lightId) const override;
225*38e8c45fSAndroid Build Coastguard Worker     void sysfsNodeChanged(const std::string& sysfsNodePath) override;
dump(std::string &)226*38e8c45fSAndroid Build Coastguard Worker     void dump(std::string&) const override {}
monitor()227*38e8c45fSAndroid Build Coastguard Worker     void monitor() const override {}
requestReopenDevices()228*38e8c45fSAndroid Build Coastguard Worker     void requestReopenDevices() override {}
wake()229*38e8c45fSAndroid Build Coastguard Worker     void wake() override {}
230*38e8c45fSAndroid Build Coastguard Worker };
231*38e8c45fSAndroid Build Coastguard Worker 
232*38e8c45fSAndroid Build Coastguard Worker } // namespace android
233