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

Commit c2d10506 authored by Ajay Panicker's avatar Ajay Panicker Committed by Android (Google) Code Review
Browse files

Merge "Add Filtering for snoop logs based on L2CAP and RFCOMM Channels (3/4)"

parents c706c643 fc4d53c2
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -59,10 +59,12 @@
            android:entries="@array/hdcp_checking_titles"
            android:entryValues="@array/hdcp_checking_values" />

        <SwitchPreference
        <ListPreference
            android:key="bt_hci_snoop_log"
            android:title="@string/bt_hci_snoop_log"
            android:summary="@string/bt_hci_snoop_log_summary" />
            android:dialogTitle="@string/bt_hci_snoop_log_summary"
            android:entries="@array/bt_hci_snoop_log_entries"
            android:entryValues="@array/bt_hci_snoop_log_values" />

        <com.android.settingslib.RestrictedSwitchPreference
            android:key="oem_unlock_enable"
+55 −10
Original line number Diff line number Diff line
@@ -17,12 +17,19 @@
package com.android.settings.development;

import android.content.Context;
import android.os.Build;
import android.os.SystemProperties;
import android.provider.Settings;
import android.text.TextUtils;

import android.util.Log;

import androidx.annotation.VisibleForTesting;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;

import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.development.DeveloperOptionsPreferenceController;

@@ -31,11 +38,40 @@ public class BluetoothSnoopLogPreferenceController extends DeveloperOptionsPrefe

    private static final String PREFERENCE_KEY = "bt_hci_snoop_log";
    @VisibleForTesting
    static final String BLUETOOTH_BTSNOOP_ENABLE_PROPERTY =
            "persist.bluetooth.btsnoopenable";
    static final int BTSNOOP_LOG_MODE_DISABLED_INDEX = 0;
    @VisibleForTesting
    static final int BTSNOOP_LOG_MODE_FILTERED_INDEX = 1;
    @VisibleForTesting
    static final int BTSNOOP_LOG_MODE_FULL_INDEX = 2;
    @VisibleForTesting
    static final String BLUETOOTH_BTSNOOP_LOG_MODE_PROPERTY = "persist.bluetooth.btsnooplogmode";

    private final String[] mListValues;
    private final String[] mListEntries;

    public BluetoothSnoopLogPreferenceController(Context context) {
        super(context);
        mListValues = context.getResources().getStringArray(R.array.bt_hci_snoop_log_values);
        mListEntries = context.getResources().getStringArray(R.array.bt_hci_snoop_log_entries);
    }

    // Default mode is FILTERED on userdebug/eng build, DISABLED on user build,
    // or can be changed by modifying the global setting.
    public int getDefaultModeIndex() {
        if (!Build.IS_DEBUGGABLE) {
            return BTSNOOP_LOG_MODE_DISABLED_INDEX;
        }

        final String default_mode = Settings.Global.getString(mContext.getContentResolver(),
                Settings.Global.BLUETOOTH_BTSNOOP_DEFAULT_MODE);

        for (int i = 0; i < mListValues.length; i++) {
            if (TextUtils.equals(default_mode, mListValues[i])) {
                return i;
            }
        }

        return BTSNOOP_LOG_MODE_FILTERED_INDEX;
    }

    @Override
@@ -45,23 +81,32 @@ public class BluetoothSnoopLogPreferenceController extends DeveloperOptionsPrefe

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        final boolean enableBtSnoopLog = (Boolean) newValue;
        SystemProperties.set(BLUETOOTH_BTSNOOP_ENABLE_PROPERTY, Boolean.toString(enableBtSnoopLog));
        SystemProperties.set(BLUETOOTH_BTSNOOP_LOG_MODE_PROPERTY, newValue.toString());
        updateState(mPreference);
        return true;
    }

    @Override
    public void updateState(Preference preference) {
        super.updateState(preference);
        final boolean enableBtSnoopLog = SystemProperties.getBoolean(
                BLUETOOTH_BTSNOOP_ENABLE_PROPERTY, false /* def */);
        ((SwitchPreference) mPreference).setChecked(enableBtSnoopLog);
        final ListPreference listPreference = (ListPreference) preference;
        final String currentValue = SystemProperties.get(BLUETOOTH_BTSNOOP_LOG_MODE_PROPERTY);

        int index = getDefaultModeIndex();
        for (int i = 0; i < mListValues.length; i++) {
            if (TextUtils.equals(currentValue, mListValues[i])) {
                index = i;
                break;
            }
        }
        listPreference.setValue(mListValues[index]);
        listPreference.setSummary(mListEntries[index]);
    }

    @Override
    protected void onDeveloperOptionsSwitchDisabled() {
        super.onDeveloperOptionsSwitchDisabled();
        SystemProperties.set(BLUETOOTH_BTSNOOP_ENABLE_PROPERTY, Boolean.toString(false));
        ((SwitchPreference) mPreference).setChecked(false);
        SystemProperties.set(BLUETOOTH_BTSNOOP_LOG_MODE_PROPERTY, null);
        ((ListPreference) mPreference).setValue(mListValues[getDefaultModeIndex()]);
        ((ListPreference) mPreference).setSummary(mListEntries[getDefaultModeIndex()]);
    }
}
+71 −34
Original line number Diff line number Diff line
@@ -16,86 +16,123 @@

package com.android.settings.development;

import static com.android.settings.development.BluetoothSnoopLogPreferenceController
        .BLUETOOTH_BTSNOOP_ENABLE_PROPERTY;

import static com.android.settings.development.BluetoothSnoopLogPreferenceController.BLUETOOTH_BTSNOOP_LOG_MODE_PROPERTY;
import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;
import android.content.res.Resources;
import android.os.SystemProperties;

