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