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
17ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungpackage com.android.car;
18ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
19abd4723ef632cf4cb62146f1ef83af6110baae18Pavel Maltsevimport android.annotation.MainThread;
20e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chenimport android.app.UiModeManager;
21e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport android.car.Car;
22e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport android.car.ICar;
230477e29bb17ee8ec99acfa5fa966889cd45ebf34Pavel Maltsevimport android.car.cluster.renderer.IInstrumentClusterNavigation;
24d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zhengimport android.car.user.CarUserManagerHelper;
25ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungimport android.content.Context;
261ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoungimport android.content.pm.PackageManager;
27cfe93105f637c2822da113308f113ed418d0b319Pavel Maltsevimport android.hardware.automotive.vehicle.V2_0.IVehicle;
285cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadiimport android.hardware.automotive.vehicle.V2_0.VehicleArea;
29aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Parkimport android.os.Binder;
30e8056ca93515f01f237290bbc371bc082570fa96Enrico Granataimport android.os.Build;
31ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungimport android.os.IBinder;
32aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Parkimport android.os.Process;
33c302c7c9f8f67664052501a8ed388f3c28156465Steve Paikimport android.os.Trace;
34ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungimport android.util.Log;
35c302c7c9f8f67664052501a8ed388f3c28156465Steve Paikimport android.util.Slog;
364a79a38b5f73596f39ea41794c6bd6d9bde12ce9Keun-young Parkimport android.util.TimingsTraceLog;
3726fa601421977b1ceb90da1544879e5cb1f90267Gregory Clark
381ecdd6ca75fdf8ff62105630664de5125e29676bPavel Maltsevimport com.android.car.cluster.InstrumentClusterService;
39cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoungimport com.android.car.hal.VehicleHal;
40c52d5f9f6190cf9a44dd6dfd3bc92386fbf023b3Antonio Cortesimport com.android.car.internal.FeatureConfiguration;
414aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Parkimport com.android.car.pm.CarPackageManagerService;
42b19bc326413285806ecca7fb7b54ec7a9074f286Enrico Granataimport com.android.car.systeminterface.SystemInterface;
43d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zhengimport com.android.car.user.CarUserService;
44ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungimport com.android.internal.annotations.GuardedBy;
451d8bea24a5680b7fd452835a407e4a7438cc5d4aSteve Paikimport com.android.internal.car.ICarServiceHelper;
4626fa601421977b1ceb90da1544879e5cb1f90267Gregory Clark
47e8056ca93515f01f237290bbc371bc082570fa96Enrico Granataimport java.io.FileDescriptor;
48a3b28d81e0c8df531ac704f9e649e38ea90483d2keunyoungimport java.io.PrintWriter;
49d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zhengimport java.util.ArrayList;
50e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortesimport java.util.Arrays;
51d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zhengimport java.util.List;
52a3b28d81e0c8df531ac704f9e649e38ea90483d2keunyoung
53ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungpublic class ICarImpl extends ICar.Stub {
54ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
5549d5a5a4b57b38abbfb6e83fcbaf066cba595c07Ram Periathiruvadi    public static final String INTERNAL_INPUT_SERVICE = "internal_input";
564727da3796711ddd09d8c684fe50a341841284eeKeun-young Park    public static final String INTERNAL_SYSTEM_ACTIVITY_MONITORING_SERVICE =
574727da3796711ddd09d8c684fe50a341841284eeKeun-young Park            "system_activity_monitoring";
58a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park
59ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    private final Context mContext;
60ec83b63c47f65c5978eec3ee24952969a17b1ee7Pavel Maltsev    private final VehicleHal mHal;
61ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
6212aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen    private final SystemInterface mSystemInterface;
6312aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen
644727da3796711ddd09d8c684fe50a341841284eeKeun-young Park    private final SystemActivityMonitoringService mSystemActivityMonitoringService;
654b0212c1b3576f4174c292bbcdd72815584ff075keunyoung    private final CarPowerManagementService mCarPowerManagementService;
66a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park    private final CarPackageManagerService mCarPackageManagerService;
67a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park    private final CarInputService mCarInputService;
6825c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi    private final CarDrivingStateService mCarDrivingStateService;
694526a43140177072b5543f3cf0f06bd72fd8e38eRam Periathiruvadi    private final CarUxRestrictionsManagerService mCarUXRestrictionsService;
70d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    private final CarAudioService mCarAudioService;
716e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv    private final CarProjectionService mCarProjectionService;
724d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik    private final CarPropertyService mCarPropertyService;
73317343df4ba11bc3923e95bff30ed5a54bb66e5cJoseph Pirozzo    private final CarNightService mCarNightService;
7446371473c416415fb6bcb8db85686669c3d65af6Vitalii Tomkiv    private final AppFocusService mAppFocusService;
753a7976d83f52def1e6200f393f68ae7ddfa3fe56Yao Chen    private final GarageModeService mGarageModeService;
761ecdd6ca75fdf8ff62105630664de5125e29676bPavel Maltsev    private final InstrumentClusterService mInstrumentClusterService;
77d8136065ef09e3987598f339477f5371a9c4bb45Gregory Clark    private final CarLocationService mCarLocationService;
78d73afaeb1c4c64ddad94e696a0fd88147888dee1Keun-young Park    private final SystemStateControllerService mSystemStateControllerService;
797ed8418790b9e30ef90bc808ce8641a6c2d814d4Ram Periathiruvadi    private final CarBluetoothService mCarBluetoothService;
80acb6024180232a2c0b6bad6f14758ef28d8f63f7Ram Periathiruvadi    private final PerUserCarServiceHelper mPerUserCarServiceHelper;
819a916d707c04d80e9df6dcd84d976900804be717Enrico Granata    private final CarDiagnosticService mCarDiagnosticService;
829a916d707c04d80e9df6dcd84d976900804be717Enrico Granata    private final CarStorageMonitoringService mCarStorageMonitoringService;
8312aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen    private final CarConfigurationService mCarConfigurationService;
8412aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen
85d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng    private final CarUserManagerHelper mUserManagerHelper;
86d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng    private CarUserService mCarUserService;
87e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortes    private VmsSubscriberService mVmsSubscriberService;
886b3544cf13ee99d6704216c96d40f89aff9bdc2bAntonio Cortes    private VmsPublisherService mVmsPublisherService;
89a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung
900d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev    private final CarServiceBase[] mAllServices;
910d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev
92c302c7c9f8f67664052501a8ed388f3c28156465Steve Paik    private static final String TAG = "ICarImpl";
93c302c7c9f8f67664052501a8ed388f3c28156465Steve Paik    private static final String VHAL_TIMING_TAG = "VehicleHalTiming";
944a79a38b5f73596f39ea41794c6bd6d9bde12ce9Keun-young Park    private static final TimingsTraceLog mBootTiming = new TimingsTraceLog(VHAL_TIMING_TAG,
95d8136065ef09e3987598f339477f5371a9c4bb45Gregory Clark            Trace.TRACE_TAG_HAL);
96c302c7c9f8f67664052501a8ed388f3c28156465Steve Paik
971ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    /** Test only service. Populate it only when necessary. */
981ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    @GuardedBy("this")
991ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    private CarTestService mCarTestService;
100ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
101aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Park    @GuardedBy("this")
102aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Park    private ICarServiceHelper mICarServiceHelper;
103aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Park
104e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata    private final String mVehicleInterfaceName;
105e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata
106ec83b63c47f65c5978eec3ee24952969a17b1ee7Pavel Maltsev    public ICarImpl(Context serviceContext, IVehicle vehicle, SystemInterface systemInterface,
107e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            CanBusErrorNotifier errorNotifier, String vehicleInterfaceName) {
108ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        mContext = serviceContext;
1090f9fc00ffb03bc8e88c0a55e2e21b4ffdba19edfSteve Paik        mSystemInterface = systemInterface;
1100d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev        mHal = new VehicleHal(vehicle);
111e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata        mVehicleInterfaceName = vehicleInterfaceName;
1124727da3796711ddd09d8c684fe50a341841284eeKeun-young Park        mSystemActivityMonitoringService = new SystemActivityMonitoringService(serviceContext);
113388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik        mCarPowerManagementService = new CarPowerManagementService(mContext, mHal.getPowerHal(),
114388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik                systemInterface);
1154d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik        mCarPropertyService = new CarPropertyService(serviceContext, mHal.getPropertyHal());
1164d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik        mCarDrivingStateService = new CarDrivingStateService(serviceContext, mCarPropertyService);
1174526a43140177072b5543f3cf0f06bd72fd8e38eRam Periathiruvadi        mCarUXRestrictionsService = new CarUxRestrictionsManagerService(serviceContext,
1184d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik                mCarDrivingStateService, mCarPropertyService);
1192da6d0efdd5676ba5c48b00a7f3bb04a113eeafaRam Periathiruvadi        mCarPackageManagerService = new CarPackageManagerService(serviceContext,
1202da6d0efdd5676ba5c48b00a7f3bb04a113eeafaRam Periathiruvadi                mCarUXRestrictionsService,
1214727da3796711ddd09d8c684fe50a341841284eeKeun-young Park                mSystemActivityMonitoringService);
1220d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev        mCarInputService = new CarInputService(serviceContext, mHal.getInputHal());
1236e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv        mCarProjectionService = new CarProjectionService(serviceContext, mCarInputService);
1243a7976d83f52def1e6200f393f68ae7ddfa3fe56Yao Chen        mGarageModeService = new GarageModeService(mContext, mCarPowerManagementService);
12526fa601421977b1ceb90da1544879e5cb1f90267Gregory Clark        mCarLocationService = new CarLocationService(mContext, mCarPowerManagementService,
1264d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik                mCarPropertyService);
1278c7f297a4c5440fcb50c2a039229e73e9c6c388bVitalii Tomkiv        mAppFocusService = new AppFocusService(serviceContext, mSystemActivityMonitoringService);
12830557233bd224b3416dda11b57288d3ea0ee55e4Hongwei Wang        mCarAudioService = new CarAudioService(serviceContext);
1294d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik        mCarNightService = new CarNightService(serviceContext, mCarPropertyService);
1300477e29bb17ee8ec99acfa5fa966889cd45ebf34Pavel Maltsev        mInstrumentClusterService = new InstrumentClusterService(serviceContext,
13103cf60ce1ac0c87d137f93aeaac4b3062cdf839cPavel Maltsev                mAppFocusService, mCarInputService);
132d73afaeb1c4c64ddad94e696a0fd88147888dee1Keun-young Park        mSystemStateControllerService = new SystemStateControllerService(serviceContext,
1333cb891017933140b613cfaf5b8422c112c0f32dcKeun-young Park                mCarPowerManagementService, mCarAudioService, this);
134acb6024180232a2c0b6bad6f14758ef28d8f63f7Ram Periathiruvadi        mPerUserCarServiceHelper = new PerUserCarServiceHelper(serviceContext);
1354d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik        mCarBluetoothService = new CarBluetoothService(serviceContext, mCarPropertyService,
1364d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik                mPerUserCarServiceHelper, mCarUXRestrictionsService);
13739e4f034a93dc2abbbf28ac8a5c09f6612fdaba3Asaf Rosenfeld        mVmsSubscriberService = new VmsSubscriberService(serviceContext, mHal.getVmsHal());
13839e4f034a93dc2abbbf28ac8a5c09f6612fdaba3Asaf Rosenfeld        mVmsPublisherService = new VmsPublisherService(serviceContext, mHal.getVmsHal());
139b3634e209ebcfe2cb987f70cea264bf8b07c3e15Enrico Granata        mCarDiagnosticService = new CarDiagnosticService(serviceContext, mHal.getDiagnosticHal());
140517a1e0666fc801dc38ee387013bb05ee965b1a6Enrico Granata        mCarStorageMonitoringService = new CarStorageMonitoringService(serviceContext,
141517a1e0666fc801dc38ee387013bb05ee965b1a6Enrico Granata                systemInterface);
14212aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen        mCarConfigurationService =
14312aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen                new CarConfigurationService(serviceContext, new JsonReaderImpl());
144d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        mUserManagerHelper = new CarUserManagerHelper(serviceContext);
145a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung
146a3b28d81e0c8df531ac704f9e649e38ea90483d2keunyoung        // Be careful with order. Service depending on other service should be inited later.
147d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        List<CarServiceBase> allServices = new ArrayList<>();
148d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mSystemActivityMonitoringService);
149d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mCarPowerManagementService);
1504d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik        allServices.add(mCarPropertyService);
151d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mCarDrivingStateService);
152d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mCarUXRestrictionsService);
153d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mCarPackageManagerService);
154d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mCarInputService);
155d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mCarLocationService);
156d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mGarageModeService);
157d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mAppFocusService);
158d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mCarAudioService);
159d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mCarNightService);
160d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mInstrumentClusterService);
161d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mCarProjectionService);
162d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mSystemStateControllerService);
163d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mCarBluetoothService);
164d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mCarDiagnosticService);
165d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mPerUserCarServiceHelper);
166d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mCarStorageMonitoringService);
167d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mCarConfigurationService);
168d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mVmsSubscriberService);
169d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        allServices.add(mVmsPublisherService);
170d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng
171d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        if (mUserManagerHelper.isHeadlessSystemUser()) {
172d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng            mCarUserService = new CarUserService(serviceContext, mUserManagerHelper);
173d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng            allServices.add(mCarUserService);
174d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        }
175d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng
176d3cb98e76080151bdfb5085b8971b5070f11d28bYing Zheng        mAllServices = allServices.toArray(new CarServiceBase[allServices.size()]);
177ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
178ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
179abd4723ef632cf4cb62146f1ef83af6110baae18Pavel Maltsev    @MainThread
1808edd2555182213bc576d0493fffe0973368e22c2Pavel Maltsev    void init() {
181c302c7c9f8f67664052501a8ed388f3c28156465Steve Paik        traceBegin("VehicleHal.init");
1820d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev        mHal.init();
183c302c7c9f8f67664052501a8ed388f3c28156465Steve Paik        traceEnd();
184c302c7c9f8f67664052501a8ed388f3c28156465Steve Paik        traceBegin("CarService.initAllServices");
185ee28c00d9a031c7316e47027482d8d6178574f35Ram Periathiruvadi        for (CarServiceBase service : mAllServices) {
186a3b28d81e0c8df531ac704f9e649e38ea90483d2keunyoung            service.init();
187a3b28d81e0c8df531ac704f9e649e38ea90483d2keunyoung        }
188c302c7c9f8f67664052501a8ed388f3c28156465Steve Paik        traceEnd();
189ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
190ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
1918edd2555182213bc576d0493fffe0973368e22c2Pavel Maltsev    void release() {
192a3b28d81e0c8df531ac704f9e649e38ea90483d2keunyoung        // release done in opposite order from init
193a3b28d81e0c8df531ac704f9e649e38ea90483d2keunyoung        for (int i = mAllServices.length - 1; i >= 0; i--) {
194a3b28d81e0c8df531ac704f9e649e38ea90483d2keunyoung            mAllServices[i].release();
195a3b28d81e0c8df531ac704f9e649e38ea90483d2keunyoung        }
1960d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev        mHal.release();
1971ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
1981ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
1998edd2555182213bc576d0493fffe0973368e22c2Pavel Maltsev    void vehicleHalReconnected(IVehicle vehicle) {
200ec83b63c47f65c5978eec3ee24952969a17b1ee7Pavel Maltsev        mHal.vehicleHalReconnected(vehicle);
201ec83b63c47f65c5978eec3ee24952969a17b1ee7Pavel Maltsev        for (CarServiceBase service : mAllServices) {
202ec83b63c47f65c5978eec3ee24952969a17b1ee7Pavel Maltsev            service.vehicleHalReconnected();
203ec83b63c47f65c5978eec3ee24952969a17b1ee7Pavel Maltsev        }
204ec83b63c47f65c5978eec3ee24952969a17b1ee7Pavel Maltsev    }
205ec83b63c47f65c5978eec3ee24952969a17b1ee7Pavel Maltsev
206ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    @Override
207aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Park    public void setCarServiceHelper(IBinder helper) {
208aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Park        int uid = Binder.getCallingUid();
209aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Park        if (uid != Process.SYSTEM_UID) {
210aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Park            throw new SecurityException("Only allowed from system");
211aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Park        }
212aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Park        synchronized (this) {
213aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Park            mICarServiceHelper = ICarServiceHelper.Stub.asInterface(helper);
2140f9fc00ffb03bc8e88c0a55e2e21b4ffdba19edfSteve Paik            mSystemInterface.setCarServiceHelper(mICarServiceHelper);
215aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Park        }
216aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Park    }
217aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Park
218aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Park    @Override
219ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public IBinder getCarService(String serviceName) {
220ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        switch (serviceName) {
2215672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park            case Car.AUDIO_SERVICE:
2225672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park                return mCarAudioService;
22346371473c416415fb6bcb8db85686669c3d65af6Vitalii Tomkiv            case Car.APP_FOCUS_SERVICE:
22446371473c416415fb6bcb8db85686669c3d65af6Vitalii Tomkiv                return mAppFocusService;
22545fdcbaab5699d7d8153bfda058d0eea2049c8b8Keun-young Park            case Car.PACKAGE_SERVICE:
22645fdcbaab5699d7d8153bfda058d0eea2049c8b8Keun-young Park                return mCarPackageManagerService;
2275c56d2a3a5bc4ef5b46a58fa56b7f4a657b0827eEnrico Granata            case Car.DIAGNOSTIC_SERVICE:
228b3634e209ebcfe2cb987f70cea264bf8b07c3e15Enrico Granata                assertAnyDiagnosticPermission(mContext);
229b3634e209ebcfe2cb987f70cea264bf8b07c3e15Enrico Granata                return mCarDiagnosticService;
230388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik            case Car.POWER_SERVICE:
231388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik                assertPowerPermission(mContext);
232388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik                return mCarPowerManagementService;
2334d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik            case Car.CABIN_SERVICE:
2344d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik            case Car.HVAC_SERVICE:
2354d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik            case Car.INFO_SERVICE:
2364d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik            case Car.PROPERTY_SERVICE:
2374d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik            case Car.SENSOR_SERVICE:
2384d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik            case Car.VENDOR_EXTENSION_SERVICE:
2394d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik                return mCarPropertyService;
2407a948e54331cccf96f178ab426cb7810472c2dc8Pavel Maltsev            case Car.CAR_NAVIGATION_SERVICE:
241e31a8b24afe58bfc924fab7b66c9e48b9ef8e884Keun-young Park                assertNavigationManagerPermission(mContext);
2420477e29bb17ee8ec99acfa5fa966889cd45ebf34Pavel Maltsev                IInstrumentClusterNavigation navService =
2430477e29bb17ee8ec99acfa5fa966889cd45ebf34Pavel Maltsev                        mInstrumentClusterService.getNavigationService();
2440477e29bb17ee8ec99acfa5fa966889cd45ebf34Pavel Maltsev                return navService == null ? null : navService.asBinder();
245905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev            case Car.CAR_INSTRUMENT_CLUSTER_SERVICE:
246905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev                assertClusterManagerPermission(mContext);
247905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev                return mInstrumentClusterService.getManagerService();
2486e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv            case Car.PROJECTION_SERVICE:
2496e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv                assertProjectionPermission(mContext);
2506e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv                return mCarProjectionService;
251e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortes            case Car.VMS_SUBSCRIBER_SERVICE:
25239e4f034a93dc2abbbf28ac8a5c09f6612fdaba3Asaf Rosenfeld                assertVmsSubscriberPermission(mContext);
25339e4f034a93dc2abbbf28ac8a5c09f6612fdaba3Asaf Rosenfeld                return mVmsSubscriberService;
254e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park            case Car.TEST_SERVICE: {
2550d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev                assertPermission(mContext, Car.PERMISSION_CAR_TEST_SERVICE);
2561ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                synchronized (this) {
2571ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                    if (mCarTestService == null) {
2581ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                        mCarTestService = new CarTestService(mContext, this);
2591ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                    }
2601ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                    return mCarTestService;
2611ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                }
2621ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            }
26376a8489d09152192f356e61029eaffc401c5e639Ram Periathiruvadi            case Car.BLUETOOTH_SERVICE:
26476a8489d09152192f356e61029eaffc401c5e639Ram Periathiruvadi                return mCarBluetoothService;
2659a916d707c04d80e9df6dcd84d976900804be717Enrico Granata            case Car.STORAGE_MONITORING_SERVICE:
2661172f888cd2cf1c2572308fb76a3ad101ab2bcb6Enrico Granata                assertPermission(mContext, Car.PERMISSION_STORAGE_MONITORING);
2679a916d707c04d80e9df6dcd84d976900804be717Enrico Granata                return mCarStorageMonitoringService;
26825c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi            case Car.CAR_DRIVING_STATE_SERVICE:
26925c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi                assertDrivingStatePermission(mContext);
27025c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi                return mCarDrivingStateService;
27125c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi            case Car.CAR_UX_RESTRICTION_SERVICE:
27225c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi                return mCarUXRestrictionsService;
273d4203d84835b5deba4818f23623a4a1ef4acbbbbAnthony Chen            case Car.CAR_CONFIGURATION_SERVICE:
274d4203d84835b5deba4818f23623a4a1ef4acbbbbAnthony Chen                return mCarConfigurationService;
275ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            default:
276ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung                Log.w(CarLog.TAG_SERVICE, "getCarService for unknown service:" + serviceName);
277ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung                return null;
278ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        }
279ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
280ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
2811ecdd6ca75fdf8ff62105630664de5125e29676bPavel Maltsev    @Override
2821ecdd6ca75fdf8ff62105630664de5125e29676bPavel Maltsev    public int getCarConnectionType() {
2830d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev        return Car.CONNECTION_TYPE_EMBEDDED;
2841ecdd6ca75fdf8ff62105630664de5125e29676bPavel Maltsev    }
2851ecdd6ca75fdf8ff62105630664de5125e29676bPavel Maltsev
286a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park    public CarServiceBase getCarInternalService(String serviceName) {
287a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park        switch (serviceName) {
288a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park            case INTERNAL_INPUT_SERVICE:
289a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park                return mCarInputService;
2904727da3796711ddd09d8c684fe50a341841284eeKeun-young Park            case INTERNAL_SYSTEM_ACTIVITY_MONITORING_SERVICE:
2914727da3796711ddd09d8c684fe50a341841284eeKeun-young Park                return mSystemActivityMonitoringService;
292a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park            default:
293a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park                Log.w(CarLog.TAG_SERVICE, "getCarInternalService for unknown service:" +
294a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park                        serviceName);
295a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park                return null;
296a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park        }
297a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park    }
298a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park
2991ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public static void assertVehicleHalMockPermission(Context context) {
300461ecc6c9bd22f782e8c64a6693bd8ec6d61593eSteve Paik        assertPermission(context, Car.PERMISSION_MOCK_VEHICLE_HAL);
3011ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
3021ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
303e31a8b24afe58bfc924fab7b66c9e48b9ef8e884Keun-young Park    public static void assertNavigationManagerPermission(Context context) {
304461ecc6c9bd22f782e8c64a6693bd8ec6d61593eSteve Paik        assertPermission(context, Car.PERMISSION_CAR_NAVIGATION_MANAGER);
305ce4ffd95d6883b28756e5b02ae45a06013bd6c38Pavel Maltsev    }
306ce4ffd95d6883b28756e5b02ae45a06013bd6c38Pavel Maltsev
307905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev    public static void assertClusterManagerPermission(Context context) {
308905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev        assertPermission(context, Car.PERMISSION_CAR_INSTRUMENT_CLUSTER_CONTROL);
309905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev    }
310905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev
311388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik    public static void assertPowerPermission(Context context) {
312388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik        assertPermission(context, Car.PERMISSION_CAR_POWER);
313388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik    }
314388d77770e00eadde4e45df95678f1468ce6fbc8Steve Paik
3156e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv    public static void assertProjectionPermission(Context context) {
316461ecc6c9bd22f782e8c64a6693bd8ec6d61593eSteve Paik        assertPermission(context, Car.PERMISSION_CAR_PROJECTION);
317461ecc6c9bd22f782e8c64a6693bd8ec6d61593eSteve Paik    }
318461ecc6c9bd22f782e8c64a6693bd8ec6d61593eSteve Paik
3193c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata    public static void assertAnyDiagnosticPermission(Context context) {
3203c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata        assertAnyPermission(context,
321ae25b9293df64e4ec71178fbfe999b303a63577eEnrico Granata                Car.PERMISSION_CAR_DIAGNOSTIC_READ_ALL,
3223c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata                Car.PERMISSION_CAR_DIAGNOSTIC_CLEAR);
3233c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata    }
3243c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata
32525c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi    public static void assertDrivingStatePermission(Context context) {
32625c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi        assertPermission(context, Car.PERMISSION_CAR_DRIVING_STATE);
32725c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi    }
32825c16f168c685c11065836d2682dfb1dfef2b60dRam Periathiruvadi
3296b3544cf13ee99d6704216c96d40f89aff9bdc2bAntonio Cortes    public static void assertVmsPublisherPermission(Context context) {
3306b3544cf13ee99d6704216c96d40f89aff9bdc2bAntonio Cortes        assertPermission(context, Car.PERMISSION_VMS_PUBLISHER);
3316b3544cf13ee99d6704216c96d40f89aff9bdc2bAntonio Cortes    }
3326b3544cf13ee99d6704216c96d40f89aff9bdc2bAntonio Cortes
333e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortes    public static void assertVmsSubscriberPermission(Context context) {
334e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortes        assertPermission(context, Car.PERMISSION_VMS_SUBSCRIBER);
335e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortes    }
336e4619c7bdd549833cb795b74e438a7d1f3caa1b5Antonio Cortes
337461ecc6c9bd22f782e8c64a6693bd8ec6d61593eSteve Paik    public static void assertPermission(Context context, String permission) {
338461ecc6c9bd22f782e8c64a6693bd8ec6d61593eSteve Paik        if (context.checkCallingOrSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
339461ecc6c9bd22f782e8c64a6693bd8ec6d61593eSteve Paik            throw new SecurityException("requires " + permission);
3406e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv        }
3416e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv    }
3426e5ee61be4c24ae4d647d687901b7c9670c25899Vitalii Tomkiv
3434d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik    /**
3444d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik     * Checks to see if the caller has a permission.
3454d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik     * @param context
3464d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik     * @param permission
3474d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik     *
3484d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik     * @return boolean TRUE if caller has the permission.
3494d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik     */
3504d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik    public static boolean hasPermission(Context context, String permission) {
3514d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik        return context.checkCallingOrSelfPermission(permission)
3524d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik                == PackageManager.PERMISSION_GRANTED;
3534d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik    }
3544d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik
3553c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata    public static void assertAnyPermission(Context context, String... permissions) {
3563c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata        for (String permission : permissions) {
3573c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata            if (context.checkCallingOrSelfPermission(permission) ==
3583c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata                    PackageManager.PERMISSION_GRANTED) {
3593c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata                return;
3603c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata            }
3613c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata        }
3623c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata        throw new SecurityException("requires any of " + Arrays.toString(permissions));
3633c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata    }
3643c7a66693e28acaa82d3c9ff2ed99712270c889fEnrico Granata
365e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata    @Override
366e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata    protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
367e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
36812aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen                != PackageManager.PERMISSION_GRANTED) {
369e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            writer.println("Permission Denial: can't dump CarService from from pid="
37012aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen                    + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()
37112aec30c0cee9ad19c1457e661395f27a5e9a27bAnthony Chen                    + " without permission " + android.Manifest.permission.DUMP);
372e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            return;
3731ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        }
374e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata        if (args == null || args.length == 0) {
375e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            writer.println("*dump car service*");
376e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata
377e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            writer.println("*FutureConfig, DEFAULT:" + FeatureConfiguration.DEFAULT);
378e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            writer.println("*Dump all services*");
379e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            for (CarServiceBase service : mAllServices) {
380e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata                dumpService(service, writer);
381e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            }
382e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            if (mCarTestService != null) {
383e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata                dumpService(mCarTestService, writer);
384e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            }
385e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            writer.println("*Dump Vehicle HAL*");
386e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            writer.println("Vehicle HAL Interface: " + mVehicleInterfaceName);
387e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            try {
388e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata                // TODO dump all feature flags by creating a dumpable interface
389e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata                mHal.dump(writer);
390e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            } catch (Exception e) {
391e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata                writer.println("Failed dumping: " + mHal.getClass().getName());
392e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata                e.printStackTrace(writer);
393e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            }
394e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata        } else if (Build.IS_USERDEBUG || Build.IS_ENG) {
395e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            execShellCmd(args, writer);
396e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata        } else {
397e8056ca93515f01f237290bbc371bc082570fa96Enrico Granata            writer.println("Commands not supported in " + Build.TYPE);
398ed3d59bbe179399a8520ea137cda14f018c9068dBrad Stenning        }
399ed3d59bbe179399a8520ea137cda14f018c9068dBrad Stenning    }
400ed3d59bbe179399a8520ea137cda14f018c9068dBrad Stenning
401ed3d59bbe179399a8520ea137cda14f018c9068dBrad Stenning    private void dumpService(CarServiceBase service, PrintWriter writer) {
402ed3d59bbe179399a8520ea137cda14f018c9068dBrad Stenning        try {
403ed3d59bbe179399a8520ea137cda14f018c9068dBrad Stenning            service.dump(writer);
404ed3d59bbe179399a8520ea137cda14f018c9068dBrad Stenning        } catch (Exception e) {
405ed3d59bbe179399a8520ea137cda14f018c9068dBrad Stenning            writer.println("Failed dumping: " + service.getClass().getName());
406ed3d59bbe179399a8520ea137cda14f018c9068dBrad Stenning            e.printStackTrace(writer);
407ed3d59bbe179399a8520ea137cda14f018c9068dBrad Stenning        }
408cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung    }
409e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen
410e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen    void execShellCmd(String[] args, PrintWriter writer) {
411e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen        new CarShellCommand().exec(args, writer);
412e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen    }
413e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen
414abd4723ef632cf4cb62146f1ef83af6110baae18Pavel Maltsev    @MainThread
415c302c7c9f8f67664052501a8ed388f3c28156465Steve Paik    private static void traceBegin(String name) {
416c302c7c9f8f67664052501a8ed388f3c28156465Steve Paik        Slog.i(TAG, name);
417c302c7c9f8f67664052501a8ed388f3c28156465Steve Paik        mBootTiming.traceBegin(name);
418c302c7c9f8f67664052501a8ed388f3c28156465Steve Paik    }
419c302c7c9f8f67664052501a8ed388f3c28156465Steve Paik
420abd4723ef632cf4cb62146f1ef83af6110baae18Pavel Maltsev    @MainThread
421c302c7c9f8f67664052501a8ed388f3c28156465Steve Paik    private static void traceEnd() {
422c302c7c9f8f67664052501a8ed388f3c28156465Steve Paik        mBootTiming.traceEnd();
423c302c7c9f8f67664052501a8ed388f3c28156465Steve Paik    }
424c302c7c9f8f67664052501a8ed388f3c28156465Steve Paik
425e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen    private class CarShellCommand {
426e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen        private static final String COMMAND_HELP = "-h";
427e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen        private static final String COMMAND_DAY_NIGHT_MODE = "day-night-mode";
4285cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi        private static final String COMMAND_INJECT_VHAL_EVENT = "inject-vhal-event";
429bf0eab7a275edfbf7df2881ebca69cde72bd5614Ram Periathiruvadi        private static final String COMMAND_ENABLE_UXR = "enable-uxr";
430a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler        private static final String COMMAND_GARAGE_MODE = "garage-mode";
4313838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi        private static final String COMMAND_GET_DO_ACTIVITIES = "get-do-activities";
432ee28c00d9a031c7316e47027482d8d6178574f35Ram Periathiruvadi
433e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen        private static final String PARAM_DAY_MODE = "day";
434e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen        private static final String PARAM_NIGHT_MODE = "night";
435e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen        private static final String PARAM_SENSOR_MODE = "sensor";
4365cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi        private static final String PARAM_VEHICLE_PROPERTY_AREA_GLOBAL = "0";
437a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler        private static final String PARAM_ON_MODE = "on";
438a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler        private static final String PARAM_OFF_MODE = "off";
439a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler        private static final String PARAM_QUERY_MODE = "query";
4405cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi
441e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen
442e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen        private void dumpHelp(PrintWriter pw) {
443e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen            pw.println("Car service commands:");
444e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen            pw.println("\t-h");
445e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen            pw.println("\t  Print this help text.");
446e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen            pw.println("\tday-night-mode [day|night|sensor]");
447e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen            pw.println("\t  Force into day/night mode or restore to auto.");
4485cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi            pw.println("\tinject-vhal-event property [zone] data(can be comma separated list)");
4495cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi            pw.println("\t  Inject a vehicle property for testing");
450bf0eab7a275edfbf7df2881ebca69cde72bd5614Ram Periathiruvadi            pw.println("\tdisable-uxr true|false");
451bf0eab7a275edfbf7df2881ebca69cde72bd5614Ram Periathiruvadi            pw.println("\t  Disable UX restrictions and App blocking.");
452a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler            pw.println("\tgarage-mode [on|off|query]");
453a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler            pw.println("\t  Force into garage mode or check status.");
4543838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi            pw.println("\tget-do-activities pkgname");
4553838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi            pw.println("\t Get Distraction Optimized activities in given package");
456e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen        }
457e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen
458e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen        public void exec(String[] args, PrintWriter writer) {
459e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen            String arg = args[0];
460e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen            switch (arg) {
461e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                case COMMAND_HELP:
462e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    dumpHelp(writer);
463e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    break;
464a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                case COMMAND_DAY_NIGHT_MODE: {
465e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    String value = args.length < 1 ? "" : args[1];
466e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    forceDayNightMode(value, writer);
467e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    break;
468a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                }
469a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                case COMMAND_GARAGE_MODE: {
470a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                    String value = args.length < 1 ? "" : args[1];
471a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                    forceGarageMode(value, writer);
472a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                    break;
473a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                }
4745cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                case COMMAND_INJECT_VHAL_EVENT:
4755cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                    String zone = PARAM_VEHICLE_PROPERTY_AREA_GLOBAL;
4765cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                    String data;
4775cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                    if (args.length < 3) {
4785cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                        writer.println("Incorrect number of arguments.");
4795cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                        dumpHelp(writer);
4805cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                        break;
4815cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                    } else if (args.length > 3) {
4825cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                        // Zoned
4835cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                        zone = args[2];
4845cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                        data = args[3];
4855cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                    } else {
4865cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                        // Global
4875cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                        data = args[2];
488ee28c00d9a031c7316e47027482d8d6178574f35Ram Periathiruvadi                    }
4895cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                    injectVhalEvent(args[1], zone, data, writer);
490ee28c00d9a031c7316e47027482d8d6178574f35Ram Periathiruvadi                    break;
491bf0eab7a275edfbf7df2881ebca69cde72bd5614Ram Periathiruvadi                case COMMAND_ENABLE_UXR:
492bf0eab7a275edfbf7df2881ebca69cde72bd5614Ram Periathiruvadi                    if (args.length < 2) {
493bf0eab7a275edfbf7df2881ebca69cde72bd5614Ram Periathiruvadi                        writer.println("Incorrect number of arguments");
494bf0eab7a275edfbf7df2881ebca69cde72bd5614Ram Periathiruvadi                        dumpHelp(writer);
495bf0eab7a275edfbf7df2881ebca69cde72bd5614Ram Periathiruvadi                        break;
496bf0eab7a275edfbf7df2881ebca69cde72bd5614Ram Periathiruvadi                    }
497bf0eab7a275edfbf7df2881ebca69cde72bd5614Ram Periathiruvadi                    boolean enableBlocking = Boolean.valueOf(args[1]);
498bf0eab7a275edfbf7df2881ebca69cde72bd5614Ram Periathiruvadi                    if (mCarPackageManagerService != null) {
499bf0eab7a275edfbf7df2881ebca69cde72bd5614Ram Periathiruvadi                        mCarPackageManagerService.setEnableActivityBlocking(enableBlocking);
500bf0eab7a275edfbf7df2881ebca69cde72bd5614Ram Periathiruvadi                    }
501bf0eab7a275edfbf7df2881ebca69cde72bd5614Ram Periathiruvadi                    break;
5023838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                case COMMAND_GET_DO_ACTIVITIES:
5033838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                    if (args.length < 2) {
5043838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                        writer.println("Incorrect number of arguments");
5053838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                        dumpHelp(writer);
5063838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                        break;
5073838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                    }
5083838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                    String pkgName = args[1].toLowerCase();
5093838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                    if (mCarPackageManagerService != null) {
5103838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                        String[] doActivities =
5113838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                                mCarPackageManagerService.getDistractionOptimizedActivities(
5123838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                                        pkgName);
5133838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                        if (doActivities != null) {
5143838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                            writer.println("DO Activities for " + pkgName);
5153838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                            for (String a : doActivities) {
5163838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                                writer.println(a);
5173838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                            }
5183838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                        } else {
5193838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                            writer.println("No DO Activities for " + pkgName);
5203838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                        }
5213838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                    }
5223838830086d818960d556841427a2e415a7999c5Ram Periathiruvadi                    break;
523e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                default:
524e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    writer.println("Unknown command.");
525e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    dumpHelp(writer);
526e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen            }
527e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen        }
528e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen
529e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen        private void forceDayNightMode(String arg, PrintWriter writer) {
530e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen            int mode;
531e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen            switch (arg) {
532e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                case PARAM_DAY_MODE:
533e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    mode = CarNightService.FORCED_DAY_MODE;
534e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    break;
535e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                case PARAM_NIGHT_MODE:
536e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    mode = CarNightService.FORCED_NIGHT_MODE;
537e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    break;
538e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                case PARAM_SENSOR_MODE:
539e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    mode = CarNightService.FORCED_SENSOR_MODE;
540e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    break;
541e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                default:
542e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    writer.println("Unknown value. Valid argument: " + PARAM_DAY_MODE + "|"
543e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                            + PARAM_NIGHT_MODE + "|" + PARAM_SENSOR_MODE);
544e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    return;
545e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen            }
546e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen            int current = mCarNightService.forceDayNightMode(mode);
547e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen            String currentMode = null;
548e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen            switch (current) {
549e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                case UiModeManager.MODE_NIGHT_AUTO:
550e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    currentMode = PARAM_SENSOR_MODE;
551e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    break;
552e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                case UiModeManager.MODE_NIGHT_YES:
553e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    currentMode = PARAM_NIGHT_MODE;
554e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    break;
555e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                case UiModeManager.MODE_NIGHT_NO:
556e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    currentMode = PARAM_DAY_MODE;
557e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen                    break;
558e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen            }
559e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen            writer.println("DayNightMode changed to: " + currentMode);
560e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen        }
561ee28c00d9a031c7316e47027482d8d6178574f35Ram Periathiruvadi
562a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler        private void forceGarageMode(String arg, PrintWriter writer) {
563a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler            switch (arg) {
564a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                case PARAM_ON_MODE:
565a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                    mGarageModeService.onPrepareShutdown(false);
566a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                    break;
567a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                case PARAM_OFF_MODE:
568a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                    mGarageModeService.onSleepEntry();
569a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                    break;
570a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                case PARAM_QUERY_MODE:
571a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                    // Nothing to do. Always query at the end anyway.
572a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                    break;
573a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                default:
574a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                    writer.println("Unknown value. Valid argument: " + PARAM_ON_MODE + "|"
575a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                            + PARAM_OFF_MODE + "|" + PARAM_QUERY_MODE);
576a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler                    return;
577a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler            }
578a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler            writer.println("Garage mode: " + mGarageModeService.isInGarageMode());
579a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler        }
580a32a7c1831202999940091fc51efb0a9dec980cfBryan Eyler
581ee28c00d9a031c7316e47027482d8d6178574f35Ram Periathiruvadi        /**
5825cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi         * Inject a fake  VHAL event
58349d5a5a4b57b38abbfb6e83fcbaf066cba595c07Ram Periathiruvadi         *
5845cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi         * @param property the Vehicle property Id as defined in the HAL
5855cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi         * @param zone     Zone that this event services
5865cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi         * @param value    Data value of the event
5875cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi         * @param writer   PrintWriter
588ee28c00d9a031c7316e47027482d8d6178574f35Ram Periathiruvadi         */
5895cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi        private void injectVhalEvent(String property, String zone, String value,
59049d5a5a4b57b38abbfb6e83fcbaf066cba595c07Ram Periathiruvadi                PrintWriter writer) {
5915cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi            if (zone != null && (zone.equalsIgnoreCase(PARAM_VEHICLE_PROPERTY_AREA_GLOBAL))) {
5925cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                if (!isPropertyAreaTypeGlobal(property)) {
5935cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                    writer.println("Property area type inconsistent with given zone");
5945cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                    return;
5955cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                }
596ee28c00d9a031c7316e47027482d8d6178574f35Ram Periathiruvadi            }
597ee28c00d9a031c7316e47027482d8d6178574f35Ram Periathiruvadi            try {
5985cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                mHal.injectVhalEvent(property, zone, value);
599ee28c00d9a031c7316e47027482d8d6178574f35Ram Periathiruvadi            } catch (NumberFormatException e) {
6005cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                writer.println("Invalid property Id zone Id or value" + e);
6015cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                dumpHelp(writer);
602ee28c00d9a031c7316e47027482d8d6178574f35Ram Periathiruvadi            }
603ee28c00d9a031c7316e47027482d8d6178574f35Ram Periathiruvadi        }
604ee28c00d9a031c7316e47027482d8d6178574f35Ram Periathiruvadi
6055cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi        // Check if the given property is global
6065cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi        private boolean isPropertyAreaTypeGlobal(String property) {
6075cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi            if (property == null) {
6085cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi                return false;
60949d5a5a4b57b38abbfb6e83fcbaf066cba595c07Ram Periathiruvadi            }
6105cd00cb14ad8c8e6a05eb494831d028886d385a1Ram Periathiruvadi            return (Integer.decode(property) & VehicleArea.MASK) == VehicleArea.GLOBAL;
61149d5a5a4b57b38abbfb6e83fcbaf066cba595c07Ram Periathiruvadi        }
612e33f07e7c149ae6bf9154745fd9f83b49127b4f7Yao Chen    }
613aab47cd81c75e4fe4a486a665f61287d83f79967Keun-young Park}
614