import androidx.preference.ListPreference;
import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;

import com.android.settings.R;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;

@RunWith(RobolectricTestRunner.class)
public class BluetoothSnoopLogPreferenceControllerTest {

    @Mock
    private Context mContext;
    @Mock
    private SwitchPreference mPreference;
    @Spy
    private Context mSpyContext = RuntimeEnvironment.application;
    @Spy
    private Resources mSpyResources = RuntimeEnvironment.application.getResources();
    private ListPreference mPreference;
    @Mock
    private PreferenceScreen mPreferenceScreen;
    private BluetoothSnoopLogPreferenceController mController;

    private CharSequence[] mListValues;
    private CharSequence[] mListEntries;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        mController = new BluetoothSnoopLogPreferenceController(mContext);
        doReturn(mSpyResources).when(mSpyContext).getResources();
        // Get XML values without mock
        // Setup test list preference using XML values
        mPreference = new ListPreference(mSpyContext);
        mPreference.setEntries(R.array.bt_hci_snoop_log_entries);
        mPreference.setEntryValues(R.array.bt_hci_snoop_log_values);
        // Init the actual controller
        mController = new BluetoothSnoopLogPreferenceController(mSpyContext);
        // Construct preference in the controller via a mocked preference screen object
        when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
            .thenReturn(mPreference);
        mController.displayPreference(mPreferenceScreen);
        mListValues = mPreference.getEntryValues();
        mListEntries = mPreference.getEntries();
    }

    @Test
    public void onPreferenceChanged_turnOnBluetoothSnoopLog() {
        mController.onPreferenceChange(null, true);

        final boolean mode = SystemProperties.getBoolean(BLUETOOTH_BTSNOOP_ENABLE_PROPERTY, false);

        assertThat(mode).isTrue();
    public void verifyResourceSizeAndRange() {
        // Verify normal list entries and default preference entries have the same size
        assertThat(mListEntries.length).isEqualTo(mListValues.length);
        // Update the preference
        mController.updateState(mPreference);
        // Verify default preference value, entry and summary
        final int defaultIndex = mController.getDefaultModeIndex();
        assertThat(mPreference.getValue()).isEqualTo(mListValues[defaultIndex]);
        assertThat(mPreference.getEntry()).isEqualTo(mListEntries[defaultIndex]);
        assertThat(mPreference.getSummary()).isEqualTo(mListEntries[defaultIndex]);
    }

    @Test
    public void onPreferenceChanged_turnOffBluetoothSnoopLog() {
        mController.onPreferenceChange(null, false);

        final boolean mode = SystemProperties.getBoolean(BLUETOOTH_BTSNOOP_ENABLE_PROPERTY, false);

        assertThat(mode).isFalse();
    public void onPreferenceChanged_turnOnFullBluetoothSnoopLog() {
        mController.onPreferenceChange(null,
                mListValues[BluetoothSnoopLogPreferenceController.BTSNOOP_LOG_MODE_FULL_INDEX]);
        final String mode = SystemProperties.get(BLUETOOTH_BTSNOOP_LOG_MODE_PROPERTY);
        // "full" is hard-coded between Settings and system/bt
        assertThat(mode).isEqualTo("full");
    }

    @Test
    public void updateState_preferenceShouldBeChecked() {
        SystemProperties.set(BLUETOOTH_BTSNOOP_ENABLE_PROPERTY, Boolean.toString(true));
        mController.updateState(mPreference);
    public void onPreferenceChanged_turnOnFilteredBluetoothSnoopLog() {
        mController.onPreferenceChange(null,
                mListValues[BluetoothSnoopLogPreferenceController.BTSNOOP_LOG_MODE_FILTERED_INDEX]);
        final String mode = SystemProperties.get(BLUETOOTH_BTSNOOP_LOG_MODE_PROPERTY);
        // "filtered" is hard-coded between Settings and system/bt
        assertThat(mode).isEqualTo("filtered");
    }

        verify(mPreference).setChecked(true);
    @Test
    public void onPreferenceChanged_turnOffBluetoothSnoopLog() {
        mController.onPreferenceChange(null,
                mListValues[BluetoothSnoopLogPreferenceController.BTSNOOP_LOG_MODE_DISABLED_INDEX]);
        final String mode = SystemProperties.get(BLUETOOTH_BTSNOOP_LOG_MODE_PROPERTY);
        // "disabled" is hard-coded between Settings and system/bt
        assertThat(mode).isEqualTo("disabled");
    }

    @Test
    public void updateState_preferenceShouldNotBeChecked() {
        SystemProperties.set(BLUETOOTH_BTSNOOP_ENABLE_PROPERTY, Boolean.toString(false));
    public void updateState_preferenceShouldBeSetToRightValue() {
        for (int i = 0; i < mListValues.length; ++i) {
            SystemProperties.set(BLUETOOTH_BTSNOOP_LOG_MODE_PROPERTY, mListValues[i].toString());
            mController.updateState(mPreference);

        verify(mPreference).setChecked(false);
            assertThat(mPreference.getValue()).isEqualTo(mListValues[i].toString());
            assertThat(mPreference.getSummary()).isEqualTo(mListEntries[i].toString());
        }
    }

    @Test
    public void onDeveloperOptionsDisabled_shouldDisablePreference() {
        mController.onDeveloperOptionsDisabled();

        verify(mPreference).setEnabled(false);
        verify(mPreference).setChecked(false);
        assertThat(mPreference.isEnabled()).isFalse();
        assertThat(mPreference.getValue()).isEqualTo(
                mListValues[mController.getDefaultModeIndex()]
                        .toString());
        assertThat(mPreference.getSummary()).isEqualTo(
                mListEntries[mController.getDefaultModeIndex()]
                        .toString());
    }
}