blob: eedb05d0e2dfb2335286d9f60989fe5bb5b2849f [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
package com.android.settingslib.bluetooth;
import static android.bluetooth.BluetoothProfile.CONNECTION_POLICY_UNKNOWN;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothVcp;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.util.Log;
import com.android.settingslib.R;
import java.util.ArrayList;
import java.util.List;
public class VcpProfile implements LocalBluetoothProfile {
private static final String TAG = "VcpProfile";
private static boolean V = true;
private Context mContext;
private BluetoothVcp mService;
private boolean mIsProfileReady;
private final CachedBluetoothDeviceManager mDeviceManager;
static final String NAME = "VCP";
private final LocalBluetoothProfileManager mProfileManager;
private final BluetoothAdapter mBluetoothAdapter;
// Order of this profile in device profiles list
private static final int ORDINAL = 1;
// These callbacks run on the main thread.
private final class VcpServiceListener
implements BluetoothProfile.ServiceListener {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
mService = (BluetoothVcp) proxy;
Log.w(TAG, "Bluetooth service Connected");
mIsProfileReady=true;
mProfileManager.callServiceConnectedListeners();
}
public void onServiceDisconnected(int profile) {
Log.w(TAG, "Bluetooth service Disconnected");
mIsProfileReady=false;
}
}
public boolean isProfileReady() {
return mIsProfileReady;
}
@Override
public int getProfileId() {
return BluetoothProfile.VCP;
}
VcpProfile(Context context, CachedBluetoothDeviceManager deviceManager,
LocalBluetoothProfileManager profileManager) {
mContext = context;
mDeviceManager = deviceManager;
mProfileManager = profileManager;
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
mBluetoothAdapter.getProfileProxy(context,
new VcpServiceListener(), BluetoothProfile.VCP);
}
public boolean accessProfileEnabled() {
return false;
}
public boolean isAutoConnectable() {
return false;
}
public int getConnectionStatus(BluetoothDevice device) {
if (mService == null) {
return BluetoothProfile.STATE_DISCONNECTED;
}
return mService.getConnectionState(device);
}
public int getConnectionMode(BluetoothDevice device) {
if (mService == null) {
return BluetoothProfile.STATE_DISCONNECTED;
}
return mService.getConnectionMode(device);
}
@Override
public boolean isEnabled(BluetoothDevice device) {
return false;
}
@Override
public int getConnectionPolicy(BluetoothDevice device) {
return CONNECTION_POLICY_UNKNOWN;
}
@Override
public boolean setEnabled(BluetoothDevice device, boolean enabled) {
return false;
}
public void setAbsoluteVolume(BluetoothDevice device, int volume) {
if (mService == null) {
return;
}
mService.setAbsoluteVolume(device, volume);
}
public int getAbsoluteVolume(BluetoothDevice device) {
if (mService == null) {
return -1;
}
return mService.getAbsoluteVolume(device);
}
public void setMute(BluetoothDevice device, boolean enableMute) {
if (mService == null) {
return;
}
mService.setMute(device, enableMute);
}
public boolean isMute(BluetoothDevice device) {
if (mService == null) {
return false;
}
return mService.isMute(device);
}
public String toString() {
return NAME;
}
public int getOrdinal() {
return ORDINAL;
}
public int getNameResource(BluetoothDevice device) {
return R.string.bluetooth_profile_vcp;
}
public int getSummaryResourceForDevice(BluetoothDevice device) {
return 0; // VCP profile not displayed in UI
}
public int getDrawableResource(BluetoothClass btClass) {
return 0; // no icon for VCP
}
protected void finalize() {
Log.d(TAG, "finalize()");
if (mService != null) {
try {
BluetoothAdapter.getDefaultAdapter().closeProfileProxy(BluetoothProfile.VCP,
mService);
mService = null;
}catch (Throwable t) {
Log.w(TAG, "Error cleaning up Vcp proxy", t);
}
}
}
}