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

Commit 488a80a7 authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change Id587a517 into eclair

* changes:
  b/2314560 Prevent PIN dialog from showing up on undocked docks
parents a9f9031b d617a078
Loading
Loading
Loading
Loading
+45 −3
Original line number Diff line number Diff line
@@ -75,10 +75,23 @@ public class BluetoothEventRedirector {
            } else if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
                int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
                                                   BluetoothDevice.ERROR);
                mManager.getCachedDeviceManager().onBondingStateChanged(device, bondState);
                CachedBluetoothDeviceManager cachedDeviceMgr = mManager.getCachedDeviceManager();
                cachedDeviceMgr.onBondingStateChanged(device, bondState);
                if (bondState == BluetoothDevice.BOND_NONE) {
                    int reason = intent.getIntExtra(BluetoothDevice.EXTRA_REASON, BluetoothDevice.ERROR);
                    mManager.getCachedDeviceManager().showUnbondMessage(device, reason);
                    if (device.isBluetoothDock()) {
                        // After a dock is unpaired, we will forget the
                        // setttings
                        mManager.removeDockAutoConnectSetting(device.getAddress());

                        // if the device is undocked, remove it from the list as
                        // well
                        if (!device.getAddress().equals(getDockedDeviceAddress(context))) {
                            cachedDeviceMgr.onDeviceDisappeared(device);
                        }
                    }
                    int reason = intent.getIntExtra(BluetoothDevice.EXTRA_REASON,
                            BluetoothDevice.ERROR);
                    cachedDeviceMgr.showUnbondMessage(device, reason);
                }

            } else if (action.equals(BluetoothHeadset.ACTION_STATE_CHANGED)) {
@@ -112,6 +125,16 @@ public class BluetoothEventRedirector {
            } else if (action.equals(BluetoothDevice.ACTION_PAIRING_CANCEL)) {
                int errorMsg = R.string.bluetooth_pairing_error_message;
                mManager.showError(device, R.string.bluetooth_error_title, errorMsg);

            } else if (action.equals(Intent.ACTION_DOCK_EVENT)) {
                // Remove if unpair device upon undocking
                int anythingButUnDocked = Intent.EXTRA_DOCK_STATE_UNDOCKED + 1;
                int state = intent.getIntExtra(Intent.EXTRA_DOCK_STATE, anythingButUnDocked);
                if (state == Intent.EXTRA_DOCK_STATE_UNDOCKED) {
                    if (device.getBondState() == BluetoothDevice.BOND_NONE) {
                        mManager.getCachedDeviceManager().onDeviceDisappeared(device);
                    }
                }
            }
        }
    };
@@ -143,10 +166,29 @@ public class BluetoothEventRedirector {
        filter.addAction(BluetoothDevice.ACTION_CLASS_CHANGED);
        filter.addAction(BluetoothDevice.ACTION_UUID);

        // Dock event broadcasts
        filter.addAction(Intent.ACTION_DOCK_EVENT);

        mManager.getContext().registerReceiver(mBroadcastReceiver, filter);
    }

    public void stop() {
        mManager.getContext().unregisterReceiver(mBroadcastReceiver);
    }

    // This can't be called from a broadcast receiver where the filter is set in the Manifest.
    private String getDockedDeviceAddress(Context context) {
        // This works only because these broadcast intents are "sticky"
        Intent i = context.registerReceiver(null, new IntentFilter(Intent.ACTION_DOCK_EVENT));
        if (i != null) {
            int state = i.getIntExtra(Intent.EXTRA_DOCK_STATE, Intent.EXTRA_DOCK_STATE_UNDOCKED);
            if (state != Intent.EXTRA_DOCK_STATE_UNDOCKED) {
                BluetoothDevice device = i.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                if (device != null) {
                    return device.getAddress();
                }
            }
        }
        return null;
    }
}
+8 −27
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
@@ -58,8 +57,6 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
    // TODO clean up logs. Disable DEBUG flag for this file and receiver's too
    private static final boolean DEBUG = true;

    private static final String SHARED_PREFERENCE_KEY_AUTO_CONNECT_TO_DOCK = "auto_connect_to_dock";

    // Time allowed for the device to be undocked and redocked without severing
    // the bluetooth connection
    private static final long UNDOCKED_GRACE_PERIOD = 1000;
