| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.googlecode.android_scripting.facade; |
| |
| import com.google.common.collect.Maps; |
| import com.googlecode.android_scripting.Log; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothA2dpFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothA2dpSinkFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothAvrcpFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothConnectionFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothHfpClientFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothHidDeviceFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothHidFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothHspFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothLeAdvertiseFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothLeAdvertisingSetFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothLeScanFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothMapClientFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothMapFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothMediaFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothPanFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothPbapClientFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.BluetoothRfcommFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.GattClientFacade; |
| import com.googlecode.android_scripting.facade.bluetooth.GattServerFacade; |
| import com.googlecode.android_scripting.facade.media.AudioManagerFacade; |
| import com.googlecode.android_scripting.facade.media.MediaPlayerFacade; |
| import com.googlecode.android_scripting.facade.media.MediaRecorderFacade; |
| import com.googlecode.android_scripting.facade.media.MediaScannerFacade; |
| import com.googlecode.android_scripting.facade.media.MediaSessionFacade; |
| import com.googlecode.android_scripting.facade.net.IpSecManagerFacade; |
| import com.googlecode.android_scripting.facade.net.SocketFacade; |
| import com.googlecode.android_scripting.facade.net.SocketKeepaliveFacade; |
| import com.googlecode.android_scripting.facade.net.nsd.NsdManagerFacade; |
| import com.googlecode.android_scripting.facade.telephony.CarrierConfigFacade; |
| import com.googlecode.android_scripting.facade.telephony.ImsManagerFacade; |
| import com.googlecode.android_scripting.facade.telephony.ImsMmTelManagerFacade; |
| import com.googlecode.android_scripting.facade.telephony.ProvisioningManagerFacade; |
| import com.googlecode.android_scripting.facade.telephony.SmsFacade; |
| import com.googlecode.android_scripting.facade.telephony.SubscriptionManagerFacade; |
| import com.googlecode.android_scripting.facade.telephony.TelecomCallFacade; |
| import com.googlecode.android_scripting.facade.telephony.TelecomManagerFacade; |
| import com.googlecode.android_scripting.facade.telephony.TelephonyManagerFacade; |
| import com.googlecode.android_scripting.facade.ui.UiFacade; |
| import com.googlecode.android_scripting.facade.webcam.WebCamFacade; |
| import com.googlecode.android_scripting.facade.wifi.HttpFacade; |
| import com.googlecode.android_scripting.facade.wifi.WifiAwareManagerFacade; |
| import com.googlecode.android_scripting.facade.wifi.WifiManagerFacade; |
| import com.googlecode.android_scripting.facade.wifi.WifiP2pManagerFacade; |
| import com.googlecode.android_scripting.facade.wifi.WifiRtt2ManagerFacade; |
| import com.googlecode.android_scripting.facade.wifi.WifiRttManagerFacade; |
| import com.googlecode.android_scripting.facade.wifi.WifiScannerFacade; |
| import com.googlecode.android_scripting.jsonrpc.RpcReceiver; |
| import com.googlecode.android_scripting.rpc.MethodDescriptor; |
| import com.googlecode.android_scripting.rpc.RpcDeprecated; |
| import com.googlecode.android_scripting.rpc.RpcMinSdk; |
| import com.googlecode.android_scripting.rpc.RpcStartEvent; |
| import com.googlecode.android_scripting.rpc.RpcStopEvent; |
| |
| import java.lang.reflect.Method; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| import java.util.SortedMap; |
| import java.util.TreeMap; |
| |
| /** |
| * Encapsulates the list of supported facades and their construction. |
| */ |
| public class FacadeConfiguration { |
| private final static Set<Class<? extends RpcReceiver>> sFacadeClassList; |
| private final static SortedMap<String, MethodDescriptor> sRpcs = |
| new TreeMap<String, MethodDescriptor>(); |
| |
| private static int sSdkLevel; |
| |
| static { |
| sSdkLevel = android.os.Build.VERSION.SDK_INT; |
| |
| sFacadeClassList = new HashSet<Class<? extends RpcReceiver>>(); |
| sFacadeClassList.add(ActivityResultFacade.class); |
| sFacadeClassList.add(AndroidFacade.class); |
| sFacadeClassList.add(ApplicationManagerFacade.class); |
| sFacadeClassList.add(AudioManagerFacade.class); |
| sFacadeClassList.add(BatteryManagerFacade.class); |
| sFacadeClassList.add(CallLogFacade.class); |
| sFacadeClassList.add(CameraFacade.class); |
| sFacadeClassList.add(CommonIntentsFacade.class); |
| sFacadeClassList.add(ContactsFacade.class); |
| sFacadeClassList.add(EventFacade.class); |
| sFacadeClassList.add(ImsManagerFacade.class); |
| sFacadeClassList.add(ImsMmTelManagerFacade.class); |
| sFacadeClassList.add(LocationFacade.class); |
| sFacadeClassList.add(TelephonyManagerFacade.class); |
| sFacadeClassList.add(ProvisioningManagerFacade.class); |
| sFacadeClassList.add(PreferencesFacade.class); |
| sFacadeClassList.add(MediaPlayerFacade.class); |
| sFacadeClassList.add(MediaRecorderFacade.class); |
| sFacadeClassList.add(MediaScannerFacade.class); |
| sFacadeClassList.add(MediaSessionFacade.class); |
| sFacadeClassList.add(SensorManagerFacade.class); |
| sFacadeClassList.add(SettingsFacade.class); |
| sFacadeClassList.add(SmsFacade.class); |
| sFacadeClassList.add(SpeechRecognitionFacade.class); |
| sFacadeClassList.add(ToneGeneratorFacade.class); |
| sFacadeClassList.add(WakeLockFacade.class); |
| sFacadeClassList.add(HttpFacade.class); |
| sFacadeClassList.add(WifiManagerFacade.class); |
| sFacadeClassList.add(UiFacade.class); |
| sFacadeClassList.add(TextToSpeechFacade.class); |
| sFacadeClassList.add(BluetoothFacade.class); |
| sFacadeClassList.add(BluetoothA2dpFacade.class); |
| sFacadeClassList.add(BluetoothAvrcpFacade.class); |
| sFacadeClassList.add(BluetoothConnectionFacade.class); |
| sFacadeClassList.add(BluetoothHspFacade.class); |
| sFacadeClassList.add(BluetoothHidFacade.class); |
| sFacadeClassList.add(BluetoothHidDeviceFacade.class); |
| sFacadeClassList.add(BluetoothMapFacade.class); |
| sFacadeClassList.add(BluetoothPanFacade.class); |
| sFacadeClassList.add(BluetoothMediaFacade.class); |
| sFacadeClassList.add(BluetoothRfcommFacade.class); |
| sFacadeClassList.add(WebCamFacade.class); |
| sFacadeClassList.add(WifiP2pManagerFacade.class); |
| sFacadeClassList.add(BluetoothLeScanFacade.class); |
| sFacadeClassList.add(BluetoothLeAdvertiseFacade.class); |
| sFacadeClassList.add(GattClientFacade.class); |
| sFacadeClassList.add(GattServerFacade.class); |
| sFacadeClassList.add(ConnectivityManagerFacade.class); |
| sFacadeClassList.add(DisplayFacade.class); |
| sFacadeClassList.add(TelecomManagerFacade.class); |
| sFacadeClassList.add(WifiRttManagerFacade.class); |
| sFacadeClassList.add(WifiScannerFacade.class); |
| sFacadeClassList.add(SubscriptionManagerFacade.class); |
| sFacadeClassList.add(TelecomCallFacade.class); |
| sFacadeClassList.add(CarrierConfigFacade.class); |
| sFacadeClassList.add(NfcManagerFacade.class); |
| sFacadeClassList.add(VpnFacade.class); |
| |
| /* Compatibility reset to >= Marshmallow */ |
| if (sSdkLevel >= 23) { |
| // add new facades here |
| sFacadeClassList.add(WifiAwareManagerFacade.class); |
| sFacadeClassList.add(BluetoothHfpClientFacade.class); |
| sFacadeClassList.add(BluetoothA2dpSinkFacade.class); |
| sFacadeClassList.add(BluetoothPbapClientFacade.class); |
| sFacadeClassList.add(NsdManagerFacade.class); |
| sFacadeClassList.add(BluetoothMapClientFacade.class); |
| sFacadeClassList.add(BluetoothLeAdvertisingSetFacade.class); |
| sFacadeClassList.add(IpSecManagerFacade.class); |
| sFacadeClassList.add(SocketFacade.class); |
| } |
| |
| if (sSdkLevel >= 27) { |
| sFacadeClassList.add(WifiRtt2ManagerFacade.class); |
| } |
| |
| if (sSdkLevel >= 29) { |
| sFacadeClassList.add(SocketKeepaliveFacade.class); |
| } |
| |
| for (Class<? extends RpcReceiver> recieverClass : sFacadeClassList) { |
| for (MethodDescriptor rpcMethod : MethodDescriptor.collectFrom(recieverClass)) { |
| sRpcs.put(rpcMethod.getName(), rpcMethod); |
| } |
| } |
| } |
| |
| private FacadeConfiguration() { |
| // Utility class. |
| } |
| |
| public static int getSdkLevel() { |
| return sSdkLevel; |
| } |
| |
| /** Returns a list of {@link MethodDescriptor} objects for all facades. */ |
| public static List<MethodDescriptor> collectMethodDescriptors() { |
| return new ArrayList<MethodDescriptor>(sRpcs.values()); |
| } |
| |
| /** |
| * Returns a list of not deprecated {@link MethodDescriptor} objects for facades supported by |
| * the current SDK version. |
| */ |
| public static List<MethodDescriptor> collectSupportedMethodDescriptors() { |
| List<MethodDescriptor> list = new ArrayList<MethodDescriptor>(); |
| for (MethodDescriptor descriptor : sRpcs.values()) { |
| Method method = descriptor.getMethod(); |
| if (method.isAnnotationPresent(RpcDeprecated.class)) { |
| continue; |
| } else if (method.isAnnotationPresent(RpcMinSdk.class)) { |
| int requiredSdkLevel = method.getAnnotation(RpcMinSdk.class).value(); |
| if (sSdkLevel < requiredSdkLevel) { |
| continue; |
| } |
| } |
| list.add(descriptor); |
| } |
| return list; |
| } |
| |
| public static Map<String, MethodDescriptor> collectStartEventMethodDescriptors() { |
| Map<String, MethodDescriptor> map = Maps.newHashMap(); |
| for (MethodDescriptor descriptor : sRpcs.values()) { |
| Method method = descriptor.getMethod(); |
| if (method.isAnnotationPresent(RpcStartEvent.class)) { |
| String eventName = method.getAnnotation(RpcStartEvent.class).value(); |
| if (map.containsKey(eventName)) { |
| Log.d("Duplicate eventName " + eventName); |
| throw new RuntimeException("Duplicate start event method descriptor found."); |
| } |
| map.put(eventName, descriptor); |
| } |
| } |
| return map; |
| } |
| |
| public static Map<String, MethodDescriptor> collectStopEventMethodDescriptors() { |
| Map<String, MethodDescriptor> map = Maps.newHashMap(); |
| for (MethodDescriptor descriptor : sRpcs.values()) { |
| Method method = descriptor.getMethod(); |
| if (method.isAnnotationPresent(RpcStopEvent.class)) { |
| String eventName = method.getAnnotation(RpcStopEvent.class).value(); |
| if (map.containsKey(eventName)) { |
| throw new RuntimeException("Duplicate stop event method descriptor found."); |
| } |
| map.put(eventName, descriptor); |
| } |
| } |
| return map; |
| } |
| |
| /** Returns a method by name. */ |
| public static MethodDescriptor getMethodDescriptor(String name) { |
| return sRpcs.get(name); |
| } |
| |
| public static Collection<Class<? extends RpcReceiver>> getFacadeClasses() { |
| return sFacadeClassList; |
| } |
| } |