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.ComponentName; 22import android.content.Context; 23import android.content.pm.PackageManager; 24import android.graphics.Color; 25import android.os.Bundle; 26import android.support.car.Car; 27import android.support.car.CarAppContextManager; 28import android.support.car.CarNotConnectedException; 29import android.support.car.CarNotSupportedException; 30import android.support.car.ServiceConnectionListener; 31import android.support.car.app.menu.CarDrawerActivity; 32import android.support.car.app.menu.CarMenu; 33import android.support.car.app.menu.CarMenuCallbacks; 34import android.support.car.app.menu.RootMenu; 35import android.support.car.hardware.CarSensorEvent; 36import android.support.car.hardware.CarSensorManager; 37import android.support.car.navigation.CarNavigationManager; 38import android.util.Log; 39 40import com.google.android.car.kitchensink.audio.AudioTestFragment; 41import com.google.android.car.kitchensink.camera.CameraTestFragment; 42import com.google.android.car.kitchensink.cluster.InstrumentClusterFragment; 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; 47 48import java.util.ArrayList; 49import java.util.List; 50 51public class KitchenSinkActivity extends CarDrawerActivity { 52 private static final String TAG = "KitchenSinkActivity"; 53 54 private static final String MENU_AUDIO = "audio"; 55 private static final String MENU_CAMERA = "camera"; 56 private static final String MENU_HVAC = "hvac"; 57 private static final String MENU_QUIT = "quit"; 58 private static final String MENU_JOB = "job_scheduler"; 59 private static final String MENU_KEYBOARD = "keyboard"; 60 private static final String MENU_CLUSTER = "inst cluster"; 61 private static final String MENU_INPUT_TEST = "input test"; 62 63 private Car mCarApi; 64 private CarCameraManager mCameraManager; 65 private CarHvacManager mHvacManager; 66 private CarSensorManager mCarSensorManager; 67 private CarNavigationManager mCarNavigationManager; 68 private CarAppContextManager mCarAppContextManager; 69 70 71 private AudioTestFragment mAudioTestFragment; 72 private CameraTestFragment mCameraTestFragment; 73 private HvacTestFragment mHvacTestFragment; 74 private JobSchedulerFragment mJobFragment; 75 private KeyboardFragment mKeyboardFragment; 76 private InstrumentClusterFragment mInstrumentClusterFragment; 77 private InputTestFragment mInputTestFragment; 78 79 private final CarSensorManager.CarSensorEventListener mListener = 80 new CarSensorManager.CarSensorEventListener() { 81 @Override 82 public void onSensorChanged(CarSensorEvent event) { 83 switch (event.sensorType) { 84 case CarSensorManager.SENSOR_TYPE_DRIVING_STATUS: 85 Log.d(TAG, "driving status:" + event.intValues[0]); 86 break; 87 } 88 } 89 }; 90 91 public KitchenSinkActivity(Proxy proxy, Context context, Car car) { 92 super(proxy, context, car); 93 } 94 95 @Override 96 protected void onCreate(Bundle savedInstanceState) { 97 super.onCreate(savedInstanceState); 98 resetTitle(); 99 setScrimColor(Color.LTGRAY); 100 setLightMode(); 101 setCarMenuCallbacks(new MyCarMenuCallbacks()); 102 setContentView(R.layout.kitchen_sink_activity); 103 104 // Connection to Car Service does not work for non-automotive yet. 105 if (getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) { 106 mCarApi = Car.createCar(getContext(), mServiceConnectionListener); 107 mCarApi.connect(); 108 } 109 Log.i(TAG, "onCreate"); 110 } 111 112 @Override 113 protected void onStart() { 114 super.onStart(); 115 Log.i(TAG, "onStart"); 116 } 117 118 @Override 119 protected void onRestart() { 120 super.onRestart(); 121 Log.i(TAG, "onRestart"); 122 } 123 124 @Override 125 protected void onResume() { 126 super.onResume(); 127 Log.i(TAG, "onResume"); 128 } 129 130 @Override 131 protected void onPause() { 132 super.onPause(); 133 Log.i(TAG, "onPause"); 134 } 135 136 @Override 137 protected void onStop() { 138 super.onStop(); 139 Log.i(TAG, "onStop"); 140 } 141 142 @Override 143 protected void onDestroy() { 144 super.onDestroy(); 145 if (mCarSensorManager != null) { 146 try { 147 mCarSensorManager.unregisterListener(mListener); 148 } catch (CarNotConnectedException e) { 149 Log.e(TAG, "Failed to unregister car seonsor listener", e); 150 } 151 } 152 if (mCarApi != null) { 153 mCarApi.disconnect(); 154 } 155 Log.i(TAG, "onDestroy"); 156 } 157 158 private void resetTitle() { 159 setTitle(getContext().getString(R.string.app_title)); 160 } 161 162 private final ServiceConnectionListener mServiceConnectionListener = 163 new ServiceConnectionListener() { 164 @Override 165 public void onServiceConnected(ComponentName name) { 166 Log.d(TAG, "Connected to Car Service"); 167 try { 168 mCameraManager = (CarCameraManager) mCarApi.getCarManager(android.car.Car 169 .CAMERA_SERVICE); 170 mHvacManager = (CarHvacManager) mCarApi.getCarManager(android.car.Car.HVAC_SERVICE); 171 mCarNavigationManager = (CarNavigationManager) mCarApi.getCarManager( 172 android.car.Car.CAR_NAVIGATION_SERVICE); 173 mCarSensorManager = (CarSensorManager) mCarApi.getCarManager(Car.SENSOR_SERVICE); 174 mCarSensorManager.registerListener(mListener, 175 CarSensorManager.SENSOR_TYPE_DRIVING_STATUS, 176 CarSensorManager.SENSOR_RATE_NORMAL); 177 mCarAppContextManager = 178 (CarAppContextManager) mCarApi.getCarManager(Car.APP_CONTEXT_SERVICE); 179 } catch (CarNotConnectedException e) { 180 Log.e(TAG, "Car is not connected!", e); 181 } catch (CarNotSupportedException e) { 182 Log.e(TAG, "Car is not supported!", e); 183 } 184 } 185 186 @Override 187 public void onServiceDisconnected(ComponentName name) { 188 Log.d(TAG, "Disconnect from Car Service"); 189 } 190 191 @Override 192 public void onServiceSuspended(int cause) { 193 Log.d(TAG, "Car Service connection suspended"); 194 } 195 196 @Override 197 public void onServiceConnectionFailed(int cause) { 198 Log.d(TAG, "Car Service connection failed"); 199 } 200 }; 201 202 private final class MyCarMenuCallbacks extends CarMenuCallbacks { 203 /** Id for the root menu */ 204 private static final String ROOT = "ROOT"; 205 206 @Override 207 public RootMenu onGetRoot(Bundle hints) { 208 return new RootMenu(ROOT); 209 } 210 211 @Override 212 public void onLoadChildren(String parentId, CarMenu result) { 213 List<CarMenu.Item> items = new ArrayList<>(); 214 if (parentId.equals(ROOT)) { 215 String[] allMenus = { 216 MENU_AUDIO, MENU_CAMERA, MENU_HVAC, MENU_JOB, MENU_KEYBOARD, MENU_CLUSTER, 217 MENU_INPUT_TEST, MENU_QUIT 218 }; 219 for (String menu : allMenus) { 220 items.add(new CarMenu.Builder(menu).setText(menu).build()); 221 } 222 } 223 result.sendResult(items); 224 } 225 226 @Override 227 public void onItemClicked(String id) { 228 Log.d(TAG, "onItemClicked id=" + id); 229 if (id.equals(MENU_AUDIO)) { 230 if (mAudioTestFragment == null) { 231 mAudioTestFragment = new AudioTestFragment(); 232 } 233 setContentFragment(mAudioTestFragment); 234 } else if (id.equals(MENU_CAMERA)) { 235 if (mCameraManager != null) { 236 if (mCameraTestFragment == null) { 237 mCameraTestFragment = new CameraTestFragment(); 238 mCameraTestFragment.setCameraManager(mCameraManager); 239 } 240 // Don't allow camera fragment to start if we don't have a manager. 241 setContentFragment(mCameraTestFragment); 242 } 243 } else if (id.equals(MENU_HVAC)) { 244 if (mHvacManager != null) { 245 if (mHvacTestFragment == null) { 246 mHvacTestFragment = new HvacTestFragment(); 247 mHvacTestFragment.setHvacManager(mHvacManager); 248 } 249 // Don't allow HVAC fragment to start if we don't have a manager. 250 setContentFragment(mHvacTestFragment); 251 } 252 } else if (id.equals(MENU_JOB)) { 253 if (mJobFragment == null) { 254 mJobFragment = new JobSchedulerFragment(); 255 } 256 setContentFragment(mJobFragment); 257 } else if (id.equals(MENU_KEYBOARD)) { 258 if (mKeyboardFragment == null) { 259 mKeyboardFragment = new KeyboardFragment(); 260 } 261 setContentFragment(mKeyboardFragment); 262 } else if (id.equals(MENU_CLUSTER)) { 263 if (mInstrumentClusterFragment == null) { 264 mInstrumentClusterFragment = new InstrumentClusterFragment(); 265 mInstrumentClusterFragment.setCarNavigationManager(mCarNavigationManager); 266 mInstrumentClusterFragment.setCarAppContextManager(mCarAppContextManager); 267 } 268 setContentFragment(mInstrumentClusterFragment); 269 } else if (id.equals(MENU_INPUT_TEST)) { 270 if (mInputTestFragment == null) { 271 mInputTestFragment = new InputTestFragment(); 272 } 273 setContentFragment(mInputTestFragment); 274 } else if (id.equals(MENU_QUIT)) { 275 finish(); 276 } 277 } 278 279 @Override 280 public void onCarMenuClosed() { 281 resetTitle(); 282 } 283 } 284} 285