1ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung/* 2ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Copyright (C) 2015 The Android Open Source Project 3ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * 4ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Licensed under the Apache License, Version 2.0 (the "License"); 5ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * you may not use this file except in compliance with the License. 6ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * You may obtain a copy of the License at 7ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * 8ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * http://www.apache.org/licenses/LICENSE-2.0 9ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * 10ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Unless required by applicable law or agreed to in writing, software 11ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * distributed under the License is distributed on an "AS IS" BASIS, 12ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * See the License for the specific language governing permissions and 14ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * limitations under the License. 15ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 16ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 17e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkpackage android.car; 18ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 19e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport android.annotation.IntDef; 20e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport android.annotation.Nullable; 21e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport android.annotation.SystemApi; 22905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsevimport android.car.cluster.CarInstrumentClusterManager; 236e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkivimport android.car.content.pm.CarPackageManager; 2425e89468119cd0b109f62c751446dfdd8e903143Enrico Granataimport android.car.diagnostic.CarDiagnosticManager; 2525c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadiimport android.car.drivingstate.CarDrivingStateManager; 264526a43140177072b5543f3cf0f06bd72fd8e38eRam Periathiruvadiimport android.car.drivingstate.CarUxRestrictionsManager; 276e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkivimport android.car.hardware.CarSensorManager; 28634e1ff49c62c32c8227ec5092743de3caca790cPavel Maltsevimport android.car.hardware.CarVendorExtensionManager; 290d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsevimport android.car.hardware.cabin.CarCabinManager; 306e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkivimport android.car.hardware.hvac.CarHvacManager; 31388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paikimport android.car.hardware.power.CarPowerManager; 324d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paikimport android.car.hardware.property.CarPropertyManager; 336e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkivimport android.car.media.CarAudioManager; 343388e7848f3a30029935463afafe9b8280939127Keun-young Parkimport android.car.navigation.CarNavigationStatusManager; 3512aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chenimport android.car.settings.CarConfigurationManager; 369a916d707c04d80e9df6dcd84d976900804be717Enrico Granataimport android.car.storagemonitoring.CarStorageMonitoringManager; 376e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkivimport android.car.test.CarTestManagerBinderWrapper; 38a7d8ed1681d297bdda8345c1598c7b9a388599beAntonio Cortesimport android.car.vms.VmsSubscriberManager; 39ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungimport android.content.ComponentName; 40ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungimport android.content.Context; 41e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport android.content.Intent; 42e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport android.content.ServiceConnection; 43ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungimport android.content.pm.PackageManager; 446b19769ee8cfbe0960d05ecfc01f73d08040784fkeunyoungimport android.os.Handler; 45ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungimport android.os.IBinder; 46ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungimport android.os.Looper; 47ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungimport android.os.RemoteException; 4844241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Parkimport android.os.UserHandle; 49ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungimport android.util.Log; 50ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 5120526258de542b521b630079513059d08c08efdbSteve Paikimport com.android.internal.annotations.GuardedBy; 5220526258de542b521b630079513059d08c08efdbSteve Paik 5320526258de542b521b630079513059d08c08efdbSteve Paikimport java.lang.annotation.Retention; 5420526258de542b521b630079513059d08c08efdbSteve Paikimport java.lang.annotation.RetentionPolicy; 5520526258de542b521b630079513059d08c08efdbSteve Paikimport java.util.HashMap; 5620526258de542b521b630079513059d08c08efdbSteve Paik 57ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung/** 58e4c731ea3ed22615783efb02818b0b3d184bba33Jason Tholstrup * Top level car API for embedded Android Auto deployments. 59e4c731ea3ed22615783efb02818b0b3d184bba33Jason Tholstrup * This API works only for devices with {@link PackageManager#FEATURE_AUTOMOTIVE} 60e4c731ea3ed22615783efb02818b0b3d184bba33Jason Tholstrup * Calling this API on a device with no such feature will lead to an exception. 61ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 624cf6911619b9fe6ffeba7afeb05299aab165f184Keun-young Parkpublic final class Car { 63ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 64f521fd7b917a63c240802c7f841fc04c315573d0Keun-young Park /** 6512cfa0d0d909df96c501546eec83bfa09515e3f8Keun-young Park * Represent the version of Car API. This is only updated when there is API change. 6612cfa0d0d909df96c501546eec83bfa09515e3f8Keun-young Park * 1 : N 6712cfa0d0d909df96c501546eec83bfa09515e3f8Keun-young Park * 2 : O 68909546fc1aea53bb86fb1a91d11a11bd2cd4befdKeun-young Park * 3 : O-MR1 69f521fd7b917a63c240802c7f841fc04c315573d0Keun-young Park */ 70909546fc1aea53bb86fb1a91d11a11bd2cd4befdKeun-young Park public static final int VERSION = 3; 71f521fd7b917a63c240802c7f841fc04c315573d0Keun-young Park 72a3b28d81e0c8df531ac704f9e649e38ea90483d2keunyoung /** Service name for {@link CarSensorManager}, to be used in {@link #getCarManager(String)}. */ 73ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final String SENSOR_SERVICE = "sensor"; 74ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 75a3b28d81e0c8df531ac704f9e649e38ea90483d2keunyoung /** Service name for {@link CarInfoManager}, to be used in {@link #getCarManager(String)}. */ 76a3b28d81e0c8df531ac704f9e649e38ea90483d2keunyoung public static final String INFO_SERVICE = "info"; 77a3b28d81e0c8df531ac704f9e649e38ea90483d2keunyoung 783ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup /** Service name for {@link CarAppFocusManager}. */ 7946371473c416415fb6bcb8db85686669c3d65af6Vitalii Tomkiv public static final String APP_FOCUS_SERVICE = "app_focus"; 80a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung 817a948e54331cccf96f178ab426cb7810472c2dc8Pavel Maltsev /** Service name for {@link CarPackageManager} */ 8245fdcbaab5699d7d8153bfda058d0eea2049c8b8Keun-young Park public static final String PACKAGE_SERVICE = "package"; 8345fdcbaab5699d7d8153bfda058d0eea2049c8b8Keun-young Park 845672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** Service name for {@link CarAudioManager} */ 855672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final String AUDIO_SERVICE = "audio"; 8676a8489d09152192f356e61029eaffc401c5e639Ram Periathiruvadi 87dfd861edd5a83f6a54efbcc02352ccc80d365445Harry Slatyer /** Service name for {@link CarNavigationStatusManager} */ 887a948e54331cccf96f178ab426cb7810472c2dc8Pavel Maltsev public static final String CAR_NAVIGATION_SERVICE = "car_navigation_service"; 89dfd861edd5a83f6a54efbcc02352ccc80d365445Harry Slatyer 90905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev /** 91905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * Service name for {@link CarInstrumentClusterManager} 92905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * @hide 93905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev */ 94905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev public static final String CAR_INSTRUMENT_CLUSTER_SERVICE = "cluster_service"; 957a948e54331cccf96f178ab426cb7810472c2dc8Pavel Maltsev 96280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv /** 97280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv * @hide 98280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv */ 99e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park @SystemApi 10043c04a7c87404d078db60e09d2da0061d72357c2Steve Paik public static final String CABIN_SERVICE = "cabin"; 10143c04a7c87404d078db60e09d2da0061d72357c2Steve Paik 10243c04a7c87404d078db60e09d2da0061d72357c2Steve Paik /** 10343c04a7c87404d078db60e09d2da0061d72357c2Steve Paik * @hide 10443c04a7c87404d078db60e09d2da0061d72357c2Steve Paik */ 105ae25b9293df64e4ec71178fbfe999b303a63577eEnrico Granata @SystemApi 1065c56d2a3a5bc4ef5b46a58fa56b7f4a657b0827eEnrico Granata public static final String DIAGNOSTIC_SERVICE = "diagnostic"; 1075c56d2a3a5bc4ef5b46a58fa56b7f4a657b0827eEnrico Granata 1085c56d2a3a5bc4ef5b46a58fa56b7f4a657b0827eEnrico Granata /** 1095c56d2a3a5bc4ef5b46a58fa56b7f4a657b0827eEnrico Granata * @hide 110280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv */ 111e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park @SystemApi 112e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park public static final String HVAC_SERVICE = "hvac"; 113e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park 114280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv /** 115280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv * @hide 116280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv */ 1176e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv @SystemApi 118388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik public static final String POWER_SERVICE = "power"; 119388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik 120388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik /** 121388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik * @hide 122388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik */ 123388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik @SystemApi 1246e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv public static final String PROJECTION_SERVICE = "projection"; 1256e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv 126e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park /** 127634e1ff49c62c32c8227ec5092743de3caca790cPavel Maltsev * @hide 128634e1ff49c62c32c8227ec5092743de3caca790cPavel Maltsev */ 129634e1ff49c62c32c8227ec5092743de3caca790cPavel Maltsev @SystemApi 1304d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik public static final String PROPERTY_SERVICE = "property"; 1314d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik 1324d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik /** 1334d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * @hide 1344d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik */ 1354d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik @SystemApi 136634e1ff49c62c32c8227ec5092743de3caca790cPavel Maltsev public static final String VENDOR_EXTENSION_SERVICE = "vendor_extension"; 137634e1ff49c62c32c8227ec5092743de3caca790cPavel Maltsev 138634e1ff49c62c32c8227ec5092743de3caca790cPavel Maltsev /** 13976a8489d09152192f356e61029eaffc401c5e639Ram Periathiruvadi * @hide 14076a8489d09152192f356e61029eaffc401c5e639Ram Periathiruvadi */ 14176a8489d09152192f356e61029eaffc401c5e639Ram Periathiruvadi public static final String BLUETOOTH_SERVICE = "car_bluetooth"; 14276a8489d09152192f356e61029eaffc401c5e639Ram Periathiruvadi 14376a8489d09152192f356e61029eaffc401c5e639Ram Periathiruvadi /** 144e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortes * @hide 145e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortes */ 146dd60089d8b572737997cc78ea0a1e059f9a37c6fAditi Nagaraj @SystemApi 147e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortes public static final String VMS_SUBSCRIBER_SERVICE = "vehicle_map_subscriber_service"; 148e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortes 149e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortes /** 15025c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi * Service name for {@link CarDrivingStateManager} 15125c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi * @hide 15225c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi */ 15325c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi @SystemApi 15425c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi public static final String CAR_DRIVING_STATE_SERVICE = "drivingstate"; 15525c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi 15625c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi /** 1574526a43140177072b5543f3cf0f06bd72fd8e38eRam Periathiruvadi * Service name for {@link CarUxRestrictionsManager} 15825c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi */ 15925c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi public static final String CAR_UX_RESTRICTION_SERVICE = "uxrestriction"; 16025c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi 16125c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi /** 16212aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen * Service name for {@link android.car.settings.CarConfigurationManager} 16312aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen */ 16412aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen public static final String CAR_CONFIGURATION_SERVICE = "configuration"; 16512aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen 16612aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen /** 1679a916d707c04d80e9df6dcd84d976900804be717Enrico Granata * @hide 1689a916d707c04d80e9df6dcd84d976900804be717Enrico Granata */ 1699a916d707c04d80e9df6dcd84d976900804be717Enrico Granata @SystemApi 1709a916d707c04d80e9df6dcd84d976900804be717Enrico Granata public static final String STORAGE_MONITORING_SERVICE = "storage_monitoring"; 1719a916d707c04d80e9df6dcd84d976900804be717Enrico Granata 1729a916d707c04d80e9df6dcd84d976900804be717Enrico Granata /** 173e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park * Service for testing. This is system app only feature. 174e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park * Service name for {@link CarTestManager}, to be used in {@link #getCarManager(String)}. 175e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park * @hide 176e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park */ 177e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park @SystemApi 178e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park public static final String TEST_SERVICE = "car-service-test"; 179ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 18068ee16bde23d44fc4bafd30732bf50145a2fe9ffKai /** Permission necessary to access car's mileage information. 18168ee16bde23d44fc4bafd30732bf50145a2fe9ffKai * @hide 18268ee16bde23d44fc4bafd30732bf50145a2fe9ffKai */ 18368ee16bde23d44fc4bafd30732bf50145a2fe9ffKai @SystemApi 184e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park public static final String PERMISSION_MILEAGE = "android.car.permission.CAR_MILEAGE"; 185e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park 18668ee16bde23d44fc4bafd30732bf50145a2fe9ffKai /** Permission necessary to access car's energy information. */ 18768ee16bde23d44fc4bafd30732bf50145a2fe9ffKai public static final String PERMISSION_ENERGY = "android.car.permission.CAR_ENERGY"; 18868ee16bde23d44fc4bafd30732bf50145a2fe9ffKai 18968ee16bde23d44fc4bafd30732bf50145a2fe9ffKai /** Permission necessary to access car's VIN information */ 19068ee16bde23d44fc4bafd30732bf50145a2fe9ffKai public static final String PERMISSION_IDENTIFICATION = 19168ee16bde23d44fc4bafd30732bf50145a2fe9ffKai "android.car.permission.CAR_IDENTIFICATION"; 192e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park 193ce4ffd95d6883b28756e5b02ae45a06013bd6c38Pavel Maltsev /** Permission necessary to access car's speed. */ 194e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park public static final String PERMISSION_SPEED = "android.car.permission.CAR_SPEED"; 195e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park 19668ee16bde23d44fc4bafd30732bf50145a2fe9ffKai /** Permission necessary to access car's dynamics state. 19768ee16bde23d44fc4bafd30732bf50145a2fe9ffKai * @hide 19868ee16bde23d44fc4bafd30732bf50145a2fe9ffKai */ 19968ee16bde23d44fc4bafd30732bf50145a2fe9ffKai @SystemApi 20068ee16bde23d44fc4bafd30732bf50145a2fe9ffKai public static final String PERMISSION_CAR_DYNAMICS_STATE = 20168ee16bde23d44fc4bafd30732bf50145a2fe9ffKai "android.car.permission.CAR_DYNAMICS_STATE"; 20268ee16bde23d44fc4bafd30732bf50145a2fe9ffKai 20368ee16bde23d44fc4bafd30732bf50145a2fe9ffKai /** Permission necessary to access car's fuel door and ev charge port. */ 20468ee16bde23d44fc4bafd30732bf50145a2fe9ffKai public static final String PERMISSION_ENERGY_PORTS = "android.car.permission.CAR_ENERGY_PORTS"; 20568ee16bde23d44fc4bafd30732bf50145a2fe9ffKai 20668ee16bde23d44fc4bafd30732bf50145a2fe9ffKai /** Permission necessary to read car's lights information. 20768ee16bde23d44fc4bafd30732bf50145a2fe9ffKai * @hide 20868ee16bde23d44fc4bafd30732bf50145a2fe9ffKai */ 20968ee16bde23d44fc4bafd30732bf50145a2fe9ffKai @SystemApi 21068ee16bde23d44fc4bafd30732bf50145a2fe9ffKai public static final String PERMISSION_EXTERIOR_LIGHTS = 21168ee16bde23d44fc4bafd30732bf50145a2fe9ffKai "android.car.permission.CAR_EXTERIOR_LIGHTS"; 21268ee16bde23d44fc4bafd30732bf50145a2fe9ffKai 21368ee16bde23d44fc4bafd30732bf50145a2fe9ffKai /** Permission necessary to control car's exterior lights. 21468ee16bde23d44fc4bafd30732bf50145a2fe9ffKai * @hide 21568ee16bde23d44fc4bafd30732bf50145a2fe9ffKai */ 21668ee16bde23d44fc4bafd30732bf50145a2fe9ffKai @SystemApi 21768ee16bde23d44fc4bafd30732bf50145a2fe9ffKai public static final String PERMISSION_CONTROL_EXTERIOR_LIGHTS = 21868ee16bde23d44fc4bafd30732bf50145a2fe9ffKai "android.car.permission.CONTROL_CAR_EXTERIOR_LIGHTS"; 21968ee16bde23d44fc4bafd30732bf50145a2fe9ffKai 22068ee16bde23d44fc4bafd30732bf50145a2fe9ffKai /** Permission necessary to access car's powertrain information.*/ 22168ee16bde23d44fc4bafd30732bf50145a2fe9ffKai public static final String PERMISSION_POWERTRAIN = "android.car.permission.CAR_POWERTRAIN"; 222289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik 223ce4ffd95d6883b28756e5b02ae45a06013bd6c38Pavel Maltsev /** 224c4d442f4a0d3acf90b1c7a1dd7c222a8f32a193fYao Chen * Permission necessary to change car audio volume through {@link CarAudioManager}. 225c4d442f4a0d3acf90b1c7a1dd7c222a8f32a193fYao Chen */ 226c4d442f4a0d3acf90b1c7a1dd7c222a8f32a193fYao Chen public static final String PERMISSION_CAR_CONTROL_AUDIO_VOLUME = 227c4d442f4a0d3acf90b1c7a1dd7c222a8f32a193fYao Chen "android.car.permission.CAR_CONTROL_AUDIO_VOLUME"; 228c4d442f4a0d3acf90b1c7a1dd7c222a8f32a193fYao Chen 229c4d442f4a0d3acf90b1c7a1dd7c222a8f32a193fYao Chen /** 230fe1a8f14e1ac56f095d29336e0986950d8adfc0cKeun-young Park * Permission necessary to change car audio settings through {@link CarAudioManager}. 231fe1a8f14e1ac56f095d29336e0986950d8adfc0cKeun-young Park * @hide 232fe1a8f14e1ac56f095d29336e0986950d8adfc0cKeun-young Park */ 233fe1a8f14e1ac56f095d29336e0986950d8adfc0cKeun-young Park public static final String PERMISSION_CAR_CONTROL_AUDIO_SETTINGS = 234fe1a8f14e1ac56f095d29336e0986950d8adfc0cKeun-young Park "android.car.permission.CAR_CONTROL_AUDIO_SETTINGS"; 235fe1a8f14e1ac56f095d29336e0986950d8adfc0cKeun-young Park 236fe1a8f14e1ac56f095d29336e0986950d8adfc0cKeun-young Park /** 2373388e7848f3a30029935463afafe9b8280939127Keun-young Park * Permission necessary to use {@link CarNavigationStatusManager}. 238ce4ffd95d6883b28756e5b02ae45a06013bd6c38Pavel Maltsev */ 239ce4ffd95d6883b28756e5b02ae45a06013bd6c38Pavel Maltsev public static final String PERMISSION_CAR_NAVIGATION_MANAGER = 240e31a8b24afe58bfc924fab7b66c9e48b9ef8e884Keun-young Park "android.car.permission.CAR_NAVIGATION_MANAGER"; 241ce4ffd95d6883b28756e5b02ae45a06013bd6c38Pavel Maltsev 242280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv /** 243905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * Permission necessary to start activities in the instrument cluster through 244905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * {@link CarInstrumentClusterManager} 245905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * 246905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * @hide 247905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev */ 248ced1131dca040724639e7cb18c399b7e38e2fba9Pavel Maltsev @SystemApi 249905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev public static final String PERMISSION_CAR_INSTRUMENT_CLUSTER_CONTROL = 250905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev "android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL"; 251905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 252905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev /** 253905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * Application must have this permission in order to be launched in the instrument cluster 254905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * display. 255905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * 256905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * @hide 257905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev */ 258905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev public static final String PERMISSION_CAR_DISPLAY_IN_CLUSTER = 259905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev "android.car.permission.CAR_DISPLAY_IN_CLUSTER"; 260905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 26168ee16bde23d44fc4bafd30732bf50145a2fe9ffKai /** Permission necessary to use {@link CarInfoManager}. */ 26268ee16bde23d44fc4bafd30732bf50145a2fe9ffKai public static final String PERMISSION_CAR_INFO = "android.car.permission.CAR_INFO"; 26368ee16bde23d44fc4bafd30732bf50145a2fe9ffKai 26468ee16bde23d44fc4bafd30732bf50145a2fe9ffKai /** Permission necessary to read temperature of car's exterior environment. */ 26568ee16bde23d44fc4bafd30732bf50145a2fe9ffKai public static final String PERMISSION_EXTERIOR_ENVIRONMENT = 26668ee16bde23d44fc4bafd30732bf50145a2fe9ffKai "android.car.permission.CAR_EXTERIOR_ENVIRONMENT"; 26768ee16bde23d44fc4bafd30732bf50145a2fe9ffKai 268905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev /** 269280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv * Permission necessary to access car specific communication channel. 270280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv * @hide 271280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv */ 272e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park @SystemApi 273ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final String PERMISSION_VENDOR_EXTENSION = 274e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park "android.car.permission.CAR_VENDOR_EXTENSION"; 275e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park 276280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv /** 277280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv * @hide 278280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv */ 279e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park @SystemApi 2804aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park public static final String PERMISSION_CONTROL_APP_BLOCKING = 281e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park "android.car.permission.CONTROL_APP_BLOCKING"; 282ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 283280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv /** 28443c04a7c87404d078db60e09d2da0061d72357c2Steve Paik * Permission necessary to access Car Cabin APIs. 28543c04a7c87404d078db60e09d2da0061d72357c2Steve Paik * @hide 28643c04a7c87404d078db60e09d2da0061d72357c2Steve Paik */ 28743c04a7c87404d078db60e09d2da0061d72357c2Steve Paik @SystemApi 28868ee16bde23d44fc4bafd30732bf50145a2fe9ffKai public static final String PERMISSION_ADJUST_CAR_CABIN = 28968ee16bde23d44fc4bafd30732bf50145a2fe9ffKai "android.car.permission.ADJUST_CAR_CABIN"; 29025c0b8583d2328ec8e9f9d34587fb80d6bb38099Kai 29125c0b8583d2328ec8e9f9d34587fb80d6bb38099Kai /** 29225c0b8583d2328ec8e9f9d34587fb80d6bb38099Kai * Permission necessary to access car's engine information. 29325c0b8583d2328ec8e9f9d34587fb80d6bb38099Kai * @hide 29425c0b8583d2328ec8e9f9d34587fb80d6bb38099Kai */ 29525c0b8583d2328ec8e9f9d34587fb80d6bb38099Kai @SystemApi 29625c0b8583d2328ec8e9f9d34587fb80d6bb38099Kai public static final String PERMISSION_CAR_ENGINE_DETAILED = 29768ee16bde23d44fc4bafd30732bf50145a2fe9ffKai "android.car.permission.CAR_ENGINE_DETAILED"; 29868ee16bde23d44fc4bafd30732bf50145a2fe9ffKai 29968ee16bde23d44fc4bafd30732bf50145a2fe9ffKai /** 30068ee16bde23d44fc4bafd30732bf50145a2fe9ffKai * Permission necessary to access car's tire pressure information. 30168ee16bde23d44fc4bafd30732bf50145a2fe9ffKai * @hide 30268ee16bde23d44fc4bafd30732bf50145a2fe9ffKai */ 30368ee16bde23d44fc4bafd30732bf50145a2fe9ffKai @SystemApi 30468ee16bde23d44fc4bafd30732bf50145a2fe9ffKai public static final String PERMISSION_TIRES = "android.car.permission.CAR_TIRES"; 30568ee16bde23d44fc4bafd30732bf50145a2fe9ffKai 30668ee16bde23d44fc4bafd30732bf50145a2fe9ffKai /** 30768ee16bde23d44fc4bafd30732bf50145a2fe9ffKai * Permission necessary to control car's door. 30868ee16bde23d44fc4bafd30732bf50145a2fe9ffKai * @hide 30968ee16bde23d44fc4bafd30732bf50145a2fe9ffKai */ 31068ee16bde23d44fc4bafd30732bf50145a2fe9ffKai @SystemApi 31168ee16bde23d44fc4bafd30732bf50145a2fe9ffKai public static final String PERMISSION_CONTROL_CAR_DOORS = 31268ee16bde23d44fc4bafd30732bf50145a2fe9ffKai "android.car.permission.CONTROL_CAR_DOORS"; 31368ee16bde23d44fc4bafd30732bf50145a2fe9ffKai 31468ee16bde23d44fc4bafd30732bf50145a2fe9ffKai /** 31568ee16bde23d44fc4bafd30732bf50145a2fe9ffKai * Permission necessary to control car's windows. 31668ee16bde23d44fc4bafd30732bf50145a2fe9ffKai * @hide 31768ee16bde23d44fc4bafd30732bf50145a2fe9ffKai */ 31868ee16bde23d44fc4bafd30732bf50145a2fe9ffKai @SystemApi 31968ee16bde23d44fc4bafd30732bf50145a2fe9ffKai public static final String PERMISSION_CONTROL_CAR_WINDOWS = 32068ee16bde23d44fc4bafd30732bf50145a2fe9ffKai "android.car.permission.CONTROL_CAR_WINDOWS"; 32168ee16bde23d44fc4bafd30732bf50145a2fe9ffKai 32268ee16bde23d44fc4bafd30732bf50145a2fe9ffKai /** 32368ee16bde23d44fc4bafd30732bf50145a2fe9ffKai * Permission necessary to control car's seats. 32468ee16bde23d44fc4bafd30732bf50145a2fe9ffKai * @hide 32568ee16bde23d44fc4bafd30732bf50145a2fe9ffKai */ 32668ee16bde23d44fc4bafd30732bf50145a2fe9ffKai @SystemApi 32768ee16bde23d44fc4bafd30732bf50145a2fe9ffKai public static final String PERMISSION_CONTROL_CAR_SEATS = 32868ee16bde23d44fc4bafd30732bf50145a2fe9ffKai "android.car.permission.CONTROL_CAR_SEATS"; 32968ee16bde23d44fc4bafd30732bf50145a2fe9ffKai 33068ee16bde23d44fc4bafd30732bf50145a2fe9ffKai /** 33168ee16bde23d44fc4bafd30732bf50145a2fe9ffKai * Permission necessary to control car's mirrors. 33268ee16bde23d44fc4bafd30732bf50145a2fe9ffKai * @hide 33368ee16bde23d44fc4bafd30732bf50145a2fe9ffKai */ 33468ee16bde23d44fc4bafd30732bf50145a2fe9ffKai @SystemApi 33568ee16bde23d44fc4bafd30732bf50145a2fe9ffKai public static final String PERMISSION_CONTROL_CAR_MIRRORS = 33668ee16bde23d44fc4bafd30732bf50145a2fe9ffKai "android.car.permission.CONTROL_CAR_MIRRORS"; 33743c04a7c87404d078db60e09d2da0061d72357c2Steve Paik 33843c04a7c87404d078db60e09d2da0061d72357c2Steve Paik /** 339280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv * Permission necessary to access Car HVAC APIs. 340280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv * @hide 341280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv */ 342e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park @SystemApi 34368ee16bde23d44fc4bafd30732bf50145a2fe9ffKai public static final String PERMISSION_CONTROL_CAR_CLIMATE = 34468ee16bde23d44fc4bafd30732bf50145a2fe9ffKai "android.car.permission.CONTROL_CAR_CLIMATE"; 345ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 346280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv /** 347388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik * Permission necessary to access Car POWER APIs. 348388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik * @hide 349388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik */ 350388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik @SystemApi 351388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik public static final String PERMISSION_CAR_POWER = "android.car.permission.CAR_POWER"; 352b13dbe470108846d1c04494c5c0d2bf3cd9b8054Jason Tholstrup 353280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv /** 354b13dbe470108846d1c04494c5c0d2bf3cd9b8054Jason Tholstrup * Permission necessary to access Car PROJECTION system APIs. 355280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv * @hide 356280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv */ 3576e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv @SystemApi 3586e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv public static final String PERMISSION_CAR_PROJECTION = "android.car.permission.CAR_PROJECTION"; 3596e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv 360280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv /** 361280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv * Permission necessary to mock vehicle hal for testing. 362280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv * @hide 3630d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev * @deprecated mocking vehicle HAL in car service is no longer supported. 364280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv */ 365e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park @SystemApi 366e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park public static final String PERMISSION_MOCK_VEHICLE_HAL = 367e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park "android.car.permission.CAR_MOCK_VEHICLE_HAL"; 368e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park 3691ecdd6ca75fdf8ff62105630664de5125e29676bPavel Maltsev /** 3700d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev * Permission necessary to access CarTestService. 3711ecdd6ca75fdf8ff62105630664de5125e29676bPavel Maltsev * @hide 3721ecdd6ca75fdf8ff62105630664de5125e29676bPavel Maltsev */ 3730d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev @SystemApi 3740d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev public static final String PERMISSION_CAR_TEST_SERVICE = 3750d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev "android.car.permission.CAR_TEST_SERVICE"; 3760d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev 377e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortes /** 37825c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi * Permission necessary to access CarDrivingStateService to get a Car's driving state. 37925c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi * @hide 38025c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi */ 38125c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi @SystemApi 38225c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi public static final String PERMISSION_CAR_DRIVING_STATE = 38325c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi "android.car.permission.CAR_DRIVING_STATE"; 38425c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi 38525c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi /** 3866b3544cf13ee99d6704216c96d40f89aff9bdc2bAntonio Cortes * Permissions necessary to access VMS publisher APIs. 3876b3544cf13ee99d6704216c96d40f89aff9bdc2bAntonio Cortes * 3886b3544cf13ee99d6704216c96d40f89aff9bdc2bAntonio Cortes * @hide 3896b3544cf13ee99d6704216c96d40f89aff9bdc2bAntonio Cortes */ 390dd60089d8b572737997cc78ea0a1e059f9a37c6fAditi Nagaraj @SystemApi 3916b3544cf13ee99d6704216c96d40f89aff9bdc2bAntonio Cortes public static final String PERMISSION_VMS_PUBLISHER = "android.car.permission.VMS_PUBLISHER"; 3926b3544cf13ee99d6704216c96d40f89aff9bdc2bAntonio Cortes 3936b3544cf13ee99d6704216c96d40f89aff9bdc2bAntonio Cortes /** 3946b3544cf13ee99d6704216c96d40f89aff9bdc2bAntonio Cortes * Permissions necessary to access VMS subscriber APIs. 3956b3544cf13ee99d6704216c96d40f89aff9bdc2bAntonio Cortes * 396e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortes * @hide 397e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortes */ 398dd60089d8b572737997cc78ea0a1e059f9a37c6fAditi Nagaraj @SystemApi 399e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortes public static final String PERMISSION_VMS_SUBSCRIBER = "android.car.permission.VMS_SUBSCRIBER"; 400e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortes 4013c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata /** 402ae25b9293df64e4ec71178fbfe999b303a63577eEnrico Granata * Permissions necessary to read diagnostic information, including vendor-specific bits. 4033c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata * 4043c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata * @hide 4053c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata */ 406ae25b9293df64e4ec71178fbfe999b303a63577eEnrico Granata @SystemApi 407ae25b9293df64e4ec71178fbfe999b303a63577eEnrico Granata public static final String PERMISSION_CAR_DIAGNOSTIC_READ_ALL = 40825c0b8583d2328ec8e9f9d34587fb80d6bb38099Kai "android.car.permission.CAR_DIAGNOSTICS"; 4093c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata 4103c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata /** 4113c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata * Permissions necessary to clear diagnostic information. 4123c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata * 4133c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata * @hide 4143c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata */ 415ae25b9293df64e4ec71178fbfe999b303a63577eEnrico Granata @SystemApi 41625c0b8583d2328ec8e9f9d34587fb80d6bb38099Kai public static final String PERMISSION_CAR_DIAGNOSTIC_CLEAR = "android.car.permission.CLEAR_CAR_DIAGNOSTICS"; 4173c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata 4181172f888cd2cf1c2572308fb76a3ad101ab2bcb6Enrico Granata /** 4191172f888cd2cf1c2572308fb76a3ad101ab2bcb6Enrico Granata * Permissions necessary to clear diagnostic information. 4201172f888cd2cf1c2572308fb76a3ad101ab2bcb6Enrico Granata * 4211172f888cd2cf1c2572308fb76a3ad101ab2bcb6Enrico Granata * @hide 4221172f888cd2cf1c2572308fb76a3ad101ab2bcb6Enrico Granata */ 4231172f888cd2cf1c2572308fb76a3ad101ab2bcb6Enrico Granata @SystemApi 4241172f888cd2cf1c2572308fb76a3ad101ab2bcb6Enrico Granata public static final String PERMISSION_STORAGE_MONITORING = "android.car.permission.STORAGE_MONITORING"; 4251172f888cd2cf1c2572308fb76a3ad101ab2bcb6Enrico Granata 4260d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev /** Type of car connection: platform runs directly in car. */ 4270d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev public static final int CONNECTION_TYPE_EMBEDDED = 5; 428e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park 429e4c731ea3ed22615783efb02818b0b3d184bba33Jason Tholstrup 430e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park /** @hide */ 4310d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev @IntDef({CONNECTION_TYPE_EMBEDDED}) 432e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park @Retention(RetentionPolicy.SOURCE) 433e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park public @interface ConnectionType {} 434ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 4353cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal /** 4363cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal * CarXyzService throws IllegalStateException with this message is re-thrown as 4373cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal * {@link CarNotConnectedException}. 4383cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal * 4393cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal * @hide 4403cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal */ 4413cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal public static final String CAR_NOT_CONNECTED_EXCEPTION_MSG = "CarNotConnected"; 4423cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal 44335189a39cbce93de93b677d36f883baa8efe9df0Yao Chen /** 44435189a39cbce93de93b677d36f883baa8efe9df0Yao Chen * Activity Action: Provide media playing through a media template app. 44535189a39cbce93de93b677d36f883baa8efe9df0Yao Chen * <p>Input: String extra mapped by {@link android.app.SearchManager#QUERY} is the query 44635189a39cbce93de93b677d36f883baa8efe9df0Yao Chen * used to start the media. String extra mapped by {@link #CAR_EXTRA_MEDIA_PACKAGE} is the 44735189a39cbce93de93b677d36f883baa8efe9df0Yao Chen * package name of the media app which user wants to play media on. 44835189a39cbce93de93b677d36f883baa8efe9df0Yao Chen * <p>Output: nothing. 44935189a39cbce93de93b677d36f883baa8efe9df0Yao Chen */ 45035189a39cbce93de93b677d36f883baa8efe9df0Yao Chen public static final String CAR_INTENT_ACTION_MEDIA_TEMPLATE = 45135189a39cbce93de93b677d36f883baa8efe9df0Yao Chen "android.car.intent.action.MEDIA_TEMPLATE"; 45235189a39cbce93de93b677d36f883baa8efe9df0Yao Chen 45335189a39cbce93de93b677d36f883baa8efe9df0Yao Chen /** 45435189a39cbce93de93b677d36f883baa8efe9df0Yao Chen * Used as a string extra field with {@link #CAR_INTENT_ACTION_MEDIA_TEMPLATE} to specify the 45535189a39cbce93de93b677d36f883baa8efe9df0Yao Chen * media app that user wants to start the media on. Note: this is not the templated media app. 45635189a39cbce93de93b677d36f883baa8efe9df0Yao Chen */ 45735189a39cbce93de93b677d36f883baa8efe9df0Yao Chen public static final String CAR_EXTRA_MEDIA_PACKAGE = "android.car.intent.extra.MEDIA_PACKAGE"; 45835189a39cbce93de93b677d36f883baa8efe9df0Yao Chen 459e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park /** @hide */ 460e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park public static final String CAR_SERVICE_INTERFACE_NAME = "android.car.ICar"; 461e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park 462e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park private static final String CAR_SERVICE_PACKAGE = "com.android.car"; 463e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park 46444241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park private static final String CAR_SERVICE_CLASS = "com.android.car.CarService"; 46544241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park 46644241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park private static final long CAR_SERVICE_BIND_RETRY_INTERVAL_MS = 500; 46744241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park private static final long CAR_SERVICE_BIND_MAX_RETRY = 20; 46844241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park 469ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung private final Context mContext; 470ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung @GuardedBy("this") 471ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung private ICar mService; 4720d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev private final boolean mOwnsService; 473ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung private static final int STATE_DISCONNECTED = 0; 474ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung private static final int STATE_CONNECTING = 1; 475ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung private static final int STATE_CONNECTED = 2; 476ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung @GuardedBy("this") 477ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung private int mConnectionState; 47844241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park @GuardedBy("this") 47944241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park private int mConnectionRetryCount; 48044241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park 48144241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park private final Runnable mConnectionRetryRunnable = new Runnable() { 48244241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park @Override 48344241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park public void run() { 48444241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park startCarService(); 48544241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park } 48644241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park }; 48744241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park 48844241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park private final Runnable mConnectionRetryFailedRunnable = new Runnable() { 48944241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park @Override 49044241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park public void run() { 49144241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park mServiceConnectionListener.onServiceDisconnected(new ComponentName(CAR_SERVICE_PACKAGE, 49244241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park CAR_SERVICE_CLASS)); 49344241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park } 49444241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park }; 495ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 496e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park private final ServiceConnection mServiceConnectionListener = 497e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park new ServiceConnection () { 498ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public void onServiceConnected(ComponentName name, IBinder service) { 4991ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung synchronized (Car.this) { 500ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung mService = ICar.Stub.asInterface(service); 501ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung mConnectionState = STATE_CONNECTED; 502ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 503ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung mServiceConnectionListenerClient.onServiceConnected(name, service); 504ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 505ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 506ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public void onServiceDisconnected(ComponentName name) { 5071ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung synchronized (Car.this) { 508ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung mService = null; 509ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (mConnectionState == STATE_DISCONNECTED) { 510ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return; 511ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 512cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung mConnectionState = STATE_DISCONNECTED; 513ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 514e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park // unbind explicitly here. 515e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park disconnect(); 516ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung mServiceConnectionListenerClient.onServiceDisconnected(name); 517ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 518ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung }; 519ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 520e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park private final ServiceConnection mServiceConnectionListenerClient; 521ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung private final Object mCarManagerLock = new Object(); 522ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung @GuardedBy("mCarManagerLock") 523ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung private final HashMap<String, CarManagerBase> mServiceMap = new HashMap<>(); 5246b19769ee8cfbe0960d05ecfc01f73d08040784fkeunyoung 5256b19769ee8cfbe0960d05ecfc01f73d08040784fkeunyoung /** Handler for generic event dispatching. */ 5266b19769ee8cfbe0960d05ecfc01f73d08040784fkeunyoung private final Handler mEventHandler; 5276b19769ee8cfbe0960d05ecfc01f73d08040784fkeunyoung 5283ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup private final Handler mMainThreadEventHandler; 52944241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park 5301ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung /** 5318de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev * A factory method that creates Car instance for all Car API access. 532ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @param context 533e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park * @param serviceConnectionListener listener for monitoring service connection. 5343ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup * @param handler the handler on which the callback should execute, or null to execute on the 5353ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup * service's main thread. Note: the service connection listener will be always on the main 5363ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup * thread regardless of the handler given. 5378de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev * @return Car instance if system is in car environment and returns {@code null} otherwise. 538ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 539e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park public static Car createCar(Context context, ServiceConnection serviceConnectionListener, 5403ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup @Nullable Handler handler) { 541e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) { 542e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park Log.e(CarLibLog.TAG_CAR, "FEATURE_AUTOMOTIVE not declared while android.car is used"); 543e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park return null; 544e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park } 5458de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev try { 5463ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup return new Car(context, serviceConnectionListener, handler); 5478de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev } catch (IllegalArgumentException e) { 5488de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev // Expected when car service loader is not available. 5498de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev } 5508de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev return null; 5518de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev } 5528de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev 5538de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev /** 5548de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev * A factory method that creates Car instance for all Car API access using main thread {@code 5558de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev * Looper}. 5568de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev * 5573ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup * @see #createCar(Context, ServiceConnection, Handler) 5588de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev */ 559e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park public static Car createCar(Context context, ServiceConnection serviceConnectionListener) { 5608de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev return createCar(context, serviceConnectionListener, null); 5618de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev } 5628de993354f1a8c30880b535cf8b80fee10c4e882Pavel Maltsev 563e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park private Car(Context context, ServiceConnection serviceConnectionListener, 5643ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup @Nullable Handler handler) { 565ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung mContext = context; 5663ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup mEventHandler = determineEventHandler(handler); 567224220701b9c22ebcfc7dc532714839dca202bb3Yao Chen mMainThreadEventHandler = determineMainThreadEventHandler(mEventHandler); 5683ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup 5693ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup mService = null; 5700d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev mOwnsService = true; 571ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung mServiceConnectionListenerClient = serviceConnectionListener; 572ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 573ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 5743ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup 575ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 5760d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev * Car constructor when ICar binder is already available. 577ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @hide 578ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 5793ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup public Car(Context context, ICar service, @Nullable Handler handler) { 580ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung mContext = context; 5813ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup mEventHandler = determineEventHandler(handler); 582f4f07bf04563b9ad25ff9cdfc96f40790f155e41Keun-young Park mMainThreadEventHandler = determineMainThreadEventHandler(mEventHandler); 5833ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup 584ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung mService = service; 5850d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev mOwnsService = false; 586ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung mConnectionState = STATE_CONNECTED; 587ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung mServiceConnectionListenerClient = null; 588ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 589ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 5903ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup private static Handler determineMainThreadEventHandler(Handler eventHandler) { 5913ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup Looper mainLooper = Looper.getMainLooper(); 5923ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup return (eventHandler.getLooper() == mainLooper) ? eventHandler : new Handler(mainLooper); 5933ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup } 5943ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup 5953ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup private static Handler determineEventHandler(@Nullable Handler handler) { 5963ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup if (handler == null) { 597f4f07bf04563b9ad25ff9cdfc96f40790f155e41Keun-young Park Looper looper = Looper.getMainLooper(); 5983ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup handler = new Handler(looper); 5993ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup } 6003ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup return handler; 6013ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup } 6023ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup 603ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 604ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Connect to car service. This can be called while it is disconnected. 605ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @throws IllegalStateException If connection is still on-going from previous 606ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * connect call or it is already connected 607ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 608ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public void connect() throws IllegalStateException { 609ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung synchronized (this) { 610ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (mConnectionState != STATE_DISCONNECTED) { 611ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung throw new IllegalStateException("already connected or connecting"); 612ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 613ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung mConnectionState = STATE_CONNECTING; 614e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park startCarService(); 615ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 616ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 617ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 618ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 619ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Disconnect from car service. This can be called while disconnected. Once disconnect is 620ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * called, all Car*Managers from this instance becomes invalid, and 621ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * {@link Car#getCarManager(String)} will return different instance if it is connected again. 622ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 623ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public void disconnect() { 624ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung synchronized (this) { 625ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (mConnectionState == STATE_DISCONNECTED) { 626ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return; 627ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 62844241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park mEventHandler.removeCallbacks(mConnectionRetryRunnable); 6293ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup mMainThreadEventHandler.removeCallbacks(mConnectionRetryFailedRunnable); 63044241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park mConnectionRetryCount = 0; 631ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung tearDownCarManagers(); 632ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung mService = null; 633ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung mConnectionState = STATE_DISCONNECTED; 6340d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev 6350d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev if (mOwnsService) { 6360d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev mContext.unbindService(mServiceConnectionListener); 6370d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev } 638ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 639ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 640ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 641ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 642ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Tells if it is connected to the service or not. This will return false if it is still 643ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * connecting. 644ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @return 645ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 646ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public boolean isConnected() { 647ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung synchronized (this) { 648ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return mService != null; 649ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 650ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 651ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 652ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 653ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Tells if this instance is already connecting to car service or not. 654ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @return 655ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 656ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public boolean isConnecting() { 657ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung synchronized (this) { 658ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return mConnectionState == STATE_CONNECTING; 659ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 660ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 661ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 662ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 663ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Get car specific service as in {@link Context#getSystemService(String)}. Returned 664ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * {@link Object} should be type-casted to the desired service. 665ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * For example, to get sensor service, 666ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * SensorManagerService sensorManagerService = car.getCarManager(Car.SENSOR_SERVICE); 667ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @param serviceName Name of service that should be created like {@link #SENSOR_SERVICE}. 668ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @return Matching service manager or null if there is no such service. 669d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup * @throws CarNotConnectedException if the connection to the car service has been lost. 670ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 671235f8acd3cf83079ecd0f3e1b8368b0c9886de82Vitalii Tomkiv public Object getCarManager(String serviceName) throws CarNotConnectedException { 6720477e29bb17ee8ec99acfa5fa966889cd45ebf34Pavel Maltsev CarManagerBase manager; 6731ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung ICar service = getICarOrThrow(); 674ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung synchronized (mCarManagerLock) { 675ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung manager = mServiceMap.get(serviceName); 676ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (manager == null) { 677ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung try { 6781ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung IBinder binder = service.getCarService(serviceName); 679ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (binder == null) { 680ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung Log.w(CarLibLog.TAG_CAR, "getCarManager could not get binder for service:" + 681ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung serviceName); 682ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return null; 683ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 684e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park manager = createCarManager(serviceName, binder); 685ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (manager == null) { 686ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung Log.w(CarLibLog.TAG_CAR, 687ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung "getCarManager could not create manager for service:" + 6880477e29bb17ee8ec99acfa5fa966889cd45ebf34Pavel Maltsev serviceName); 689ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return null; 690ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 691ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung mServiceMap.put(serviceName, manager); 692ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } catch (RemoteException e) { 693e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park handleRemoteException(e); 694ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 695ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 696ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 697ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return manager; 698ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 699ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 700ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 701ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Return the type of currently connected car. 702ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @return 703ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 704ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung @ConnectionType 705e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park public int getCarConnectionType() { 706e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park return CONNECTION_TYPE_EMBEDDED; 707ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 708ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 7093cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal /** 7103cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal * IllegalStateException from XyzCarService with special message is re-thrown as a different 7113cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal * exception. If the IllegalStateException is not understood then this message will throw the 7123cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal * original exception. 7133cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal * 7143cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal * @param e exception from XyzCarService. 715d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup * @throws CarNotConnectedException if the connection to the car service has been lost. 7163cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal * @hide 7173cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal */ 7183cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal public static void checkCarNotConnectedExceptionFromCarService( 7193cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal IllegalStateException e) throws CarNotConnectedException, IllegalStateException { 7203cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal String message = e.getMessage(); 72177ac6cf7366599d48d242205bcf5a67bcc633980Keun-young Park if (CAR_NOT_CONNECTED_EXCEPTION_MSG.equals(message)) { 7223cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal throw new CarNotConnectedException(); 7233cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal } else { 7243cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal throw e; 7253cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal } 7263cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal } 7273cf096ae0d992d22cfba1b0711af2211c511a9feSanket Agarwal 728150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park /** @hide */ 729150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park public static void hideCarNotConnectedExceptionFromCarService( 730150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park IllegalStateException e) throws IllegalStateException { 731150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park String message = e.getMessage(); 732150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park if (CAR_NOT_CONNECTED_EXCEPTION_MSG.equals(message)) { 733150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park return; //ignore 734150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park } else { 735150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park throw e; 736150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park } 737150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park } 738150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park 739235f8acd3cf83079ecd0f3e1b8368b0c9886de82Vitalii Tomkiv private CarManagerBase createCarManager(String serviceName, IBinder binder) 740235f8acd3cf83079ecd0f3e1b8368b0c9886de82Vitalii Tomkiv throws CarNotConnectedException { 741e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park CarManagerBase manager = null; 742e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park switch (serviceName) { 743e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park case AUDIO_SERVICE: 744fe1a8f14e1ac56f095d29336e0986950d8adfc0cKeun-young Park manager = new CarAudioManager(binder, mContext, mEventHandler); 745e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park break; 746e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park case SENSOR_SERVICE: 7473ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup manager = new CarSensorManager(binder, mContext, mEventHandler); 748e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park break; 749e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park case INFO_SERVICE: 750e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park manager = new CarInfoManager(binder); 751e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park break; 75246371473c416415fb6bcb8db85686669c3d65af6Vitalii Tomkiv case APP_FOCUS_SERVICE: 7533ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup manager = new CarAppFocusManager(binder, mEventHandler); 754e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park break; 755e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park case PACKAGE_SERVICE: 756e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park manager = new CarPackageManager(binder, mContext); 757e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park break; 758e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park case CAR_NAVIGATION_SERVICE: 7593388e7848f3a30029935463afafe9b8280939127Keun-young Park manager = new CarNavigationStatusManager(binder); 760e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park break; 76143c04a7c87404d078db60e09d2da0061d72357c2Steve Paik case CABIN_SERVICE: 7623ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup manager = new CarCabinManager(binder, mContext, mEventHandler); 76343c04a7c87404d078db60e09d2da0061d72357c2Steve Paik break; 7645c56d2a3a5bc4ef5b46a58fa56b7f4a657b0827eEnrico Granata case DIAGNOSTIC_SERVICE: 765b3634e209ebcfe2cb987f70cea264bf8b07c3e15Enrico Granata manager = new CarDiagnosticManager(binder, mContext, mEventHandler); 7665c56d2a3a5bc4ef5b46a58fa56b7f4a657b0827eEnrico Granata break; 767e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park case HVAC_SERVICE: 7683ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup manager = new CarHvacManager(binder, mContext, mEventHandler); 769e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park break; 770388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik case POWER_SERVICE: 771388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik manager = new CarPowerManager(binder, mContext, mEventHandler); 772388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik break; 7736e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv case PROJECTION_SERVICE: 7743ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup manager = new CarProjectionManager(binder, mEventHandler); 7756e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv break; 7764d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik case PROPERTY_SERVICE: 7774d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik manager = new CarPropertyManager(binder, mEventHandler, false, 7784d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik "CarPropertyManager"); 7794d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik break; 780634e1ff49c62c32c8227ec5092743de3caca790cPavel Maltsev case VENDOR_EXTENSION_SERVICE: 7813ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup manager = new CarVendorExtensionManager(binder, mEventHandler); 782634e1ff49c62c32c8227ec5092743de3caca790cPavel Maltsev break; 783905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev case CAR_INSTRUMENT_CLUSTER_SERVICE: 784905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev manager = new CarInstrumentClusterManager(binder, mEventHandler); 785905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev break; 786e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park case TEST_SERVICE: 787e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park /* CarTestManager exist in static library. So instead of constructing it here, 788e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park * only pass binder wrapper so that CarTestManager can be constructed outside. */ 789e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park manager = new CarTestManagerBinderWrapper(binder); 790e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park break; 791a7d8ed1681d297bdda8345c1598c7b9a388599beAntonio Cortes case VMS_SUBSCRIBER_SERVICE: 79240f1dede85595b9b5497c5916adf34fbcbbd1d74Anna Linetsky manager = new VmsSubscriberManager(binder); 793a7d8ed1681d297bdda8345c1598c7b9a388599beAntonio Cortes break; 79476a8489d09152192f356e61029eaffc401c5e639Ram Periathiruvadi case BLUETOOTH_SERVICE: 79576a8489d09152192f356e61029eaffc401c5e639Ram Periathiruvadi manager = new CarBluetoothManager(binder, mContext); 79625c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi break; 7979a916d707c04d80e9df6dcd84d976900804be717Enrico Granata case STORAGE_MONITORING_SERVICE: 7987dce379b19970cc64ce5749a3d1a1a95167e99f0Enrico Granata manager = new CarStorageMonitoringManager(binder, mEventHandler); 79925c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi break; 80025c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi case CAR_DRIVING_STATE_SERVICE: 80125c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi manager = new CarDrivingStateManager(binder, mContext, mEventHandler); 80225c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi break; 80325c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi case CAR_UX_RESTRICTION_SERVICE: 8044526a43140177072b5543f3cf0f06bd72fd8e38eRam Periathiruvadi manager = new CarUxRestrictionsManager(binder, mContext, mEventHandler); 80525c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi break; 80612aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen case CAR_CONFIGURATION_SERVICE: 80712aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen manager = new CarConfigurationManager(binder); 80812aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen break; 80925c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi default: 81025c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi break; 811e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park } 812e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park return manager; 813e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park } 814e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park 815e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park private void startCarService() { 816e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park Intent intent = new Intent(); 817e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park intent.setPackage(CAR_SERVICE_PACKAGE); 818e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park intent.setAction(Car.CAR_SERVICE_INTERFACE_NAME); 81944241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park boolean bound = mContext.bindServiceAsUser(intent, mServiceConnectionListener, 82044241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park Context.BIND_AUTO_CREATE, UserHandle.CURRENT_OR_SELF); 82144241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park if (!bound) { 82244241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park mConnectionRetryCount++; 82344241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park if (mConnectionRetryCount > CAR_SERVICE_BIND_MAX_RETRY) { 82444241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park Log.w(CarLibLog.TAG_CAR, "cannot bind to car service after max retry"); 8253ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup mMainThreadEventHandler.post(mConnectionRetryFailedRunnable); 82644241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park } else { 82744241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park mEventHandler.postDelayed(mConnectionRetryRunnable, 82844241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park CAR_SERVICE_BIND_RETRY_INTERVAL_MS); 82944241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park } 83044241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park } else { 83144241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park mConnectionRetryCount = 0; 83244241ffb0717f22650bbcef19c9b68c1f56cac10Keun-young Park } 833e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park } 834e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park 835ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung private synchronized ICar getICarOrThrow() throws IllegalStateException { 836ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (mService == null) { 837ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung throw new IllegalStateException("not connected"); 838ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 839ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return mService; 840ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 841ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 842ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung private void handleRemoteException(RemoteException e) { 843ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung Log.w(CarLibLog.TAG_CAR, "RemoteException", e); 844ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung disconnect(); 845ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 846ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 847ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung private void tearDownCarManagers() { 848ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung synchronized (mCarManagerLock) { 849ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung for (CarManagerBase manager: mServiceMap.values()) { 850ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung manager.onCarDisconnected(); 851ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 852ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung mServiceMap.clear(); 853ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 854ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 855ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung} 856