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