Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a47a5a92 authored by Srinu Jella's avatar Srinu Jella Committed by Steve Kondik
Browse files

Bluetooth: DUN: Add DUN profile support in Settings APP

It registers service listener for DUN profile with the
BT adapter, and it will track the profile status with
the service listener state chnages.

It also has support for DUN profile connection status
updation and DUN Disconnection from server.

Change-Id: I83d4919821cb095429ff7e73a8974d92c4df086c
parent 206e3e1e
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -1137,6 +1137,8 @@
    <string name="bluetooth_profile_pan_nap">Internet connection sharing</string>
    <!-- Bluetooth settings.  The user-visible string that is used whenever referring to the SAP profile. -->
    <string name="bluetooth_profile_sap">SIM Access</string>
    <!-- Bluetooth settings.  The user-visible string that is used whenever referring to the DUN profile. -->
    <string name="bluetooth_profile_dun">Dial-up network access</string>
    <!-- Bluetooth settings.  Message for disconnecting from the A2DP profile. [CHAR LIMIT=80] -->
    <string name="bluetooth_disconnect_a2dp_profile"><xliff:g id="device_name">%1$s</xliff:g> will be disconnected from media audio.</string>
    <!-- Bluetooth settings.  Message for disconnecting from the headset profile. [CHAR LIMIT=80] -->
@@ -1169,7 +1171,9 @@
    <!-- Bluetooth settings.  Connection options screen.  The summary for the OPP checkbox preference when OPP is connected. -->
    <string name="bluetooth_opp_profile_summary_connected">Connected to file transfer server</string>
    <!-- Bluetooth settings.  Connection options screen.  The summary for the SAP checkbox preference when SAP is connected. -->
    <string name="bluetooth_sap_profile_summary_connected">Connected to SIM Access Server</string>
    <string name="bluetooth_sap_profile_summary_connected">Connected to SIM access server</string>
    <!-- Bluetooth settings.  Connection options screen.  The summary for the DUN checkbox preference when DUN is connected. -->
    <string name="bluetooth_dun_profile_summary_connected">Connected to DUN server</string>
    <!-- Bluetooth settings.  Connection options screen.  The summary for the OPP checkbox preference when OPP is not connected. -->
    <string name="bluetooth_opp_profile_summary_not_connected">Not connected to file transfer server</string>
    <!-- Bluetooth settings. Connection options screen. The summary for the HID checkbox preference when HID is connected. -->
@@ -1187,6 +1191,8 @@
    <string name="bluetooth_opp_profile_summary_use_for">Use for file transfer</string>
    <!-- Bluetooth settings.  Connection options screen.  The summary for the SAP checkbox preference that describes how checking it will set the SAP profile as preferred. -->
    <string name="bluetooth_sap_profile_summary_use_for">Use for SIM Access</string>
    <!-- Bluetooth settings.  Connection options screen.  The summary for the DUN checkbox preference that describes how checking it will set the DUN profile as preferred. -->
    <string name="bluetooth_dun_profile_summary_use_for">Use for dial-up network access</string>
    <!-- Bluetooth settings. Connection options screen. The summary
         for the HID checkbox preference that describes how checking it
         will set the HID profile as preferred. -->
+162 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2013, 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 BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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.settings.bluetooth;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothDun;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.util.Log;

import com.android.settings.R;

import java.util.HashMap;
import java.util.List;

/**
 * DunServerProfile handles Bluetooth DUN server profile.
 */
final class DunServerProfile implements LocalBluetoothProfile {
    private static final String TAG = "DunServerProfile";
    private static boolean V = true;

    private BluetoothDun mService;
    private boolean mIsProfileReady;

    static final String NAME = "DUN Server";

    // Order of this profile in device profiles list
    private static final int ORDINAL = 11;

