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

Commit eb9cecd9 authored by Zhihai Xu's avatar Zhihai Xu Committed by Android Git Automerger
Browse files

am 6ee5b450: Merge "Bluetooth MAP profile - sms and mms support initial check-in" into klp-dev

* commit '6ee5b450':
  Bluetooth MAP profile - sms and mms support initial check-in
parents 3c7fdfd9 6ee5b450
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -36,12 +36,12 @@
            android:gravity="center_horizontal"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <CheckBox android:id="@+id/bluetooth_pb_remember_choice"
        <CheckBox android:id="@+id/bluetooth_remember_choice"
            style="?android:attr/textAppearanceMedium"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dip"
            android:text="@string/bluetooth_pb_remember_choice" />
            android:text="@string/bluetooth_remember_choice" />

    </LinearLayout>

+11 −0
Original line number Diff line number Diff line
@@ -355,8 +355,19 @@
    <string name="bluetooth_pb_acceptance_dialog_text">%1$s wants to access your contacts and call history. Give access to %2$s?</string>

    <!-- Bluetooth phone book permission Alert Activity checkbox text [CHAR LIMIT=none] -->
    <string name="bluetooth_remember_choice">Don\'t ask again</string>
    <!--FIXME SHOULD BE REMOVED AND ALL LANG VERSIONS FIXED TO ABOVE NAME -->
    <string name="bluetooth_pb_remember_choice">Don\'t ask again</string>

    <!-- Activity label of BluetoothMessagePermissionActivity, also used as Strings in the permission dialog [CHAR LIMIT=none] -->
    <string name="bluetooth_map_request">"Message request"</string>

    <!-- Bluetooth message permission Alert Activity text [CHAR LIMIT=none] -->
    <string name="bluetooth_map_acceptance_dialog_text">%1$s wants to access your messages. Give access to %2$s?</string>




    <!-- Date & time settings screen title -->
    <string name="date_and_time">Date &amp; time settings</string>
    <!-- The title of the activity to pick a time zone. -->
+70 −51
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ public class BluetoothPermissionActivity extends AlertActivity implements

    private CheckBox mRememberChoice;
    private boolean mRememberChoiceValue = false;

    private int mRequestType = 0;
    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
