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}