1afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen/* 2afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen * Copyright (C) 2016 The Android Open Source Project 3afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen * 4afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen * you may not use this file except in compliance with the License. 6afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen * You may obtain a copy of the License at 7afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen * 8afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen * http://www.apache.org/licenses/LICENSE-2.0 9afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen * 10afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen * Unless required by applicable law or agreed to in writing, software 11afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen * distributed under the License is distributed on an "AS IS" BASIS, 12afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen * See the License for the specific language governing permissions and 14afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen * limitations under the License. 15afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen */ 16afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chenpackage com.android.car.test; 17afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 18afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chenimport android.app.Activity; 19afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chenimport android.content.ComponentName; 20afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chenimport android.content.Intent; 21cfe93105f637c2822da113308f113ed418d0b319Pavel Maltsevimport android.hardware.automotive.vehicle.V2_0.VehicleDrivingStatus; 22cfe93105f637c2822da113308f113ed418d0b319Pavel Maltsevimport android.hardware.automotive.vehicle.V2_0.VehiclePropValue; 23cfe93105f637c2822da113308f113ed418d0b319Pavel Maltsevimport android.hardware.automotive.vehicle.V2_0.VehicleProperty; 24cfe93105f637c2822da113308f113ed418d0b319Pavel Maltsevimport android.hardware.automotive.vehicle.V2_0.VehiclePropertyAccess; 25afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chenimport android.os.SystemClock; 269f6f2546729b204c69195e0908a8ea750e7ce9ddsmaraaospimport android.test.suitebuilder.annotation.MediumTest; 27afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 28afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chenimport com.android.car.SystemActivityMonitoringService; 29afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chenimport com.android.car.SystemActivityMonitoringService.TopTaskInfoContainer; 300d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsevimport com.android.car.vehiclehal.VehiclePropValueBuilder; 310d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsevimport com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler; 32afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 33afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chenimport java.util.ArrayList; 34afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chenimport java.util.List; 35afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chenimport java.util.concurrent.Semaphore; 36afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chenimport java.util.concurrent.TimeUnit; 37afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 389f6f2546729b204c69195e0908a8ea750e7ce9ddsmaraaosp@MediumTest 39afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chenpublic class SystemActivityMonitoringServiceTest extends MockedCarTestBase { 40afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen private static final long TIMEOUT_MS = 3000; 41afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen private static final long POLL_INTERVAL_MS = 50; 42afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen private static final Semaphore sAvailable = new Semaphore(0); 43afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 44afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen private final DrivingStatusHandler mDrivingStatusHandler = new DrivingStatusHandler(); 45afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 46afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen @Override 470d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev protected synchronized void configureMockedHal() { 480d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev addProperty(VehicleProperty.DRIVING_STATUS, mDrivingStatusHandler) 490d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev .setAccess(VehiclePropertyAccess.READ); 50afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 51afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 52afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen private void init(boolean drivingStatusRestricted) { 53afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen // Set no restriction to driving status, to avoid CarPackageManagerService to launch a 54afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen // blocking activity. 55afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen mDrivingStatusHandler.setDrivingStatusRestricted(drivingStatusRestricted); 560d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev 573ae759551710424c01c2e985bfc13e7e3d4ee1cbPavel Maltsev // Due to asynchronous nature of Car Service initialization, if we won't wait we may inject 583ae759551710424c01c2e985bfc13e7e3d4ee1cbPavel Maltsev // an event while SensorHalService is not subscribed yet. 593ae759551710424c01c2e985bfc13e7e3d4ee1cbPavel Maltsev assertTrue(getMockedVehicleHal() 603ae759551710424c01c2e985bfc13e7e3d4ee1cbPavel Maltsev .waitForSubscriber(VehicleProperty.DRIVING_STATUS, TIMEOUT_MS)); 613ae759551710424c01c2e985bfc13e7e3d4ee1cbPavel Maltsev 620d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev VehiclePropValue injectValue = 630d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev VehiclePropValueBuilder.newBuilder(VehicleProperty.DRIVING_STATUS) 640d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev .setTimestamp(SystemClock.elapsedRealtimeNanos()) 650d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev .addIntValue(0) 660d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev .build(); 670d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev getMockedVehicleHal().injectEvent(injectValue); 68afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 69afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 70afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen public void testActivityLaunch() { 71afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen init(false); 72afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen List<TopTaskInfoContainer> taskList = new ArrayList<>(); 73afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen SystemActivityMonitoringService systemActivityMonitoringService = 74afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen new SystemActivityMonitoringService(getContext()); 75afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen systemActivityMonitoringService.registerActivityLaunchListener( 76afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen new SystemActivityMonitoringService.ActivityLaunchListener() { 77afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen @Override 78afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen public void onActivityLaunch( 79afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen SystemActivityMonitoringService.TopTaskInfoContainer topTask) { 80afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen taskList.add(topTask); 81afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 82afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen }); 83afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen getContext().startActivity(new Intent(getContext(), ActivityA.class)); 84afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen verifyTopActivityPolling(taskList, 0, new ComponentName(getContext().getPackageName(), 85afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen ActivityA.class.getName())); 86afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen sAvailable.release(); 87afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 88afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen verifyTopActivityPolling(taskList, 1, new ComponentName(getContext().getPackageName(), 89afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen ActivityB.class.getName())); 90afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen sAvailable.release(); 91afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 92afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen verifyTopActivityPolling(taskList, 2, new ComponentName(getContext().getPackageName(), 93afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen ActivityC.class.getName())); 94afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 95afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 96afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen public void testActivityBlocking() { 97afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen init(false); 98afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen Semaphore blocked = new Semaphore(0); 99afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen List<TopTaskInfoContainer> taskList = new ArrayList<>(); 100afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen SystemActivityMonitoringService systemActivityMonitoringService = 101afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen new SystemActivityMonitoringService(getContext()); 102afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 103afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen ComponentName blackListedActivity = new ComponentName(getContext().getPackageName(), 104afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen ActivityC.class.getName()); 105afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen ComponentName blockingActivity = new ComponentName(getContext().getPackageName(), 106afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen BlockingActivity.class.getName()); 107afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen Intent newActivityIntent = new Intent(); 108afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen newActivityIntent.setComponent(blockingActivity); 109afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 110afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen systemActivityMonitoringService.registerActivityLaunchListener( 111afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen new SystemActivityMonitoringService.ActivityLaunchListener() { 112afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen @Override 113afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen public void onActivityLaunch( 114afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen SystemActivityMonitoringService.TopTaskInfoContainer topTask) { 115afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen taskList.add(topTask); 116afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen if (topTask.topActivity.equals(blackListedActivity)) { 117afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen systemActivityMonitoringService.blockActivity(topTask, 118afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen newActivityIntent); 119afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen blocked.release(); 120afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 121afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 122afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen }); 123afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen // start a black listed activity 124afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen getContext().startActivity(new Intent(getContext(), ActivityC.class)); 125afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen // wait for the listener to call blockActivity() 126afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen try { 127afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen blocked.tryAcquire(2, TimeUnit.SECONDS); 128afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } catch (InterruptedException e) { 129afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen fail(e.getMessage()); 130afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 131afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen // We should first receive the blackListedActivity launch, 132afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen // and later the blockActivity launch 133afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen verifyTopActivityPolling(taskList, 0, blackListedActivity); 134afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen verifyTopActivityPolling(taskList, 1, blockingActivity); 135afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 136afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 137afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen private void verifyTopActivityPolling( 138afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen List<TopTaskInfoContainer> topTaskList, int i, ComponentName activity) { 139afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen boolean activityVerified = false; 140afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen int timeElapsedMs = 0; 141afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen try { 142afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen while (!activityVerified && timeElapsedMs <= TIMEOUT_MS) { 143afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen Thread.sleep(POLL_INTERVAL_MS); 144afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen timeElapsedMs += POLL_INTERVAL_MS; 145afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen if (topTaskList.size() <= i) continue; 146afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen TopTaskInfoContainer topTask = topTaskList.get(i); 147afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen if (topTask != null && topTask.topActivity.equals(activity)) { 148afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen activityVerified = true; 149afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen break; 150afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 151afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 152afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen assertEquals(true, activityVerified); 153afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } catch (Exception e) { 154afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen fail(e.toString()); 155afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 156afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 157afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 158afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen public static class ActivityA extends Activity { 159afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen @Override 160afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen protected void onPostResume() { 161afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen super.onPostResume(); 162afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen // Wait until the activity launch event is consumed by the listener. 163afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen try { 164afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen if (!sAvailable.tryAcquire(2, TimeUnit.SECONDS)) { 165afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen fail("Time out"); 166afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 167afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } catch (Exception e) { 168afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen fail(e.toString()); 169afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 170afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen Intent intent = new Intent(this, ActivityB.class); 171afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 172afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen startActivity(intent); 173afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 174afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 175afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 176afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen public static class ActivityB extends Activity { 177afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen @Override 178afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen protected void onPostResume() { 179afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen super.onPostResume(); 180afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen // Wait until the activity launch event is consumed by the listener. 181afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen try { 182afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen if (!sAvailable.tryAcquire(2, TimeUnit.SECONDS)) { 183afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen fail("Time out"); 184afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 185afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } catch (Exception e) { 186afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen fail(e.toString()); 187afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 188afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen Intent intent = new Intent(this, ActivityC.class); 189afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen startActivity(intent); 190afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 191afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 192afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 193afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen public static class ActivityC extends Activity { 194afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 195afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 196afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen public static class BlockingActivity extends Activity { 197afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 198afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 1990d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev private class DrivingStatusHandler implements VehicleHalPropertyHandler { 2000d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev int mDrivingStatus = VehicleDrivingStatus.UNRESTRICTED; 201afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 202afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen public void setDrivingStatusRestricted(boolean restricted) { 2030d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev mDrivingStatus = restricted ? VehicleDrivingStatus.NO_VIDEO 2040d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev : VehicleDrivingStatus.UNRESTRICTED; 205afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 206afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 207afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen @Override 2080d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev public void onPropertySet(VehiclePropValue value) { 209afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 210afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 211afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen @Override 2120d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev public VehiclePropValue onPropertyGet(VehiclePropValue value) { 2130d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev return VehiclePropValueBuilder.newBuilder(VehicleProperty.DRIVING_STATUS) 2140d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev .setTimestamp(SystemClock.elapsedRealtimeNanos()) 2150d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev .addIntValue(mDrivingStatus) 2160d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev .build(); 217afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 218afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 219afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen @Override 2200d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev public void onPropertySubscribe(int property, int zones, float sampleRate) { 221afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 222afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen 223afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen @Override 224afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen public void onPropertyUnsubscribe(int property) { 225afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 226afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen } 227afdc9ae840d5c47aae2954a4f5800f43ed106036Yao Chen}