1fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen/*
2fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen * Copyright (C) 2015 The Android Open Source Project
3fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen *
4fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen * Licensed under the Apache License, Version 2.0 (the "License");
5fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen * you may not use this file except in compliance with the License.
6fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen * You may obtain a copy of the License at
7fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen *
8fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen *      http://www.apache.org/licenses/LICENSE-2.0
9fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen *
10fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen * Unless required by applicable law or agreed to in writing, software
11fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen * distributed under the License is distributed on an "AS IS" BASIS,
12fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen * See the License for the specific language governing permissions and
14fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen * limitations under the License.
15fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen */
16fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenpackage com.google.android.car.kitchensink.volume;
17fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
18fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenimport android.car.Car;
19fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenimport android.car.CarNotConnectedException;
20fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenimport android.car.media.CarAudioManager;
216bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chenimport android.content.ComponentName;
22fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenimport android.content.Context;
236bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chenimport android.content.ServiceConnection;
24fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenimport android.media.AudioManager;
25fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenimport android.os.Bundle;
26fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenimport android.os.Handler;
276bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chenimport android.os.IBinder;
28fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenimport android.os.Message;
29fa3290a37081cfa6d4862d206f6b62293957adedRodrigo Lagosimport android.support.annotation.Nullable;
30fa3290a37081cfa6d4862d206f6b62293957adedRodrigo Lagosimport android.support.v4.app.Fragment;
31fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenimport android.util.Log;
32fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenimport android.util.SparseIntArray;
33fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenimport android.view.LayoutInflater;
34fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenimport android.view.View;
35fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenimport android.view.ViewGroup;
36fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenimport android.widget.ListView;
3731bfad155543439b1421c815b81db44129794414Scott Randolphimport android.widget.SeekBar;
38fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
39fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chenimport com.google.android.car.kitchensink.R;
40fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
416bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chenpublic class VolumeTestFragment extends Fragment {
42fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    private static final String TAG = "CarVolumeTest";
43fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    private static final int MSG_VOLUME_CHANGED = 0;
44fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    private static final int MSG_REQUEST_FOCUS = 1;
45fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    private static final int MSG_FOCUS_CHANGED= 2;
46fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
47fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    private AudioManager mAudioManager;
48fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    private VolumeAdapter mAdapter;
49fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
50fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    private CarAudioManager mCarAudioManager;
51fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    private Car mCar;
52fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
5331bfad155543439b1421c815b81db44129794414Scott Randolph    private SeekBar mFader;
5431bfad155543439b1421c815b81db44129794414Scott Randolph    private SeekBar mBalance;
5531bfad155543439b1421c815b81db44129794414Scott Randolph
56fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    private final Handler mHandler = new VolumeHandler();
57fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
58fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    private class VolumeHandler extends Handler {
59fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        private AudioFocusListener mFocusListener;
60fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
61fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        @Override
62fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        public void handleMessage(Message msg) {
63fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen            switch (msg.what) {
64fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen                case MSG_VOLUME_CHANGED:
65fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen                    initVolumeInfo();
66fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen                    break;
67fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen                case MSG_REQUEST_FOCUS:
6833707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                    int groupId = msg.arg1;
69fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen                    if (mFocusListener != null) {
70fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen                        mAudioManager.abandonAudioFocus(mFocusListener);
7133707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                        mVolumeInfos[mGroupIdIndexMap.get(groupId)].mHasFocus = false;
72fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen                        mAdapter.notifyDataSetChanged();
73fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen                    }
74fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
7533707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                    mFocusListener = new AudioFocusListener(groupId);
7633707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                    mAudioManager.requestAudioFocus(mFocusListener, groupId,
77fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen                            AudioManager.AUDIOFOCUS_GAIN);
78fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen                    break;
79fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen                case MSG_FOCUS_CHANGED:
8033707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                    int focusGroupId = msg.arg1;
8133707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                    mVolumeInfos[mGroupIdIndexMap.get(focusGroupId)].mHasFocus = true;
82fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen                    mAdapter.refreshVolumes(mVolumeInfos);
83fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen                    break;
84fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
85fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen            }
86fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        }
87fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    }
88fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
894dc649a013dfa61d1990284a07b19c4af22daa90Hongwei Wang    private VolumeInfo[] mVolumeInfos = new VolumeInfo[0];
9033707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang    private SparseIntArray mGroupIdIndexMap = new SparseIntArray();
91fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
92fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    private class AudioFocusListener implements AudioManager.OnAudioFocusChangeListener {
9333707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang        private final int mGroupId;
9433707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang        public AudioFocusListener(int groupId) {
9533707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang            mGroupId = groupId;
96fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        }
97fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        @Override
98fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        public void onAudioFocusChange(int focusChange) {
99fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen            if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
10033707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                mHandler.sendMessage(mHandler.obtainMessage(MSG_FOCUS_CHANGED, mGroupId, 0));
101fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen            } else {
102fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen                Log.e(TAG, "Audio focus request failed");
103fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen            }
104fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        }
105fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    }
106fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
107fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    public static class VolumeInfo {
10833707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang        public int mGroupId;
109fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        public String mId;
110fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        public String mMax;
111fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        public String mCurrent;
112fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        public boolean mHasFocus;
113fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    }
114fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
1156bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen    private final ServiceConnection mCarConnectionCallback =
1166bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen            new ServiceConnection() {
1176bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen                @Override
1186bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen                public void onServiceConnected(ComponentName name, IBinder binder) {
1196bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen                    Log.d(TAG, "Connected to Car Service");
1206bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen                    try {
1216bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen                        mCarAudioManager = (CarAudioManager) mCar.getCarManager(Car.AUDIO_SERVICE);
1226bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen                        initVolumeInfo();
1236bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen                    } catch (CarNotConnectedException e) {
1246bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen                        Log.e(TAG, "Car is not connected!", e);
1256bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen                    }
1266bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen                }
1276bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen
1286bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen                @Override
1296bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen                public void onServiceDisconnected(ComponentName name) {
1306bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen                    Log.d(TAG, "Disconnect from Car Service");
1316bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen                }
1326bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen            };
133fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
134fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    @Override
135fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
136fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen                             @Nullable Bundle savedInstanceState) {
137fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        View v = inflater.inflate(R.layout.volume_test, container, false);
138fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
13933707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang        ListView volumeListView = v.findViewById(R.id.volume_list);
140fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
141fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
142fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        mAdapter = new VolumeAdapter(getContext(), R.layout.volume_item, mVolumeInfos, this);
14333707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang        volumeListView.setAdapter(mAdapter);
144fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
14533707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang        v.findViewById(R.id.refresh).setOnClickListener((view) -> initVolumeInfo());
146fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
14731bfad155543439b1421c815b81db44129794414Scott Randolph        final SeekBar.OnSeekBarChangeListener seekListener = new SeekBar.OnSeekBarChangeListener() {
14831bfad155543439b1421c815b81db44129794414Scott Randolph            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
14931bfad155543439b1421c815b81db44129794414Scott Randolph                final float percent = (progress - 100) / 100.0f;
15031bfad155543439b1421c815b81db44129794414Scott Randolph                try {
15131bfad155543439b1421c815b81db44129794414Scott Randolph                    if (seekBar.getId() == R.id.fade_bar) {
15231bfad155543439b1421c815b81db44129794414Scott Randolph                        mCarAudioManager.setFadeTowardFront(percent);
15331bfad155543439b1421c815b81db44129794414Scott Randolph                    } else {
15431bfad155543439b1421c815b81db44129794414Scott Randolph                        mCarAudioManager.setBalanceTowardRight(percent);
15531bfad155543439b1421c815b81db44129794414Scott Randolph                    }
15631bfad155543439b1421c815b81db44129794414Scott Randolph                } catch (CarNotConnectedException e) {
15731bfad155543439b1421c815b81db44129794414Scott Randolph                    Log.e(TAG, "Can't adjust fade or balance when car not connected", e);
15831bfad155543439b1421c815b81db44129794414Scott Randolph                }
15931bfad155543439b1421c815b81db44129794414Scott Randolph            }
16031bfad155543439b1421c815b81db44129794414Scott Randolph
16131bfad155543439b1421c815b81db44129794414Scott Randolph            public void onStartTrackingTouch(SeekBar seekBar) {}
16231bfad155543439b1421c815b81db44129794414Scott Randolph
16331bfad155543439b1421c815b81db44129794414Scott Randolph            public void onStopTrackingTouch(SeekBar seekBar) {}
16431bfad155543439b1421c815b81db44129794414Scott Randolph        };
16531bfad155543439b1421c815b81db44129794414Scott Randolph
16631bfad155543439b1421c815b81db44129794414Scott Randolph        mFader = v.findViewById(R.id.fade_bar);
16731bfad155543439b1421c815b81db44129794414Scott Randolph        mFader.setOnSeekBarChangeListener(seekListener);
16831bfad155543439b1421c815b81db44129794414Scott Randolph
16931bfad155543439b1421c815b81db44129794414Scott Randolph        mBalance = v.findViewById(R.id.balance_bar);
17031bfad155543439b1421c815b81db44129794414Scott Randolph        mBalance.setOnSeekBarChangeListener(seekListener);
17131bfad155543439b1421c815b81db44129794414Scott Randolph
1726bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen        mCar = Car.createCar(getActivity(), mCarConnectionCallback);
1736bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen        mCar.connect();
174fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        return v;
175fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    }
176fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
17733707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang    public void adjustVolumeByOne(int groupId, boolean up) {
178fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        if (mCarAudioManager == null) {
179fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen            Log.e(TAG, "CarAudioManager is null");
180fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen            return;
181fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        }
182fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        int current = 0;
183fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        try {
18433707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang            current = mCarAudioManager.getGroupVolume(groupId);
18533707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang            int volume = current + (up ? 1 : -1);
18633707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang            mCarAudioManager.setGroupVolume(groupId, volume,
1876bcaeeed788f060ba94fbd64357e6ae2caf97ab8Yao Chen                    AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_PLAY_SOUND);
18833707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang            Log.d(TAG, "Set group " + groupId + " volume " + volume);
189fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        } catch (CarNotConnectedException e) {
190fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen            Log.e(TAG, "car not connected", e);
191fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        }
192fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    }
193fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
19433707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang    public void requestFocus(int groupId) {
19533707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang        mHandler.sendMessage(mHandler.obtainMessage(MSG_REQUEST_FOCUS, groupId));
19633707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang    }
197fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
198fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    private void initVolumeInfo() {
19933707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang        try {
20033707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang            int volumeGroupCount = mCarAudioManager.getVolumeGroupCount();
20133707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang            mVolumeInfos = new VolumeInfo[volumeGroupCount + 1];
20233707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang            mGroupIdIndexMap.clear();
203fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen            mVolumeInfos[0] = new VolumeInfo();
20433707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang            mVolumeInfos[0].mId = "Group id";
205fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen            mVolumeInfos[0].mCurrent = "Current";
206fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen            mVolumeInfos[0].mMax = "Max";
207fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
20833707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang            int i = 1;
20933707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang            for (int groupId = 0; groupId < volumeGroupCount; groupId++) {
210fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen                mVolumeInfos[i] = new VolumeInfo();
21133707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                mVolumeInfos[i].mGroupId = groupId;
21233707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                mGroupIdIndexMap.put(groupId, i);
21333707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                mVolumeInfos[i].mId = String.valueOf(groupId);
214fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
215fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
21633707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                int current = mCarAudioManager.getGroupVolume(groupId);
21733707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                int max = mCarAudioManager.getGroupMaxVolume(groupId);
21833707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                mVolumeInfos[i].mCurrent = String.valueOf(current);
21933707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                mVolumeInfos[i].mMax = String.valueOf(max);
220fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
22133707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                Log.d(TAG, groupId + " max: " + mVolumeInfos[i].mMax + " current: "
22233707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                        + mVolumeInfos[i].mCurrent);
22333707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang                i++;
22433707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang            }
22533707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang            mAdapter.refreshVolumes(mVolumeInfos);
22633707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang        } catch (CarNotConnectedException e) {
22733707a9d6e5beb03c5ae010e661035f820cc4bb8Hongwei Wang            Log.e(TAG, "car not connected", e);
228fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        }
229fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    }
230fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen
231fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    @Override
232fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    public void onDestroy() {
233fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        if (mCar != null) {
234fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen            mCar.disconnect();
235fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        }
236fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen        super.onDestroy();
237fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen    }
238fe533c6ca182b0e1c9bde49c7a05edeb7b693223Yao Chen}
239