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