    // These callbacks run on the main thread.
    private final class DunServiceListener
            implements BluetoothProfile.ServiceListener {

        public void onServiceConnected(int profile, BluetoothProfile proxy) {
            if (V) Log.d(TAG,"Bluetooth service connected");
            mService = (BluetoothDun) proxy;
            mIsProfileReady = true;
        }

        public void onServiceDisconnected(int profile) {
            if (V) Log.d(TAG,"Bluetooth service disconnected");
            mIsProfileReady = false;
        }
    }

    public boolean isProfileReady() {
        return mIsProfileReady;
    }

    DunServerProfile(Context context) {
        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
        adapter.getProfileProxy(context, new DunServiceListener(),
                BluetoothProfile.DUN);
    }

    public boolean isConnectable() {
        return true;
    }

    public boolean isAutoConnectable() {
        return false;
    }

    public boolean connect(BluetoothDevice device) {
        return false;
    }

    public boolean disconnect(BluetoothDevice device) {
        if (mService == null) return false;
        return mService.disconnect(device);
    }

    public int getConnectionStatus(BluetoothDevice device) {
        if (mService == null) {
            return BluetoothProfile.STATE_DISCONNECTED;
        }
        return mService.getConnectionState(device);
    }

    public boolean isPreferred(BluetoothDevice device) {
        return true;
    }

    public int getPreferred(BluetoothDevice device) {
        return -1;
    }

    public void setPreferred(BluetoothDevice device, boolean preferred) {
        // ignore: isPreferred is always true for DUN
    }

    public String toString() {
        return NAME;
    }

    public int getOrdinal() {
        return ORDINAL;
    }

    public int getNameResource(BluetoothDevice device) {
        return R.string.bluetooth_profile_dun;
    }

    public int getSummaryResourceForDevice(BluetoothDevice device) {
        int state = getConnectionStatus(device);
        switch (state) {
            case BluetoothProfile.STATE_DISCONNECTED:
                return R.string.bluetooth_dun_profile_summary_use_for;

            case BluetoothProfile.STATE_CONNECTED:
                return R.string.bluetooth_dun_profile_summary_connected;
            default:
                return Utils.getConnectionStateSummary(state);
        }
    }

    public int getDrawableResource(BluetoothClass btClass) {
        return R.drawable.ic_bt_network_pan;
    }

    protected void finalize() {
        if (V) Log.d(TAG, "finalize()");
        if (mService != null) {
            try {
                BluetoothAdapter.getDefaultAdapter().closeProfileProxy
                                    (BluetoothProfile.DUN, mService);
                mService = null;
            } catch (Throwable t) {
                Log.w(TAG, "Error cleaning up DUN proxy", t);
            }
        }
    }
}
+9 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothInputDevice;
import android.bluetooth.BluetoothPan;
import android.bluetooth.BluetoothSap;
import android.bluetooth.BluetoothDun;
import android.bluetooth.BluetoothPbap;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothUuid;
@@ -85,6 +86,7 @@ final class LocalBluetoothProfileManager {
    private OppProfile mOppProfile;
    private final PanProfile mPanProfile;
    private SapServerProfile mSapProfile;
    private DunServerProfile mDunProfile;
    private final PbapServerProfile mPbapProfile;

    /**
@@ -123,11 +125,17 @@ final class LocalBluetoothProfileManager {
                BluetoothPan.ACTION_CONNECTION_STATE_CHANGED);

        // enable SAP only if the property is set
        if(SystemProperties.getBoolean("ro.qualcomm.bluetooth.sap", false) == true) {
        if (SystemProperties.getBoolean("ro.bluetooth.sap", false) == true) {
            mSapProfile = new SapServerProfile(context);
            addProfile(mSapProfile, SapServerProfile.NAME,
                    BluetoothSap.ACTION_CONNECTION_STATE_CHANGED);
        }
        // enable DUN only if the property is set
        if (SystemProperties.getBoolean("ro.bluetooth.dun", false) == true) {
            mDunProfile = new DunServerProfile(context);
            addProfile(mDunProfile, DunServerProfile.NAME,
                    BluetoothDun.ACTION_CONNECTION_STATE_CHANGED);
        }


       //Create PBAP server profile, but do not add it to list of profiles