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