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

Commit a1ae2b1e authored by Jin Dong's avatar Jin Dong Committed by David Magno
Browse files

Limit bluetooth broadcast password to single byte characters

The bluetooth broadcast password is supposed to be single byte
characters, so crash hanppened when input too many double-byte
characters when connecting to other broadcast.
Limit the password to single byte characters to fix this issue.

Bug: 297840479
Test: Manual
Change-Id: Ifab89ee9a07f20d1f30aba17bed694b5a5da8480
parent a3f6a70e
Loading
Loading
Loading
Loading
+61 −0
Original line number Diff line number Diff line
@@ -30,10 +30,16 @@ import android.bluetooth.le.ScanFilter;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
import android.text.Spanned;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
@@ -468,9 +474,64 @@ public class BluetoothFindBroadcastsFragment extends RestrictedDashboardFragment
                .create();

        alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
        addTextWatcher(alertDialog, editText);
        alertDialog.show();
        updateBtnState(alertDialog, false);
    }

    private void addTextWatcher(AlertDialog alertDialog, EditText editText) {
        if (alertDialog == null || editText == null) {
            return;
        }
        final InputFilter[] filter = new InputFilter[] {mInputFilter};
        editText.setFilters(filter);
        editText.setInputType(InputType.TYPE_CLASS_TEXT
                | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
        TextWatcher bCodeTextWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // Do nothing
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // Do nothing
            }

            @Override
            public void afterTextChanged(Editable s) {
                boolean breakBroadcastCodeRuleTextLengthLessThanMin =
                        s.length() > 0 && s.toString().getBytes().length < 4;
                boolean breakBroadcastCodeRuleTextLengthMoreThanMax =
                        s.toString().getBytes().length > 16;
                boolean breakRule = breakBroadcastCodeRuleTextLengthLessThanMin
                        || breakBroadcastCodeRuleTextLengthMoreThanMax;
                updateBtnState(alertDialog, !breakRule);
            }
        };
        editText.addTextChangedListener(bCodeTextWatcher);
    }

    private void updateBtnState(AlertDialog alertDialog, boolean isEnable) {
        Button positiveBtn = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
        if (positiveBtn != null) {
            positiveBtn.setEnabled(isEnable ? true : false);
        }
    }

    private InputFilter mInputFilter = new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end,
                Spanned dest, int dstart, int dend) {
            byte[] bytes = source.toString().getBytes(StandardCharsets.UTF_8);
            if (bytes.length == source.length()) {
                return source;
            } else {
                return "";
            }
        }
    };

    private void handleSearchStarted() {
        cacheRemoveAllPrefs(mBroadcastSourceListCategory);
        addConnectedSourcePreference();