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