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 17 package com.google.android.car.kitchensink; 18 19 import android.car.hardware.hvac.CarHvacManager; 20 import android.content.Intent; 21 import android.content.pm.PackageManager; 22 import android.os.Bundle; 23 import android.support.car.Car; 24 import android.support.car.CarAppFocusManager; 25 import android.support.car.CarConnectionCallback; 26 import android.support.car.CarNotConnectedException; 27 import android.support.car.hardware.CarSensorManager; 28 import android.support.v4.app.Fragment; 29 import android.util.Log; 30 import android.view.HapticFeedbackConstants; 31 import android.view.View; 32 import android.widget.ImageView; 33 import android.widget.Toast; 34 35 import com.android.car.app.CarDrawerActivity; 36 import com.android.car.app.CarDrawerAdapter; 37 import com.android.car.app.DrawerItemViewHolder; 38 import com.google.android.car.kitchensink.assistant.CarAssistantFragment; 39 import com.google.android.car.kitchensink.audio.AudioTestFragment; 40 import com.google.android.car.kitchensink.bluetooth.BluetoothHeadsetFragment; 41 import com.google.android.car.kitchensink.bluetooth.MapMceTestFragment; 42 import com.google.android.car.kitchensink.cluster.InstrumentClusterFragment; 43 import com.google.android.car.kitchensink.cube.CubesTestFragment; 44 import com.google.android.car.kitchensink.hvac.HvacTestFragment; 45 import com.google.android.car.kitchensink.input.InputTestFragment; 46 import com.google.android.car.kitchensink.job.JobSchedulerFragment; 47 import com.google.android.car.kitchensink.orientation.OrientationTestFragment; 48 import com.google.android.car.kitchensink.radio.RadioTestFragment; 49 import com.google.android.car.kitchensink.sensor.SensorsTestFragment; 50 import com.google.android.car.kitchensink.setting.CarServiceSettingsActivity; 51 import com.google.android.car.kitchensink.touch.TouchTestFragment; 52 import com.google.android.car.kitchensink.volume.VolumeTestFragment; 53 54 public class KitchenSinkActivity extends CarDrawerActivity { 55 private static final String TAG = "KitchenSinkActivity"; 56 57 private static final String MENU_AUDIO = "audio"; 58 private static final String MENU_ASSISTANT = "assistant"; 59 private static final String MENU_HVAC = "hvac"; 60 private static final String MENU_QUIT = "quit"; 61 private static final String MENU_JOB = "job_scheduler"; 62 private static final String MENU_CLUSTER = "inst cluster"; 63 private static final String MENU_INPUT_TEST = "input test"; 64 private static final String MENU_RADIO = "radio"; 65 private static final String MENU_SENSORS = "sensors"; 66 private static final String MENU_VOLUME_TEST = "volume test"; 67 private static final String MENU_TOUCH_TEST = "touch test"; 68 private static final String MENU_CUBES_TEST = "cubes test"; 69 private static final String MENU_CAR_SETTINGS = "car service settings"; 70 private static final String MENU_ORIENTATION = "orientation test"; 71 private static final String MENU_BLUETOOTH_HEADSET = "bluetooth headset"; 72 private static final String MENU_MAP_MESSAGING = "bluetooth messaging test"; 73 74 private Car mCarApi; 75 private CarHvacManager mHvacManager; 76 private CarSensorManager mCarSensorManager; 77 private CarAppFocusManager mCarAppFocusManager; 78 79 private AudioTestFragment mAudioTestFragment; 80 private RadioTestFragment mRadioTestFragment; 81 private SensorsTestFragment mSensorsTestFragment; 82 private HvacTestFragment mHvacTestFragment; 83 private JobSchedulerFragment mJobFragment; 84 private InstrumentClusterFragment mInstrumentClusterFragment; 85 private InputTestFragment mInputTestFragment; 86 private VolumeTestFragment mVolumeTestFragment; 87 private TouchTestFragment mTouchTestFragment; 88 private CubesTestFragment mCubesTestFragment; 89 private OrientationTestFragment mOrientationFragment; 90 private MapMceTestFragment mMapMceTestFragment; 91 private BluetoothHeadsetFragment mBluetoothHeadsetFragement; 92 private CarAssistantFragment mAssistantFragment; 93 94 private final CarSensorManager.OnSensorChangedListener mListener = (manager, event) -> { 95 switch (event.sensorType) { 96 case CarSensorManager.SENSOR_TYPE_DRIVING_STATUS: 97 Log.d(TAG, "driving status:" + event.intValues[0]); 98 break; 99 } 100 }; 101 102 @Override 103 protected CarDrawerAdapter getRootAdapter() { 104 return new DrawerAdapter(); 105 } 106 107 @Override 108 protected void onCreate(Bundle savedInstanceState) { 109 super.onCreate(savedInstanceState); 110 setMainContent(R.layout.kitchen_content); 111 // Connection to Car Service does not work for non-automotive yet. 112 if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) { 113 mCarApi = Car.createCar(this, mCarConnectionCallback); 114 mCarApi.connect(); 115 } 116 Log.i(TAG, "onCreate"); 117 } 118 119 @Override 120 protected void onStart() { 121 super.onStart(); 122 Log.i(TAG, "onStart"); 123 } 124 125 @Override 126 protected void onRestart() { 127 super.onRestart(); 128 Log.i(TAG, "onRestart"); 129 } 130 131 @Override 132 protected void onResume() { 133 super.onResume(); 134 Log.i(TAG, "onResume"); 135 } 136 137 @Override 138 protected void onPause() { 139 super.onPause(); 140 Log.i(TAG, "onPause"); 141 } 142 143 @Override 144 protected void onStop() { 145 super.onStop(); 146 Log.i(TAG, "onStop"); 147 } 148 149 @Override 150 protected void onDestroy() { 151 super.onDestroy(); 152 if (mCarSensorManager != null) { 153 mCarSensorManager.removeListener(mListener); 154 } 155 if (mCarApi != null) { 156 mCarApi.disconnect(); 157 } 158 Log.i(TAG, "onDestroy"); 159 } 160 161 private void showFragment(Fragment fragment) { 162 getSupportFragmentManager().beginTransaction() 163 .replace(R.id.kitchen_content, fragment) 164 .commit(); 165 } 166 167 private final CarConnectionCallback mCarConnectionCallback = 168 new CarConnectionCallback() { 169 @Override 170 public void onConnected(Car car) { 171 Log.d(TAG, "Connected to Car Service"); 172 try { 173 mHvacManager = (CarHvacManager) mCarApi.getCarManager(android.car.Car.HVAC_SERVICE); 174 mCarSensorManager = (CarSensorManager) mCarApi.getCarManager(Car.SENSOR_SERVICE); 175 mCarSensorManager.addListener(mListener, 176 CarSensorManager.SENSOR_TYPE_DRIVING_STATUS, 177 CarSensorManager.SENSOR_RATE_NORMAL); 178 mCarAppFocusManager = 179 (CarAppFocusManager) mCarApi.getCarManager(Car.APP_FOCUS_SERVICE); 180 } catch (CarNotConnectedException e) { 181 Log.e(TAG, "Car is not connected!", e); 182 } 183 } 184 185 @Override 186 public void onDisconnected(Car car) { 187 Log.d(TAG, "Disconnect from Car Service"); 188 } 189 }; 190 191 public Car getCar() { 192 return mCarApi; 193 } 194 195 private final class DrawerAdapter extends CarDrawerAdapter { 196 197 private final String mAllMenus[] = { 198 MENU_AUDIO, MENU_ASSISTANT, MENU_RADIO, MENU_HVAC, MENU_JOB, 199 MENU_CLUSTER, MENU_INPUT_TEST, MENU_SENSORS, MENU_VOLUME_TEST, 200 MENU_TOUCH_TEST, MENU_CUBES_TEST, MENU_CAR_SETTINGS, MENU_ORIENTATION, 201 MENU_BLUETOOTH_HEADSET, MENU_MAP_MESSAGING, MENU_QUIT 202 }; 203 204 public DrawerAdapter() { 205 super(KitchenSinkActivity.this, true /* showDisabledOnListOnEmpty */, 206 true /* smallLayout */); 207 setTitle(getString(R.string.app_title)); 208 } 209 210 @Override 211 protected int getActualItemCount() { 212 return mAllMenus.length; 213 } 214 215 @Override 216 protected void populateViewHolder(DrawerItemViewHolder holder, int position) { 217 holder.getTitle().setText(mAllMenus[position]); 218 } 219 220 @Override 221 public void onItemClick(int position) { 222 223 switch (mAllMenus[position]) { 224 case MENU_AUDIO: 225 if (mAudioTestFragment == null) { 226 mAudioTestFragment = new AudioTestFragment(); 227 } 228 showFragment(mAudioTestFragment); 229 break; 230 case MENU_ASSISTANT: 231 if (mAssistantFragment == null) { 232 mAssistantFragment = new CarAssistantFragment(); 233 } 234 showFragment(mAssistantFragment); 235 break; 236 case MENU_RADIO: 237 if (mRadioTestFragment == null) { 238 mRadioTestFragment = new RadioTestFragment(); 239 } 240 showFragment(mRadioTestFragment); 241 break; 242 case MENU_SENSORS: 243 if (mSensorsTestFragment == null) { 244 mSensorsTestFragment = new SensorsTestFragment(); 245 } 246 showFragment(mSensorsTestFragment); 247 break; 248 case MENU_HVAC: 249 if (mHvacManager != null) { 250 if (mHvacTestFragment == null) { 251 mHvacTestFragment = new HvacTestFragment(); 252 mHvacTestFragment.setHvacManager(mHvacManager); 253 } 254 // Don't allow HVAC fragment to start if we don't have a manager. 255 showFragment(mHvacTestFragment); 256 } 257 break; 258 case MENU_JOB: 259 if (mJobFragment == null) { 260 mJobFragment = new JobSchedulerFragment(); 261 } 262 showFragment(mJobFragment); 263 break; 264 case MENU_CLUSTER: 265 if (mInstrumentClusterFragment == null) { 266 mInstrumentClusterFragment = new InstrumentClusterFragment(); 267 } 268 showFragment(mInstrumentClusterFragment); 269 break; 270 case MENU_INPUT_TEST: 271 if (mInputTestFragment == null) { 272 mInputTestFragment = new InputTestFragment(); 273 } 274 showFragment(mInputTestFragment); 275 break; 276 case MENU_VOLUME_TEST: 277 if (mVolumeTestFragment == null) { 278 mVolumeTestFragment = new VolumeTestFragment(); 279 } 280 showFragment(mVolumeTestFragment); 281 break; 282 case MENU_TOUCH_TEST: 283 if (mTouchTestFragment == null) { 284 mTouchTestFragment = new TouchTestFragment(); 285 } 286 showFragment(mTouchTestFragment); 287 break; 288 case MENU_CUBES_TEST: 289 if (mCubesTestFragment == null) { 290 mCubesTestFragment = new CubesTestFragment(); 291 } 292 showFragment(mCubesTestFragment); 293 break; 294 case MENU_CAR_SETTINGS: 295 Intent intent = new Intent(KitchenSinkActivity.this, 296 CarServiceSettingsActivity.class); 297 startActivity(intent); 298 break; 299 case MENU_ORIENTATION: 300 if (mOrientationFragment == null) { 301 mOrientationFragment = new OrientationTestFragment(); 302 } 303 showFragment(mOrientationFragment); 304 break; 305 case MENU_BLUETOOTH_HEADSET: 306 if (mBluetoothHeadsetFragement == null) { 307 mBluetoothHeadsetFragement = new BluetoothHeadsetFragment(); 308 } 309 showFragment(mBluetoothHeadsetFragement); 310 break; 311 case MENU_MAP_MESSAGING: 312 if (mMapMceTestFragment == null) { 313 mMapMceTestFragment = new MapMceTestFragment(); 314 } 315 showFragment(mMapMceTestFragment); 316 break; 317 case MENU_QUIT: 318 finish(); 319 break; 320 default: 321 Log.wtf(TAG, "Unknown menu item: " + mAllMenus[position]); 322 } 323 closeDrawer(); 324 } 325 } 326 } 327