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