1a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park/* 2a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park * Copyright (C) 2015 The Android Open Source Project 3a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park * 4a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park * Licensed under the Apache License, Version 2.0 (the "License"); 5a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park * you may not use this file except in compliance with the License. 6a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park * You may obtain a copy of the License at 7a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park * 8a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park * http://www.apache.org/licenses/LICENSE-2.0 9a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park * 10a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park * Unless required by applicable law or agreed to in writing, software 11a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park * distributed under the License is distributed on an "AS IS" BASIS, 12a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park * See the License for the specific language governing permissions and 14a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park * limitations under the License. 15a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park */ 16a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 17a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Parkpackage com.google.android.car.kitchensink; 18a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 19a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Parkimport android.car.hardware.hvac.CarHvacManager; 2094d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport android.content.Intent; 21a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Parkimport android.content.pm.PackageManager; 22a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Parkimport android.os.Bundle; 23a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Parkimport android.support.car.Car; 2446371473c416415fb6bcb8db85686669c3d65af6Vitalii Tomkivimport android.support.car.CarAppFocusManager; 25ed493f7ffcfaf46819913825a4edddde7736b429Jason Tholstrupimport android.support.car.CarConnectionCallback; 26f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathanimport android.support.car.CarNotConnectedException; 27a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Parkimport android.support.car.hardware.CarSensorManager; 2826f5b9cc3cb1d7362fc8371efa76953304145ec1Yao Chenimport android.support.v4.app.Fragment; 29a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Parkimport android.util.Log; 30140295d8700f8888a58199e14431e50236952c7cYao Chenimport android.view.HapticFeedbackConstants; 31140295d8700f8888a58199e14431e50236952c7cYao Chenimport android.view.View; 32140295d8700f8888a58199e14431e50236952c7cYao Chenimport android.widget.ImageView; 33140295d8700f8888a58199e14431e50236952c7cYao Chenimport android.widget.Toast; 34a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 35f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathanimport com.android.car.app.CarDrawerActivity; 36f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathanimport com.android.car.app.CarDrawerAdapter; 37f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathanimport com.android.car.app.DrawerItemViewHolder; 38114ef7428c0e95fb7ce5a4965a486c8c9e7909f9Yao Chenimport com.google.android.car.kitchensink.assistant.CarAssistantFragment; 394cc80210d973e2ba01d726dbd537a43f87003de6Vitalii Tomkivimport com.google.android.car.kitchensink.audio.AudioTestFragment; 40f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathanimport com.google.android.car.kitchensink.bluetooth.BluetoothHeadsetFragment; 41f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathanimport com.google.android.car.kitchensink.bluetooth.MapMceTestFragment; 424cc80210d973e2ba01d726dbd537a43f87003de6Vitalii Tomkivimport com.google.android.car.kitchensink.cluster.InstrumentClusterFragment; 43a6d8c000fd92f02a3b4ad0600ec1a4b0101dc411Keun-young Parkimport com.google.android.car.kitchensink.cube.CubesTestFragment; 443c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport com.google.android.car.kitchensink.diagnostic.DiagnosticTestFragment; 454cc80210d973e2ba01d726dbd537a43f87003de6Vitalii Tomkivimport com.google.android.car.kitchensink.hvac.HvacTestFragment; 464cc80210d973e2ba01d726dbd537a43f87003de6Vitalii Tomkivimport com.google.android.car.kitchensink.input.InputTestFragment; 474cc80210d973e2ba01d726dbd537a43f87003de6Vitalii Tomkivimport com.google.android.car.kitchensink.job.JobSchedulerFragment; 4826f5b9cc3cb1d7362fc8371efa76953304145ec1Yao Chenimport com.google.android.car.kitchensink.orientation.OrientationTestFragment; 494cc80210d973e2ba01d726dbd537a43f87003de6Vitalii Tomkivimport com.google.android.car.kitchensink.radio.RadioTestFragment; 50db66ed679c25284d612cc3cd4141215ef7c0d1d4Vitalii Tomkivimport com.google.android.car.kitchensink.sensor.SensorsTestFragment; 5194d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport com.google.android.car.kitchensink.setting.CarServiceSettingsActivity; 525cbe009f1d436e55dfea5bfcddce5e0b29847f9aKeun-young Parkimport com.google.android.car.kitchensink.touch.TouchTestFragment; 53fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenimport com.google.android.car.kitchensink.volume.VolumeTestFragment; 543c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport java.util.ArrayList; 553c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport java.util.List; 56a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 57a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Parkpublic class KitchenSinkActivity extends CarDrawerActivity { 58a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park private static final String TAG = "KitchenSinkActivity"; 59a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 603c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata private interface ClickHandler { 613c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata void onClick(); 623c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 633c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata 643c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata private static abstract class MenuEntry implements ClickHandler { 653c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata abstract String getText(); 663c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 673c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata 683c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata private final class OnClickMenuEntry extends MenuEntry { 693c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata private final String mText; 703c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata private final ClickHandler mClickHandler; 71a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 723c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata OnClickMenuEntry(String text, ClickHandler clickHandler) { 733c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata mText = text; 743c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata mClickHandler = clickHandler; 753c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 763c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata 773c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata @Override 783c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata String getText() { 793c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata return mText; 803c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 813c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata 823c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata @Override 833c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata public void onClick() { 843c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata mClickHandler.onClick(); 853c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 863c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 873c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata 883c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata private final class FragmentMenuEntry<T extends Fragment> extends MenuEntry { 893c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata private final class FragmentClassOrInstance<T extends Fragment> { 903c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata final Class<T> mClazz; 913c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata T mFragment = null; 923c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata 933c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata FragmentClassOrInstance(Class<T> clazz) { 943c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata mClazz = clazz; 953c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 963c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata 973c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata T getFragment() { 983c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata if (mFragment == null) { 993c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata try { 1003c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata mFragment = mClazz.newInstance(); 1013c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } catch (InstantiationException | IllegalAccessException e) { 1023c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata Log.e(TAG, "unable to create fragment", e); 1033c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 1043c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 1053c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata return mFragment; 1063c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 1073c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 1083c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata 1093c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata private final String mText; 1103c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata private final FragmentClassOrInstance<T> mFragment; 1113c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata 1123c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata FragmentMenuEntry(String text, Class<T> clazz) { 1133c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata mText = text; 1143c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata mFragment = new FragmentClassOrInstance<>(clazz); 1153c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 1163c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata 1173c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata @Override 1183c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata String getText() { 1193c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata return mText; 1203c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 1213c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata 1223c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata @Override 1233c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata public void onClick() { 1243c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata Fragment fragment = mFragment.getFragment(); 1253c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata if (fragment != null) { 1263c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata KitchenSinkActivity.this.showFragment(fragment); 1273c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } else { 1283c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata Log.e(TAG, "cannot show fragment for " + getText()); 1293c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 1303c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 1313c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 1323c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata 1333c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata private final List<MenuEntry> mMenuEntries = new ArrayList<MenuEntry>() { 1343c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata { 1353c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("audio", AudioTestFragment.class); 1363c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("hvac", HvacTestFragment.class); 1373c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("job scheduler", JobSchedulerFragment.class); 1383c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("inst cluster", InstrumentClusterFragment.class); 1393c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("input test", InputTestFragment.class); 1403c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("radio", RadioTestFragment.class); 1413c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("assistant", CarAssistantFragment.class); 1423c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("sensors", SensorsTestFragment.class); 1433c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("diagnostic", DiagnosticTestFragment.class); 1443c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("volume test", VolumeTestFragment.class); 1453c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("touch test", TouchTestFragment.class); 1463c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("cubes test", CubesTestFragment.class); 1473c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("orientation test", OrientationTestFragment.class); 1483c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("bluetooth headset",BluetoothHeadsetFragment.class); 1493c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("bluetooth messaging test", MapMceTestFragment.class); 1503c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("car service settings", () -> { 1513c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata Intent intent = new Intent(KitchenSinkActivity.this, 1523c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata CarServiceSettingsActivity.class); 1533c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata startActivity(intent); 1543c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata }); 1553c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add("quit", KitchenSinkActivity.this::finish); 1563c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 1573c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata 1583c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata <T extends Fragment> void add(String text, Class<T> clazz) { 1593c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add(new FragmentMenuEntry(text, clazz)); 1603c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 1613c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata void add(String text, ClickHandler onClick) { 1623c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata add(new OnClickMenuEntry(text, onClick)); 1633c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 1643c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata }; 165a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park private Car mCarApi; 166a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park private CarHvacManager mHvacManager; 167a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park private CarSensorManager mCarSensorManager; 16846371473c416415fb6bcb8db85686669c3d65af6Vitalii Tomkiv private CarAppFocusManager mCarAppFocusManager; 169a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 170f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan private final CarSensorManager.OnSensorChangedListener mListener = (manager, event) -> { 171f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan switch (event.sensorType) { 172f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan case CarSensorManager.SENSOR_TYPE_DRIVING_STATUS: 173f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan Log.d(TAG, "driving status:" + event.intValues[0]); 174f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan break; 175a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 176a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park }; 177a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 1783c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata public CarHvacManager getHvacManager() { 1793c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata return mHvacManager; 1803c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata } 1813c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata 182f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan @Override 183f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan protected CarDrawerAdapter getRootAdapter() { 184f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan return new DrawerAdapter(); 185a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 186a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 187a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park @Override 188a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park protected void onCreate(Bundle savedInstanceState) { 189a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park super.onCreate(savedInstanceState); 190f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan setMainContent(R.layout.kitchen_content); 191a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park // Connection to Car Service does not work for non-automotive yet. 192f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) { 193f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan mCarApi = Car.createCar(this, mCarConnectionCallback); 194a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park mCarApi.connect(); 195a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 196a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park Log.i(TAG, "onCreate"); 197a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 198a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 199a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park @Override 200a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park protected void onStart() { 201a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park super.onStart(); 202a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park Log.i(TAG, "onStart"); 203a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 204a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 205a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park @Override 206a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park protected void onRestart() { 207a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park super.onRestart(); 208a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park Log.i(TAG, "onRestart"); 209a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 210a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 211a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park @Override 212a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park protected void onResume() { 213a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park super.onResume(); 214a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park Log.i(TAG, "onResume"); 215a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 216a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 217a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park @Override 218a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park protected void onPause() { 219a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park super.onPause(); 220a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park Log.i(TAG, "onPause"); 221a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 222a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 223a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park @Override 224a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park protected void onStop() { 225a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park super.onStop(); 226a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park Log.i(TAG, "onStop"); 227a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 228a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 229a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park @Override 230a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park protected void onDestroy() { 231a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park super.onDestroy(); 232a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park if (mCarSensorManager != null) { 233150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park mCarSensorManager.removeListener(mListener); 234a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 235a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park if (mCarApi != null) { 236a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park mCarApi.disconnect(); 237a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 238a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park Log.i(TAG, "onDestroy"); 239a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 240a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 24126f5b9cc3cb1d7362fc8371efa76953304145ec1Yao Chen private void showFragment(Fragment fragment) { 24226f5b9cc3cb1d7362fc8371efa76953304145ec1Yao Chen getSupportFragmentManager().beginTransaction() 243f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan .replace(R.id.kitchen_content, fragment) 24426f5b9cc3cb1d7362fc8371efa76953304145ec1Yao Chen .commit(); 24526f5b9cc3cb1d7362fc8371efa76953304145ec1Yao Chen } 24626f5b9cc3cb1d7362fc8371efa76953304145ec1Yao Chen 247ed493f7ffcfaf46819913825a4edddde7736b429Jason Tholstrup private final CarConnectionCallback mCarConnectionCallback = 248ed493f7ffcfaf46819913825a4edddde7736b429Jason Tholstrup new CarConnectionCallback() { 249a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park @Override 250ed493f7ffcfaf46819913825a4edddde7736b429Jason Tholstrup public void onConnected(Car car) { 251a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park Log.d(TAG, "Connected to Car Service"); 252a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park try { 253a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park mHvacManager = (CarHvacManager) mCarApi.getCarManager(android.car.Car.HVAC_SERVICE); 254a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park mCarSensorManager = (CarSensorManager) mCarApi.getCarManager(Car.SENSOR_SERVICE); 2553ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup mCarSensorManager.addListener(mListener, 256a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park CarSensorManager.SENSOR_TYPE_DRIVING_STATUS, 257a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park CarSensorManager.SENSOR_RATE_NORMAL); 25846371473c416415fb6bcb8db85686669c3d65af6Vitalii Tomkiv mCarAppFocusManager = 25946371473c416415fb6bcb8db85686669c3d65af6Vitalii Tomkiv (CarAppFocusManager) mCarApi.getCarManager(Car.APP_FOCUS_SERVICE); 260a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } catch (CarNotConnectedException e) { 261235f8acd3cf83079ecd0f3e1b8368b0c9886de82Vitalii Tomkiv Log.e(TAG, "Car is not connected!", e); 262a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 263a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 264a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 265a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park @Override 266ed493f7ffcfaf46819913825a4edddde7736b429Jason Tholstrup public void onDisconnected(Car car) { 267a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park Log.d(TAG, "Disconnect from Car Service"); 268a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 269a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park }; 270a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 271f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan public Car getCar() { 272f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan return mCarApi; 273f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan } 274f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan 275f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan private final class DrawerAdapter extends CarDrawerAdapter { 276f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan 277f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan public DrawerAdapter() { 278c4cb97640c37454b905106d2cfdd14d091a384d6Srinivas Visvanathan super(KitchenSinkActivity.this, true /* showDisabledOnListOnEmpty */); 279f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan setTitle(getString(R.string.app_title)); 280f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan } 281a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 282a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park @Override 283f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan protected int getActualItemCount() { 2843c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata return mMenuEntries.size(); 285a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 286a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 287a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park @Override 288f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan protected void populateViewHolder(DrawerItemViewHolder holder, int position) { 2893c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata holder.getTitle().setText(mMenuEntries.get(position).getText()); 290a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 291a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park 292a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park @Override 293f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan public void onItemClick(int position) { 2943c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata if ((position < 0) || (position >= mMenuEntries.size())) { 2953c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata Log.wtf(TAG, "Unknown menu item: " + position); 2963c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata return; 297a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 2983c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata 2993c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata mMenuEntries.get(position).onClick(); 3003c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata 301f854423e7cb7861626df70663977f6d4a3f2bd2eSrinivas Visvanathan closeDrawer(); 302a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 303a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park } 304a6521cd799e509b03ecbeea3b05f1dd5c0379387Keun-young Park} 305