Home | History | Annotate | Download | only in kitchensink
      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