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