From 98e3bfdebb99cb3f47b16cfde2181fcb553db8c8 Mon Sep 17 00:00:00 2001 From: Milton Wu Date: Mon, 8 Aug 2022 09:05:00 +0000 Subject: [PATCH 1/4] [DO NOT MERGE] Add FLAG_SECURE for ChooseLockPassword and Pattern Prevent ChooseLockPassword and ChooseLockPatten being projected to remote views, add FLAG_SECURE for these screens. Bug: 179725730 Test: Check these 2 screens not projected to chromecast Test: robo test for SetupChooseLockPatternTest ChooseLockPatternTest SetupChooseLockPasswordTest ChooseLockPasswordTest Change-Id: I7449a24427c966c1aa4280a7b7e7e70b60997cca Merged-In: I7449a24427c966c1aa4280a7b7e7e70b60997cca (cherry picked from commit 98239c0da68917a0622c24e9af16ce06768a68f2) --- .../settings/password/ChooseLockPassword.java | 2 ++ .../settings/password/ChooseLockPattern.java | 2 ++ .../password/ChooseLockPasswordTest.java | 16 ++++++++++++++++ .../settings/password/ChooseLockPatternTest.java | 10 ++++++++++ 4 files changed, 30 insertions(+) diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java index c03362510d0..24bfe46bf02 100644 --- a/src/com/android/settings/password/ChooseLockPassword.java +++ b/src/com/android/settings/password/ChooseLockPassword.java @@ -61,6 +61,7 @@ import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import android.view.inputmethod.EditorInfo; import android.widget.ImeAwareEditText; import android.widget.TextView; @@ -205,6 +206,7 @@ public class ChooseLockPassword extends SettingsActivity { ThemeHelper.trySetDynamicColor(this); super.onCreate(savedInstanceState); findViewById(R.id.content_parent).setFitsSystemWindows(false); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); } public static class ChooseLockPasswordFragment extends InstrumentedFragment diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java index 8464a2ffd7c..d45bb2e21e8 100644 --- a/src/com/android/settings/password/ChooseLockPattern.java +++ b/src/com/android/settings/password/ChooseLockPattern.java @@ -37,6 +37,7 @@ import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import android.widget.TextView; import androidx.fragment.app.Fragment; @@ -171,6 +172,7 @@ public class ChooseLockPattern extends SettingsActivity { ThemeHelper.trySetDynamicColor(this); super.onCreate(savedInstanceState); findViewById(R.id.content_parent).setFitsSystemWindows(false); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); } @Override diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java index e789b61f188..5299190051f 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java @@ -27,6 +27,7 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_SOMETHING; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; +import static android.view.WindowManager.LayoutParams.FLAG_SECURE; import static com.android.internal.widget.LockPatternUtils.PASSWORD_TYPE_KEY; import static com.android.settings.password.ChooseLockGeneric.CONFIRM_CREDENTIALS; @@ -162,6 +163,21 @@ public class ChooseLockPasswordTest { .isNotNull(); } + @Test + public void activity_shouldHaveSecureFlag() { + PasswordPolicy policy = new PasswordPolicy(); + policy.quality = PASSWORD_QUALITY_ALPHABETIC; + policy.length = 10; + + Intent intent = createIntentForPasswordValidation( + /* minMetrics */ policy.getMinMetrics(), + /* minComplexity= */ PASSWORD_COMPLEXITY_NONE, + /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC); + ChooseLockPassword activity = buildChooseLockPasswordActivity(intent); + final int flags = activity.getWindow().getAttributes().flags; + assertThat(flags & FLAG_SECURE).isEqualTo(FLAG_SECURE); + } + @Test public void processAndValidatePasswordRequirements_noMinPasswordComplexity() { PasswordPolicy policy = new PasswordPolicy(); diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java index f5cc39435ad..1fc10fc75f2 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java @@ -16,6 +16,8 @@ package com.android.settings.password; +import static android.view.WindowManager.LayoutParams.FLAG_SECURE; + import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; @@ -107,6 +109,14 @@ public class ChooseLockPatternTest { assertThat(iconView.getVisibility()).isEqualTo(View.GONE); } + @Test + public void activity_shouldHaveSecureFlag() { + final ChooseLockPattern activity = Robolectric.buildActivity( + ChooseLockPattern.class, new IntentBuilder(application).build()).setup().get(); + final int flags = activity.getWindow().getAttributes().flags; + assertThat(flags & FLAG_SECURE).isEqualTo(FLAG_SECURE); + } + private ChooseLockPattern createActivity(boolean addFingerprintExtra) { return Robolectric.buildActivity( ChooseLockPattern.class, From 51cabc55532d125ed7ec1fce88adb3bce997b921 Mon Sep 17 00:00:00 2001 From: SongFerngWang Date: Fri, 23 Sep 2022 21:21:25 +0800 Subject: [PATCH 2/4] Add the way for hiding the "contact sharing" on the pairing dialog There is the way to hide the "contact sharing" at the "device details" page, but it did not be implemented on the pairing dialog. Add this way on pairing dialog. Bug: 246668278 Test: make RunSettingsRoboTests ROBOTEST_FILTER=BluetoothPairingControllerTest make RunSettingsRoboTests ROBOTEST_FILTER=BluetoothPairingDialogTest Change-Id: I472acb80e70fe5d2a59cb9eed95fcbccfa417fa5 --- .../bluetooth/BluetoothPairingController.java | 56 +++++- .../BluetoothPairingDialogFragment.java | 7 +- .../BluetoothPairingControllerTest.java | 178 +++++++++++++++++- .../bluetooth/BluetoothPairingDialogTest.java | 10 +- 4 files changed, 234 insertions(+), 17 deletions(-) diff --git a/src/com/android/settings/bluetooth/BluetoothPairingController.java b/src/com/android/settings/bluetooth/BluetoothPairingController.java index c70a56ab866..a9e89e914cb 100644 --- a/src/com/android/settings/bluetooth/BluetoothPairingController.java +++ b/src/com/android/settings/bluetooth/BluetoothPairingController.java @@ -17,8 +17,10 @@ package com.android.settings.bluetooth; import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothProfile; import android.content.Context; import android.content.Intent; +import android.provider.DeviceConfig; import android.text.Editable; import android.util.Log; import android.widget.CompoundButton; @@ -28,6 +30,7 @@ import androidx.annotation.VisibleForTesting; import com.android.settings.R; import com.android.settings.bluetooth.BluetoothPairingDialogFragment.BluetoothPairingDialogListener; +import com.android.settings.core.SettingsUIDeviceConfig; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothProfile; @@ -54,7 +57,7 @@ public class BluetoothPairingController implements OnCheckedChangeListener, private static final int BLUETOOTH_PASSKEY_MAX_LENGTH = 6; // Bluetooth dependencies for the connection we are trying to establish - private LocalBluetoothManager mBluetoothManager; + LocalBluetoothManager mBluetoothManager; private BluetoothDevice mDevice; @VisibleForTesting int mType; @@ -66,6 +69,8 @@ public class BluetoothPairingController implements OnCheckedChangeListener, private LocalBluetoothProfile mPbapClientProfile; private boolean mPbapAllowed; private boolean mIsCoordinatedSetMember; + private boolean mIsLeAudio; + private boolean mIsLeContactSharingEnabled; /** * Creates an instance of a BluetoothPairingController. @@ -92,10 +97,26 @@ public class BluetoothPairingController implements OnCheckedChangeListener, mDeviceName = mBluetoothManager.getCachedDeviceManager().getName(mDevice); mPbapClientProfile = mBluetoothManager.getProfileManager().getPbapClientProfile(); mPasskeyFormatted = formatKey(mPasskey); + final CachedBluetoothDevice cachedDevice = mBluetoothManager.getCachedDeviceManager().findDevice(mDevice); - mIsCoordinatedSetMember = cachedDevice != null - ? cachedDevice.isCoordinatedSetMemberDevice() : false; + + mIsCoordinatedSetMember = false; + mIsLeAudio = false; + mIsLeContactSharingEnabled = true; + if (cachedDevice != null) { + mIsCoordinatedSetMember = cachedDevice.isCoordinatedSetMemberDevice(); + + for (LocalBluetoothProfile profile : cachedDevice.getProfiles()) { + if (profile.getProfileId() == BluetoothProfile.LE_AUDIO) { + mIsLeAudio = true; + } + } + + mIsLeContactSharingEnabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI, + SettingsUIDeviceConfig.BT_LE_AUDIO_CONTACT_SHARING_ENABLED, true); + Log.d(TAG, "BT_LE_AUDIO_CONTACT_SHARING_ENABLED is " + mIsLeContactSharingEnabled); + } } @Override @@ -180,6 +201,30 @@ public class BluetoothPairingController implements OnCheckedChangeListener, return mPbapClientProfile != null && mPbapClientProfile.isProfileReady(); } + @VisibleForTesting + boolean isLeAudio() { + return mIsLeAudio; + } + + @VisibleForTesting + boolean isLeContactSharingEnabled() { + return mIsLeContactSharingEnabled; + } + + /** + * A method whether the device allows to show the le audio's contact sharing. + * + * @return A boolean whether the device allows to show the contact sharing. + */ + public boolean isContactSharingVisible() { + boolean isContactSharingVisible = !isProfileReady(); + // If device do not support the ContactSharing of LE audio device, hiding ContactSharing UI + if (isLeAudio() && !isLeContactSharingEnabled()) { + isContactSharingVisible = false; + } + return isContactSharingVisible; + } + /** * A method for querying if the bluetooth device has access to contacts on the device. * @@ -447,4 +492,9 @@ public class BluetoothPairingController implements OnCheckedChangeListener, public boolean deviceEquals(BluetoothDevice device) { return mDevice == device; } + + @VisibleForTesting + void mockPbapClientProfile(LocalBluetoothProfile mockPbapClientProfile) { + mPbapClientProfile = mockPbapClientProfile; + } } diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java b/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java index 8dd00b389ed..bae2471dd9b 100644 --- a/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java +++ b/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java @@ -254,8 +254,8 @@ public class BluetoothPairingDialogFragment extends InstrumentedDialogFragment i mPairingController.getDeviceName())); EditText pairingView = (EditText) view.findViewById(R.id.text); - contactSharing.setVisibility(mPairingController.isProfileReady() - ? View.GONE : View.VISIBLE); + contactSharing.setVisibility( + mPairingController.isContactSharingVisible() ? View.VISIBLE : View.GONE); mPairingController.setContactSharingState(); contactSharing.setOnCheckedChangeListener(mPairingController); contactSharing.setChecked(mPairingController.getContactSharingState()); @@ -346,7 +346,7 @@ public class BluetoothPairingDialogFragment extends InstrumentedDialogFragment i mPairingController.getDeviceName())); contactSharing.setVisibility( - mPairingController.isProfileReady() ? View.GONE : View.VISIBLE); + mPairingController.isContactSharingVisible() ? View.VISIBLE : View.GONE); mPairingController.setContactSharingState(); contactSharing.setChecked(mPairingController.getContactSharingState()); contactSharing.setOnCheckedChangeListener(mPairingController); @@ -363,5 +363,4 @@ public class BluetoothPairingDialogFragment extends InstrumentedDialogFragment i ? View.VISIBLE : View.GONE); return view; } - } diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingControllerTest.java index 88e15ebc13e..a7dc17da0e0 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingControllerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingControllerTest.java @@ -17,16 +17,28 @@ package com.android.settings.bluetooth; import static android.bluetooth.BluetoothDevice.PAIRING_VARIANT_CONSENT; +import static com.google.common.truth.Truth.assertThat; + import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothProfile; import android.content.Context; import android.content.Intent; import android.os.Parcel; +import com.android.settings.core.SettingsUIDeviceConfig; import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; +import com.android.settings.testutils.shadow.ShadowBluetoothUtils; +import com.android.settings.testutils.shadow.ShadowDeviceConfig; +import com.android.settingslib.bluetooth.CachedBluetoothDevice; +import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; +import com.android.settingslib.bluetooth.LocalBluetoothManager; +import com.android.settingslib.bluetooth.LocalBluetoothProfile; +import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; import org.junit.Before; import org.junit.Test; @@ -36,16 +48,36 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.shadow.api.Shadow; + +import java.util.ArrayList; +import java.util.List; @RunWith(RobolectricTestRunner.class) -@Config(shadows = {ShadowBluetoothAdapter.class}) +@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothUtils.class, + ShadowDeviceConfig.class}) public class BluetoothPairingControllerTest { private final BluetoothClass mBluetoothClass = createBtClass(BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE); + + @Mock + private CachedBluetoothDeviceManager mCachedDeviceManager; + @Mock + private LocalBluetoothManager mLocalBluetoothManager; + @Mock + private LocalBluetoothProfileManager mLocalBluetoothProfileManager; @Mock private BluetoothDevice mBluetoothDevice; + @Mock + private CachedBluetoothDevice mCachedDevice; + @Mock + private LocalBluetoothProfile mLocalBluetoothProfile; + @Mock + private LocalBluetoothProfile mPbapLocalBluetoothProfile; + private Context mContext; private BluetoothPairingController mBluetoothPairingController; + private ShadowBluetoothAdapter mShadowBluetoothAdapter; private BluetoothClass createBtClass(int deviceClass) { Parcel p = Parcel.obtain(); @@ -57,14 +89,32 @@ public class BluetoothPairingControllerTest { return bluetoothClass; } + private BluetoothPairingController createBluetoothPairingController() { + final Intent intent = new Intent(); + intent.putExtra(BluetoothDevice.EXTRA_DEVICE, mBluetoothDevice); + return new BluetoothPairingController(intent, mContext); + } + @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; - final Intent intent = new Intent(); - intent.putExtra(BluetoothDevice.EXTRA_DEVICE, mBluetoothDevice); - mBluetoothPairingController = new BluetoothPairingController(intent, mContext); + mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter()); + mShadowBluetoothAdapter.setEnabled(true); + ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager; + mLocalBluetoothManager = Utils.getLocalBtManager(mContext); + when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager); + when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager); + when(mCachedDeviceManager.findDevice(mBluetoothDevice)).thenReturn(mCachedDevice); + List localBluetoothProfiles = new ArrayList<>(); + mockIsLeAudio(false); + localBluetoothProfiles.add(mLocalBluetoothProfile); + when(mCachedDevice.getProfiles()).thenReturn(localBluetoothProfiles); + when(mCachedDevice.getDevice()).thenReturn(mBluetoothDevice); + + mBluetoothPairingController = createBluetoothPairingController(); + mBluetoothPairingController.mockPbapClientProfile(mPbapLocalBluetoothProfile); } @Test @@ -108,4 +158,124 @@ public class BluetoothPairingControllerTest { verify(mBluetoothDevice).setPhonebookAccessPermission(BluetoothDevice.ACCESS_REJECTED); } + + @Test + public void isLeAudio_noLeProfile_returnsFalse() { + mockIsLeAudio(false); + + mBluetoothPairingController = createBluetoothPairingController(); + + assertThat(mBluetoothPairingController.isLeAudio()).isFalse(); + } + + @Test + public void isLeAudio_isLeProfile_returnsTrue() { + mockIsLeAudio(true); + + mBluetoothPairingController = createBluetoothPairingController(); + + assertThat(mBluetoothPairingController.isLeAudio()).isTrue(); + } + + @Test + public void isLeContactSharingEnabled_configIsFalse_returnsFalse() { + mockIsLeContactSharingEnabled(false); + + mBluetoothPairingController = createBluetoothPairingController(); + + assertThat(mBluetoothPairingController.isLeContactSharingEnabled()).isFalse(); + } + + @Test + public void isLeContactSharingEnabled_configIsTrue_returnsTrue() { + mockIsLeContactSharingEnabled(true); + + mBluetoothPairingController = createBluetoothPairingController(); + + assertThat(mBluetoothPairingController.isLeContactSharingEnabled()).isTrue(); + } + + @Test + public void isContactSharingVisible_profileIsNotReady_returnsTrue() { + // isProfileReady=false, isLeAudio=false, isLeContactSharingEnabled=true + mockIsProfileReady(false); + mockIsLeAudio(false); + mockIsLeContactSharingEnabled(true); + + mBluetoothPairingController = createBluetoothPairingController(); + mBluetoothPairingController.mockPbapClientProfile(mPbapLocalBluetoothProfile); + + assertThat(mBluetoothPairingController.isContactSharingVisible()).isTrue(); + } + + @Test + public void isContactSharingVisible_profileIsReady_returnsFalse() { + // isProfileReady=true, isLeAudio=false, isLeContactSharingEnabled=true + mockIsProfileReady(true); + mockIsLeAudio(false); + mockIsLeContactSharingEnabled(true); + + mBluetoothPairingController = createBluetoothPairingController(); + mBluetoothPairingController.mockPbapClientProfile(mPbapLocalBluetoothProfile); + + assertThat(mBluetoothPairingController.isContactSharingVisible()).isFalse(); + } + + @Test + public void isContactSharingVisible_DeviceIsLeAudioAndProfileIsReady_returnsFalse() { + // isProfileReady=true, isLeAudio=true, isLeContactSharingEnabled=true + mockIsProfileReady(true); + mockIsLeAudio(true); + mockIsLeContactSharingEnabled(true); + + mBluetoothPairingController = createBluetoothPairingController(); + mBluetoothPairingController.mockPbapClientProfile(mPbapLocalBluetoothProfile); + + assertThat(mBluetoothPairingController.isContactSharingVisible()).isFalse(); + } + + @Test + public void isContactSharingVisible_DeviceIsLeAudioAndProfileIsNotReady_returnsTrue() { + // isProfileReady=false, isLeAudio=true, isLeContactSharingEnabled=true + mockIsProfileReady(false); + mockIsLeAudio(true); + mockIsLeContactSharingEnabled(true); + + mBluetoothPairingController = createBluetoothPairingController(); + mBluetoothPairingController.mockPbapClientProfile(mPbapLocalBluetoothProfile); + + assertThat(mBluetoothPairingController.isContactSharingVisible()).isTrue(); + } + + @Test + public void isContactSharingVisible_DeviceIsLeAndContactSharingIsNotEnabled_returnsFalse() { + // isProfileReady=false, isLeAudio=true, isLeContactSharingEnabled=false + mockIsProfileReady(false); + mockIsLeAudio(true); + mockIsLeContactSharingEnabled(false); + + mBluetoothPairingController = createBluetoothPairingController(); + mBluetoothPairingController.mockPbapClientProfile(mPbapLocalBluetoothProfile); + + assertThat(mBluetoothPairingController.isContactSharingVisible()).isFalse(); + } + + private void mockIsProfileReady(boolean mockValue) { + when(mPbapLocalBluetoothProfile.isProfileReady()).thenReturn(mockValue); + } + + private void mockIsLeAudio(boolean mockValue) { + int profileId = BluetoothProfile.HEADSET; + if (mockValue) { + profileId = BluetoothProfile.LE_AUDIO; + } + when(mLocalBluetoothProfile.getProfileId()).thenReturn(profileId); + } + + private void mockIsLeContactSharingEnabled(boolean mockValue) { + android.provider.DeviceConfig.setProperty( + android.provider.DeviceConfig.NAMESPACE_SETTINGS_UI, + SettingsUIDeviceConfig.BT_LE_AUDIO_CONTACT_SHARING_ENABLED, + /* value= */ mockValue ? "true" : "false", true); + } } diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java index a53e693976e..874ddf0d158 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java @@ -274,13 +274,12 @@ public class BluetoothPairingDialogTest { } @Test - public void dialogShowsContactSharingCheckboxWhenBluetoothProfileNotReady() { + public void contactSharingCheckbox_conditionIsReady_showsUi() { // set the dialog variant to confirmation/consent when(controller.getDialogType()).thenReturn(BluetoothPairingController.CONFIRMATION_DIALOG); - // set a fake device name and pretend the profile has not been set up for it when(controller.getDeviceName()).thenReturn(FAKE_DEVICE_NAME); - when(controller.isProfileReady()).thenReturn(false); + when(controller.isContactSharingVisible()).thenReturn(true); // build the fragment BluetoothPairingDialogFragment frag = makeFragment(); @@ -292,13 +291,12 @@ public class BluetoothPairingDialogTest { } @Test - public void dialogHidesContactSharingCheckboxWhenBluetoothProfileIsReady() { + public void contactSharingCheckbox_conditionIsNotReady_doesNotShowUi() { // set the dialog variant to confirmation/consent when(controller.getDialogType()).thenReturn(BluetoothPairingController.CONFIRMATION_DIALOG); - // set a fake device name and pretend the profile has been set up for it when(controller.getDeviceName()).thenReturn(FAKE_DEVICE_NAME); - when(controller.isProfileReady()).thenReturn(true); + when(controller.isContactSharingVisible()).thenReturn(false); // build the fragment BluetoothPairingDialogFragment frag = makeFragment(); From 6629b12a08c6b256b208fc52c3da248f05beb3a3 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Mon, 26 Sep 2022 03:35:12 +0800 Subject: [PATCH 3/4] Restrict Wi-Fi configuration if settings UI is restricted - Don't launch W-Fi configuration settings if the settings UI is restricted (including guest users). Bug: 246301667 Test: manual test make RunSettingsRoboTests ROBOTEST_FILTER=NetworkProviderSettingsTest Merged-In: Id82498f41765f955e01bb311bb221d26f9574f31 Change-Id: Id82498f41765f955e01bb311bb221d26f9574f31 (cherry picked from commit aaa65fc6f04679889f5959c33c670fd7c9a5db1e) --- .../settings/network/NetworkProviderSettings.java | 6 ++++++ .../settings/network/NetworkProviderSettingsTest.java | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java index ec17dd371b1..1c480e05735 100644 --- a/src/com/android/settings/network/NetworkProviderSettings.java +++ b/src/com/android/settings/network/NetworkProviderSettings.java @@ -1324,6 +1324,12 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment @VisibleForTesting void launchConfigNewNetworkFragment(WifiEntry wifiEntry) { + if (mIsRestricted) { + Log.e(TAG, "Can't configure Wi-Fi because NetworkProviderSettings is restricted."); + EventLog.writeEvent(0x534e4554, "246301667", -1 /* UID */, "Fragment is restricted."); + return; + } + final Bundle bundle = new Bundle(); bundle.putString(WifiNetworkDetailsFragment.KEY_CHOSEN_WIFIENTRY_KEY, wifiEntry.getKey()); diff --git a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java index 1424d0eced1..5122def9843 100644 --- a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java +++ b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java @@ -751,6 +751,15 @@ public class NetworkProviderSettingsTest { assertThat(keys).contains(NetworkProviderSettings.PREF_KEY_WIFI_TOGGLE); } + @Test + public void launchConfigNewNetworkFragment_fragmentIsRestricted_ignoreWifiEntry() { + mNetworkProviderSettings.mIsRestricted = true; + + mNetworkProviderSettings.launchConfigNewNetworkFragment(mWifiEntry); + + verify(mWifiEntry, never()).getKey(); + } + @Implements(PreferenceFragmentCompat.class) public static class ShadowPreferenceFragmentCompat { From a4c78e3820c9bc956fe72a293780a01708bac77d Mon Sep 17 00:00:00 2001 From: Tom Hsu Date: Wed, 28 Sep 2022 13:37:36 +0000 Subject: [PATCH 4/4] Revert "[Languages] Add new information to system language page." This reverts commit 3cbb6f86802ade7aac51234a070b6f623d829081. Reason for revert: b/248456615 Change-Id: I3bc5088784ed97f69ffadb0ea69078bfcf7dc39d Merged-In: I3bc5088784ed97f69ffadb0ea69078bfcf7dc39d --- res/layout/locale_drag_cell.xml | 11 --- res/values/strings.xml | 24 +----- res/xml/languages.xml | 42 ----------- .../LocaleDragAndDropAdapter.java | 3 +- .../settings/localepicker/LocaleDragCell.java | 10 --- .../LocaleHelperPreferenceController.java | 74 ------------------- .../localepicker/LocaleListEditor.java | 27 ++----- .../LocaleHelperPreferenceControllerTest.java | 59 --------------- 8 files changed, 12 insertions(+), 238 deletions(-) delete mode 100644 res/xml/languages.xml delete mode 100644 src/com/android/settings/localepicker/LocaleHelperPreferenceController.java delete mode 100644 tests/unit/src/com/android/settings/localepicker/LocaleHelperPreferenceControllerTest.java diff --git a/res/layout/locale_drag_cell.xml b/res/layout/locale_drag_cell.xml index 47bf70a473e..7b932f39a02 100644 --- a/res/layout/locale_drag_cell.xml +++ b/res/layout/locale_drag_cell.xml @@ -56,17 +56,6 @@ android:layout_toStartOf="@+id/dragHandle" android:layout_below="@id/label"/> - - Languages - - Preferred language order - - - System language - Remove @@ -503,13 +497,13 @@ Preferred Language - App languages + App Languages Set the language for each app - App language + App Language Suggested languages @@ -532,18 +526,6 @@ Only apps that support language selection are shown here. - - Your system, apps, and websites use the first supported language from your preferred languages. - - - To select a language for each app, go to app language settings. - - - Learn more about languages - - - https://support.google.com/android?p=per_language_app_settings - Remove selected language? @@ -559,7 +541,7 @@ Keep at least one preferred language - Not available as system language + May not be available in some apps Move up diff --git a/res/xml/languages.xml b/res/xml/languages.xml deleted file mode 100644 index 0f455407645..00000000000 --- a/res/xml/languages.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - diff --git a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java index b3c2e3071af..ab9110d01ab 100644 --- a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java +++ b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java @@ -43,6 +43,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; + class LocaleDragAndDropAdapter extends RecyclerView.Adapter { @@ -153,10 +154,8 @@ class LocaleDragAndDropAdapter final LocaleDragCell dragCell = holder.getLocaleDragCell(); final String label = feedItem.getFullNameNative(); final String description = feedItem.getFullNameInUiLanguage(); - dragCell.setLabelAndDescription(label, description); dragCell.setLocalized(feedItem.isTranslated()); - dragCell.setCurrentDefault(feedItem.getLocale().equals(Locale.getDefault())); dragCell.setMiniLabel(mNumberFormatter.format(i + 1)); dragCell.setShowCheckbox(mRemoveMode); dragCell.setShowMiniLabel(!mRemoveMode); diff --git a/src/com/android/settings/localepicker/LocaleDragCell.java b/src/com/android/settings/localepicker/LocaleDragCell.java index 2f4cfefefb1..ea86189b018 100644 --- a/src/com/android/settings/localepicker/LocaleDragCell.java +++ b/src/com/android/settings/localepicker/LocaleDragCell.java @@ -33,7 +33,6 @@ class LocaleDragCell extends RelativeLayout { private CheckBox mCheckbox; private TextView mMiniLabel; private TextView mLocalized; - private TextView mCurrentDefault; private ImageView mDragHandle; public LocaleDragCell(Context context, AttributeSet attrs) { @@ -45,7 +44,6 @@ class LocaleDragCell extends RelativeLayout { super.onFinishInflate(); mLabel = (TextView) findViewById(R.id.label); mLocalized = (TextView) findViewById(R.id.l10nWarn); - mCurrentDefault = (TextView) findViewById(R.id.default_locale); mMiniLabel = (TextView) findViewById(R.id.miniLabel); mCheckbox = (CheckBox) findViewById(R.id.checkbox); mDragHandle = (ImageView) findViewById(R.id.dragHandle); @@ -102,14 +100,6 @@ class LocaleDragCell extends RelativeLayout { invalidate(); } - /** - * Indicate current locale is system default. - */ - public void setCurrentDefault(boolean isCurrentDefault) { - mCurrentDefault.setVisibility(isCurrentDefault ? VISIBLE : GONE); - invalidate(); - } - public ImageView getDragHandle() { return mDragHandle; } diff --git a/src/com/android/settings/localepicker/LocaleHelperPreferenceController.java b/src/com/android/settings/localepicker/LocaleHelperPreferenceController.java deleted file mode 100644 index 05c740139cc..00000000000 --- a/src/com/android/settings/localepicker/LocaleHelperPreferenceController.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settings.localepicker; - -import android.content.Context; - -import androidx.annotation.VisibleForTesting; -import androidx.preference.PreferenceScreen; - -import com.android.settings.R; -import com.android.settingslib.HelpUtils; -import com.android.settingslib.core.AbstractPreferenceController; -import com.android.settingslib.widget.FooterPreference; - -/** - * A controller to update current locale information of application. - */ -public class LocaleHelperPreferenceController extends AbstractPreferenceController { - private static final String TAG = LocaleHelperPreferenceController.class.getSimpleName(); - - private static final String KEY_FOOTER_LANGUAGE_PICKER = "footer_languages_picker"; - - public LocaleHelperPreferenceController(Context context) { - super(context); - } - - @Override - public boolean isAvailable() { - return true; - } - - @Override - public String getPreferenceKey() { - return KEY_FOOTER_LANGUAGE_PICKER; - } - - @Override - public void displayPreference(PreferenceScreen screen) { - super.displayPreference(screen); - FooterPreference footerPreference = screen.findPreference(getPreferenceKey()); - updateFooterPreference(footerPreference); - } - - @VisibleForTesting - void updateFooterPreference(FooterPreference footerPreference) { - if (footerPreference != null) { - footerPreference.setLearnMoreAction(v -> openLocaleLearnMoreLink()); - footerPreference.setLearnMoreText(mContext.getString( - R.string.desc_locale_helper_footer_general)); - } - } - - private void openLocaleLearnMoreLink() { - mContext.startActivity( - HelpUtils.getHelpIntent( - mContext, - mContext.getString(R.string.link_locale_picker_footer_learn_more), - /*backupContext=*/"")); - } -} diff --git a/src/com/android/settings/localepicker/LocaleListEditor.java b/src/com/android/settings/localepicker/LocaleListEditor.java index 9db3468c9e1..eac2dd1df3c 100644 --- a/src/com/android/settings/localepicker/LocaleListEditor.java +++ b/src/com/android/settings/localepicker/LocaleListEditor.java @@ -36,7 +36,6 @@ import android.widget.TextView; import androidx.annotation.VisibleForTesting; import androidx.appcompat.app.AlertDialog; -import androidx.preference.PreferenceScreen; import androidx.recyclerview.widget.RecyclerView; import com.android.internal.app.LocalePicker; @@ -47,7 +46,6 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.search.SearchIndexableRaw; -import com.android.settingslib.widget.LayoutPreference; import java.util.ArrayList; import java.util.List; @@ -66,7 +64,6 @@ public class LocaleListEditor extends RestrictedSettingsFragment { private static final int REQUEST_LOCALE_PICKER = 0; private static final String INDEX_KEY_ADD_LANGUAGE = "add_language"; - private static final String KEY_LANGUAGES_PICKER = "languages_picker"; private LocaleDragAndDropAdapter mAdapter; private Menu mMenu; @@ -75,9 +72,6 @@ public class LocaleListEditor extends RestrictedSettingsFragment { private boolean mShowingRemoveDialog; private boolean mIsUiRestricted; - private LayoutPreference mLocalePickerPreference; - private LocaleHelperPreferenceController mLocaleHelperPreferenceController; - public LocaleListEditor() { super(DISALLOW_CONFIG_LOCALE); } @@ -92,14 +86,6 @@ public class LocaleListEditor extends RestrictedSettingsFragment { super.onCreate(savedInstanceState); setHasOptionsMenu(true); - addPreferencesFromResource(R.xml.languages); - final Activity activity = getActivity(); - activity.setTitle(R.string.language_picker_title); - mLocaleHelperPreferenceController = new LocaleHelperPreferenceController(activity); - final PreferenceScreen screen = getPreferenceScreen(); - mLocalePickerPreference = screen.findPreference(KEY_LANGUAGES_PICKER); - mLocaleHelperPreferenceController.displayPreference(screen); - LocaleStore.fillCache(this.getContext()); final List feedsList = getUserLocaleList(); mAdapter = new LocaleDragAndDropAdapter(this.getContext(), feedsList); @@ -107,8 +93,11 @@ public class LocaleListEditor extends RestrictedSettingsFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstState) { - configureDragAndDrop(mLocalePickerPreference); - return super.onCreateView(inflater, container, savedInstState); + final View result = super.onCreateView(inflater, container, savedInstState); + final View myLayout = inflater.inflate(R.layout.locale_order_list, (ViewGroup) result); + + configureDragAndDrop(myLayout); + return result; } @Override @@ -298,8 +287,8 @@ public class LocaleListEditor extends RestrictedSettingsFragment { return result; } - private void configureDragAndDrop(LayoutPreference layout) { - final RecyclerView list = layout.findViewById(R.id.dragList); + private void configureDragAndDrop(View view) { + final RecyclerView list = view.findViewById(R.id.dragList); final LocaleLinearLayoutManager llm = new LocaleLinearLayoutManager(getContext(), mAdapter); llm.setAutoMeasureEnabled(true); list.setLayoutManager(llm); @@ -308,7 +297,7 @@ public class LocaleListEditor extends RestrictedSettingsFragment { mAdapter.setRecyclerView(list); list.setAdapter(mAdapter); - mAddLanguage = layout.findViewById(R.id.add_language); + mAddLanguage = view.findViewById(R.id.add_language); mAddLanguage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { diff --git a/tests/unit/src/com/android/settings/localepicker/LocaleHelperPreferenceControllerTest.java b/tests/unit/src/com/android/settings/localepicker/LocaleHelperPreferenceControllerTest.java deleted file mode 100644 index 31b8e794480..00000000000 --- a/tests/unit/src/com/android/settings/localepicker/LocaleHelperPreferenceControllerTest.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settings.localepicker; - -import static org.mockito.Mockito.anyString; -import static org.mockito.Mockito.verify; - -import android.content.Context; -import android.os.Looper; - -import androidx.test.core.app.ApplicationProvider; -import androidx.test.ext.junit.runners.AndroidJUnit4; - -import com.android.settingslib.widget.FooterPreference; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -@RunWith(AndroidJUnit4.class) -public class LocaleHelperPreferenceControllerTest { - private Context mContext; - private LocaleHelperPreferenceController mLocaleHelperPreferenceController; - - @Mock - private FooterPreference mMockFooterPreference; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - if (Looper.myLooper() == null) { - Looper.prepare(); - } - mContext = ApplicationProvider.getApplicationContext(); - mLocaleHelperPreferenceController = new LocaleHelperPreferenceController(mContext); - } - - @Test - public void updateFooterPreference_setFooterPreference_hasClickAction() { - mLocaleHelperPreferenceController.updateFooterPreference(mMockFooterPreference); - verify(mMockFooterPreference).setLearnMoreText(anyString()); - } -}