1905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev/* 2905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * Copyright (C) 2017 The Android Open Source Project 3905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * 4905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * Licensed under the Apache License, Version 2.0 (the "License"); 5905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * you may not use this file except in compliance with the License. 6905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * You may obtain a copy of the License at 7905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * 8905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * http://www.apache.org/licenses/LICENSE-2.0 9905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * 10905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * Unless required by applicable law or agreed to in writing, software 11905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * distributed under the License is distributed on an "AS IS" BASIS, 12905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * See the License for the specific language governing permissions and 14905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * limitations under the License. 15905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev */ 16905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 17905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsevpackage com.google.android.car.kitchensink.cluster; 18905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 19905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsevimport android.app.Activity; 20905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsevimport android.car.cluster.CarInstrumentClusterManager; 21905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsevimport android.car.cluster.ClusterActivityState; 22905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsevimport android.graphics.Rect; 23905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsevimport android.os.Bundle; 24905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsevimport android.support.car.Car; 25905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsevimport android.support.car.CarConnectionCallback; 26905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsevimport android.support.car.CarNotConnectedException; 27905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsevimport android.util.Log; 28905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsevimport android.widget.ImageView; 29905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsevimport android.widget.RelativeLayout; 30905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 31905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsevimport com.google.android.car.kitchensink.R; 32905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 33905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev/** 34905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev * Fake navigation activity for instrument cluster. 35905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev */ 36905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsevpublic class FakeClusterNavigationActivity 37905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev extends Activity 38905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev implements CarInstrumentClusterManager.Callback { 39905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 40905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev private final static String TAG = FakeClusterNavigationActivity.class.getSimpleName(); 41905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 42905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev private Car mCarApi; 43905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev private CarInstrumentClusterManager mClusterManager; 44905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev private ImageView mUnobscuredArea; 45905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 46905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev @Override 47905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev public void onCreate(Bundle savedInstanceState) { 48905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev super.onCreate(savedInstanceState); 49905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev Log.i(TAG, "onCreate"); 50905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev setContentView(R.layout.fake_cluster_navigation_activity); 51905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev mUnobscuredArea = findViewById(R.id.unobscuredArea); 52905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 53905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev mCarApi = Car.createCar(this /* context */, new CarConnectionCallback() { 54905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 55905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev @Override 56905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev public void onConnected(Car car) { 57905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev onCarConnected(car); 58905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev } 59905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 60905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev @Override 61905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev public void onDisconnected(Car car) { 62905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev onCarDisconnected(car); 63905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev } 64905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev }); 65905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev Log.i(TAG, "Connecting to car api..."); 66905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev mCarApi.connect(); 67905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev } 68905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 69905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 70905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev @Override 71905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev public void onClusterActivityStateChanged(String category, Bundle clusterActivityState) { 72905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev ClusterActivityState state = ClusterActivityState.fromBundle(clusterActivityState); 73905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev Log.i(TAG, "onClusterActivityStateChanged, category: " + category + ", state: " + state); 74905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 75905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev Rect unobscured = state.getUnobscuredBounds(); 76905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( 77905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev unobscured.width(), unobscured.height()); 78905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev lp.setMargins(unobscured.left, unobscured.top, 0, 0); 79905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev mUnobscuredArea.setLayoutParams(lp); 80905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev } 81905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 82905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev private void onCarConnected(Car car) { 83905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev Log.i(TAG, "onCarConnected, car: " + car); 84905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev try { 85905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev mClusterManager = (CarInstrumentClusterManager) car.getCarManager( 86905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev android.car.Car.CAR_INSTRUMENT_CLUSTER_SERVICE); 87905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev } catch (CarNotConnectedException e) { 88905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev throw new IllegalStateException(e); 89905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev } 90905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 91905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev try { 92905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev Log.i(TAG, "registering callback..."); 93905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev mClusterManager.registerCallback(CarInstrumentClusterManager.CATEGORY_NAVIGATION, this); 94905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev Log.i(TAG, "callback registered"); 95905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev } catch (android.car.CarNotConnectedException e) { 96905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev throw new IllegalStateException(e); 97905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev } 98905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev } 99905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 100905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev private void onCarDisconnected(Car car) { 101905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev 102905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev } 103905968cf95d4c8608d6d9351b5dd10fe994a1220Pavel Maltsev}