1634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen/*
2634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen * Copyright (C) 2016 The Android Open Source Project
3634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen *
4634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen * Licensed under the Apache License, Version 2.0 (the "License");
5634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen * you may not use this file except in compliance with the License.
6634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen * You may obtain a copy of the License at
7634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen *
8634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen *      http://www.apache.org/licenses/LICENSE-2.0
9634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen *
10634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen * Unless required by applicable law or agreed to in writing, software
11634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen * distributed under the License is distributed on an "AS IS" BASIS,
12634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen * See the License for the specific language governing permissions and
14634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen * limitations under the License.
15634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen */
16634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen
17634acb9712f2627acf9279a78d120ea2da1e0464Yao Chenpackage com.android.systemui.volume.car;
18634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen
19634acb9712f2627acf9279a78d120ea2da1e0464Yao Chenimport android.car.Car;
20634acb9712f2627acf9279a78d120ea2da1e0464Yao Chenimport android.car.CarNotConnectedException;
21634acb9712f2627acf9279a78d120ea2da1e0464Yao Chenimport android.car.media.CarAudioManager;
22634acb9712f2627acf9279a78d120ea2da1e0464Yao Chenimport android.content.ComponentName;
23634acb9712f2627acf9279a78d120ea2da1e0464Yao Chenimport android.content.Context;
24634acb9712f2627acf9279a78d120ea2da1e0464Yao Chenimport android.content.ServiceConnection;
25634acb9712f2627acf9279a78d120ea2da1e0464Yao Chenimport android.os.IBinder;
26634acb9712f2627acf9279a78d120ea2da1e0464Yao Chenimport android.util.Log;
27634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen
28782cd6711bc15e3f03456210b3543a67606d6591Jason Monkimport com.android.systemui.volume.VolumeDialogControllerImpl;
29634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen
30634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen/**
31634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen * A volume dialog controller for the automotive use case.
32634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen *
33634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen * {@link android.car.media.CarAudioManager} is the source of truth to get the stream volumes.
34634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen * And volume changes should be sent to the car's audio module instead of the android's audio mixer.
35634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen */
36782cd6711bc15e3f03456210b3543a67606d6591Jason Monkpublic class CarVolumeDialogController extends VolumeDialogControllerImpl {
37634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    private static final String TAG = "CarVolumeDialogController";
38634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen
39634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    private final Car mCar;
40634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    private CarAudioManager mCarAudioManager;
41634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen
42634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    private final ServiceConnection mConnection = new ServiceConnection() {
43634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        @Override
44634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
45634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            try {
46634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen                mCarAudioManager = (CarAudioManager) mCar.getCarManager(Car.AUDIO_SERVICE);
47634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen                setVolumeController();
48634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen                CarVolumeDialogController.this.getState();
49634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            } catch (CarNotConnectedException e) {
50634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen                Log.e(TAG, "Car is not connected!", e);
51634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            }
52634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        }
53634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen
54634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        @Override
55634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        public void onServiceDisconnected(ComponentName componentName) {
56634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            Log.e(TAG, "Car service is disconnected");
57634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        }
58634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    };
59634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen
60782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    public CarVolumeDialogController(Context context) {
61782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        super(context);
62634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        mCar = Car.createCar(context, mConnection);
63634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        mCar.connect();
64634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    }
65634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen
66634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    @Override
67634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    protected void setAudioManagerStreamVolume(int stream, int level, int flag) {
68634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        if (mCarAudioManager == null) {
69634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            Log.d(TAG, "Car audio manager is not initialized yet");
70634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            return;
71634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        }
72634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        try {
73634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            mCarAudioManager.setStreamVolume(stream, level, flag);
74634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        } catch (CarNotConnectedException e) {
75634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            Log.e(TAG, "Car is not connected", e);
76634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        }
77634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    }
78634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen
79634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    @Override
80634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    protected int getAudioManagerStreamVolume(int stream) {
81634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        if(mCarAudioManager == null) {
82634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            Log.d(TAG, "Car audio manager is not initialized yet");
83634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            return 0;
84634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        }
85634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen
86634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        try {
87634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            return mCarAudioManager.getStreamVolume(stream);
88634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        } catch (CarNotConnectedException e) {
89634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            Log.e(TAG, "Car is not connected", e);
90634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            return 0;
91634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        }
92634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    }
93634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen
94634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    @Override
95634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    protected int getAudioManagerStreamMaxVolume(int stream) {
96634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        if(mCarAudioManager == null) {
97634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            Log.d(TAG, "Car audio manager is not initialized yet");
98634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            return 0;
99634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        }
100634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen
101634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        try {
102634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            return mCarAudioManager.getStreamMaxVolume(stream);
103634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        } catch (CarNotConnectedException e) {
104634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            Log.e(TAG, "Car is not connected", e);
105634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            return 0;
106634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        }
107634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    }
108634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen
109634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    @Override
110634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    protected int getAudioManagerStreamMinVolume(int stream) {
111634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        if(mCarAudioManager == null) {
112634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            Log.d(TAG, "Car audio manager is not initialized yet");
113634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            return 0;
114634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        }
115634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen
116634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        try {
117634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            return mCarAudioManager.getStreamMinVolume(stream);
118634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        } catch (CarNotConnectedException e) {
119634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            Log.e(TAG, "Car is not connected", e);
120634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            return 0;
121634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        }
122634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    }
123634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen
124634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    @Override
125634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    public void setVolumeController() {
126634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        if (mCarAudioManager == null) {
127634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            Log.d(TAG, "Car audio manager is not initialized yet");
128634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            return;
129634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        }
130634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        try {
131634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            mCarAudioManager.setVolumeController(mVolumeController);
132634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        } catch (CarNotConnectedException e) {
133634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen            Log.e(TAG, "Car is not connected", e);
134634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen        }
135634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen    }
136634acb9712f2627acf9279a78d120ea2da1e0464Yao Chen}
137