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