KitchenSinkActivity.java revision caa94c65936322c05588d567c233f7a34a8233a3
1/* 2 * Copyright (C) 2015 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; 18 19import android.car.hardware.camera.CarCameraManager; 20import android.car.hardware.hvac.CarHvacManager; 21import android.content.Context; 22import android.content.Intent; 23import android.content.pm.PackageManager; 24import android.graphics.Color; 25import android.os.Bundle; 26import android.support.car.Car; 27import android.support.car.CarAppFocusManager; 28import android.support.car.CarNotConnectedException; 29import android.support.car.ServiceConnectionCallback; 30import android.support.car.app.menu.CarDrawerActivity; 31import android.support.car.app.menu.CarMenu; 32import android.support.car.app.menu.CarMenuCallbacks; 33import android.support.car.app.menu.RootMenu; 34import android.support.car.hardware.CarSensorEvent; 35import android.support.car.hardware.CarSensorManager; 36import android.support.v4.app.Fragment; 37import android.util.Log; 38 39import com.google.android.car.kitchensink.audio.AudioTestFragment; 40import com.google.android.car.kitchensink.camera.CameraTestFragment; 41import com.google.android.car.kitchensink.cluster.InstrumentClusterFragment; 42import com.google.android.car.kitchensink.cube.CubesTestFragment; 43import com.google.android.car.kitchensink.hvac.HvacTestFragment; 44import com.google.android.car.kitchensink.input.InputTestFragment; 45import com.google.android.car.kitchensink.job.JobSchedulerFragment; 46import com.google.android.car.kitchensink.keyboard.KeyboardFragment; 47import com.google.android.car.kitchensink.orientation.OrientationTestFragment; 48import com.google.android.car.kitchensink.radio.RadioTestFragment; 49import com.google.android.car.kitchensink.sensor.SensorsTestFragment; 50import com.google.android.car.kitchensink.setting.CarServiceSettingsActivity; 51import com.google.android.car.kitchensink.touch.TouchTestFragment; 52import com.google.android.car.kitchensink.volume.VolumeTestFragment; 53import com.google.android.car.kitchensink.bluetooth.MapMceTestFragment; 54 55import java.util.ArrayList; 56import java.util.List; 57 58public class KitchenSinkActivity extends CarDrawerActivity { 59 private static final String TAG = "KitchenSinkActivity"; 60 61 private static final String MENU_AUDIO = "audio"; 62 private static final String MENU_CAMERA = "camera"; 63 private static final String MENU_HVAC = "hvac"; 64 private static final String MENU_QUIT = "quit"; 65 private static final String MENU_JOB = "job_scheduler"; 66 private static final String MENU_KEYBOARD = "keyboard"; 67 private static final String MENU_CLUSTER = "inst cluster"; 68 private static final String MENU_INPUT_TEST = "input test"; 69 private static final String MENU_RADIO = "radio"; 70 private static final String MENU_SENSORS = "sensors"; 71 private static final String MENU_VOLUME_TEST = "volume test"; 72 private static final String MENU_TOUCH_TEST = "touch test"; 73 private static final String MENU_CUBES_TEST = "cubes test"; 74 private static final String MENU_CAR_SETTINGS = "car service settings"; 75 private static final String MENU_ORIENTATION = "orientation test"; 76 private static final String MENU_MAP_MESSAGING = "bluetooth messaging test"; 77 78 private Car mCarApi; 79 private CarCameraManager mCameraManager; 80 private CarHvacManager mHvacManager; 81 private CarSensorManager mCarSensorManager; 82 private CarAppFocusManager mCarAppFocusManager; 83 84 private AudioTestFragment mAudioTestFragment; 85 private RadioTestFragment mRadioTestFragment; 86 private SensorsTestFragment mSensorsTestFragment; 87 private CameraTestFragment mCameraTestFragment; 88 private HvacTestFragment mHvacTestFragment; 89 private JobSchedulerFragment mJobFragment; 90 private KeyboardFragment mKeyboardFragment; 91 private InstrumentClusterFragment mInstrumentClusterFragment; 92 private InputTestFragment mInputTestFragment; 93 private VolumeTestFragment mVolumeTestFragment; 94 private TouchTestFragment mTouchTestFragment; 95 private CubesTestFragment mCubesTestFragment; 96 private OrientationTestFragment mOrientationFragment; 97 private MapMceTestFragment mMapMceTestFragment; 98 99 private final CarSensorManager.OnSensorChangedListener mListener = 100 new CarSensorManager.OnSensorChangedListener() { 101 @Override 102 public void onSensorChanged(CarSensorManager manager, CarSensorEvent event) { 103 switch (event.sensorType) { 104 case CarSensorManager.SENSOR_TYPE_DRIVING_STATUS: 105 Log.d(TAG, "driving status:" + event.intValues[0]); 106 break; 107 } 108 } 109 }; 110 111 public KitchenSinkActivity(Proxy proxy, Context context, Car car) { 112 super(proxy, context, car); 113 } 114 115 @Override 116 protected void onCreate(Bundle savedInstanceState) { 117 super.onCreate(savedInstanceState); 118 resetTitle(); 119 setScrimColor(Color.LTGRAY); 120 setLightMode(); 121 setCarMenuCallbacks(new MyCarMenuCallbacks()); 122 setContentView(R.layout.kitchen_sink_activity); 123 124 // Connection to Car Service does not work for non-automotive yet. 125 if (getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) { 126 mCarApi = Car.createCar(getContext(), mServiceConnectionCallback); 127 mCarApi.connect(); 128 } 129 Log.i(TAG, "onCreate"); 130 } 131 132 @Override 133 protected void onStart() { 134 super.onStart(); 135 Log.i(TAG, "onStart"); 136 } 137 138 @Override 139 protected void onRestart() { 140 super.onRestart(); 141 Log.i(TAG, "onRestart"); 142 } 143 144 @Override 145 protected void onResume() { 146 super.onResume(); 147 Log.i(TAG, "onResume"); 148 } 149 150 @Override 151 protected void onPause() { 152 super.onPause(); 153 Log.i(TAG, "onPause"); 154 } 155 156 @Override 157 protected void onStop() { 158 super.onStop(); 159 Log.i(TAG, "onStop"); 160 } 161 162 @Override 163 protected void onDestroy() { 164 super.onDestroy(); 165 if (mCarSensorManager != null) { 166 try { 167 mCarSensorManager.removeListener(mListener); 168 } catch (CarNotConnectedException e) { 169 Log.e(TAG, "Failed to unregister car seonsor listener", e); 170 } 171 } 172 if (mCarApi != null) { 173 mCarApi.disconnect(); 174 } 175 Log.i(TAG, "onDestroy"); 176 } 177 178 private void resetTitle() { 179 setTitle(getContext().getString(R.string.app_title)); 180 } 181 182 private void showFragment(Fragment fragment) { 183 getSupportFragmentManager().beginTransaction() 184 .replace(R.id.contents, fragment) 185 .commit(); 186 } 187 188 private final ServiceConnectionCallback mServiceConnectionCallback = 189 new ServiceConnectionCallback() { 190 @Override 191 public void onServiceConnected() { 192 Log.d(TAG, "Connected to Car Service"); 193 try { 194 mCameraManager = (CarCameraManager) mCarApi.getCarManager(android.car.Car 195 .CAMERA_SERVICE); 196 mHvacManager = (CarHvacManager) mCarApi.getCarManager(android.car.Car.HVAC_SERVICE); 197 mCarSensorManager = (CarSensorManager) mCarApi.getCarManager(Car.SENSOR_SERVICE); 198 mCarSensorManager.addListener(mListener, 199 CarSensorManager.SENSOR_TYPE_DRIVING_STATUS, 200 CarSensorManager.SENSOR_RATE_NORMAL); 201 mCarAppFocusManager = 202 (CarAppFocusManager) mCarApi.getCarManager(Car.APP_FOCUS_SERVICE); 203 } catch (CarNotConnectedException e) { 204 Log.e(TAG, "Car is not connected!", e); 205 } 206 } 207 208 @Override 209 public void onServiceDisconnected() { 210 Log.d(TAG, "Disconnect from Car Service"); 211 } 212 213 @Override 214 public void onServiceConnectionFailed() { 215 Log.d(TAG, "Car Service connection failed"); 216 } 217 }; 218 219 private final class MyCarMenuCallbacks extends CarMenuCallbacks { 220 /** Id for the root menu */ 221 private static final String ROOT = "ROOT"; 222 223 @Override 224 public RootMenu onGetRoot(Bundle hints) { 225 return new RootMenu(ROOT); 226 } 227 228 @Override 229 public void onLoadChildren(String parentId, CarMenu result) { 230 List<CarMenu.Item> items = new ArrayList<>(); 231 if (parentId.equals(ROOT)) { 232 String[] allMenus = { 233 MENU_AUDIO, MENU_RADIO, MENU_CAMERA, MENU_HVAC, MENU_JOB, MENU_KEYBOARD, 234 MENU_CLUSTER, MENU_INPUT_TEST, MENU_SENSORS, MENU_VOLUME_TEST, 235 MENU_TOUCH_TEST, MENU_CUBES_TEST, MENU_CAR_SETTINGS, MENU_ORIENTATION, 236 MENU_MAP_MESSAGING, MENU_QUIT 237 }; 238 for (String menu : allMenus) { 239 items.add(new CarMenu.Builder(menu).setText(menu).build()); 240 } 241 } 242 result.sendResult(items); 243 } 244 245 @Override 246 public void onItemClicked(String id) { 247 Log.d(TAG, "onItemClicked id=" + id); 248 if (id.equals(MENU_AUDIO)) { 249 if (mAudioTestFragment == null) { 250 mAudioTestFragment = new AudioTestFragment(); 251 } 252 showFragment(mAudioTestFragment); 253 } else if (id.equals(MENU_RADIO)) { 254 if (mRadioTestFragment == null) { 255 mRadioTestFragment = new RadioTestFragment(); 256 } 257 showFragment(mRadioTestFragment); 258 } else if (id.equals(MENU_SENSORS)) { 259 if (mSensorsTestFragment == null) { 260 mSensorsTestFragment = new SensorsTestFragment(); 261 } 262 showFragment(mSensorsTestFragment); 263 } else if (id.equals(MENU_CAMERA)) { 264 if (mCameraManager != null) { 265 if (mCameraTestFragment == null) { 266 mCameraTestFragment = new CameraTestFragment(); 267 mCameraTestFragment.setCameraManager(mCameraManager); 268 } 269 // Don't allow camera fragment to start if we don't have a manager. 270 showFragment(mCameraTestFragment); 271 } 272 } else if (id.equals(MENU_HVAC)) { 273 if (mHvacManager != null) { 274 if (mHvacTestFragment == null) { 275 mHvacTestFragment = new HvacTestFragment(); 276 mHvacTestFragment.setHvacManager(mHvacManager); 277 } 278 // Don't allow HVAC fragment to start if we don't have a manager. 279 showFragment(mHvacTestFragment); 280 } 281 } else if (id.equals(MENU_JOB)) { 282 if (mJobFragment == null) { 283 mJobFragment = new JobSchedulerFragment(); 284 } 285 showFragment(mJobFragment); 286 } else if (id.equals(MENU_KEYBOARD)) { 287 if (mKeyboardFragment == null) { 288 mKeyboardFragment = new KeyboardFragment(); 289 } 290 showFragment(mKeyboardFragment); 291 } else if (id.equals(MENU_CLUSTER)) { 292 if (mInstrumentClusterFragment == null) { 293 mInstrumentClusterFragment = new InstrumentClusterFragment(); 294 } 295 showFragment(mInstrumentClusterFragment); 296 } else if (id.equals(MENU_INPUT_TEST)) { 297 if (mInputTestFragment == null) { 298 mInputTestFragment = new InputTestFragment(); 299 } 300 showFragment(mInputTestFragment); 301 } else if (id.equals(MENU_VOLUME_TEST)) { 302 if (mVolumeTestFragment == null) { 303 mVolumeTestFragment = new VolumeTestFragment(); 304 } 305 showFragment(mVolumeTestFragment); 306 } else if (id.equals(MENU_TOUCH_TEST)) { 307 if (mTouchTestFragment == null) { 308 mTouchTestFragment = new TouchTestFragment(); 309 } 310 showFragment(mTouchTestFragment); 311 } else if (id.equals(MENU_CUBES_TEST)) { 312 if (mCubesTestFragment == null) { 313 mCubesTestFragment = new CubesTestFragment(); 314 } 315 showFragment(mCubesTestFragment); 316 } else if (id.equals(MENU_CAR_SETTINGS)) { 317 Intent intent = new Intent(getContext(), CarServiceSettingsActivity.class); 318 getContext().startActivity(intent); 319 } else if (id.equals(MENU_ORIENTATION)) { 320 if (mOrientationFragment == null) { 321 mOrientationFragment = new OrientationTestFragment(); 322 } 323 showFragment(mOrientationFragment); 324 } else if (id.equals(MENU_MAP_MESSAGING)) { 325 if (mMapMceTestFragment == null) { 326 mMapMceTestFragment = new MapMceTestFragment(); 327 } 328 showFragment(mMapMceTestFragment); 329 } else if (id.equals(MENU_QUIT)) { 330 finish(); 331 } 332 } 333 334 @Override 335 public void onCarMenuClosed() { 336 resetTitle(); 337 } 338 } 339} 340