@@ -214,7 +211,7 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
                    }

                    mDevice = device;
                    if (getAutoConnectSetting(mBtManager, device.getAddress())) {
                    if (mBtManager.getDockAutoConnectSetting(device.getAddress())) {
                        // Setting == auto connect
                        initBtSettings(mContext, device, state, false);
                        applyBtSettings(mDevice, startId);
@@ -291,7 +288,7 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
        startForeground(0, new Notification());

        // Device in a new dock.
        boolean firstTime = !hasAutoConnectSetting(mBtManager, device.getAddress());
        boolean firstTime = !mBtManager.hasDockAutoConnectSetting(device.getAddress());

        CharSequence[] items = initBtSettings(service, device, state, firstTime);

@@ -309,14 +306,15 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
        CheckBox rememberCheckbox = (CheckBox) view.findViewById(R.id.remember);

        // check "Remember setting" by default if no value was saved
        boolean checked = firstTime || getAutoConnectSetting(mBtManager, device.getAddress());
        boolean checked = firstTime || mBtManager.getDockAutoConnectSetting(device.getAddress());
        rememberCheckbox.setChecked(checked);
        rememberCheckbox.setOnCheckedChangeListener(this);
        int viewSpacingLeft = (int) (14 * pixelScaleFactor);
        int viewSpacingRight = (int) (14 * pixelScaleFactor);
        ab.setView(view, viewSpacingLeft, 0 /* top */, viewSpacingRight, 0 /* bottom */);
        if (DEBUG) {
            Log.d(TAG, "Auto connect = " + getAutoConnectSetting(mBtManager, device.getAddress()));
            Log.d(TAG, "Auto connect = "
                    + mBtManager.getDockAutoConnectSetting(device.getAddress()));
        }

        // Ok Button
@@ -339,7 +337,7 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
    // Called when the "Remember" Checkbox is clicked
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (DEBUG) Log.d(TAG, "onCheckedChanged: Remember Settings = " + isChecked);
        saveAutoConnectSetting(mBtManager, mDevice.getAddress(), isChecked);
        mBtManager.saveDockAutoConnectSetting(mDevice.getAddress(), isChecked);
    }

    // Called when the dialog is dismissed
@@ -355,8 +353,8 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
    // Called when clicked on the OK button
    public void onClick(DialogInterface dialog, int which) {
        if (which == DialogInterface.BUTTON_POSITIVE) {
            if (!hasAutoConnectSetting(mBtManager, mDevice.getAddress())) {
                saveAutoConnectSetting(mBtManager, mDevice.getAddress(), true);
            if (!mBtManager.hasDockAutoConnectSetting(mDevice.getAddress())) {
                mBtManager.saveDockAutoConnectSetting(mDevice.getAddress(), true);
            }

            applyBtSettings(mDevice, mStartIdAssociatedWithDialog);
@@ -514,23 +512,6 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
        return cachedBluetoothDevice;
    }

    public static boolean hasAutoConnectSetting(LocalBluetoothManager localManager, String addr) {
        return localManager.getSharedPreferences().contains(
                SHARED_PREFERENCE_KEY_AUTO_CONNECT_TO_DOCK + addr);
    }

    public static boolean getAutoConnectSetting(LocalBluetoothManager localManager, String addr) {
        return localManager.getSharedPreferences().getBoolean(
                SHARED_PREFERENCE_KEY_AUTO_CONNECT_TO_DOCK + addr, false);
    }

    public static void saveAutoConnectSetting(LocalBluetoothManager localManager, String addr,
            boolean autoConnect) {
        SharedPreferences.Editor editor = localManager.getSharedPreferences().edit();
        editor.putBoolean(SHARED_PREFERENCE_KEY_AUTO_CONNECT_TO_DOCK + addr, autoConnect);
        editor.commit();
    }

    // TODO Delete this method if not needed.
    private Notification getNotification(Service service) {
        CharSequence title = service.getString(R.string.dock_settings_title);
+23 −0
Original line number Diff line number Diff line
@@ -78,6 +78,8 @@ public class LocalBluetoothManager {
    private static final String SHARED_PREFERENCES_KEY_LAST_SELECTED_DEVICE_TIME =
        "last_selected_device_time";

    private static final String SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT = "auto_connect_to_dock";

    private long mLastScan;

    public static LocalBluetoothManager getInstance(Context context) {
@@ -339,4 +341,25 @@ public class LocalBluetoothManager {
                System.currentTimeMillis());
        editor.commit();
    }

    public boolean hasDockAutoConnectSetting(String addr) {
        return getSharedPreferences().contains(SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT + addr);
    }

    public boolean getDockAutoConnectSetting(String addr) {
        return getSharedPreferences().getBoolean(SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT + addr,
                false);
    }

    public void saveDockAutoConnectSetting(String addr, boolean autoConnect) {
        SharedPreferences.Editor editor = getSharedPreferences().edit();
        editor.putBoolean(SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT + addr, autoConnect);
        editor.commit();
    }

    public void removeDockAutoConnectSetting(String addr) {
        SharedPreferences.Editor editor = getSharedPreferences().edit();
        editor.remove(SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT + addr);
        editor.commit();
    }
}