1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.car;
18 
19 import android.annotation.Nullable;
20 import android.car.annotation.FutureFeature;
21 import android.car.annotation.ValueTypeDef;
22 import android.os.Bundle;
23 import android.os.IBinder;
24 import android.os.RemoteException;
25 
26 
27 import com.android.internal.annotations.GuardedBy;
28 
29 import java.lang.annotation.Retention;
30 import java.lang.annotation.RetentionPolicy;
31 
32 
33 /**
34  * Utility to retrieve various static information from car. Each data are grouped as {@link Bundle}
35  * and relevant data can be checked from {@link Bundle} using pre-specified keys.
36  */
37 public final class CarInfoManager implements CarManagerBase {
38 
39     /**
40      * Key for manufacturer of the car. Passed in basic info Bundle.
41      * @hide
42      */
43     @ValueTypeDef(type = String.class)
44     public static final String BASIC_INFO_KEY_MANUFACTURER = "android.car.manufacturer";
45     /**
46      * Key for model name of the car. This information may not necessarily allow distinguishing
47      * different car models as the same name may be used for different cars depending on
48      * manufacturers. Passed in basic info Bundle.
49      * @hide
50      */
51     @ValueTypeDef(type = String.class)
52     public static final String BASIC_INFO_KEY_MODEL = "android.car.model";
53     /**
54      * Key for model year of the car in AC. Passed in basic info Bundle.
55      * @hide
56      */
57     @ValueTypeDef(type = Integer.class)
58     public static final String BASIC_INFO_KEY_MODEL_YEAR = "android.car.model-year";
59     /**
60      * Key for unique identifier for the car. This is not VIN, and id is persistent until user
61      * resets it. Passed in basic info Bundle.
62      * @hide
63      */
64     @ValueTypeDef(type = String.class)
65     public static final String BASIC_INFO_KEY_VEHICLE_ID = "android.car.vehicle-id";
66 
67     /**
68      * Key for product configuration info.
69      * @FutureFeature Cannot drop due to usage in non-flag protected place.
70      * @hide
71      */
72     @ValueTypeDef(type = String.class)
73     public static final String INFO_KEY_PRODUCT_CONFIGURATION = "android.car.product-config";
74 
75     /* TODO bug: 32059999
76     //@ValueTypeDef(type = Integer.class)
77     //public static final String KEY_DRIVER_POSITION = "driver-position";
78 
79     //@ValueTypeDef(type = int[].class)
80     //public static final String KEY_SEAT_CONFIGURATION = "seat-configuration";
81 
82     //@ValueTypeDef(type = Integer.class)
83     //public static final String KEY_WINDOW_CONFIGURATION = "window-configuration";
84 
85     //MT, AT, CVT, ...
86     //@ValueTypeDef(type = Integer.class)
87     //public static final String KEY_TRANSMISSION_TYPE = "transmission-type";
88 
89     // add: transmission gear available selection, gear available steps
90     //          drive wheel: FWD, RWD, AWD, 4WD */
91 
92     private final ICarInfo mService;
93 
94     @GuardedBy("this")
95     private Bundle mBasicInfo;
96 
97     /**
98      * Return manufacturer of the car.
99      * @return null if information is not available.
100      */
getManufacturer()101     public @android.annotation.Nullable String getManufacturer() throws CarNotConnectedException {
102         return getBasicInfo().getString(BASIC_INFO_KEY_MANUFACTURER);
103     }
104 
105     /**
106      * Return model name of the car. This information may not necessarily allow distinguishing
107      * different car models as the same name may be used for different cars depending on
108      * manufacturers.
109      * @return null if information is not available.
110      */
getModel()111     public @Nullable String getModel() throws CarNotConnectedException {
112         return getBasicInfo().getString(BASIC_INFO_KEY_MODEL);
113     }
114 
115     /**
116      * Return model year of the car in AC.
117      * @return null if information is not available.
118      */
getModelYear()119     public @Nullable String getModelYear() throws CarNotConnectedException {
120         return getBasicInfo().getString(BASIC_INFO_KEY_MODEL_YEAR);
121     }
122 
123     /**
124      * Return unique identifier for the car. This is not VIN, and id is persistent until user
125      * resets it. This ID is guaranteed to be always available.
126      * @return vehicle id
127      */
getVehicleId()128     public String getVehicleId() throws CarNotConnectedException {
129         return getBasicInfo().getString(BASIC_INFO_KEY_VEHICLE_ID);
130     }
131 
132     /**
133      * Get product configuration string. Contents of this string is product specific but it should
134      * be composed of key-value pairs with the format of:
135      *   key1=value1;key2=value2;...
136      * @return null if such information is not available in this car.
137      * @throws CarNotConnectedException
138      * @hide
139      */
140     @FutureFeature
getProductConfiguration()141     public @Nullable String getProductConfiguration() throws CarNotConnectedException {
142         try {
143             return mService.getStringInfo(INFO_KEY_PRODUCT_CONFIGURATION);
144         } catch (IllegalStateException e) {
145             CarApiUtil.checkCarNotConnectedExceptionFromCarService(e);
146         } catch (RemoteException e) {
147             throw new CarNotConnectedException(e);
148         }
149         return null;
150     }
151 
152     /**
153      * Get {@link android.os.Bundle} containing basic car information. Check
154      * {@link #BASIC_INFO_KEY_MANUFACTURER}, {@link #BASIC_INFO_KEY_MODEL},
155      * {@link #BASIC_INFO_KEY_MODEL_YEAR}, and {@link #BASIC_INFO_KEY_VEHICLE_ID} for supported
156      * keys in the {@link android.os.Bundle}.
157      * @return {@link android.os.Bundle} containing basic car info.
158      * @throws CarNotConnectedException
159      */
getBasicInfo()160     private synchronized Bundle getBasicInfo() throws CarNotConnectedException {
161         if (mBasicInfo != null) {
162             return mBasicInfo;
163         }
164         try {
165             mBasicInfo = mService.getBasicInfo();
166         } catch (IllegalStateException e) {
167             CarApiUtil.checkCarNotConnectedExceptionFromCarService(e);
168         } catch (RemoteException e) {
169             throw new CarNotConnectedException(e);
170         }
171         return mBasicInfo;
172     }
173 
174     /** @hide */
CarInfoManager(IBinder service)175     CarInfoManager(IBinder service) {
176         mService = ICarInfo.Stub.asInterface(service);
177     }
178 
179     /** @hide */
180     @Override
onCarDisconnected()181     public void onCarDisconnected() {
182         synchronized (this) {
183             mBasicInfo = null;
184         }
185     }
186 }
187