1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2010 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef __IDRM_MANAGER_SERVICE_H__ 18*ec779b8eSAndroid Build Coastguard Worker #define __IDRM_MANAGER_SERVICE_H__ 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <utils/RefBase.h> 21*ec779b8eSAndroid Build Coastguard Worker #include <binder/IInterface.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <binder/Parcel.h> 23*ec779b8eSAndroid Build Coastguard Worker #include <drm/drm_framework_common.h> 24*ec779b8eSAndroid Build Coastguard Worker #include "IDrmServiceListener.h" 25*ec779b8eSAndroid Build Coastguard Worker 26*ec779b8eSAndroid Build Coastguard Worker namespace android { 27*ec779b8eSAndroid Build Coastguard Worker 28*ec779b8eSAndroid Build Coastguard Worker class DrmConstraints; 29*ec779b8eSAndroid Build Coastguard Worker class DrmMetadata; 30*ec779b8eSAndroid Build Coastguard Worker class DrmRights; 31*ec779b8eSAndroid Build Coastguard Worker class DrmInfo; 32*ec779b8eSAndroid Build Coastguard Worker class DrmInfoStatus; 33*ec779b8eSAndroid Build Coastguard Worker class DrmInfoRequest; 34*ec779b8eSAndroid Build Coastguard Worker class DrmSupportInfo; 35*ec779b8eSAndroid Build Coastguard Worker class DrmConvertedStatus; 36*ec779b8eSAndroid Build Coastguard Worker class String8; 37*ec779b8eSAndroid Build Coastguard Worker class ActionDescription; 38*ec779b8eSAndroid Build Coastguard Worker 39*ec779b8eSAndroid Build Coastguard Worker /** 40*ec779b8eSAndroid Build Coastguard Worker * This is the interface class for DRM Manager service. 41*ec779b8eSAndroid Build Coastguard Worker * 42*ec779b8eSAndroid Build Coastguard Worker */ 43*ec779b8eSAndroid Build Coastguard Worker class IDrmManagerService : public IInterface 44*ec779b8eSAndroid Build Coastguard Worker { 45*ec779b8eSAndroid Build Coastguard Worker public: 46*ec779b8eSAndroid Build Coastguard Worker enum { 47*ec779b8eSAndroid Build Coastguard Worker ADD_UNIQUEID = IBinder::FIRST_CALL_TRANSACTION, 48*ec779b8eSAndroid Build Coastguard Worker REMOVE_UNIQUEID, 49*ec779b8eSAndroid Build Coastguard Worker ADD_CLIENT, 50*ec779b8eSAndroid Build Coastguard Worker REMOVE_CLIENT, 51*ec779b8eSAndroid Build Coastguard Worker SET_DRM_SERVICE_LISTENER, 52*ec779b8eSAndroid Build Coastguard Worker INSTALL_DRM_ENGINE, 53*ec779b8eSAndroid Build Coastguard Worker GET_CONSTRAINTS_FROM_CONTENT, 54*ec779b8eSAndroid Build Coastguard Worker GET_METADATA_FROM_CONTENT, 55*ec779b8eSAndroid Build Coastguard Worker CAN_HANDLE, 56*ec779b8eSAndroid Build Coastguard Worker PROCESS_DRM_INFO, 57*ec779b8eSAndroid Build Coastguard Worker ACQUIRE_DRM_INFO, 58*ec779b8eSAndroid Build Coastguard Worker SAVE_RIGHTS, 59*ec779b8eSAndroid Build Coastguard Worker GET_ORIGINAL_MIMETYPE, 60*ec779b8eSAndroid Build Coastguard Worker GET_DRM_OBJECT_TYPE, 61*ec779b8eSAndroid Build Coastguard Worker CHECK_RIGHTS_STATUS, 62*ec779b8eSAndroid Build Coastguard Worker CONSUME_RIGHTS, 63*ec779b8eSAndroid Build Coastguard Worker SET_PLAYBACK_STATUS, 64*ec779b8eSAndroid Build Coastguard Worker VALIDATE_ACTION, 65*ec779b8eSAndroid Build Coastguard Worker REMOVE_RIGHTS, 66*ec779b8eSAndroid Build Coastguard Worker REMOVE_ALL_RIGHTS, 67*ec779b8eSAndroid Build Coastguard Worker OPEN_CONVERT_SESSION, 68*ec779b8eSAndroid Build Coastguard Worker CONVERT_DATA, 69*ec779b8eSAndroid Build Coastguard Worker CLOSE_CONVERT_SESSION, 70*ec779b8eSAndroid Build Coastguard Worker GET_ALL_SUPPORT_INFO, 71*ec779b8eSAndroid Build Coastguard Worker OPEN_DECRYPT_SESSION, 72*ec779b8eSAndroid Build Coastguard Worker OPEN_DECRYPT_SESSION_FROM_URI, 73*ec779b8eSAndroid Build Coastguard Worker OPEN_DECRYPT_SESSION_FOR_STREAMING, 74*ec779b8eSAndroid Build Coastguard Worker CLOSE_DECRYPT_SESSION, 75*ec779b8eSAndroid Build Coastguard Worker INITIALIZE_DECRYPT_UNIT, 76*ec779b8eSAndroid Build Coastguard Worker DECRYPT, 77*ec779b8eSAndroid Build Coastguard Worker FINALIZE_DECRYPT_UNIT, 78*ec779b8eSAndroid Build Coastguard Worker PREAD 79*ec779b8eSAndroid Build Coastguard Worker }; 80*ec779b8eSAndroid Build Coastguard Worker 81*ec779b8eSAndroid Build Coastguard Worker public: 82*ec779b8eSAndroid Build Coastguard Worker DECLARE_META_INTERFACE(DrmManagerService); 83*ec779b8eSAndroid Build Coastguard Worker 84*ec779b8eSAndroid Build Coastguard Worker public: 85*ec779b8eSAndroid Build Coastguard Worker virtual int addUniqueId(bool isNative) = 0; 86*ec779b8eSAndroid Build Coastguard Worker 87*ec779b8eSAndroid Build Coastguard Worker virtual void removeUniqueId(int uniqueId) = 0; 88*ec779b8eSAndroid Build Coastguard Worker 89*ec779b8eSAndroid Build Coastguard Worker virtual void addClient(int uniqueId) = 0; 90*ec779b8eSAndroid Build Coastguard Worker 91*ec779b8eSAndroid Build Coastguard Worker virtual void removeClient(int uniqueId) = 0; 92*ec779b8eSAndroid Build Coastguard Worker 93*ec779b8eSAndroid Build Coastguard Worker virtual status_t setDrmServiceListener( 94*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const sp<IDrmServiceListener>& infoListener) = 0; 95*ec779b8eSAndroid Build Coastguard Worker 96*ec779b8eSAndroid Build Coastguard Worker virtual DrmConstraints* getConstraints( 97*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const String8* path, const int action) = 0; 98*ec779b8eSAndroid Build Coastguard Worker 99*ec779b8eSAndroid Build Coastguard Worker virtual DrmMetadata* getMetadata(int uniqueId, const String8* path) = 0; 100*ec779b8eSAndroid Build Coastguard Worker 101*ec779b8eSAndroid Build Coastguard Worker virtual bool canHandle(int uniqueId, const String8& path, const String8& mimeType) = 0; 102*ec779b8eSAndroid Build Coastguard Worker 103*ec779b8eSAndroid Build Coastguard Worker virtual DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo) = 0; 104*ec779b8eSAndroid Build Coastguard Worker 105*ec779b8eSAndroid Build Coastguard Worker virtual DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) = 0; 106*ec779b8eSAndroid Build Coastguard Worker 107*ec779b8eSAndroid Build Coastguard Worker virtual status_t saveRights(int uniqueId, const DrmRights& drmRights, 108*ec779b8eSAndroid Build Coastguard Worker const String8& rightsPath, const String8& contentPath) = 0; 109*ec779b8eSAndroid Build Coastguard Worker 110*ec779b8eSAndroid Build Coastguard Worker virtual String8 getOriginalMimeType(int uniqueId, const String8& path, int fd) = 0; 111*ec779b8eSAndroid Build Coastguard Worker 112*ec779b8eSAndroid Build Coastguard Worker virtual int getDrmObjectType( 113*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const String8& path, const String8& mimeType) = 0; 114*ec779b8eSAndroid Build Coastguard Worker 115*ec779b8eSAndroid Build Coastguard Worker virtual int checkRightsStatus(int uniqueId, const String8& path, int action) = 0; 116*ec779b8eSAndroid Build Coastguard Worker 117*ec779b8eSAndroid Build Coastguard Worker virtual status_t consumeRights( 118*ec779b8eSAndroid Build Coastguard Worker int uniqueId, sp<DecryptHandle>& decryptHandle, int action, bool reserve) = 0; 119*ec779b8eSAndroid Build Coastguard Worker 120*ec779b8eSAndroid Build Coastguard Worker virtual status_t setPlaybackStatus( 121*ec779b8eSAndroid Build Coastguard Worker int uniqueId, sp<DecryptHandle>& decryptHandle, int playbackStatus, 122*ec779b8eSAndroid Build Coastguard Worker int64_t position) = 0; 123*ec779b8eSAndroid Build Coastguard Worker 124*ec779b8eSAndroid Build Coastguard Worker virtual bool validateAction( 125*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const String8& path, 126*ec779b8eSAndroid Build Coastguard Worker int action, const ActionDescription& description) = 0; 127*ec779b8eSAndroid Build Coastguard Worker 128*ec779b8eSAndroid Build Coastguard Worker virtual status_t removeRights(int uniqueId, const String8& path) = 0; 129*ec779b8eSAndroid Build Coastguard Worker 130*ec779b8eSAndroid Build Coastguard Worker virtual status_t removeAllRights(int uniqueId) = 0; 131*ec779b8eSAndroid Build Coastguard Worker 132*ec779b8eSAndroid Build Coastguard Worker virtual int openConvertSession(int uniqueId, const String8& mimeType) = 0; 133*ec779b8eSAndroid Build Coastguard Worker 134*ec779b8eSAndroid Build Coastguard Worker virtual DrmConvertedStatus* convertData( 135*ec779b8eSAndroid Build Coastguard Worker int uniqueId, int convertId, const DrmBuffer* inputData) = 0; 136*ec779b8eSAndroid Build Coastguard Worker 137*ec779b8eSAndroid Build Coastguard Worker virtual DrmConvertedStatus* closeConvertSession(int uniqueId, int convertId) = 0; 138*ec779b8eSAndroid Build Coastguard Worker 139*ec779b8eSAndroid Build Coastguard Worker virtual status_t getAllSupportInfo( 140*ec779b8eSAndroid Build Coastguard Worker int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) = 0; 141*ec779b8eSAndroid Build Coastguard Worker 142*ec779b8eSAndroid Build Coastguard Worker virtual sp<DecryptHandle> openDecryptSession( 143*ec779b8eSAndroid Build Coastguard Worker int uniqueId, int fd, off64_t offset, 144*ec779b8eSAndroid Build Coastguard Worker off64_t length, const char* mime) = 0; 145*ec779b8eSAndroid Build Coastguard Worker 146*ec779b8eSAndroid Build Coastguard Worker virtual sp<DecryptHandle> openDecryptSession( 147*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const char* uri, const char* mime) = 0; 148*ec779b8eSAndroid Build Coastguard Worker 149*ec779b8eSAndroid Build Coastguard Worker virtual sp<DecryptHandle> openDecryptSession( 150*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const DrmBuffer& buf, const String8& mimeType) = 0; 151*ec779b8eSAndroid Build Coastguard Worker 152*ec779b8eSAndroid Build Coastguard Worker virtual status_t closeDecryptSession(int uniqueId, sp<DecryptHandle>& decryptHandle) = 0; 153*ec779b8eSAndroid Build Coastguard Worker 154*ec779b8eSAndroid Build Coastguard Worker virtual status_t initializeDecryptUnit(int uniqueId, sp<DecryptHandle>& decryptHandle, 155*ec779b8eSAndroid Build Coastguard Worker int decryptUnitId, const DrmBuffer* headerInfo) = 0; 156*ec779b8eSAndroid Build Coastguard Worker 157*ec779b8eSAndroid Build Coastguard Worker virtual status_t decrypt(int uniqueId, sp<DecryptHandle>& decryptHandle, int decryptUnitId, 158*ec779b8eSAndroid Build Coastguard Worker const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) = 0; 159*ec779b8eSAndroid Build Coastguard Worker 160*ec779b8eSAndroid Build Coastguard Worker virtual status_t finalizeDecryptUnit( 161*ec779b8eSAndroid Build Coastguard Worker int uniqueId, sp<DecryptHandle>& decryptHandle, int decryptUnitId) = 0; 162*ec779b8eSAndroid Build Coastguard Worker 163*ec779b8eSAndroid Build Coastguard Worker virtual ssize_t pread(int uniqueId, sp<DecryptHandle>& decryptHandle, 164*ec779b8eSAndroid Build Coastguard Worker void* buffer, ssize_t numBytes,off64_t offset) = 0; 165*ec779b8eSAndroid Build Coastguard Worker }; 166*ec779b8eSAndroid Build Coastguard Worker 167*ec779b8eSAndroid Build Coastguard Worker /** 168*ec779b8eSAndroid Build Coastguard Worker * This is the Binder implementation class for DRM Manager service. 169*ec779b8eSAndroid Build Coastguard Worker */ 170*ec779b8eSAndroid Build Coastguard Worker class BpDrmManagerService: public BpInterface<IDrmManagerService> 171*ec779b8eSAndroid Build Coastguard Worker { 172*ec779b8eSAndroid Build Coastguard Worker public: BpDrmManagerService(const sp<IBinder> & impl)173*ec779b8eSAndroid Build Coastguard Worker explicit BpDrmManagerService(const sp<IBinder>& impl) 174*ec779b8eSAndroid Build Coastguard Worker : BpInterface<IDrmManagerService>(impl) {} 175*ec779b8eSAndroid Build Coastguard Worker 176*ec779b8eSAndroid Build Coastguard Worker virtual int addUniqueId(bool isNative); 177*ec779b8eSAndroid Build Coastguard Worker 178*ec779b8eSAndroid Build Coastguard Worker virtual void removeUniqueId(int uniqueId); 179*ec779b8eSAndroid Build Coastguard Worker 180*ec779b8eSAndroid Build Coastguard Worker virtual void addClient(int uniqueId); 181*ec779b8eSAndroid Build Coastguard Worker 182*ec779b8eSAndroid Build Coastguard Worker virtual void removeClient(int uniqueId); 183*ec779b8eSAndroid Build Coastguard Worker 184*ec779b8eSAndroid Build Coastguard Worker virtual status_t setDrmServiceListener( 185*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const sp<IDrmServiceListener>& infoListener); 186*ec779b8eSAndroid Build Coastguard Worker 187*ec779b8eSAndroid Build Coastguard Worker virtual DrmConstraints* getConstraints(int uniqueId, const String8* path, const int action); 188*ec779b8eSAndroid Build Coastguard Worker 189*ec779b8eSAndroid Build Coastguard Worker virtual DrmMetadata* getMetadata(int uniqueId, const String8* path); 190*ec779b8eSAndroid Build Coastguard Worker 191*ec779b8eSAndroid Build Coastguard Worker virtual bool canHandle(int uniqueId, const String8& path, const String8& mimeType); 192*ec779b8eSAndroid Build Coastguard Worker 193*ec779b8eSAndroid Build Coastguard Worker virtual DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo); 194*ec779b8eSAndroid Build Coastguard Worker 195*ec779b8eSAndroid Build Coastguard Worker virtual DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest); 196*ec779b8eSAndroid Build Coastguard Worker 197*ec779b8eSAndroid Build Coastguard Worker virtual status_t saveRights(int uniqueId, const DrmRights& drmRights, 198*ec779b8eSAndroid Build Coastguard Worker const String8& rightsPath, const String8& contentPath); 199*ec779b8eSAndroid Build Coastguard Worker 200*ec779b8eSAndroid Build Coastguard Worker virtual String8 getOriginalMimeType(int uniqueId, const String8& path, int fd); 201*ec779b8eSAndroid Build Coastguard Worker 202*ec779b8eSAndroid Build Coastguard Worker virtual int getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType); 203*ec779b8eSAndroid Build Coastguard Worker 204*ec779b8eSAndroid Build Coastguard Worker virtual int checkRightsStatus(int uniqueId, const String8& path, int action); 205*ec779b8eSAndroid Build Coastguard Worker 206*ec779b8eSAndroid Build Coastguard Worker virtual status_t consumeRights( 207*ec779b8eSAndroid Build Coastguard Worker int uniqueId, sp<DecryptHandle>& decryptHandle, int action, bool reserve); 208*ec779b8eSAndroid Build Coastguard Worker 209*ec779b8eSAndroid Build Coastguard Worker virtual status_t setPlaybackStatus( 210*ec779b8eSAndroid Build Coastguard Worker int uniqueId, sp<DecryptHandle>& decryptHandle, int playbackStatus, int64_t position); 211*ec779b8eSAndroid Build Coastguard Worker 212*ec779b8eSAndroid Build Coastguard Worker virtual bool validateAction( 213*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const String8& path, int action, const ActionDescription& description); 214*ec779b8eSAndroid Build Coastguard Worker 215*ec779b8eSAndroid Build Coastguard Worker virtual status_t removeRights(int uniqueId, const String8& path); 216*ec779b8eSAndroid Build Coastguard Worker 217*ec779b8eSAndroid Build Coastguard Worker virtual status_t removeAllRights(int uniqueId); 218*ec779b8eSAndroid Build Coastguard Worker 219*ec779b8eSAndroid Build Coastguard Worker virtual int openConvertSession(int uniqueId, const String8& mimeType); 220*ec779b8eSAndroid Build Coastguard Worker 221*ec779b8eSAndroid Build Coastguard Worker virtual DrmConvertedStatus* convertData( 222*ec779b8eSAndroid Build Coastguard Worker int uniqueId, int convertId, const DrmBuffer* inputData); 223*ec779b8eSAndroid Build Coastguard Worker 224*ec779b8eSAndroid Build Coastguard Worker virtual DrmConvertedStatus* closeConvertSession(int uniqueId, int convertId); 225*ec779b8eSAndroid Build Coastguard Worker 226*ec779b8eSAndroid Build Coastguard Worker virtual status_t getAllSupportInfo( 227*ec779b8eSAndroid Build Coastguard Worker int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray); 228*ec779b8eSAndroid Build Coastguard Worker 229*ec779b8eSAndroid Build Coastguard Worker virtual sp<DecryptHandle> openDecryptSession( 230*ec779b8eSAndroid Build Coastguard Worker int uniqueId, int fd, off64_t offset, off64_t length, 231*ec779b8eSAndroid Build Coastguard Worker const char* mime); 232*ec779b8eSAndroid Build Coastguard Worker 233*ec779b8eSAndroid Build Coastguard Worker virtual sp<DecryptHandle> openDecryptSession( 234*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const char* uri, const char* mime); 235*ec779b8eSAndroid Build Coastguard Worker 236*ec779b8eSAndroid Build Coastguard Worker virtual sp<DecryptHandle> openDecryptSession( 237*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const DrmBuffer& buf, const String8& mimeType); 238*ec779b8eSAndroid Build Coastguard Worker 239*ec779b8eSAndroid Build Coastguard Worker virtual status_t closeDecryptSession(int uniqueId, sp<DecryptHandle>& decryptHandle); 240*ec779b8eSAndroid Build Coastguard Worker 241*ec779b8eSAndroid Build Coastguard Worker virtual status_t initializeDecryptUnit(int uniqueId, sp<DecryptHandle>& decryptHandle, 242*ec779b8eSAndroid Build Coastguard Worker int decryptUnitId, const DrmBuffer* headerInfo); 243*ec779b8eSAndroid Build Coastguard Worker 244*ec779b8eSAndroid Build Coastguard Worker virtual status_t decrypt(int uniqueId, sp<DecryptHandle>& decryptHandle, int decryptUnitId, 245*ec779b8eSAndroid Build Coastguard Worker const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV); 246*ec779b8eSAndroid Build Coastguard Worker 247*ec779b8eSAndroid Build Coastguard Worker virtual status_t finalizeDecryptUnit( 248*ec779b8eSAndroid Build Coastguard Worker int uniqueId, sp<DecryptHandle>& decryptHandle, int decryptUnitId); 249*ec779b8eSAndroid Build Coastguard Worker 250*ec779b8eSAndroid Build Coastguard Worker virtual ssize_t pread(int uniqueId, sp<DecryptHandle>& decryptHandle, 251*ec779b8eSAndroid Build Coastguard Worker void* buffer, ssize_t numBytes, off64_t offset); 252*ec779b8eSAndroid Build Coastguard Worker }; 253*ec779b8eSAndroid Build Coastguard Worker 254*ec779b8eSAndroid Build Coastguard Worker /** 255*ec779b8eSAndroid Build Coastguard Worker * This is the Binder implementation class for DRM Manager service. 256*ec779b8eSAndroid Build Coastguard Worker */ 257*ec779b8eSAndroid Build Coastguard Worker class BnDrmManagerService: public BnInterface<IDrmManagerService> 258*ec779b8eSAndroid Build Coastguard Worker { 259*ec779b8eSAndroid Build Coastguard Worker public: 260*ec779b8eSAndroid Build Coastguard Worker virtual status_t onTransact( 261*ec779b8eSAndroid Build Coastguard Worker uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); 262*ec779b8eSAndroid Build Coastguard Worker }; 263*ec779b8eSAndroid Build Coastguard Worker 264*ec779b8eSAndroid Build Coastguard Worker }; 265*ec779b8eSAndroid Build Coastguard Worker 266*ec779b8eSAndroid Build Coastguard Worker #endif /* __IDRM_MANAGER_SERVICE_H__ */ 267*ec779b8eSAndroid Build Coastguard Worker 268