blob: 214117bdb66f0f182680e84f1b4fa77e7fe6e41b [file] [log] [blame]
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001/*
2**
3** Copyright (C) 2008 The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
Mark Salyzyn34fb2962014-06-18 16:30:56 -070018#include <inttypes.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080019#include <stdint.h>
20#include <sys/types.h>
Mark Salyzyn34fb2962014-06-18 16:30:56 -070021
Mathias Agopian75624082009-05-19 19:08:10 -070022#include <binder/Parcel.h>
Chris Watkins99f31602015-03-20 13:06:33 -070023#include <media/IDataSource.h>
Andreas Huber1b86fe02014-01-29 11:13:26 -080024#include <media/IMediaHTTPService.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080025#include <media/IMediaMetadataRetriever.h>
Andreas Huberaf8791e2011-03-21 10:25:44 -070026#include <utils/String8.h>
Sangkyu Leed01c1482013-02-08 16:26:39 +090027#include <utils/KeyedVector.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080028
Dave Sparksec4dde72009-11-23 16:51:15 -080029// The binder is supposed to propagate the scheduler group across
30// the binder interface so that remote calls are executed with
31// the same priority as local calls. This is currently not working
32// so this change puts in a temporary hack to fix the issue with
33// metadata retrieval which can be a huge CPU hit if done on a
34// foreground thread.
35#ifndef DISABLE_GROUP_SCHEDULE_HACK
36
Dave Sparksf311c552009-11-23 19:51:33 -080037#undef LOG_TAG
Dave Sparksec4dde72009-11-23 16:51:15 -080038#define LOG_TAG "IMediaMetadataRetriever"
39#include <utils/Log.h>
40#include <cutils/sched_policy.h>
41
42namespace android {
43
44static void sendSchedPolicy(Parcel& data)
45{
46 SchedPolicy policy;
Glenn Kasten0512ab52011-05-04 17:58:57 -070047 get_sched_policy(gettid(), &policy);
Dave Sparksec4dde72009-11-23 16:51:15 -080048 data.writeInt32(policy);
49}
50
51static void setSchedPolicy(const Parcel& data)
52{
53 SchedPolicy policy = (SchedPolicy) data.readInt32();
Glenn Kasten0512ab52011-05-04 17:58:57 -070054 set_sched_policy(gettid(), policy);
Dave Sparksec4dde72009-11-23 16:51:15 -080055}
56static void restoreSchedPolicy()
57{
Glenn Kasten0512ab52011-05-04 17:58:57 -070058 set_sched_policy(gettid(), SP_FOREGROUND);
Dave Sparksec4dde72009-11-23 16:51:15 -080059}
60}; // end namespace android
61#endif
62
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080063namespace android {
64
65enum {
66 DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
67 SET_DATA_SOURCE_URL,
68 SET_DATA_SOURCE_FD,
Chris Watkins99f31602015-03-20 13:06:33 -070069 SET_DATA_SOURCE_CALLBACK,
James Dong16afe2f2010-12-02 17:42:08 -080070 GET_FRAME_AT_TIME,
Chong Zhangd3e0d862017-10-03 13:17:13 -070071 GET_IMAGE_AT_INDEX,
72 GET_FRAME_AT_INDEX,
Dave Sparksec4dde72009-11-23 16:51:15 -080073 EXTRACT_ALBUM_ART,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080074 EXTRACT_METADATA,
75};
76
77class BpMediaMetadataRetriever: public BpInterface<IMediaMetadataRetriever>
78{
79public:
Chih-Hung Hsieh090ef602016-04-27 10:39:54 -070080 explicit BpMediaMetadataRetriever(const sp<IBinder>& impl)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080081 : BpInterface<IMediaMetadataRetriever>(impl)
82 {
83 }
84
85 // disconnect from media metadata retriever service
86 void disconnect()
87 {
88 Parcel data, reply;
89 data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
90 remote()->transact(DISCONNECT, data, &reply);
91 }
92
Andreas Huberaf8791e2011-03-21 10:25:44 -070093 status_t setDataSource(
Andreas Huber1b86fe02014-01-29 11:13:26 -080094 const sp<IMediaHTTPService> &httpService,
95 const char *srcUrl,
96 const KeyedVector<String8, String8> *headers)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080097 {
98 Parcel data, reply;
99 data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
Andreas Huber1b86fe02014-01-29 11:13:26 -0800100 data.writeInt32(httpService != NULL);
101 if (httpService != NULL) {
Marco Nelissen06b46062014-11-14 07:58:25 -0800102 data.writeStrongBinder(IInterface::asBinder(httpService));
Andreas Huber1b86fe02014-01-29 11:13:26 -0800103 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800104 data.writeCString(srcUrl);
Andreas Huberaf8791e2011-03-21 10:25:44 -0700105
106 if (headers == NULL) {
107 data.writeInt32(0);
108 } else {
109 // serialize the headers
Glenn Kastene03dd222014-01-28 11:04:39 -0800110 data.writeInt64(headers->size());
Andreas Huberaf8791e2011-03-21 10:25:44 -0700111 for (size_t i = 0; i < headers->size(); ++i) {
112 data.writeString8(headers->keyAt(i));
113 data.writeString8(headers->valueAt(i));
114 }
115 }
116
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800117 remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
118 return reply.readInt32();
119 }
120
121 status_t setDataSource(int fd, int64_t offset, int64_t length)
122 {
123 Parcel data, reply;
124 data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
125 data.writeFileDescriptor(fd);
126 data.writeInt64(offset);
127 data.writeInt64(length);
128 remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
129 return reply.readInt32();
130 }
131
Chong Zhang24c15772017-07-26 16:25:28 -0700132 status_t setDataSource(const sp<IDataSource>& source, const char *mime)
Chris Watkins99f31602015-03-20 13:06:33 -0700133 {
134 Parcel data, reply;
135 data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
136 data.writeStrongBinder(IInterface::asBinder(source));
Chong Zhang24c15772017-07-26 16:25:28 -0700137
138 if (mime != NULL) {
139 data.writeInt32(1);
140 data.writeCString(mime);
141 } else {
142 data.writeInt32(0);
143 }
Chris Watkins99f31602015-03-20 13:06:33 -0700144 remote()->transact(SET_DATA_SOURCE_CALLBACK, data, &reply);
145 return reply.readInt32();
146 }
147
Chong Zhang24c15772017-07-26 16:25:28 -0700148 sp<IMemory> getFrameAtTime(int64_t timeUs, int option, int colorFormat, bool metaOnly)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800149 {
Chong Zhang24c15772017-07-26 16:25:28 -0700150 ALOGV("getTimeAtTime: time(%" PRId64 " us), option(%d), colorFormat(%d) metaOnly(%d)",
151 timeUs, option, colorFormat, metaOnly);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800152 Parcel data, reply;
153 data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
James Dong16afe2f2010-12-02 17:42:08 -0800154 data.writeInt64(timeUs);
155 data.writeInt32(option);
Chong Zhang24c15772017-07-26 16:25:28 -0700156 data.writeInt32(colorFormat);
157 data.writeInt32(metaOnly);
Dave Sparksec4dde72009-11-23 16:51:15 -0800158#ifndef DISABLE_GROUP_SCHEDULE_HACK
159 sendSchedPolicy(data);
160#endif
James Dong16afe2f2010-12-02 17:42:08 -0800161 remote()->transact(GET_FRAME_AT_TIME, data, &reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800162 status_t ret = reply.readInt32();
163 if (ret != NO_ERROR) {
164 return NULL;
165 }
166 return interface_cast<IMemory>(reply.readStrongBinder());
167 }
168
Chong Zhangd5fa3572018-04-09 19:03:10 -0700169 sp<IMemory> getImageAtIndex(int index, int colorFormat, bool metaOnly, bool thumbnail)
Chong Zhangd3e0d862017-10-03 13:17:13 -0700170 {
Chong Zhangd5fa3572018-04-09 19:03:10 -0700171 ALOGV("getImageAtIndex: index %d, colorFormat(%d) metaOnly(%d) thumbnail(%d)",
172 index, colorFormat, metaOnly, thumbnail);
Chong Zhangd3e0d862017-10-03 13:17:13 -0700173 Parcel data, reply;
174 data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
175 data.writeInt32(index);
176 data.writeInt32(colorFormat);
177 data.writeInt32(metaOnly);
Chong Zhangd5fa3572018-04-09 19:03:10 -0700178 data.writeInt32(thumbnail);
Chong Zhangd3e0d862017-10-03 13:17:13 -0700179#ifndef DISABLE_GROUP_SCHEDULE_HACK
180 sendSchedPolicy(data);
181#endif
182 remote()->transact(GET_IMAGE_AT_INDEX, data, &reply);
183 status_t ret = reply.readInt32();
184 if (ret != NO_ERROR) {
185 return NULL;
186 }
187 return interface_cast<IMemory>(reply.readStrongBinder());
188 }
189
190 status_t getFrameAtIndex(std::vector<sp<IMemory> > *frames,
191 int frameIndex, int numFrames, int colorFormat, bool metaOnly)
192 {
193 ALOGV("getFrameAtIndex: frameIndex(%d), numFrames(%d), colorFormat(%d) metaOnly(%d)",
194 frameIndex, numFrames, colorFormat, metaOnly);
195 Parcel data, reply;
196 data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
197 data.writeInt32(frameIndex);
198 data.writeInt32(numFrames);
199 data.writeInt32(colorFormat);
200 data.writeInt32(metaOnly);
201#ifndef DISABLE_GROUP_SCHEDULE_HACK
202 sendSchedPolicy(data);
203#endif
204 remote()->transact(GET_FRAME_AT_INDEX, data, &reply);
205 status_t ret = reply.readInt32();
206 if (ret != NO_ERROR) {
207 return ret;
208 }
209 int retNumFrames = reply.readInt32();
210 if (retNumFrames < numFrames) {
211 numFrames = retNumFrames;
212 }
213 for (int i = 0; i < numFrames; i++) {
214 frames->push_back(interface_cast<IMemory>(reply.readStrongBinder()));
215 }
216 return OK;
217 }
218
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800219 sp<IMemory> extractAlbumArt()
220 {
221 Parcel data, reply;
222 data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
Dave Sparksec4dde72009-11-23 16:51:15 -0800223#ifndef DISABLE_GROUP_SCHEDULE_HACK
224 sendSchedPolicy(data);
225#endif
226 remote()->transact(EXTRACT_ALBUM_ART, data, &reply);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800227 status_t ret = reply.readInt32();
228 if (ret != NO_ERROR) {
229 return NULL;
230 }
231 return interface_cast<IMemory>(reply.readStrongBinder());
232 }
233
234 const char* extractMetadata(int keyCode)
235 {
236 Parcel data, reply;
237 data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
Dave Sparksec4dde72009-11-23 16:51:15 -0800238#ifndef DISABLE_GROUP_SCHEDULE_HACK
239 sendSchedPolicy(data);
240#endif
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800241 data.writeInt32(keyCode);
242 remote()->transact(EXTRACT_METADATA, data, &reply);
243 status_t ret = reply.readInt32();
244 if (ret != NO_ERROR) {
245 return NULL;
246 }
Sangkyu Leed01c1482013-02-08 16:26:39 +0900247 const char* str = reply.readCString();
248 if (str != NULL) {
249 String8 value(str);
250 if (mMetadata.indexOfKey(keyCode) < 0) {
251 mMetadata.add(keyCode, value);
252 } else {
253 mMetadata.replaceValueFor(keyCode, value);
254 }
255 return mMetadata.valueFor(keyCode).string();
256 } else {
257 return NULL;
258 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800259 }
Sangkyu Leed01c1482013-02-08 16:26:39 +0900260
261private:
262 KeyedVector<int, String8> mMetadata;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800263};
264
niko56f0cc52009-06-22 08:49:52 -0700265IMPLEMENT_META_INTERFACE(MediaMetadataRetriever, "android.media.IMediaMetadataRetriever");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800266
267// ----------------------------------------------------------------------
268
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800269status_t BnMediaMetadataRetriever::onTransact(
270 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
271{
272 switch (code) {
273 case DISCONNECT: {
274 CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
275 disconnect();
276 return NO_ERROR;
277 } break;
278 case SET_DATA_SOURCE_URL: {
279 CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
Andreas Huber1b86fe02014-01-29 11:13:26 -0800280
281 sp<IMediaHTTPService> httpService;
282 if (data.readInt32()) {
283 httpService =
284 interface_cast<IMediaHTTPService>(data.readStrongBinder());
285 }
286
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800287 const char* srcUrl = data.readCString();
Andreas Huberaf8791e2011-03-21 10:25:44 -0700288
Wei Jia2afac0c2016-01-07 12:13:07 -0800289 if (httpService == NULL || srcUrl == NULL) {
290 reply->writeInt32(BAD_VALUE);
291 return NO_ERROR;
292 }
293
Andreas Huberaf8791e2011-03-21 10:25:44 -0700294 KeyedVector<String8, String8> headers;
Glenn Kastene03dd222014-01-28 11:04:39 -0800295 size_t numHeaders = (size_t) data.readInt64();
296 for (size_t i = 0; i < numHeaders; ++i) {
Andreas Huberaf8791e2011-03-21 10:25:44 -0700297 String8 key = data.readString8();
298 String8 value = data.readString8();
299 headers.add(key, value);
300 }
301
302 reply->writeInt32(
Andreas Huber1b86fe02014-01-29 11:13:26 -0800303 setDataSource(
304 httpService, srcUrl, numHeaders > 0 ? &headers : NULL));
Andreas Huberaf8791e2011-03-21 10:25:44 -0700305
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800306 return NO_ERROR;
307 } break;
308 case SET_DATA_SOURCE_FD: {
309 CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
Taiju Tsuiki55203e22015-04-21 17:36:22 +0900310 int fd = data.readFileDescriptor();
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800311 int64_t offset = data.readInt64();
312 int64_t length = data.readInt64();
313 reply->writeInt32(setDataSource(fd, offset, length));
314 return NO_ERROR;
315 } break;
Chris Watkins99f31602015-03-20 13:06:33 -0700316 case SET_DATA_SOURCE_CALLBACK: {
317 CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
318 sp<IDataSource> source =
319 interface_cast<IDataSource>(data.readStrongBinder());
Wei Jia2afac0c2016-01-07 12:13:07 -0800320 if (source == NULL) {
321 reply->writeInt32(BAD_VALUE);
322 } else {
Chong Zhang24c15772017-07-26 16:25:28 -0700323 int32_t hasMime = data.readInt32();
324 const char *mime = NULL;
325 if (hasMime) {
326 mime = data.readCString();
327 }
328 reply->writeInt32(setDataSource(source, mime));
Wei Jia2afac0c2016-01-07 12:13:07 -0800329 }
Chris Watkins99f31602015-03-20 13:06:33 -0700330 return NO_ERROR;
331 } break;
James Dong16afe2f2010-12-02 17:42:08 -0800332 case GET_FRAME_AT_TIME: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800333 CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
James Dong16afe2f2010-12-02 17:42:08 -0800334 int64_t timeUs = data.readInt64();
335 int option = data.readInt32();
Chong Zhang24c15772017-07-26 16:25:28 -0700336 int colorFormat = data.readInt32();
337 bool metaOnly = (data.readInt32() != 0);
338 ALOGV("getTimeAtTime: time(%" PRId64 " us), option(%d), colorFormat(%d), metaOnly(%d)",
339 timeUs, option, colorFormat, metaOnly);
Dave Sparksec4dde72009-11-23 16:51:15 -0800340#ifndef DISABLE_GROUP_SCHEDULE_HACK
341 setSchedPolicy(data);
342#endif
Chong Zhang24c15772017-07-26 16:25:28 -0700343 sp<IMemory> bitmap = getFrameAtTime(timeUs, option, colorFormat, metaOnly);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800344 if (bitmap != 0) { // Don't send NULL across the binder interface
345 reply->writeInt32(NO_ERROR);
Marco Nelissen06b46062014-11-14 07:58:25 -0800346 reply->writeStrongBinder(IInterface::asBinder(bitmap));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800347 } else {
348 reply->writeInt32(UNKNOWN_ERROR);
349 }
Dave Sparksec4dde72009-11-23 16:51:15 -0800350#ifndef DISABLE_GROUP_SCHEDULE_HACK
351 restoreSchedPolicy();
352#endif
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800353 return NO_ERROR;
354 } break;
Chong Zhangd3e0d862017-10-03 13:17:13 -0700355 case GET_IMAGE_AT_INDEX: {
356 CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
357 int index = data.readInt32();
358 int colorFormat = data.readInt32();
359 bool metaOnly = (data.readInt32() != 0);
Chong Zhangd5fa3572018-04-09 19:03:10 -0700360 bool thumbnail = (data.readInt32() != 0);
361 ALOGV("getImageAtIndex: index(%d), colorFormat(%d), metaOnly(%d), thumbnail(%d)",
362 index, colorFormat, metaOnly, thumbnail);
Chong Zhangd3e0d862017-10-03 13:17:13 -0700363#ifndef DISABLE_GROUP_SCHEDULE_HACK
364 setSchedPolicy(data);
365#endif
Chong Zhangd5fa3572018-04-09 19:03:10 -0700366 sp<IMemory> bitmap = getImageAtIndex(index, colorFormat, metaOnly, thumbnail);
Chong Zhangd3e0d862017-10-03 13:17:13 -0700367 if (bitmap != 0) { // Don't send NULL across the binder interface
368 reply->writeInt32(NO_ERROR);
369 reply->writeStrongBinder(IInterface::asBinder(bitmap));
370 } else {
371 reply->writeInt32(UNKNOWN_ERROR);
372 }
373#ifndef DISABLE_GROUP_SCHEDULE_HACK
374 restoreSchedPolicy();
375#endif
376 return NO_ERROR;
377 } break;
378 case GET_FRAME_AT_INDEX: {
379 CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
380 int frameIndex = data.readInt32();
381 int numFrames = data.readInt32();
382 int colorFormat = data.readInt32();
383 bool metaOnly = (data.readInt32() != 0);
384 ALOGV("getFrameAtIndex: frameIndex(%d), numFrames(%d), colorFormat(%d), metaOnly(%d)",
385 frameIndex, numFrames, colorFormat, metaOnly);
386#ifndef DISABLE_GROUP_SCHEDULE_HACK
387 setSchedPolicy(data);
388#endif
389 std::vector<sp<IMemory> > frames;
390 status_t err = getFrameAtIndex(
391 &frames, frameIndex, numFrames, colorFormat, metaOnly);
392 reply->writeInt32(err);
393 if (OK == err) {
394 reply->writeInt32(frames.size());
395 for (size_t i = 0; i < frames.size(); i++) {
396 reply->writeStrongBinder(IInterface::asBinder(frames[i]));
397 }
398 }
399#ifndef DISABLE_GROUP_SCHEDULE_HACK
400 restoreSchedPolicy();
401#endif
402 return NO_ERROR;
403 } break;
Dave Sparksec4dde72009-11-23 16:51:15 -0800404 case EXTRACT_ALBUM_ART: {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800405 CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
Dave Sparksec4dde72009-11-23 16:51:15 -0800406#ifndef DISABLE_GROUP_SCHEDULE_HACK
407 setSchedPolicy(data);
408#endif
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800409 sp<IMemory> albumArt = extractAlbumArt();
410 if (albumArt != 0) { // Don't send NULL across the binder interface
411 reply->writeInt32(NO_ERROR);
Marco Nelissen06b46062014-11-14 07:58:25 -0800412 reply->writeStrongBinder(IInterface::asBinder(albumArt));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800413 } else {
414 reply->writeInt32(UNKNOWN_ERROR);
415 }
Dave Sparksec4dde72009-11-23 16:51:15 -0800416#ifndef DISABLE_GROUP_SCHEDULE_HACK
417 restoreSchedPolicy();
418#endif
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800419 return NO_ERROR;
420 } break;
421 case EXTRACT_METADATA: {
422 CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
Dave Sparksec4dde72009-11-23 16:51:15 -0800423#ifndef DISABLE_GROUP_SCHEDULE_HACK
424 setSchedPolicy(data);
425#endif
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800426 int keyCode = data.readInt32();
427 const char* value = extractMetadata(keyCode);
428 if (value != NULL) { // Don't send NULL across the binder interface
429 reply->writeInt32(NO_ERROR);
430 reply->writeCString(value);
431 } else {
432 reply->writeInt32(UNKNOWN_ERROR);
433 }
Dave Sparksec4dde72009-11-23 16:51:15 -0800434#ifndef DISABLE_GROUP_SCHEDULE_HACK
435 restoreSchedPolicy();
436#endif
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800437 return NO_ERROR;
438 } break;
439 default:
440 return BBinder::onTransact(code, data, reply, flags);
441 }
442}
443
444// ----------------------------------------------------------------------------
445
Glenn Kasten40bc9062015-03-20 09:09:33 -0700446} // namespace android