Loading res/xml/development_settings.xml +4 −2 Original line number Diff line number Diff line Loading @@ -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" Loading src/com/android/settings/development/BluetoothSnoopLogPreferenceController.java +55 −10 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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()]); } } tests/robotests/src/com/android/settings/development/BluetoothSnoopLogPreferenceControllerTest.java +71 −34 Original line number Diff line number Diff line Loading @@ -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()); } } Loading
res/xml/development_settings.xml +4 −2 Original line number Diff line number Diff line Loading @@ -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" Loading
src/com/android/settings/development/BluetoothSnoopLogPreferenceController.java +55 −10 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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()]); } }
tests/robotests/src/com/android/settings/development/BluetoothSnoopLogPreferenceControllerTest.java +71 −34 Original line number Diff line number Diff line Loading @@ -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()); } }