blob: e68c3fafec3762535ab3b2836dc840175d682508 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.car.kitchensink;
import android.car.hardware.hvac.CarHvacManager;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.car.Car;
import android.support.car.CarAppFocusManager;
import android.support.car.CarConnectionCallback;
import android.support.car.CarNotConnectedException;
import android.support.car.hardware.CarSensorManager;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.HapticFeedbackConstants;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import com.android.car.app.CarDrawerActivity;
import com.android.car.app.CarDrawerAdapter;
import com.android.car.app.DrawerItemViewHolder;
import com.google.android.car.kitchensink.assistant.CarAssistantFragment;
import com.google.android.car.kitchensink.audio.AudioTestFragment;
import com.google.android.car.kitchensink.bluetooth.BluetoothHeadsetFragment;
import com.google.android.car.kitchensink.bluetooth.MapMceTestFragment;
import com.google.android.car.kitchensink.cluster.InstrumentClusterFragment;
import com.google.android.car.kitchensink.cube.CubesTestFragment;
import com.google.android.car.kitchensink.diagnostic.DiagnosticTestFragment;
import com.google.android.car.kitchensink.hvac.HvacTestFragment;
import com.google.android.car.kitchensink.input.InputTestFragment;
import com.google.android.car.kitchensink.job.JobSchedulerFragment;
import com.google.android.car.kitchensink.orientation.OrientationTestFragment;
import com.google.android.car.kitchensink.radio.RadioTestFragment;
import com.google.android.car.kitchensink.sensor.SensorsTestFragment;
import com.google.android.car.kitchensink.setting.CarServiceSettingsActivity;
import com.google.android.car.kitchensink.touch.TouchTestFragment;
import com.google.android.car.kitchensink.volume.VolumeTestFragment;
import java.util.ArrayList;
import java.util.List;
public class KitchenSinkActivity extends CarDrawerActivity {
private static final String TAG = "KitchenSinkActivity";
private interface ClickHandler {
void onClick();
}
private static abstract class MenuEntry implements ClickHandler {
abstract String getText();
}
private final class OnClickMenuEntry extends MenuEntry {
private final String mText;
private final ClickHandler mClickHandler;
OnClickMenuEntry(String text, ClickHandler clickHandler) {
mText = text;
mClickHandler = clickHandler;
}
@Override
String getText() {
return mText;
}
@Override
public void onClick() {
mClickHandler.onClick();
}
}
private final class FragmentMenuEntry<T extends Fragment> extends MenuEntry {
private final class FragmentClassOrInstance<T extends Fragment> {
final Class<T> mClazz;
T mFragment = null;
FragmentClassOrInstance(Class<T> clazz) {
mClazz = clazz;
}
T getFragment() {
if (mFragment == null) {
try {
mFragment = mClazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
Log.e(TAG, "unable to create fragment", e);
}
}
return mFragment;
}
}
private final String mText;
private final FragmentClassOrInstance<T> mFragment;
FragmentMenuEntry(String text, Class<T> clazz) {
mText = text;
mFragment = new FragmentClassOrInstance<>(clazz);
}
@Override
String getText() {
return mText;
}
@Override
public void onClick() {
Fragment fragment = mFragment.getFragment();
if (fragment != null) {
KitchenSinkActivity.this.showFragment(fragment);
} else {
Log.e(TAG, "cannot show fragment for " + getText());
}
}
}
private final List<MenuEntry> mMenuEntries = new ArrayList<MenuEntry>() {
{
add("audio", AudioTestFragment.class);
add("hvac", HvacTestFragment.class);
add("job scheduler", JobSchedulerFragment.class);
add("inst cluster", InstrumentClusterFragment.class);
add("input test", InputTestFragment.class);
add("radio", RadioTestFragment.class);
add("assistant", CarAssistantFragment.class);
add("sensors", SensorsTestFragment.class);
add("diagnostic", DiagnosticTestFragment.class);
add("volume test", VolumeTestFragment.class);
add("touch test", TouchTestFragment.class);
add("cubes test", CubesTestFragment.class);
add("orientation test", OrientationTestFragment.class);
add("bluetooth headset",BluetoothHeadsetFragment.class);
add("bluetooth messaging test", MapMceTestFragment.class);
add("car service settings", () -> {
Intent intent = new Intent(KitchenSinkActivity.this,
CarServiceSettingsActivity.class);
startActivity(intent);
});
add("quit", KitchenSinkActivity.this::finish);
}
<T extends Fragment> void add(String text, Class<T> clazz) {
add(new FragmentMenuEntry(text, clazz));
}
void add(String text, ClickHandler onClick) {
add(new OnClickMenuEntry(text, onClick));
}
};
private Car mCarApi;
private CarHvacManager mHvacManager;
private CarSensorManager mCarSensorManager;
private CarAppFocusManager mCarAppFocusManager;
private final CarSensorManager.OnSensorChangedListener mListener = (manager, event) -> {
switch (event.sensorType) {
case CarSensorManager.SENSOR_TYPE_DRIVING_STATUS:
Log.d(TAG, "driving status:" + event.intValues[0]);
break;
}
};
public CarHvacManager getHvacManager() {
return mHvacManager;
}
@Override
protected CarDrawerAdapter getRootAdapter() {
return new DrawerAdapter();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setMainContent(R.layout.kitchen_content);
// Connection to Car Service does not work for non-automotive yet.
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
mCarApi = Car.createCar(this, mCarConnectionCallback);
mCarApi.connect();
}
Log.i(TAG, "onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mCarSensorManager != null) {
mCarSensorManager.removeListener(mListener);
}
if (mCarApi != null) {
mCarApi.disconnect();
}
Log.i(TAG, "onDestroy");
}
private void showFragment(Fragment fragment) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.kitchen_content, fragment)
.commit();
}
private final CarConnectionCallback mCarConnectionCallback =
new CarConnectionCallback() {
@Override
public void onConnected(Car car) {
Log.d(TAG, "Connected to Car Service");
try {
mHvacManager = (CarHvacManager) mCarApi.getCarManager(android.car.Car.HVAC_SERVICE);
mCarSensorManager = (CarSensorManager) mCarApi.getCarManager(Car.SENSOR_SERVICE);
mCarSensorManager.addListener(mListener,
CarSensorManager.SENSOR_TYPE_DRIVING_STATUS,
CarSensorManager.SENSOR_RATE_NORMAL);
mCarAppFocusManager =
(CarAppFocusManager) mCarApi.getCarManager(Car.APP_FOCUS_SERVICE);
} catch (CarNotConnectedException e) {
Log.e(TAG, "Car is not connected!", e);
}
}
@Override
public void onDisconnected(Car car) {
Log.d(TAG, "Disconnect from Car Service");
}
};
public Car getCar() {
return mCarApi;
}
private final class DrawerAdapter extends CarDrawerAdapter {
public DrawerAdapter() {
super(KitchenSinkActivity.this, true /* showDisabledOnListOnEmpty */);
setTitle(getString(R.string.app_title));
}
@Override
protected int getActualItemCount() {
return mMenuEntries.size();
}
@Override
protected void populateViewHolder(DrawerItemViewHolder holder, int position) {
holder.getTitle().setText(mMenuEntries.get(position).getText());
}
@Override
public void onItemClick(int position) {
if ((position < 0) || (position >= mMenuEntries.size())) {
Log.wtf(TAG, "Unknown menu item: " + position);
return;
}
mMenuEntries.get(position).onClick();
closeDrawer();
}
}
}