10654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta/*
20654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta * Copyright (C) 2011 The Android Open Source Project
30654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta *
40654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta * Licensed under the Apache License, Version 2.0 (the "License");
50654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta * you may not use this file except in compliance with the License.
60654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta * You may obtain a copy of the License at
70654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta *
80654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta *      http://www.apache.org/licenses/LICENSE-2.0
90654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta *
100654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta * Unless required by applicable law or agreed to in writing, software
110654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta * distributed under the License is distributed on an "AS IS" BASIS,
120654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta * See the License for the specific language governing permissions and
140654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta * limitations under the License.
150654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta */
160654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
170654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Battapackage com.android.settings.bluetooth;
180654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
190654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Battaimport android.bluetooth.BluetoothAdapter;
200654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Battaimport android.bluetooth.BluetoothClass;
210654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Battaimport android.bluetooth.BluetoothDevice;
220654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Battaimport android.bluetooth.BluetoothPbap;
230654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Battaimport android.bluetooth.BluetoothProfile;
240654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Battaimport android.content.Context;
250654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Battaimport android.util.Log;
260654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
270654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Battaimport com.android.settings.R;
280654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
290654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Battaimport java.util.HashMap;
300654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Battaimport java.util.List;
310654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
320654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta/**
331490075dff65b31a20c630a9cbee8ce8233177aeAndy Stadler * PBAPServer Profile
340654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta */
350654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Battafinal class PbapServerProfile implements LocalBluetoothProfile {
360654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    private static final String TAG = "PbapServerProfile";
370654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    private static boolean V = true;
380654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
390654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    private BluetoothPbap mService;
400654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    private boolean mIsProfileReady;
410654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
420654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    static final String NAME = "PBAP Server";
430654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
440654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    // Order of this profile in device profiles list
450654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    private static final int ORDINAL = 6;
460654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
470654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    // These callbacks run on the main thread.
480654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    private final class PbapServiceListener
490654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta            implements BluetoothPbap.ServiceListener {
500654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
510654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        public void onServiceConnected(BluetoothPbap proxy) {
520654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta            if (V) Log.d(TAG,"Bluetooth service connected");
530654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta            mService = (BluetoothPbap) proxy;
540654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta            mIsProfileReady=true;
550654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        }
560654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
570654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        public void onServiceDisconnected() {
580654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta            if (V) Log.d(TAG,"Bluetooth service disconnected");
590654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta            mIsProfileReady=false;
600654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        }
610654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
620654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
630654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    public boolean isProfileReady() {
640654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        return mIsProfileReady;
650654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
660654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
670654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    PbapServerProfile(Context context) {
680654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        BluetoothPbap pbap = new BluetoothPbap(context, new PbapServiceListener());
690654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
700654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
710654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    public boolean isConnectable() {
720654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        return true;
730654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
740654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
750654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    public boolean isAutoConnectable() {
760654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        return false;
770654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
780654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
790654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    public boolean connect(BluetoothDevice device) {
800654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        /*Can't connect from server */
810654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        return false;
820654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
830654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
840654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
850654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    public boolean disconnect(BluetoothDevice device) {
860654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        if (mService == null) return false;
870654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        return mService.disconnect();
880654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
890654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
900654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    public int getConnectionStatus(BluetoothDevice device) {
910654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        if (mService == null) {
920654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta            return BluetoothProfile.STATE_DISCONNECTED;
930654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        }
940654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        if (mService.isConnected(device))
950654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta            return BluetoothProfile.STATE_CONNECTED;
960654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        else
970654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta            return BluetoothProfile.STATE_DISCONNECTED;
980654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
990654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
1000654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    public boolean isPreferred(BluetoothDevice device) {
1010654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        return false;
1020654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
1030654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
1040654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    public int getPreferred(BluetoothDevice device) {
1050654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        return -1;
1060654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
1070654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
1080654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    public void setPreferred(BluetoothDevice device, boolean preferred) {
1090654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        // ignore: isPreferred is always true for PBAP
1100654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
1110654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
1120654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    public String toString() {
1130654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        return NAME;
1140654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
1150654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
1160654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    public int getOrdinal() {
1170654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        return ORDINAL;
1180654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
1190654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
1200654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    public int getNameResource(BluetoothDevice device) {
121361d870e5415f8642cb106b4329d194673b4dd02PauloftheWest        return R.string.bluetooth_profile_pbap;
1220654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
1230654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
1240654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    public int getSummaryResourceForDevice(BluetoothDevice device) {
125361d870e5415f8642cb106b4329d194673b4dd02PauloftheWest        return R.string.bluetooth_profile_pbap_summary;
1260654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
1270654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta
1280654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    public int getDrawableResource(BluetoothClass btClass) {
129361d870e5415f8642cb106b4329d194673b4dd02PauloftheWest        return R.drawable.ic_bt_cellphone;
1300654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
131361d870e5415f8642cb106b4329d194673b4dd02PauloftheWest
1320654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    protected void finalize() {
1330654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        if (V) Log.d(TAG, "finalize()");
1340654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        if (mService != null) {
1350654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta            try {
1360654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta                mService.close();
1370654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta                mService = null;
1380654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta            }catch (Throwable t) {
1390654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta                Log.w(TAG, "Error cleaning up PBAP proxy", t);
1400654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta            }
1410654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta        }
1420654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta    }
1430654b71534411f4d93502f6ed8d8e864ef5b88efGanesh Ganapathi Batta}
144