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