@@ -91,15 +91,18 @@ public class BluetoothPermissionActivity extends AlertActivity implements
        mDevice = i.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        mReturnPackage = i.getStringExtra(BluetoothDevice.EXTRA_PACKAGE_NAME);
        mReturnClass = i.getStringExtra(BluetoothDevice.EXTRA_CLASS_NAME);
        int requestType = i.getIntExtra(BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE,
        mRequestType = i.getIntExtra(BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE,
                                     BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS);

        if (requestType == BluetoothDevice.REQUEST_TYPE_PROFILE_CONNECTION) {
            showConnectionDialog();
        } else if (requestType == BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS) {
            showPhonebookDialog();
        } else {
            Log.e(TAG, "Error: bad request type: " + requestType);
        if (mRequestType == BluetoothDevice.REQUEST_TYPE_PROFILE_CONNECTION) {
            showDialog(getString(R.string.bluetooth_connection_permission_request), mRequestType);
        } else if (mRequestType == BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS) {
            showDialog(getString(R.string.bluetooth_phonebook_request), mRequestType);
        } else if (mRequestType == BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS) {
            showDialog(getString(R.string.bluetooth_map_request), mRequestType);
        }
        else {
            Log.e(TAG, "Error: bad request type: " + mRequestType);
            finish();
            return;
        }
@@ -108,62 +111,57 @@ public class BluetoothPermissionActivity extends AlertActivity implements
        mReceiverRegistered = true;
    }

    private void showConnectionDialog() {

    private void showDialog(String title, int requestType)
    {
        final AlertController.AlertParams p = mAlertParams;
        p.mIconId = android.R.drawable.ic_dialog_info;
        p.mTitle = getString(R.string.bluetooth_connection_permission_request);
        p.mTitle = title;
        switch(requestType)
        {
        case BluetoothDevice.REQUEST_TYPE_PROFILE_CONNECTION:
            p.mView = createConnectionDialogView();
            break;
        case BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS:
            p.mView = createPhonebookDialogView();
            break;
        case BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS:
            p.mView = createMapDialogView();
            break;
        }
        p.mPositiveButtonText = getString(R.string.yes);
        p.mPositiveButtonListener = this;
        p.mNegativeButtonText = getString(R.string.no);
        p.mNegativeButtonListener = this;
        mOkButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
        setupAlert();
    }

    private void showPhonebookDialog() {
        final AlertController.AlertParams p = mAlertParams;
        p.mIconId = android.R.drawable.ic_dialog_info;
        p.mTitle = getString(R.string.bluetooth_phonebook_request);
        p.mView = createPhonebookDialogView();
        p.mPositiveButtonText = getString(android.R.string.yes);
        p.mPositiveButtonListener = this;
        p.mNegativeButtonText = getString(android.R.string.no);
        p.mNegativeButtonListener = this;
        mOkButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
        setupAlert();
    }

    private String createConnectionDisplayText() {
        String mRemoteName = mDevice != null ? mDevice.getAliasName() : null;

        if (mRemoteName == null) mRemoteName = getString(R.string.unknown);
        String mMessage1 = getString(R.string.bluetooth_connection_dialog_text,
                mRemoteName);
    private String createDisplayText(String message) {
        String mMessage1 = message;
        return mMessage1;
    }

    private String createPhonebookDisplayText() {
    private String createRemoteName()
    {
        String mRemoteName = mDevice != null ? mDevice.getAliasName() : null;

        if (mRemoteName == null) mRemoteName = getString(R.string.unknown);
        String mMessage1 = getString(R.string.bluetooth_pb_acceptance_dialog_text,
                                     mRemoteName, mRemoteName);
        return mMessage1;
        return mRemoteName;
    }

    private View createConnectionDialogView() {
        String mRemoteName = createRemoteName();
        mView = getLayoutInflater().inflate(R.layout.bluetooth_connection_access, null);
        messageView = (TextView)mView.findViewById(R.id.message);
        messageView.setText(createConnectionDisplayText());
        messageView.setText(createDisplayText(getString(R.string.bluetooth_connection_dialog_text,
                mRemoteName)));
        return mView;
    }

    private View createPhonebookDialogView() {
        mView = getLayoutInflater().inflate(R.layout.bluetooth_pb_access, null);
        messageView = (TextView)mView.findViewById(R.id.message);
        messageView.setText(createPhonebookDisplayText());
        mRememberChoice = (CheckBox)mView.findViewById(R.id.bluetooth_pb_remember_choice);
    private void createCheckbox(int viewId)
    {
        mRememberChoice = (CheckBox)mView.findViewById(viewId);
        mRememberChoice.setChecked(false);
        mRememberChoice.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
@@ -174,15 +172,31 @@ public class BluetoothPermissionActivity extends AlertActivity implements
                }
            }
            });
    }
    private View createPhonebookDialogView() {
        String mRemoteName = createRemoteName();
        mView = getLayoutInflater().inflate(R.layout.bluetooth_access, null);
        messageView = (TextView)mView.findViewById(R.id.message);
        messageView.setText(createDisplayText(getString(R.string.bluetooth_pb_acceptance_dialog_text,
                mRemoteName, mRemoteName)));
        createCheckbox(R.id.bluetooth_remember_choice);
        return mView;
    }
    private View createMapDialogView() {
        String mRemoteName = createRemoteName();
        mView = getLayoutInflater().inflate(R.layout.bluetooth_access, null);
        messageView = (TextView)mView.findViewById(R.id.message);
        messageView.setText(createDisplayText(getString(R.string.bluetooth_map_acceptance_dialog_text,
                mRemoteName, mRemoteName)));
        createCheckbox(R.id.bluetooth_remember_choice);
        return mView;
    }

    private void onPositive() {
        if (DEBUG) Log.d(TAG, "onPositive mRememberChoiceValue: " + mRememberChoiceValue);
        if (mRememberChoiceValue)
            savePermissionChoice(mRequestType, CachedBluetoothDevice.ACCESS_ALLOWED);

        if (mRememberChoiceValue) {
            savePhonebookPermissionChoice(CachedBluetoothDevice.PHONEBOOK_ACCESS_ALLOWED);
        }
        sendIntentToReceiver(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY, true,
                            BluetoothDevice.EXTRA_ALWAYS_ALLOWED, mRememberChoiceValue);
        finish();
@@ -191,9 +205,9 @@ public class BluetoothPermissionActivity extends AlertActivity implements
    private void onNegative() {
        if (DEBUG) Log.d(TAG, "onNegative mRememberChoiceValue: " + mRememberChoiceValue);

        if (mRememberChoiceValue) {
            savePhonebookPermissionChoice(CachedBluetoothDevice.PHONEBOOK_ACCESS_REJECTED);
        }
        if (mRememberChoiceValue)
            savePermissionChoice(mRequestType, CachedBluetoothDevice.ACCESS_REJECTED);

        sendIntentToReceiver(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY, false,
                             null, false // dummy value, no effect since last param is null
                             );
@@ -246,18 +260,23 @@ public class BluetoothPermissionActivity extends AlertActivity implements
        return true;
    }

    private void savePhonebookPermissionChoice(int permissionChoice) {
    private void savePermissionChoice(int permissionType, int permissionChoice) {
        LocalBluetoothManager bluetoothManager = LocalBluetoothManager.getInstance(this);
        CachedBluetoothDeviceManager cachedDeviceManager =
            bluetoothManager.getCachedDeviceManager();
        CachedBluetoothDevice cachedDevice = cachedDeviceManager.findDevice(mDevice);
        if (cachedDevice != null ) {
            cachedDevice.setPhonebookPermissionChoice(permissionChoice);
        } else {
        if (DEBUG) Log.d(TAG, "savePermissionChoice permissionType: " + permissionType);
        if (cachedDevice == null ) {
            cachedDevice = cachedDeviceManager.addDevice(bluetoothManager.getBluetoothAdapter(),
                                                         bluetoothManager.getProfileManager(),
                                                         mDevice);
        }
        if (permissionType == BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS){
            cachedDevice.setPhonebookPermissionChoice(permissionChoice);
        }else if (permissionType == BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS){
            cachedDevice.setMessagePermissionChoice(permissionChoice);
        }

    }

}
+41 −17
Original line number Diff line number Diff line
@@ -128,8 +128,10 @@ public final class BluetoothPermissionRequest extends BroadcastReceiver {
    private boolean checkUserChoice() {
        boolean processed = false;

        // we only remember PHONEBOOK permission
        if (mRequestType != BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS) {
        // ignore if it is something else than phonebook/message settings it wants us to remember
        if (mRequestType != BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS
                && mRequestType != BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS) {
            if (DEBUG) Log.d(TAG, "Unknown RequestType: " + mRequestType);
            return processed;
        }

@@ -143,24 +145,46 @@ public final class BluetoothPermissionRequest extends BroadcastReceiver {
                bluetoothManager.getProfileManager(), mDevice);
        }

        if(mRequestType == BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS) {

            int phonebookPermission = cachedDevice.getPhonebookPermissionChoice();

        if (phonebookPermission == CachedBluetoothDevice.PHONEBOOK_ACCESS_UNKNOWN) {
            if (phonebookPermission == CachedBluetoothDevice.ACCESS_UNKNOWN) {
                return processed;
            }

            String intentName = BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY;
        if (phonebookPermission == CachedBluetoothDevice.PHONEBOOK_ACCESS_ALLOWED) {
            if (phonebookPermission == CachedBluetoothDevice.ACCESS_ALLOWED) {
                sendIntentToReceiver(intentName, true, BluetoothDevice.EXTRA_ALWAYS_ALLOWED, true);
                processed = true;
        } else if (phonebookPermission == CachedBluetoothDevice.PHONEBOOK_ACCESS_REJECTED) {
            } else if (phonebookPermission == CachedBluetoothDevice.ACCESS_REJECTED) {
                sendIntentToReceiver(intentName, false,
                                 null, false // dummy value, no effect since previous param is null
                                 );
                                     null, false ); // dummy value, no effect since previous param is null
                processed = true;
            } else {
                Log.e(TAG, "Bad phonebookPermission: " + phonebookPermission);
            }

        } else if(mRequestType == BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS) {

            int messagePermission = cachedDevice.getMessagePermissionChoice();

            if (messagePermission == CachedBluetoothDevice.ACCESS_UNKNOWN) {
                return processed;
            }

            String intentName = BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY;
            if (messagePermission == CachedBluetoothDevice.ACCESS_ALLOWED) {
                sendIntentToReceiver(intentName, true, BluetoothDevice.EXTRA_ALWAYS_ALLOWED, true);
                processed = true;
            } else if (messagePermission == CachedBluetoothDevice.ACCESS_REJECTED) {
                sendIntentToReceiver(intentName, false,
                                     null, false); // dummy value, no effect since previous param is null
                processed = true;
            } else {
                Log.e(TAG, "Bad messagePermission: " + messagePermission);
            }
        }
        return processed;
    }

+38 −7
Original line number Diff line number Diff line
@@ -66,17 +66,22 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {

    private int mPhonebookPermissionChoice;

    private int mMessagePermissionChoice;


    private final Collection<Callback> mCallbacks = new ArrayList<Callback>();

    // Following constants indicate the user's choices of Phone book access settings
    // Following constants indicate the user's choices of Phone book/message access settings
    // User hasn't made any choice or settings app has wiped out the memory
    final static int PHONEBOOK_ACCESS_UNKNOWN = 0;
    final static int ACCESS_UNKNOWN = 0;
    // User has accepted the connection and let Settings app remember the decision
    final static int PHONEBOOK_ACCESS_ALLOWED = 1;
    final static int ACCESS_ALLOWED = 1;
    // User has rejected the connection and let Settings app remember the decision
    final static int PHONEBOOK_ACCESS_REJECTED = 2;
    final static int ACCESS_REJECTED = 2;


    private final static String PHONEBOOK_PREFS_NAME = "bluetooth_phonebook_permission";
    private final static String MESSAGE_PREFS_NAME = "bluetooth_message_permission";

    /**
     * When we connect to multiple profiles, we only want to display a single
@@ -349,6 +354,7 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
        fetchBtClass();
        updateProfiles();
        fetchPhonebookPermissionChoice();
        fetchMessagePermissionChoice();

        mVisible = false;
        dispatchAttributesChanged();
@@ -513,7 +519,8 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
        if (bondState == BluetoothDevice.BOND_NONE) {
            mProfiles.clear();
            mConnectAfterPairing = false;  // cancel auto-connect
            setPhonebookPermissionChoice(PHONEBOOK_ACCESS_UNKNOWN);
            setPhonebookPermissionChoice(ACCESS_UNKNOWN);
            setMessagePermissionChoice(ACCESS_UNKNOWN);
        }

        refresh();
@@ -632,7 +639,7 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
    void setPhonebookPermissionChoice(int permissionChoice) {
        SharedPreferences.Editor editor =
            mContext.getSharedPreferences(PHONEBOOK_PREFS_NAME, Context.MODE_PRIVATE).edit();
        if (permissionChoice == PHONEBOOK_ACCESS_UNKNOWN) {
        if (permissionChoice == ACCESS_UNKNOWN) {
            editor.remove(mDevice.getAddress());
        } else {
            editor.putInt(mDevice.getAddress(), permissionChoice);
@@ -645,7 +652,31 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
        SharedPreferences preference = mContext.getSharedPreferences(PHONEBOOK_PREFS_NAME,
                                                                     Context.MODE_PRIVATE);
        mPhonebookPermissionChoice = preference.getInt(mDevice.getAddress(),
                                                       PHONEBOOK_ACCESS_UNKNOWN);
                                                       ACCESS_UNKNOWN);
    }


    int getMessagePermissionChoice() {
        return mMessagePermissionChoice;
    }

    void setMessagePermissionChoice(int permissionChoice) {
        SharedPreferences.Editor editor =
            mContext.getSharedPreferences(MESSAGE_PREFS_NAME, Context.MODE_PRIVATE).edit();
        if (permissionChoice == ACCESS_UNKNOWN) {
            editor.remove(mDevice.getAddress());
        } else {
            editor.putInt(mDevice.getAddress(), permissionChoice);
        }
        editor.commit();
        mMessagePermissionChoice = permissionChoice;
    }

    private void fetchMessagePermissionChoice() {
        SharedPreferences preference = mContext.getSharedPreferences(MESSAGE_PREFS_NAME,
                                                                     Context.MODE_PRIVATE);
        mMessagePermissionChoice = preference.getInt(mDevice.getAddress(),
                                                       ACCESS_UNKNOWN);
    }

}