From a1ae2b1e934b5ec4e49b932204d59ec4326a4da5 Mon Sep 17 00:00:00 2001 From: Jin Dong Date: Mon, 28 Aug 2023 16:11:09 +0200 Subject: [PATCH] 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 --- .../BluetoothFindBroadcastsFragment.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/src/com/android/settings/bluetooth/BluetoothFindBroadcastsFragment.java b/src/com/android/settings/bluetooth/BluetoothFindBroadcastsFragment.java index b84654d851f..ffe5b6169e4 100644 --- a/src/com/android/settings/bluetooth/BluetoothFindBroadcastsFragment.java +++ b/src/com/android/settings/bluetooth/BluetoothFindBroadcastsFragment.java @@ -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();