blob: 240b14404747817fcd44d6b725d39902a178f11e [file] [log] [blame]
Amy Zhangbf68a162020-11-23 17:42:40 -08001/*
2 * Copyright 2020 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
17#define LOG_TAG "TunerClient"
18
19#include <android/binder_manager.h>
20#include <android-base/logging.h>
21#include <utils/Log.h>
22
23#include "TunerClient.h"
24
25using ::android::hardware::tv::tuner::V1_0::FrontendId;
26using ::android::hardware::tv::tuner::V1_0::FrontendType;
27
28namespace android {
29
30sp<ITuner> TunerClient::mTuner;
31sp<::android::hardware::tv::tuner::V1_1::ITuner> TunerClient::mTuner_1_1;
32shared_ptr<ITunerService> TunerClient::mTunerService;
33int TunerClient::mTunerVersion;
34
35/////////////// TunerClient ///////////////////////
36
37TunerClient::TunerClient() {
38 // Get HIDL Tuner in migration stage.
39 getHidlTuner();
Amy Zhang9eeba432021-01-21 12:52:05 -080040 if (mTuner != NULL) {
41 updateTunerResources();
42 }
Amy Zhangbf68a162020-11-23 17:42:40 -080043 // Connect with Tuner Service.
44 ::ndk::SpAIBinder binder(AServiceManager_getService("media.tuner"));
45 mTunerService = ITunerService::fromBinder(binder);
Amy Zhang9a9ed602020-12-07 16:37:33 -080046 // TODO: Remove after JNI migration is done.
47 mTunerService = NULL;
Amy Zhangbf68a162020-11-23 17:42:40 -080048 if (mTunerService == NULL) {
49 ALOGE("Failed to get tuner service");
Amy Zhang9eeba432021-01-21 12:52:05 -080050 } else {
51 // TODO: b/178124017 update TRM in TunerService independently.
52 mTunerService->updateTunerResources();
Amy Zhangbf68a162020-11-23 17:42:40 -080053 }
54}
55
56TunerClient::~TunerClient() {
57 mTuner = NULL;
58 mTuner_1_1 = NULL;
59 mTunerVersion = 0;
60 mTunerService = NULL;
61}
62
63vector<FrontendId> TunerClient::getFrontendIds() {
64 vector<FrontendId> ids;
shubang68f32a32020-12-29 00:34:24 -080065
66 if (mTunerService != NULL) {
67 vector<int32_t> v;
Amy Zhang9eeba432021-01-21 12:52:05 -080068 Status s = mTunerService->getFrontendIds(&v);
Amy Zhang4a07e802021-01-21 17:10:21 -080069 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS || v.size() == 0) {
shubang68f32a32020-12-29 00:34:24 -080070 ids.clear();
71 return ids;
72 }
73 for (int32_t id : v) {
74 ids.push_back(static_cast<FrontendId>(id));
75 }
76 return ids;
77 }
Amy Zhangbf68a162020-11-23 17:42:40 -080078
79 if (mTuner != NULL) {
80 Result res;
81 mTuner->getFrontendIds([&](Result r, const hardware::hidl_vec<FrontendId>& frontendIds) {
82 res = r;
83 ids = frontendIds;
84 });
85 if (res != Result::SUCCESS || ids.size() == 0) {
86 ALOGW("Frontend ids not available");
87 ids.clear();
88 return ids;
89 }
90 return ids;
91 }
92
93 return ids;
94}
95
96
97sp<FrontendClient> TunerClient::openFrontend(int frontendHandle) {
98 if (mTunerService != NULL) {
Amy Zhangbf68a162020-11-23 17:42:40 -080099 shared_ptr<ITunerFrontend> tunerFrontend;
Amy Zhang4a07e802021-01-21 17:10:21 -0800100 Status s = mTunerService->openFrontend(frontendHandle, &tunerFrontend);
101 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS
102 || tunerFrontend == NULL) {
Amy Zhangb9f3cab2021-01-13 15:24:14 -0800103 return NULL;
104 }
105 int id;
Amy Zhang4a07e802021-01-21 17:10:21 -0800106 s = tunerFrontend->getFrontendId(&id);
107 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
108 return NULL;
109 }
Amy Zhangd1fd5ac2021-01-13 16:30:24 -0800110 TunerFrontendInfo aidlFrontendInfo;
Amy Zhang4a07e802021-01-21 17:10:21 -0800111 s = mTunerService->getFrontendInfo(id, &aidlFrontendInfo);
112 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
113 return NULL;
114 }
Amy Zhangb9f3cab2021-01-13 15:24:14 -0800115 return new FrontendClient(tunerFrontend, frontendHandle, aidlFrontendInfo.type);
Amy Zhangbf68a162020-11-23 17:42:40 -0800116 }
117
118 if (mTuner != NULL) {
Amy Zhang210c26a2021-01-12 11:25:27 -0800119 int id = getResourceIdFromHandle(frontendHandle, FRONTEND);
120 sp<IFrontend> hidlFrontend = openHidlFrontendById(id);
Amy Zhangbf68a162020-11-23 17:42:40 -0800121 if (hidlFrontend != NULL) {
Amy Zhangb9f3cab2021-01-13 15:24:14 -0800122 FrontendInfo hidlInfo;
123 Result res = getHidlFrontendInfo(id, hidlInfo);
124 if (res != Result::SUCCESS) {
125 return NULL;
126 }
127 sp<FrontendClient> frontendClient = new FrontendClient(NULL, id, (int)hidlInfo.type);
Amy Zhangbf68a162020-11-23 17:42:40 -0800128 frontendClient->setHidlFrontend(hidlFrontend);
129 return frontendClient;
130 }
131 }
132
133 return NULL;
134}
135
136shared_ptr<FrontendInfo> TunerClient::getFrontendInfo(int id) {
137 if (mTunerService != NULL) {
Amy Zhangd1fd5ac2021-01-13 16:30:24 -0800138 TunerFrontendInfo aidlFrontendInfo;
Amy Zhangbf68a162020-11-23 17:42:40 -0800139 // TODO: handle error code
Amy Zhang4a07e802021-01-21 17:10:21 -0800140 Status s = mTunerService->getFrontendInfo(id, &aidlFrontendInfo);
141 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
142 return NULL;
143 }
Amy Zhangbf68a162020-11-23 17:42:40 -0800144 return make_shared<FrontendInfo>(FrontendInfoAidlToHidl(aidlFrontendInfo));
145 }
146
147 if (mTuner != NULL) {
148 FrontendInfo hidlInfo;
149 Result res = getHidlFrontendInfo(id, hidlInfo);
150 if (res != Result::SUCCESS) {
151 return NULL;
152 }
153 return make_shared<FrontendInfo>(hidlInfo);
154 }
155
156 return NULL;
157}
158
159shared_ptr<FrontendDtmbCapabilities> TunerClient::getFrontendDtmbCapabilities(int id) {
160 // pending aidl interface
161
162 if (mTuner_1_1 != NULL) {
163 Result result;
164 FrontendDtmbCapabilities dtmbCaps;
165 mTuner_1_1->getFrontendDtmbCapabilities(id,
166 [&](Result r, const FrontendDtmbCapabilities& caps) {
167 dtmbCaps = caps;
168 result = r;
169 });
170 if (result == Result::SUCCESS) {
171 return make_shared<FrontendDtmbCapabilities>(dtmbCaps);
172 }
173 }
174
175 return NULL;
176}
177
Amy Zhang4a07e802021-01-21 17:10:21 -0800178sp<DemuxClient> TunerClient::openDemux(int demuxHandle) {
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800179 if (mTunerService != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800180 shared_ptr<ITunerDemux> tunerDemux;
181 Status s = mTunerService->openDemux(demuxHandle, &tunerDemux);
182 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
183 return NULL;
184 }
185 return new DemuxClient(tunerDemux);
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800186 }
187
188 if (mTuner != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800189 sp<DemuxClient> demuxClient = new DemuxClient(NULL);
Amy Zhang921fd432021-01-07 13:18:27 -0800190 int demuxId;
191 sp<IDemux> hidlDemux = openHidlDemux(demuxId);
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800192 if (hidlDemux != NULL) {
193 demuxClient->setHidlDemux(hidlDemux);
Amy Zhang921fd432021-01-07 13:18:27 -0800194 demuxClient->setId(demuxId);
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800195 return demuxClient;
196 }
197 }
198
199 return NULL;
200}
201
Amy Zhang90a50b42021-01-11 16:58:59 -0800202shared_ptr<DemuxCapabilities> TunerClient::getDemuxCaps() {
Amy Zhang952794662021-02-04 15:56:22 -0800203 if (mTunerService != NULL) {
204 TunerDemuxCapabilities aidlCaps;
205 Status s = mTunerService->getDemuxCaps(&aidlCaps);
206 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
207 return NULL;
208 }
209 return make_shared<DemuxCapabilities>(getHidlDemuxCaps(aidlCaps));
210 }
Amy Zhang90a50b42021-01-11 16:58:59 -0800211
212 if (mTuner != NULL) {
213 Result res;
214 DemuxCapabilities caps;
215 mTuner->getDemuxCaps([&](Result r, const DemuxCapabilities& demuxCaps) {
216 caps = demuxCaps;
217 res = r;
218 });
219 if (res == Result::SUCCESS) {
220 return make_shared<DemuxCapabilities>(caps);
221 }
222 }
223
224 return NULL;
Amy Zhangb0f63ab2021-01-06 17:19:27 -0800225}
226
Amy Zhang38261c32021-02-03 20:38:52 -0800227sp<DescramblerClient> TunerClient::openDescrambler(int descramblerHandle) {
Amy Zhang921fd432021-01-07 13:18:27 -0800228 if (mTunerService != NULL) {
Amy Zhang38261c32021-02-03 20:38:52 -0800229 shared_ptr<ITunerDescrambler> tunerDescrambler;
230 Status s = mTunerService->openDescrambler(descramblerHandle, &tunerDescrambler);
231 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
232 return NULL;
233 }
234 return new DescramblerClient(tunerDescrambler);
Amy Zhang921fd432021-01-07 13:18:27 -0800235 }
236
237 if (mTuner != NULL) {
Amy Zhang38261c32021-02-03 20:38:52 -0800238 sp<DescramblerClient> descramblerClient = new DescramblerClient(NULL);
Amy Zhang921fd432021-01-07 13:18:27 -0800239 sp<IDescrambler> hidlDescrambler = openHidlDescrambler();
240 if (hidlDescrambler != NULL) {
241 descramblerClient->setHidlDescrambler(hidlDescrambler);
242 return descramblerClient;
243 }
244 }
245
Amy Zhangb5809be2021-01-26 16:27:23 -0800246 return NULL;
247}
Amy Zhangb0f63ab2021-01-06 17:19:27 -0800248
Amy Zhangd3d57b42021-01-07 11:14:43 -0800249sp<LnbClient> TunerClient::openLnb(int lnbHandle) {
250 if (mTunerService != NULL) {
Amy Zhang3ac0a3e2021-01-14 18:55:10 -0800251 shared_ptr<ITunerLnb> tunerLnb;
Amy Zhang4a07e802021-01-21 17:10:21 -0800252 Status s = mTunerService->openLnb(lnbHandle, &tunerLnb);
253 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
254 return NULL;
255 }
Amy Zhang3ac0a3e2021-01-14 18:55:10 -0800256 return new LnbClient(tunerLnb);
Amy Zhangd3d57b42021-01-07 11:14:43 -0800257 }
258
259 if (mTuner != NULL) {
260 int id = getResourceIdFromHandle(lnbHandle, LNB);
Amy Zhang3ac0a3e2021-01-14 18:55:10 -0800261 sp<LnbClient> lnbClient = new LnbClient(NULL);
Amy Zhangd3d57b42021-01-07 11:14:43 -0800262 sp<ILnb> hidlLnb = openHidlLnbById(id);
263 if (hidlLnb != NULL) {
264 lnbClient->setHidlLnb(hidlLnb);
265 lnbClient->setId(id);
266 return lnbClient;
267 }
268 }
269
Amy Zhangb0f63ab2021-01-06 17:19:27 -0800270 return NULL;
271}
272
Amy Zhangd3d57b42021-01-07 11:14:43 -0800273sp<LnbClient> TunerClient::openLnbByName(string lnbName) {
274 if (mTunerService != NULL) {
Amy Zhang3ac0a3e2021-01-14 18:55:10 -0800275 shared_ptr<ITunerLnb> tunerLnb;
Amy Zhang4a07e802021-01-21 17:10:21 -0800276 Status s = mTunerService->openLnbByName(lnbName, &tunerLnb);
277 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
278 return NULL;
279 }
Amy Zhang3ac0a3e2021-01-14 18:55:10 -0800280 return new LnbClient(tunerLnb);
Amy Zhangd3d57b42021-01-07 11:14:43 -0800281 }
282
283 if (mTuner != NULL) {
Amy Zhang3ac0a3e2021-01-14 18:55:10 -0800284 sp<LnbClient> lnbClient = new LnbClient(NULL);
Amy Zhangd3d57b42021-01-07 11:14:43 -0800285 LnbId id;
286 sp<ILnb> hidlLnb = openHidlLnbByName(lnbName, id);
287 if (hidlLnb != NULL) {
288 lnbClient->setHidlLnb(hidlLnb);
289 lnbClient->setId(id);
290 return lnbClient;
291 }
292 }
293
Amy Zhangb0f63ab2021-01-06 17:19:27 -0800294 return NULL;
295}
296
Amy Zhangbf68a162020-11-23 17:42:40 -0800297/////////////// TunerClient Helper Methods ///////////////////////
298
Amy Zhang39a3fa42020-12-21 16:56:03 -0800299void TunerClient::updateTunerResources() {
300 if (mTuner == NULL) {
301 return;
302 }
303
304 // Connect with Tuner Resource Manager.
305 ::ndk::SpAIBinder binder(AServiceManager_getService("tv_tuner_resource_mgr"));
306 mTunerResourceManager = ITunerResourceManager::fromBinder(binder);
307
308 updateFrontendResources();
309 updateLnbResources();
310 // TODO: update Demux, Descrambler.
311}
312
313void TunerClient::updateFrontendResources() {
314 vector<FrontendId> ids = getFrontendIds();
315 if (ids.size() == 0) {
316 return;
317 }
318 vector<TunerFrontendInfo> infos;
319 for (int i = 0; i < ids.size(); i++) {
320 shared_ptr<FrontendInfo> frontendInfo = getFrontendInfo((int)ids[i]);
321 if (frontendInfo == NULL) {
322 continue;
323 }
324 TunerFrontendInfo tunerFrontendInfo{
325 .handle = getResourceHandleFromId((int)ids[i], FRONTEND),
Amy Zhangd1fd5ac2021-01-13 16:30:24 -0800326 .type = static_cast<int>(frontendInfo->type),
Amy Zhang39a3fa42020-12-21 16:56:03 -0800327 .exclusiveGroupId = static_cast<int>(frontendInfo->exclusiveGroupId),
328 };
329 infos.push_back(tunerFrontendInfo);
330 }
331 mTunerResourceManager->setFrontendInfoList(infos);
332}
333
334void TunerClient::updateLnbResources() {
335 vector<int> handles = getLnbHandles();
336 if (handles.size() == 0) {
337 return;
338 }
339 mTunerResourceManager->setLnbInfoList(handles);
340}
341
Amy Zhangbf68a162020-11-23 17:42:40 -0800342sp<ITuner> TunerClient::getHidlTuner() {
343 if (mTuner == NULL) {
344 mTunerVersion = 0;
345 mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::getService();
346
347 if (mTuner_1_1 == NULL) {
348 ALOGW("Failed to get tuner 1.1 service.");
349 mTuner = ITuner::getService();
350 if (mTuner == NULL) {
351 ALOGW("Failed to get tuner 1.0 service.");
352 } else {
353 mTunerVersion = 1 << 16;
354 }
355 } else {
356 mTuner = static_cast<sp<ITuner>>(mTuner_1_1);
357 mTunerVersion = ((1 << 16) | 1);
358 }
359 }
360 return mTuner;
361}
362
Amy Zhang210c26a2021-01-12 11:25:27 -0800363sp<IFrontend> TunerClient::openHidlFrontendById(int id) {
Amy Zhangbf68a162020-11-23 17:42:40 -0800364 sp<IFrontend> fe;
365 Result res;
Amy Zhangbf68a162020-11-23 17:42:40 -0800366 mTuner->openFrontendById(id, [&](Result r, const sp<IFrontend>& frontend) {
367 fe = frontend;
368 res = r;
369 });
370 if (res != Result::SUCCESS || fe == nullptr) {
371 ALOGE("Failed to open frontend");
372 return NULL;
373 }
374 return fe;
375}
376
377Result TunerClient::getHidlFrontendInfo(int id, FrontendInfo& feInfo) {
378 Result res;
379 mTuner->getFrontendInfo(id, [&](Result r, const FrontendInfo& info) {
380 feInfo = info;
381 res = r;
382 });
383 return res;
384}
385
Amy Zhang921fd432021-01-07 13:18:27 -0800386sp<IDemux> TunerClient::openHidlDemux(int& demuxId) {
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800387 sp<IDemux> demux;
388 Result res;
389
Amy Zhang921fd432021-01-07 13:18:27 -0800390 mTuner->openDemux([&](Result result, uint32_t id, const sp<IDemux>& demuxSp) {
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800391 demux = demuxSp;
Amy Zhang921fd432021-01-07 13:18:27 -0800392 demuxId = id;
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800393 res = result;
394 });
395 if (res != Result::SUCCESS || demux == nullptr) {
396 ALOGE("Failed to open demux");
397 return NULL;
398 }
399 return demux;
400}
401
Amy Zhangd3d57b42021-01-07 11:14:43 -0800402sp<ILnb> TunerClient::openHidlLnbById(int id) {
403 sp<ILnb> lnb;
404 Result res;
405
406 mTuner->openLnbById(id, [&](Result r, const sp<ILnb>& lnbSp) {
407 res = r;
408 lnb = lnbSp;
409 });
410 if (res != Result::SUCCESS || lnb == nullptr) {
411 ALOGE("Failed to open lnb by id");
412 return NULL;
413 }
414 return lnb;
415}
416
417sp<ILnb> TunerClient::openHidlLnbByName(string name, LnbId& lnbId) {
418 sp<ILnb> lnb;
419 Result res;
420
421 mTuner->openLnbByName(name, [&](Result r, LnbId id, const sp<ILnb>& lnbSp) {
422 res = r;
423 lnb = lnbSp;
424 lnbId = id;
425 });
426 if (res != Result::SUCCESS || lnb == nullptr) {
427 ALOGE("Failed to open lnb by name");
428 return NULL;
429 }
430 return lnb;
431}
432
Amy Zhang39a3fa42020-12-21 16:56:03 -0800433vector<int> TunerClient::getLnbHandles() {
434 vector<int> lnbHandles;
Amy Zhang39a3fa42020-12-21 16:56:03 -0800435 if (mTuner != NULL) {
436 Result res;
437 vector<LnbId> lnbIds;
438 mTuner->getLnbIds([&](Result r, const hardware::hidl_vec<LnbId>& ids) {
439 lnbIds = ids;
440 res = r;
441 });
442 if (res != Result::SUCCESS || lnbIds.size() == 0) {
443 ALOGW("Lnb isn't available");
444 } else {
445 for (int i = 0; i < lnbIds.size(); i++) {
446 lnbHandles.push_back(getResourceHandleFromId((int)lnbIds[i], LNB));
447 }
448 }
449 }
450
451 return lnbHandles;
452}
453
Amy Zhang4a07e802021-01-21 17:10:21 -0800454sp<IDescrambler> TunerClient::openHidlDescrambler() {
455 sp<IDescrambler> descrambler;
456 Result res;
457
458 mTuner->openDescrambler([&](Result r, const sp<IDescrambler>& descramblerSp) {
459 res = r;
460 descrambler = descramblerSp;
461 });
462
463 if (res != Result::SUCCESS || descrambler == NULL) {
464 return NULL;
465 }
466
467 return descrambler;
468}
469
Amy Zhang952794662021-02-04 15:56:22 -0800470DemuxCapabilities TunerClient::getHidlDemuxCaps(TunerDemuxCapabilities& aidlCaps) {
471 DemuxCapabilities caps{
472 .numDemux = (uint32_t)aidlCaps.numDemux,
473 .numRecord = (uint32_t)aidlCaps.numRecord,
474 .numPlayback = (uint32_t)aidlCaps.numPlayback,
475 .numTsFilter = (uint32_t)aidlCaps.numTsFilter,
476 .numSectionFilter = (uint32_t)aidlCaps.numSectionFilter,
477 .numAudioFilter = (uint32_t)aidlCaps.numAudioFilter,
478 .numVideoFilter = (uint32_t)aidlCaps.numVideoFilter,
479 .numPesFilter = (uint32_t)aidlCaps.numPesFilter,
480 .numPcrFilter = (uint32_t)aidlCaps.numPcrFilter,
481 .numBytesInSectionFilter = (uint32_t)aidlCaps.numBytesInSectionFilter,
482 .filterCaps = (uint32_t)aidlCaps.filterCaps,
483 .bTimeFilter = aidlCaps.bTimeFilter,
484 };
485 caps.linkCaps.resize(aidlCaps.linkCaps.size());
486 copy(aidlCaps.linkCaps.begin(), aidlCaps.linkCaps.end(), caps.linkCaps.begin());
487 return caps;
488}
489
Amy Zhangd1fd5ac2021-01-13 16:30:24 -0800490FrontendInfo TunerClient::FrontendInfoAidlToHidl(TunerFrontendInfo aidlFrontendInfo) {
Amy Zhangbf68a162020-11-23 17:42:40 -0800491 FrontendInfo hidlFrontendInfo {
492 .type = static_cast<FrontendType>(aidlFrontendInfo.type),
493 .minFrequency = static_cast<uint32_t>(aidlFrontendInfo.minFrequency),
494 .maxFrequency = static_cast<uint32_t>(aidlFrontendInfo.maxFrequency),
495 .minSymbolRate = static_cast<uint32_t>(aidlFrontendInfo.minSymbolRate),
496 .maxSymbolRate = static_cast<uint32_t>(aidlFrontendInfo.maxSymbolRate),
497 .acquireRange = static_cast<uint32_t>(aidlFrontendInfo.acquireRange),
498 .exclusiveGroupId = static_cast<uint32_t>(aidlFrontendInfo.exclusiveGroupId),
499 };
500 // TODO: handle Frontend caps
501
502 return hidlFrontendInfo;
503}
Amy Zhang210c26a2021-01-12 11:25:27 -0800504
505int TunerClient::getResourceIdFromHandle(int handle, int /*resourceType*/) {
506 return (handle & 0x00ff0000) >> 16;
507}
508
509int TunerClient::getResourceHandleFromId(int id, int resourceType) {
510 // TODO: build up randomly generated id to handle mapping
511 return (resourceType & 0x000000ff) << 24
512 | (id << 16)
513 | (mResourceRequestCount++ & 0xffff);
514}
Amy Zhangbf68a162020-11-23 17:42:40 -0800515} // namespace android