blob: 10e6cad70bcdcc0b44e3751ee48323a111aa6918 [file] [log] [blame]
Tomasz Wasilczyk347192e2017-04-04 11:13:44 -07001/**
2 * Copyright (C) 2017 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
Tomasz Wasilczyk6b4b6462017-07-19 10:52:28 -070017package com.android.server.broadcastradio;
Tomasz Wasilczyk347192e2017-04-04 11:13:44 -070018
Tomasz Wasilczykd65b3ca2017-12-13 08:26:25 -080019import android.annotation.NonNull;
Tomasz Wasilczyk32d26a32017-06-14 13:54:03 -070020import android.Manifest;
Tomasz Wasilczyk347192e2017-04-04 11:13:44 -070021import android.content.Context;
Tomasz Wasilczyk32d26a32017-06-14 13:54:03 -070022import android.content.pm.PackageManager;
Tomasz Wasilczyk347192e2017-04-04 11:13:44 -070023import android.hardware.radio.IRadioService;
24import android.hardware.radio.ITuner;
Tomasz Wasilczyk21348172017-04-20 14:02:42 -070025import android.hardware.radio.ITunerCallback;
Tomasz Wasilczyk347192e2017-04-04 11:13:44 -070026import android.hardware.radio.RadioManager;
Tomasz Wasilczykd15c9df2017-06-13 10:10:36 -070027import android.os.ParcelableException;
Tomasz Wasilczyk436128f2018-01-08 16:46:09 -080028import android.os.RemoteException;
Tomasz Wasilczykf58305d2017-12-28 14:03:15 -080029import android.util.Slog;
Tomasz Wasilczyk347192e2017-04-04 11:13:44 -070030
31import com.android.server.SystemService;
32
Tomasz Wasilczykd15c9df2017-06-13 10:10:36 -070033import java.util.List;
Tomasz Wasilczykd65b3ca2017-12-13 08:26:25 -080034import java.util.Objects;
35import java.util.OptionalInt;
Tomasz Wasilczykd15c9df2017-06-13 10:10:36 -070036
Tomasz Wasilczyk6b4b6462017-07-19 10:52:28 -070037public class BroadcastRadioService extends SystemService {
Tomasz Wasilczykf58305d2017-12-28 14:03:15 -080038 private static final String TAG = "BcRadioSrv";
39
Tomasz Wasilczyk6b4b6462017-07-19 10:52:28 -070040 private final ServiceImpl mServiceImpl = new ServiceImpl();
Tomasz Wasilczykd7c21d32017-04-17 17:02:06 -070041
Tomasz Wasilczykdf013262017-12-13 11:47:20 -080042 private final com.android.server.broadcastradio.hal1.BroadcastRadioService mHal1 =
43 new com.android.server.broadcastradio.hal1.BroadcastRadioService();
Tomasz Wasilczykd65b3ca2017-12-13 08:26:25 -080044 private final com.android.server.broadcastradio.hal2.BroadcastRadioService mHal2 =
45 new com.android.server.broadcastradio.hal2.BroadcastRadioService();
46
Tomasz Wasilczykf13b8412017-05-09 11:54:35 -070047 private final Object mLock = new Object();
Tomasz Wasilczykd15c9df2017-06-13 10:10:36 -070048 private List<RadioManager.ModuleProperties> mModules = null;
Tomasz Wasilczykf13b8412017-05-09 11:54:35 -070049
Tomasz Wasilczyk6b4b6462017-07-19 10:52:28 -070050 public BroadcastRadioService(Context context) {
Tomasz Wasilczyk347192e2017-04-04 11:13:44 -070051 super(context);
52 }
53
54 @Override
55 public void onStart() {
Tomasz Wasilczykd7c21d32017-04-17 17:02:06 -070056 publishBinderService(Context.RADIO_SERVICE, mServiceImpl);
Tomasz Wasilczyk347192e2017-04-04 11:13:44 -070057 }
58
Tomasz Wasilczykd65b3ca2017-12-13 08:26:25 -080059 /**
60 * Finds next available index for newly loaded modules.
61 */
62 private static int getNextId(@NonNull List<RadioManager.ModuleProperties> modules) {
63 OptionalInt max = modules.stream().mapToInt(RadioManager.ModuleProperties::getId).max();
64 return max.isPresent() ? max.getAsInt() + 1 : 0;
65 }
66
Tomasz Wasilczyk6b4b6462017-07-19 10:52:28 -070067 private class ServiceImpl extends IRadioService.Stub {
Tomasz Wasilczyk32d26a32017-06-14 13:54:03 -070068 private void enforcePolicyAccess() {
69 if (PackageManager.PERMISSION_GRANTED != getContext().checkCallingPermission(
Tomasz Wasilczykdf776432017-07-21 14:07:09 -070070 Manifest.permission.ACCESS_BROADCAST_RADIO)) {
71 throw new SecurityException("ACCESS_BROADCAST_RADIO permission not granted");
Tomasz Wasilczyk32d26a32017-06-14 13:54:03 -070072 }
73 }
74
Tomasz Wasilczyk347192e2017-04-04 11:13:44 -070075 @Override
Tomasz Wasilczykd15c9df2017-06-13 10:10:36 -070076 public List<RadioManager.ModuleProperties> listModules() {
Tomasz Wasilczyk32d26a32017-06-14 13:54:03 -070077 enforcePolicyAccess();
Tomasz Wasilczykd15c9df2017-06-13 10:10:36 -070078 synchronized (mLock) {
79 if (mModules != null) return mModules;
80
Tomasz Wasilczykdf013262017-12-13 11:47:20 -080081 mModules = mHal1.loadModules();
Tomasz Wasilczykd65b3ca2017-12-13 08:26:25 -080082 mModules.addAll(mHal2.loadModules(getNextId(mModules)));
83
Tomasz Wasilczykd15c9df2017-06-13 10:10:36 -070084 return mModules;
85 }
86 }
87
88 @Override
Tomasz Wasilczyk21348172017-04-20 14:02:42 -070089 public ITuner openTuner(int moduleId, RadioManager.BandConfig bandConfig,
Tomasz Wasilczyk436128f2018-01-08 16:46:09 -080090 boolean withAudio, ITunerCallback callback) throws RemoteException {
Tomasz Wasilczykf58305d2017-12-28 14:03:15 -080091 Slog.i(TAG, "openTuner(" + moduleId + ", _, " + withAudio + ", _)");
Tomasz Wasilczyk32d26a32017-06-14 13:54:03 -070092 enforcePolicyAccess();
Tomasz Wasilczyk21348172017-04-20 14:02:42 -070093 if (callback == null) {
94 throw new IllegalArgumentException("Callback must not be empty");
95 }
Tomasz Wasilczykf13b8412017-05-09 11:54:35 -070096 synchronized (mLock) {
Tomasz Wasilczykdf013262017-12-13 11:47:20 -080097 if (mHal2.hasModule(moduleId)) {
Tomasz Wasilczykca98cde2018-01-04 12:26:40 -080098 return mHal2.openSession(moduleId, bandConfig, withAudio, callback);
Tomasz Wasilczykdf013262017-12-13 11:47:20 -080099 } else {
100 return mHal1.openTuner(moduleId, bandConfig, withAudio, callback);
101 }
Tomasz Wasilczykf13b8412017-05-09 11:54:35 -0700102 }
Tomasz Wasilczyk347192e2017-04-04 11:13:44 -0700103 }
104 }
105}