blob: 6e3d585b87b3a7482dd8bb4c669927b8228200ae [file] [log] [blame]
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.google.android.car.kitchensink.sensor;
18
Steve Paikb8058202018-06-06 18:11:55 -070019import static java.lang.Integer.toHexString;
20
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -070021import android.Manifest;
22import android.annotation.Nullable;
23import android.car.Car;
Steve Paikb8058202018-06-06 18:11:55 -070024import android.car.hardware.CarSensorConfig;
25import android.car.hardware.CarSensorEvent;
26import android.car.hardware.CarSensorManager;
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -070027import android.content.pm.PackageManager;
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -070028import android.os.Bundle;
29import android.os.Handler;
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -070030import android.text.TextUtils;
Kai4805eff2019-01-22 18:03:37 -080031import android.text.method.ScrollingMovementMethod;
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -070032import android.util.Log;
33import android.view.LayoutInflater;
34import android.view.View;
35import android.view.ViewGroup;
36import android.widget.TextView;
37
Anthony Chend12cd772018-04-16 16:20:44 -070038import androidx.fragment.app.Fragment;
39
Srinivas Visvanathanf8544232017-03-24 11:52:53 -070040import com.google.android.car.kitchensink.KitchenSinkActivity;
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -070041import com.google.android.car.kitchensink.R;
42
43import java.text.DateFormat;
44import java.text.SimpleDateFormat;
45import java.util.ArrayList;
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -070046import java.util.HashSet;
47import java.util.List;
48import java.util.Map;
49import java.util.Set;
50import java.util.concurrent.ConcurrentHashMap;
51
52public class SensorsTestFragment extends Fragment {
53 private static final String TAG = "CAR.SENSOR.KS";
54 private static final boolean DBG = true;
Steve Paikb8058202018-06-06 18:11:55 -070055 private static final boolean DBG_VERBOSE = true;
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -070056 private static final int KS_PERMISSIONS_REQUEST = 1;
57
58 private final static String[] REQUIRED_PERMISSIONS = new String[]{
59 Manifest.permission.ACCESS_FINE_LOCATION,
60 Manifest.permission.ACCESS_COARSE_LOCATION,
61 Car.PERMISSION_MILEAGE,
Kai68ee16b2018-03-22 11:57:37 -070062 Car.PERMISSION_ENERGY,
Steve Paik289ab992017-07-11 22:40:57 -070063 Car.PERMISSION_SPEED,
Kai68ee16b2018-03-22 11:57:37 -070064 Car.PERMISSION_CAR_DYNAMICS_STATE
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -070065 };
66
Jason Tholstrupd72b5352016-09-22 16:32:14 -070067 private final CarSensorManager.OnSensorChangedListener mOnSensorChangedListener =
68 new CarSensorManager.OnSensorChangedListener() {
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -070069 @Override
Steve Paikb8058202018-06-06 18:11:55 -070070 public void onSensorChanged(CarSensorEvent event) {
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -070071 if (DBG_VERBOSE) {
72 Log.v(TAG, "New car sensor event: " + event);
73 }
74 synchronized (SensorsTestFragment.this) {
75 mEventMap.put(event.sensorType, event);
76 }
Scott Randolph75d2f122018-07-11 22:04:55 -070077 refreshSensorInfoText();
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -070078 }
79 };
80 private final Handler mHandler = new Handler();
81 private final Map<Integer, CarSensorEvent> mEventMap = new ConcurrentHashMap<>();
82 private final DateFormat mDateFormat = SimpleDateFormat.getDateTimeInstance();
83
Srinivas Visvanathanf8544232017-03-24 11:52:53 -070084 private KitchenSinkActivity mActivity;
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -070085 private Car mCar;
Scott Randolph75d2f122018-07-11 22:04:55 -070086 private CarSensorManager mCarSensorManager;
87 private LocationListeners mLocationListener;
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -070088 private String mNaString;
89 private int[] supportedSensors = new int[0];
90 private Set<String> mActivePermissions = new HashSet<String>();
91
Scott Randolph75d2f122018-07-11 22:04:55 -070092 private TextView mSensorInfo;
93 private TextView mLocationInfo;
94 private TextView mAccelInfo;
95 private TextView mGyroInfo;
96 private TextView mMagInfo;
97
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -070098 @Nullable
99 @Override
100 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
101 @Nullable Bundle savedInstanceState) {
102 if (DBG) {
103 Log.i(TAG, "onCreateView");
104 }
105
106 View view = inflater.inflate(R.layout.sensors, container, false);
Srinivas Visvanathanf8544232017-03-24 11:52:53 -0700107 mActivity = (KitchenSinkActivity) getHost();
Scott Randolph75d2f122018-07-11 22:04:55 -0700108
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700109 mSensorInfo = (TextView) view.findViewById(R.id.sensor_info);
Kai4805eff2019-01-22 18:03:37 -0800110 mSensorInfo.setMovementMethod(new ScrollingMovementMethod());
Scott Randolph75d2f122018-07-11 22:04:55 -0700111 mLocationInfo = (TextView) view.findViewById(R.id.location_info);
Kai4805eff2019-01-22 18:03:37 -0800112 mLocationInfo.setMovementMethod(new ScrollingMovementMethod());
Scott Randolph75d2f122018-07-11 22:04:55 -0700113 mAccelInfo = (TextView) view.findViewById(R.id.accel_info);
114 mGyroInfo = (TextView) view.findViewById(R.id.gyro_info);
115 mMagInfo = (TextView) view.findViewById(R.id.mag_info);
116
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700117 mNaString = getContext().getString(R.string.sensor_na);
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700118 return view;
119 }
120
121 @Override
122 public void onResume() {
123 super.onResume();
Kaicf3387b2018-06-20 12:37:52 -0700124 final Runnable r = () -> {
125 initPermissions();
126 };
127 ((KitchenSinkActivity) getActivity()).requestRefreshManager(r,
128 new Handler(getContext().getMainLooper()));
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700129 }
130
131 @Override
132 public void onPause() {
133 super.onPause();
Scott Randolph75d2f122018-07-11 22:04:55 -0700134 if (mCarSensorManager != null) {
135 mCarSensorManager.unregisterListener(mOnSensorChangedListener);
136 }
137 if (mLocationListener != null) {
138 mLocationListener.stopListening();
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700139 }
140 }
141
142 private void initSensors() {
143 try {
Scott Randolph75d2f122018-07-11 22:04:55 -0700144 if (mCarSensorManager == null) {
145 mCarSensorManager =
146 (CarSensorManager) ((KitchenSinkActivity) getActivity()).getSensorManager();
147 }
148 supportedSensors = mCarSensorManager.getSupportedSensors();
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700149 for (Integer sensor : supportedSensors) {
Scott Randolph75d2f122018-07-11 22:04:55 -0700150 mCarSensorManager.registerListener(mOnSensorChangedListener, sensor,
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700151 CarSensorManager.SENSOR_RATE_NORMAL);
152 }
Steve Paikb8058202018-06-06 18:11:55 -0700153 } catch (Exception e) {
Scott Randolph75d2f122018-07-11 22:04:55 -0700154 Log.e(TAG, "initSensors() exception caught SensorManager: ", e);
155 }
156 try {
157 if (mLocationListener == null) {
158 mLocationListener = new LocationListeners(getContext(),
159 new LocationInfoTextUpdateListener());
160 }
161 mLocationListener.startListening();
162 } catch (Exception e) {
163 Log.e(TAG, "initSensors() exception caught from LocationListeners: ", e);
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700164 }
165 }
166
167 private void initPermissions() {
168 Set<String> missingPermissions = checkExistingPermissions();
169 if (!missingPermissions.isEmpty()) {
170 requestPermissions(missingPermissions);
Scott Randolph75d2f122018-07-11 22:04:55 -0700171 // The callback with premission results will take care of calling initSensors for us
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700172 } else {
173 initSensors();
174 }
175 }
176
177 private Set<String> checkExistingPermissions() {
178 Set<String> missingPermissions = new HashSet<String>();
179 for (String permission : REQUIRED_PERMISSIONS) {
Srinivas Visvanathanf8544232017-03-24 11:52:53 -0700180 if (mActivity.checkSelfPermission(permission)
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700181 == PackageManager.PERMISSION_GRANTED) {
182 mActivePermissions.add(permission);
183 } else {
184 missingPermissions.add(permission);
185 }
186 }
187 return missingPermissions;
188 }
189
190 private void requestPermissions(Set<String> permissions) {
191 Log.d(TAG, "requesting additional permissions=" + permissions);
192
193 requestPermissions(permissions.toArray(new String[permissions.size()]),
194 KS_PERMISSIONS_REQUEST);
195 }
196
197 @Override
198 public void onRequestPermissionsResult(int requestCode, String[] permissions,
199 int[] grantResults) {
200 Log.d(TAG, "onRequestPermissionsResult reqCode=" + requestCode);
201 if (KS_PERMISSIONS_REQUEST == requestCode) {
202 for (int i=0; i<permissions.length; i++) {
203 if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
204 mActivePermissions.add(permissions[i]);
205 }
206 }
207 initSensors();
208 }
209 }
210
Scott Randolph75d2f122018-07-11 22:04:55 -0700211 private void refreshSensorInfoText() {
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700212 String summaryString;
213 synchronized (this) {
214 List<String> summary = new ArrayList<>();
215 for (Integer i : supportedSensors) {
216 CarSensorEvent event = mEventMap.get(i);
217 switch (i) {
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700218 case CarSensorManager.SENSOR_TYPE_CAR_SPEED:
219 summary.add(getContext().getString(R.string.sensor_speed,
220 getTimestamp(event),
Steve Paikb8058202018-06-06 18:11:55 -0700221 event == null ? mNaString : event.getCarSpeedData(null).carSpeed));
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700222 break;
223 case CarSensorManager.SENSOR_TYPE_RPM:
224 summary.add(getContext().getString(R.string.sensor_rpm,
225 getTimestamp(event),
Steve Paikb8058202018-06-06 18:11:55 -0700226 event == null ? mNaString : event.getRpmData(null).rpm));
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700227 break;
228 case CarSensorManager.SENSOR_TYPE_ODOMETER:
229 summary.add(getContext().getString(R.string.sensor_odometer,
230 getTimestamp(event),
Steve Paikb8058202018-06-06 18:11:55 -0700231 event == null ? mNaString : event.getOdometerData(null).kms));
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700232 break;
233 case CarSensorManager.SENSOR_TYPE_FUEL_LEVEL:
Steve Paikd0ebac22017-07-17 07:10:53 -0700234 summary.add(getFuelLevel(event));
235 break;
236 case CarSensorManager.SENSOR_TYPE_FUEL_DOOR_OPEN:
237 summary.add(getFuelDoorOpen(event));
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700238 break;
Kaif5711072018-06-07 16:25:46 -0700239 case CarSensorManager.SENSOR_TYPE_IGNITION_STATE:
240 summary.add(getContext().getString(R.string.sensor_ignition_status,
241 getTimestamp(event),
242 event == null ? mNaString :
243 event.getIgnitionStateData(null).ignitionState));
244 break;
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700245 case CarSensorManager.SENSOR_TYPE_PARKING_BRAKE:
Gene Karshenboyme73a1462017-06-21 15:21:07 -0700246 summary.add(getContext().getString(R.string.sensor_parking_brake,
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700247 getTimestamp(event),
248 event == null ? mNaString :
Steve Paikb8058202018-06-06 18:11:55 -0700249 event.getParkingBrakeData(null).isEngaged));
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700250 break;
251 case CarSensorManager.SENSOR_TYPE_GEAR:
252 summary.add(getContext().getString(R.string.sensor_gear,
253 getTimestamp(event),
Steve Paikb8058202018-06-06 18:11:55 -0700254 event == null ? mNaString : event.getGearData(null).gear));
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700255 break;
256 case CarSensorManager.SENSOR_TYPE_NIGHT:
257 summary.add(getContext().getString(R.string.sensor_night,
258 getTimestamp(event),
Steve Paikb8058202018-06-06 18:11:55 -0700259 event == null ? mNaString : event.getNightData(null).isNightMode));
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700260 break;
Kaif5711072018-06-07 16:25:46 -0700261 case CarSensorManager.SENSOR_TYPE_ENV_OUTSIDE_TEMPERATURE:
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700262 String temperature = mNaString;
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700263 if (event != null) {
Steve Paikb8058202018-06-06 18:11:55 -0700264 CarSensorEvent.EnvironmentData env = event.getEnvironmentData(null);
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700265 temperature = Float.isNaN(env.temperature) ? temperature :
266 String.valueOf(env.temperature);
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700267 }
268 summary.add(getContext().getString(R.string.sensor_environment,
Kaif5711072018-06-07 16:25:46 -0700269 getTimestamp(event), temperature));
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700270 break;
Steve Paik289ab992017-07-11 22:40:57 -0700271 case CarSensorManager.SENSOR_TYPE_WHEEL_TICK_DISTANCE:
272 if(event != null) {
273 CarSensorEvent.CarWheelTickDistanceData d =
Steve Paikb8058202018-06-06 18:11:55 -0700274 event.getCarWheelTickDistanceData(null);
Steve Paik289ab992017-07-11 22:40:57 -0700275 summary.add(getContext().getString(R.string.sensor_wheel_ticks,
276 getTimestamp(event), d.sensorResetCount, d.frontLeftWheelDistanceMm,
277 d.frontRightWheelDistanceMm, d.rearLeftWheelDistanceMm,
278 d.rearRightWheelDistanceMm));
279 } else {
280 summary.add(getContext().getString(R.string.sensor_wheel_ticks,
281 getTimestamp(event), mNaString, mNaString, mNaString, mNaString,
282 mNaString));
283 }
Steve Paika2819902017-07-18 15:51:26 -0700284 // Get the config data
Justin Paupore97b4df72019-02-12 19:40:39 -0800285 CarSensorConfig c = mCarSensorManager.getSensorConfig(
Steve Paika2819902017-07-18 15:51:26 -0700286 CarSensorManager.SENSOR_TYPE_WHEEL_TICK_DISTANCE);
Justin Paupore97b4df72019-02-12 19:40:39 -0800287 summary.add(getContext().getString(R.string.sensor_wheel_ticks_cfg,
Steve Paika2819902017-07-18 15:51:26 -0700288 c.getInt(CarSensorConfig.WHEEL_TICK_DISTANCE_SUPPORTED_WHEELS),
289 c.getInt(CarSensorConfig.WHEEL_TICK_DISTANCE_FRONT_LEFT_UM_PER_TICK),
290 c.getInt(CarSensorConfig.WHEEL_TICK_DISTANCE_FRONT_RIGHT_UM_PER_TICK),
291 c.getInt(CarSensorConfig.WHEEL_TICK_DISTANCE_REAR_LEFT_UM_PER_TICK),
292 c.getInt(CarSensorConfig.WHEEL_TICK_DISTANCE_REAR_RIGHT_UM_PER_TICK)));
Steve Paik289ab992017-07-11 22:40:57 -0700293 break;
294 case CarSensorManager.SENSOR_TYPE_ABS_ACTIVE:
295 summary.add(getContext().getString(R.string.sensor_abs_is_active,
296 getTimestamp(event), event == null ? mNaString :
Steve Paikb8058202018-06-06 18:11:55 -0700297 event.getCarAbsActiveData(null).absIsActive));
Steve Paik289ab992017-07-11 22:40:57 -0700298 break;
299
300 case CarSensorManager.SENSOR_TYPE_TRACTION_CONTROL_ACTIVE:
301 summary.add(
302 getContext().getString(R.string.sensor_traction_control_is_active,
303 getTimestamp(event), event == null ? mNaString :
Steve Paikb8058202018-06-06 18:11:55 -0700304 event.getCarTractionControlActiveData(null)
305 .tractionControlIsActive));
Steve Paik289ab992017-07-11 22:40:57 -0700306 break;
Steve Paikd0ebac22017-07-17 07:10:53 -0700307 case CarSensorManager.SENSOR_TYPE_EV_BATTERY_LEVEL:
308 summary.add(getEvBatteryLevel(event));
309 break;
310 case CarSensorManager.SENSOR_TYPE_EV_CHARGE_PORT_OPEN:
311 summary.add(getEvChargePortOpen(event));
312 break;
313 case CarSensorManager.SENSOR_TYPE_EV_CHARGE_PORT_CONNECTED:
314 summary.add(getEvChargePortConnected(event));
315 break;
316 case CarSensorManager.SENSOR_TYPE_EV_BATTERY_CHARGE_RATE:
317 summary.add(getEvChargeRate(event));
318 break;
smara0d269532018-03-29 13:48:13 -0700319 case CarSensorManager.SENSOR_TYPE_ENGINE_OIL_LEVEL:
320 summary.add(getEngineOilLevel(event));
321 break;
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700322 default:
323 // Should never happen.
Steve Paikb8058202018-06-06 18:11:55 -0700324 Log.w(TAG, "Unrecognized event type: " + toHexString(i));
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700325 }
326 }
327 summaryString = TextUtils.join("\n", summary);
328 }
329 mHandler.post(new Runnable() {
330 @Override
331 public void run() {
332 mSensorInfo.setText(summaryString);
333 }
334 });
335 }
336
337 private String getTimestamp(CarSensorEvent event) {
338 if (event == null) {
339 return mNaString;
340 }
Steve Paikaceeab12018-11-02 10:52:21 -0700341 return Double.toString(event.timestamp / (1000L * 1000L * 1000L)) + " seconds";
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700342 }
343
Scott Randolph75d2f122018-07-11 22:04:55 -0700344 private String getTimestampNow() {
Steve Paikaceeab12018-11-02 10:52:21 -0700345 return Double.toString(System.nanoTime() / (1000L * 1000L * 1000L)) + " seconds";
Scott Randolph75d2f122018-07-11 22:04:55 -0700346 }
347
Steve Paikd0ebac22017-07-17 07:10:53 -0700348 private String getFuelLevel(CarSensorEvent event) {
349 String fuelLevel = mNaString;
350 if(event != null) {
Steve Paikb8058202018-06-06 18:11:55 -0700351 fuelLevel = String.valueOf(event.getFuelLevelData(null).level);
Steve Paikd0ebac22017-07-17 07:10:53 -0700352 }
353 return getContext().getString(R.string.sensor_fuel_level, getTimestamp(event), fuelLevel);
354 }
355
356 private String getFuelDoorOpen(CarSensorEvent event) {
357 String fuelDoorOpen = mNaString;
358 if(event != null) {
Steve Paikb8058202018-06-06 18:11:55 -0700359 fuelDoorOpen = String.valueOf(event.getCarFuelDoorOpenData(null).fuelDoorIsOpen);
Steve Paikd0ebac22017-07-17 07:10:53 -0700360 }
361 return getContext().getString(R.string.sensor_fuel_door_open, getTimestamp(event),
362 fuelDoorOpen);
363 }
364
Steve Paikd0ebac22017-07-17 07:10:53 -0700365 private String getEvBatteryLevel(CarSensorEvent event) {
366 String evBatteryLevel = mNaString;
367 if(event != null) {
Steve Paikb8058202018-06-06 18:11:55 -0700368 evBatteryLevel = String.valueOf(event.getCarEvBatteryLevelData(null).evBatteryLevel);
Steve Paikd0ebac22017-07-17 07:10:53 -0700369 }
370 return getContext().getString(R.string.sensor_ev_battery_level, getTimestamp(event),
371 evBatteryLevel);
372 }
373
374 private String getEvChargePortOpen(CarSensorEvent event) {
375 String evChargePortOpen = mNaString;
376 if(event != null) {
377 evChargePortOpen = String.valueOf(
Steve Paikb8058202018-06-06 18:11:55 -0700378 event.getCarEvChargePortOpenData(null).evChargePortIsOpen);
Steve Paikd0ebac22017-07-17 07:10:53 -0700379 }
380 return getContext().getString(R.string.sensor_ev_charge_port_is_open, getTimestamp(event),
381 evChargePortOpen);
382 }
383
384 private String getEvChargePortConnected(CarSensorEvent event) {
385 String evChargePortConnected = mNaString;
386 if(event != null) {
387 evChargePortConnected = String.valueOf(
Steve Paikb8058202018-06-06 18:11:55 -0700388 event.getCarEvChargePortConnectedData(null).evChargePortIsConnected);
Steve Paikd0ebac22017-07-17 07:10:53 -0700389 }
390 return getContext().getString(R.string.sensor_ev_charge_port_is_connected,
391 getTimestamp(event), evChargePortConnected);
392 }
393
394 private String getEvChargeRate(CarSensorEvent event) {
395 String evChargeRate = mNaString;
396 if(event != null) {
Steve Paikb8058202018-06-06 18:11:55 -0700397 evChargeRate = String.valueOf(event.getCarEvBatteryChargeRateData(null).evChargeRate);
Steve Paikd0ebac22017-07-17 07:10:53 -0700398 }
399 return getContext().getString(R.string.sensor_ev_charge_rate, getTimestamp(event),
400 evChargeRate);
401 }
smara0d269532018-03-29 13:48:13 -0700402
403 private String getEngineOilLevel(CarSensorEvent event) {
404 String engineOilLevel = mNaString;
405 if(event != null) {
Steve Paikb8058202018-06-06 18:11:55 -0700406 engineOilLevel = String.valueOf(event.getCarEngineOilLevelData(null).engineOilLevel);
smara0d269532018-03-29 13:48:13 -0700407 }
408 return getContext().getString(R.string.sensor_oil_level, getTimestamp(event),
409 engineOilLevel);
Scott Randolph75d2f122018-07-11 22:04:55 -0700410 }
smara0d269532018-03-29 13:48:13 -0700411
Scott Randolph75d2f122018-07-11 22:04:55 -0700412 public class LocationInfoTextUpdateListener {
413 public void setLocationField(String value) {
414 setTimestampedTextField(mLocationInfo, value);
415 }
416
417 public void setAccelField(String value) {
418 setTimestampedTextField(mAccelInfo, value);
419 }
420
421 public void setGyroField(String value) {
422 setTimestampedTextField(mGyroInfo, value);
423 }
424
425 public void setMagField(String value) {
426 setTimestampedTextField(mMagInfo, value);
427 }
428
429 private void setTimestampedTextField(TextView text, String value) {
430 synchronized (SensorsTestFragment.this) {
431 text.setText(getTimestampNow() + ": " + value);
432 Log.d(TAG, "setText: " + value);
433 }
434 }
smara0d269532018-03-29 13:48:13 -0700435 }
Vitalii Tomkivdb66ed62016-04-07 18:10:39 -0700436}