Snap for 12342105 from 7db5b7a084
to 24Q4-release
Change-Id: I8b07a5a2f2cc4b30a7abbe0ab91f6c6e4dc6cedf
This commit is contained in:
@@ -45,7 +45,7 @@
|
|||||||
android:id="@+id/illustration_lottie"
|
android:id="@+id/illustration_lottie"
|
||||||
android:layout_width="@dimen/fingerprint_progress_bar_max_size"
|
android:layout_width="@dimen/fingerprint_progress_bar_max_size"
|
||||||
android:layout_height="@dimen/fingerprint_progress_bar_max_size"
|
android:layout_height="@dimen/fingerprint_progress_bar_max_size"
|
||||||
android:layout_marginRight="@dimen/sfps_lottie_translate_x"
|
android:layout_marginEnd="@dimen/sfps_lottie_translate_x"
|
||||||
android:layout_marginBottom="@dimen/sfps_lottie_translate_y"
|
android:layout_marginBottom="@dimen/sfps_lottie_translate_y"
|
||||||
android:scaleType="centerInside"
|
android:scaleType="centerInside"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
android:id="@+id/fingerprint_progress_bar"
|
android:id="@+id/fingerprint_progress_bar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_marginLeft="@dimen/sfps_progress_bar_translate_x"
|
android:layout_marginStart="@dimen/sfps_progress_bar_translate_x"
|
||||||
android:layout_marginTop="@dimen/sfps_progress_bar_translate_y"
|
android:layout_marginTop="@dimen/sfps_progress_bar_translate_y"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:minHeight="@dimen/fingerprint_progress_bar_min_size"
|
android:minHeight="@dimen/fingerprint_progress_bar_min_size"
|
||||||
|
@@ -23,4 +23,8 @@
|
|||||||
<dimen name="rotation_90_enroll_padding_start">20dp</dimen>
|
<dimen name="rotation_90_enroll_padding_start">20dp</dimen>
|
||||||
<dimen name="rotation_90_enroll_padding_end">0dp</dimen>
|
<dimen name="rotation_90_enroll_padding_end">0dp</dimen>
|
||||||
<dimen name="rotation_90_enroll_margin_end">20dp</dimen>
|
<dimen name="rotation_90_enroll_margin_end">20dp</dimen>
|
||||||
|
|
||||||
|
<!-- SFPS Fingerprint -->
|
||||||
|
<dimen name="fingerprint_progress_bar_max_size">242dp</dimen>
|
||||||
|
<dimen name="sfps_lottie_translate_x">10dp</dimen>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -17,6 +17,8 @@
|
|||||||
package com.android.settings.accessibility;
|
package com.android.settings.accessibility;
|
||||||
|
|
||||||
import android.app.settings.SettingsEnums;
|
import android.app.settings.SettingsEnums;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.provider.Settings;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.dashboard.DashboardFragment;
|
import com.android.settings.dashboard.DashboardFragment;
|
||||||
@@ -50,5 +52,16 @@ public class CaptioningMoreOptionsFragment extends DashboardFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
||||||
new BaseSearchIndexProvider(R.xml.captioning_more_options);
|
new BaseSearchIndexProvider(R.xml.captioning_more_options) {
|
||||||
|
@Override
|
||||||
|
protected boolean isPageSearchEnabled(Context context) {
|
||||||
|
if (!Flags.fixA11ySettingsSearch()) {
|
||||||
|
return super.isPageSearchEnabled(context);
|
||||||
|
}
|
||||||
|
// CaptioningMoreOptions is only searchable if captions are enabled, so that we
|
||||||
|
// don't show search results for settings that will cause no change to the user.
|
||||||
|
return Settings.Secure.getInt(context.getContentResolver(),
|
||||||
|
Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, 0) == 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
@@ -26,6 +26,7 @@ import android.sysprop.BluetoothProperties;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.PreferenceCategory;
|
import androidx.preference.PreferenceCategory;
|
||||||
@@ -52,7 +53,9 @@ import com.android.settingslib.core.lifecycle.Lifecycle;
|
|||||||
import com.android.settingslib.utils.ThreadUtils;
|
import com.android.settingslib.utils.ThreadUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -81,7 +84,9 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
|
|||||||
private static final String LE_AUDIO_TOGGLE_VISIBLE_PROPERTY =
|
private static final String LE_AUDIO_TOGGLE_VISIBLE_PROPERTY =
|
||||||
"persist.bluetooth.leaudio.toggle_visible";
|
"persist.bluetooth.leaudio.toggle_visible";
|
||||||
|
|
||||||
private final AtomicReference<Set<String>> mInvisiblePreferenceKey = new AtomicReference<>();
|
private Set<String> mInvisibleProfiles = Collections.emptySet();
|
||||||
|
private final AtomicReference<Set<String>> mAdditionalInvisibleProfiles =
|
||||||
|
new AtomicReference<>();
|
||||||
|
|
||||||
private LocalBluetoothManager mManager;
|
private LocalBluetoothManager mManager;
|
||||||
private LocalBluetoothProfileManager mProfileManager;
|
private LocalBluetoothProfileManager mProfileManager;
|
||||||
@@ -95,13 +100,21 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
PreferenceCategory mProfilesContainer;
|
PreferenceCategory mProfilesContainer;
|
||||||
|
|
||||||
public BluetoothDetailsProfilesController(Context context, PreferenceFragmentCompat fragment,
|
public BluetoothDetailsProfilesController(
|
||||||
LocalBluetoothManager manager, CachedBluetoothDevice device, Lifecycle lifecycle) {
|
Context context,
|
||||||
|
PreferenceFragmentCompat fragment,
|
||||||
|
LocalBluetoothManager manager,
|
||||||
|
CachedBluetoothDevice device,
|
||||||
|
Lifecycle lifecycle,
|
||||||
|
@Nullable List<String> invisibleProfiles) {
|
||||||
super(context, fragment, device, lifecycle);
|
super(context, fragment, device, lifecycle);
|
||||||
mManager = manager;
|
mManager = manager;
|
||||||
mProfileManager = mManager.getProfileManager();
|
mProfileManager = mManager.getProfileManager();
|
||||||
mCachedDevice = device;
|
mCachedDevice = device;
|
||||||
mCachedDeviceGroup = Utils.findAllCachedBluetoothDevicesByGroupId(mManager, mCachedDevice);
|
mCachedDeviceGroup = Utils.findAllCachedBluetoothDevicesByGroupId(mManager, mCachedDevice);
|
||||||
|
if (invisibleProfiles != null) {
|
||||||
|
mInvisibleProfiles = Set.copyOf(invisibleProfiles);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -563,7 +576,7 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
|
|||||||
protected void refresh() {
|
protected void refresh() {
|
||||||
ThreadUtils.postOnBackgroundThread(
|
ThreadUtils.postOnBackgroundThread(
|
||||||
() -> {
|
() -> {
|
||||||
mInvisiblePreferenceKey.set(
|
mAdditionalInvisibleProfiles.set(
|
||||||
FeatureFactory.getFeatureFactory()
|
FeatureFactory.getFeatureFactory()
|
||||||
.getBluetoothFeatureProvider()
|
.getBluetoothFeatureProvider()
|
||||||
.getInvisibleProfilePreferenceKeys(
|
.getInvisibleProfilePreferenceKeys(
|
||||||
@@ -604,12 +617,15 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
|
|||||||
mProfilesContainer.addPreference(preference);
|
mProfilesContainer.addPreference(preference);
|
||||||
}
|
}
|
||||||
|
|
||||||
Set<String> invisibleKeys = mInvisiblePreferenceKey.get();
|
Set<String> additionalInvisibleProfiles = mAdditionalInvisibleProfiles.get();
|
||||||
if (invisibleKeys != null) {
|
HashSet<String> combinedInvisibleProfiles = new HashSet<>(mInvisibleProfiles);
|
||||||
for (int i = 0; i < mProfilesContainer.getPreferenceCount(); ++i) {
|
if (additionalInvisibleProfiles != null) {
|
||||||
Preference pref = mProfilesContainer.getPreference(i);
|
combinedInvisibleProfiles.addAll(additionalInvisibleProfiles);
|
||||||
pref.setVisible(pref.isVisible() && !invisibleKeys.contains(pref.getKey()));
|
}
|
||||||
}
|
Log.i(TAG, "Invisible profiles: " + combinedInvisibleProfiles);
|
||||||
|
for (int i = 0; i < mProfilesContainer.getPreferenceCount(); ++i) {
|
||||||
|
Preference pref = mProfilesContainer.getPreference(i);
|
||||||
|
pref.setVisible(pref.isVisible() && !combinedInvisibleProfiles.contains(pref.getKey()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -419,12 +419,16 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
|
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
|
||||||
|
List<String> invisibleProfiles = List.of();
|
||||||
if (Flags.enableBluetoothDeviceDetailsPolish()) {
|
if (Flags.enableBluetoothDeviceDetailsPolish()) {
|
||||||
mFormatter =
|
mFormatter =
|
||||||
FeatureFactory.getFeatureFactory()
|
FeatureFactory.getFeatureFactory()
|
||||||
.getBluetoothFeatureProvider()
|
.getBluetoothFeatureProvider()
|
||||||
.getDeviceDetailsFragmentFormatter(
|
.getDeviceDetailsFragmentFormatter(
|
||||||
requireContext(), this, mBluetoothAdapter, mCachedDevice);
|
requireContext(), this, mBluetoothAdapter, mCachedDevice);
|
||||||
|
invisibleProfiles =
|
||||||
|
mFormatter.getInvisibleBluetoothProfiles(
|
||||||
|
FragmentTypeModel.DeviceDetailsMainFragment.INSTANCE);
|
||||||
}
|
}
|
||||||
ArrayList<AbstractPreferenceController> controllers = new ArrayList<>();
|
ArrayList<AbstractPreferenceController> controllers = new ArrayList<>();
|
||||||
|
|
||||||
@@ -444,7 +448,7 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment
|
|||||||
controllers.add(new BluetoothDetailsSpatialAudioController(context, this, mCachedDevice,
|
controllers.add(new BluetoothDetailsSpatialAudioController(context, this, mCachedDevice,
|
||||||
lifecycle));
|
lifecycle));
|
||||||
controllers.add(new BluetoothDetailsProfilesController(context, this, mManager,
|
controllers.add(new BluetoothDetailsProfilesController(context, this, mManager,
|
||||||
mCachedDevice, lifecycle));
|
mCachedDevice, lifecycle, invisibleProfiles));
|
||||||
controllers.add(new BluetoothDetailsMacAddressController(context, this, mCachedDevice,
|
controllers.add(new BluetoothDetailsMacAddressController(context, this, mCachedDevice,
|
||||||
lifecycle));
|
lifecycle));
|
||||||
controllers.add(new StylusDevicesController(context, mInputDevice, mCachedDevice,
|
controllers.add(new StylusDevicesController(context, mInputDevice, mCachedDevice,
|
||||||
|
@@ -43,6 +43,7 @@ import com.android.settings.core.SubSettingLauncher
|
|||||||
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
|
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
|
||||||
import com.android.settings.spa.preference.ComposePreference
|
import com.android.settings.spa.preference.ComposePreference
|
||||||
import com.android.settingslib.bluetooth.CachedBluetoothDevice
|
import com.android.settingslib.bluetooth.CachedBluetoothDevice
|
||||||
|
import com.android.settingslib.bluetooth.devicesettings.DeviceSettingId
|
||||||
import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingConfigItemModel
|
import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingConfigItemModel
|
||||||
import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingIcon
|
import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingIcon
|
||||||
import com.android.settingslib.spa.framework.theme.SettingsDimension
|
import com.android.settingslib.spa.framework.theme.SettingsDimension
|
||||||
@@ -68,6 +69,9 @@ interface DeviceDetailsFragmentFormatter {
|
|||||||
/** Gets keys of visible preferences in built-in preference in xml. */
|
/** Gets keys of visible preferences in built-in preference in xml. */
|
||||||
fun getVisiblePreferenceKeys(fragmentType: FragmentTypeModel): List<String>?
|
fun getVisiblePreferenceKeys(fragmentType: FragmentTypeModel): List<String>?
|
||||||
|
|
||||||
|
/** Updates device details fragment layout. */
|
||||||
|
fun getInvisibleBluetoothProfiles(fragmentType: FragmentTypeModel): List<String>?
|
||||||
|
|
||||||
/** Updates device details fragment layout. */
|
/** Updates device details fragment layout. */
|
||||||
fun updateLayout(fragmentType: FragmentTypeModel)
|
fun updateLayout(fragmentType: FragmentTypeModel)
|
||||||
|
|
||||||
@@ -108,13 +112,22 @@ class DeviceDetailsFragmentFormatterImpl(
|
|||||||
viewModel
|
viewModel
|
||||||
.getItems(fragmentType)
|
.getItems(fragmentType)
|
||||||
?.filterIsInstance<DeviceSettingConfigItemModel.BuiltinItem>()
|
?.filterIsInstance<DeviceSettingConfigItemModel.BuiltinItem>()
|
||||||
?.mapNotNull { it.preferenceKey }
|
?.map { it.preferenceKey }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getInvisibleBluetoothProfiles(fragmentType: FragmentTypeModel): List<String>? =
|
||||||
|
runBlocking {
|
||||||
|
viewModel
|
||||||
|
.getItems(fragmentType)
|
||||||
|
?.filterIsInstance<DeviceSettingConfigItemModel.BuiltinItem.BluetoothProfilesItem>()
|
||||||
|
?.first()?.invisibleProfiles
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Updates bluetooth device details fragment layout. */
|
/** Updates bluetooth device details fragment layout. */
|
||||||
override fun updateLayout(fragmentType: FragmentTypeModel) = runBlocking {
|
override fun updateLayout(fragmentType: FragmentTypeModel) = runBlocking {
|
||||||
val items = viewModel.getItems(fragmentType) ?: return@runBlocking
|
val items = viewModel.getItems(fragmentType) ?: return@runBlocking
|
||||||
val layout = viewModel.getLayout(fragmentType) ?: return@runBlocking
|
val layout = viewModel.getLayout(fragmentType) ?: return@runBlocking
|
||||||
|
|
||||||
val prefKeyToSettingId =
|
val prefKeyToSettingId =
|
||||||
items
|
items
|
||||||
.filterIsInstance<DeviceSettingConfigItemModel.BuiltinItem>()
|
.filterIsInstance<DeviceSettingConfigItemModel.BuiltinItem>()
|
||||||
|
@@ -22,7 +22,6 @@ import android.content.Context
|
|||||||
import android.graphics.PorterDuff
|
import android.graphics.PorterDuff
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.view.MenuInflater
|
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import com.android.settings.R
|
import com.android.settings.R
|
||||||
@@ -63,8 +62,10 @@ class DeviceDetailsMoreSettingsFragment : DashboardFragment() {
|
|||||||
item.icon?.setColorFilter(
|
item.icon?.setColorFilter(
|
||||||
resources.getColor(
|
resources.getColor(
|
||||||
com.android.settingslib.widget.theme.R.color
|
com.android.settingslib.widget.theme.R.color
|
||||||
.settingslib_materialColorOnSurface),
|
.settingslib_materialColorOnSurface
|
||||||
PorterDuff.Mode.SRC_ATOP)
|
),
|
||||||
|
PorterDuff.Mode.SRC_ATOP,
|
||||||
|
)
|
||||||
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)
|
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -116,14 +117,27 @@ class DeviceDetailsMoreSettingsFragment : DashboardFragment() {
|
|||||||
}
|
}
|
||||||
formatter =
|
formatter =
|
||||||
featureFactory.bluetoothFeatureProvider.getDeviceDetailsFragmentFormatter(
|
featureFactory.bluetoothFeatureProvider.getDeviceDetailsFragmentFormatter(
|
||||||
requireContext(), this, bluetoothManager.adapter, cachedDevice)
|
requireContext(),
|
||||||
|
this,
|
||||||
|
bluetoothManager.adapter,
|
||||||
|
cachedDevice,
|
||||||
|
)
|
||||||
helpItem =
|
helpItem =
|
||||||
formatter
|
formatter
|
||||||
.getMenuItem(FragmentTypeModel.DeviceDetailsMoreSettingsFragment)
|
.getMenuItem(FragmentTypeModel.DeviceDetailsMoreSettingsFragment)
|
||||||
.stateIn(lifecycleScope, SharingStarted.WhileSubscribed(), initialValue = null)
|
.stateIn(lifecycleScope, SharingStarted.WhileSubscribed(), initialValue = null)
|
||||||
return listOf(
|
return listOf(
|
||||||
BluetoothDetailsProfilesController(
|
BluetoothDetailsProfilesController(
|
||||||
context, this, localBluetoothManager, cachedDevice, settingsLifecycle))
|
context,
|
||||||
|
this,
|
||||||
|
localBluetoothManager,
|
||||||
|
cachedDevice,
|
||||||
|
settingsLifecycle,
|
||||||
|
formatter.getInvisibleBluetoothProfiles(
|
||||||
|
FragmentTypeModel.DeviceDetailsMoreSettingsFragment
|
||||||
|
),
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getLogTag(): String = TAG
|
override fun getLogTag(): String = TAG
|
||||||
|
@@ -293,6 +293,7 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
|
|||||||
new ChooseLockSettingsHelper.Builder(this);
|
new ChooseLockSettingsHelper.Builder(this);
|
||||||
launchedCDC = builder.setHeader(mTitle)
|
launchedCDC = builder.setHeader(mTitle)
|
||||||
.setDescription(mDetails)
|
.setDescription(mDetails)
|
||||||
|
.setAlternateButton(alternateButton)
|
||||||
.setExternal(true)
|
.setExternal(true)
|
||||||
.setUserId(LockPatternUtils.USER_REPAIR_MODE)
|
.setUserId(LockPatternUtils.USER_REPAIR_MODE)
|
||||||
.show();
|
.show();
|
||||||
|
@@ -197,8 +197,8 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
|
|||||||
mCancelButton = view.findViewById(R.id.cancelButton);
|
mCancelButton = view.findViewById(R.id.cancelButton);
|
||||||
boolean showCancelButton = mRemoteValidation || getActivity().getIntent().getBooleanExtra(
|
boolean showCancelButton = mRemoteValidation || getActivity().getIntent().getBooleanExtra(
|
||||||
SHOW_CANCEL_BUTTON, false);
|
SHOW_CANCEL_BUTTON, false);
|
||||||
boolean hasAlternateButton = (mFrp || mRemoteValidation) && !TextUtils.isEmpty(
|
boolean hasAlternateButton = (mFrp || mRemoteValidation || mRepairMode)
|
||||||
mAlternateButtonText);
|
&& !TextUtils.isEmpty(mAlternateButtonText);
|
||||||
mCancelButton.setVisibility(showCancelButton || hasAlternateButton
|
mCancelButton.setVisibility(showCancelButton || hasAlternateButton
|
||||||
? View.VISIBLE : View.GONE);
|
? View.VISIBLE : View.GONE);
|
||||||
if (hasAlternateButton) {
|
if (hasAlternateButton) {
|
||||||
|
@@ -20,6 +20,9 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import android.app.settings.SettingsEnums;
|
import android.app.settings.SettingsEnums;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.platform.test.annotations.EnableFlags;
|
||||||
|
import android.platform.test.flag.junit.SetFlagsRule;
|
||||||
|
import android.provider.Settings;
|
||||||
|
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
@@ -27,15 +30,23 @@ import com.android.settings.R;
|
|||||||
import com.android.settings.testutils.XmlTestUtils;
|
import com.android.settings.testutils.XmlTestUtils;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/** Tests for {@link CaptioningMoreOptionsFragment}. */
|
/** Tests for {@link CaptioningMoreOptionsFragment}. */
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
public class CaptioningMoreOptionsFragmentTest {
|
public class CaptioningMoreOptionsFragmentTest {
|
||||||
|
// Language/locale preference key, from captioning_more_options.xml
|
||||||
|
private static final String CAPTIONING_LOCALE_KEY = "captioning_locale";
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public final SetFlagsRule mSetFlagRule = new SetFlagsRule();
|
||||||
|
|
||||||
private final Context mContext = ApplicationProvider.getApplicationContext();
|
private final Context mContext = ApplicationProvider.getApplicationContext();
|
||||||
private CaptioningMoreOptionsFragment mFragment;
|
private CaptioningMoreOptionsFragment mFragment;
|
||||||
@@ -65,11 +76,40 @@ public class CaptioningMoreOptionsFragmentTest {
|
|||||||
@Test
|
@Test
|
||||||
public void getNonIndexableKeys_existInXmlLayout() {
|
public void getNonIndexableKeys_existInXmlLayout() {
|
||||||
final List<String> niks = CaptioningMoreOptionsFragment.SEARCH_INDEX_DATA_PROVIDER
|
final List<String> niks = CaptioningMoreOptionsFragment.SEARCH_INDEX_DATA_PROVIDER
|
||||||
.getNonIndexableKeys(mContext);
|
.getNonIndexableKeys(mContext)
|
||||||
|
.stream().filter(Objects::nonNull).collect(Collectors.toList());
|
||||||
final List<String> keys =
|
final List<String> keys =
|
||||||
XmlTestUtils.getKeysFromPreferenceXml(mContext,
|
XmlTestUtils.getKeysFromPreferenceXml(mContext, R.xml.captioning_more_options);
|
||||||
R.xml.captioning_more_options);
|
|
||||||
|
|
||||||
assertThat(keys).containsAtLeastElementsIn(niks);
|
assertThat(keys).containsAtLeastElementsIn(niks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
|
||||||
|
public void getNonIndexableKeys_captioningEnabled_localeIsSearchable() {
|
||||||
|
setCaptioningEnabled(true);
|
||||||
|
|
||||||
|
final List<String> niks = CaptioningMoreOptionsFragment.SEARCH_INDEX_DATA_PROVIDER
|
||||||
|
.getNonIndexableKeys(mContext);
|
||||||
|
|
||||||
|
// Not in NonIndexableKeys == searchable
|
||||||
|
assertThat(niks).doesNotContain(CAPTIONING_LOCALE_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
|
||||||
|
public void getNonIndexableKeys_captioningDisabled_localeIsNotSearchable() {
|
||||||
|
setCaptioningEnabled(false);
|
||||||
|
|
||||||
|
final List<String> niks = CaptioningMoreOptionsFragment.SEARCH_INDEX_DATA_PROVIDER
|
||||||
|
.getNonIndexableKeys(mContext);
|
||||||
|
|
||||||
|
// In NonIndexableKeys == not searchable
|
||||||
|
assertThat(niks).contains(CAPTIONING_LOCALE_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setCaptioningEnabled(boolean enabled) {
|
||||||
|
Settings.Secure.putInt(mContext.getContentResolver(),
|
||||||
|
Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, enabled ? 1 : 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -120,11 +120,7 @@ public class BluetoothDetailsProfilesControllerTest extends BluetoothDetailsCont
|
|||||||
.thenAnswer(invocation -> ImmutableList.of(mConnectableProfiles));
|
.thenAnswer(invocation -> ImmutableList.of(mConnectableProfiles));
|
||||||
|
|
||||||
setupDevice(mDeviceConfig);
|
setupDevice(mDeviceConfig);
|
||||||
mController = new BluetoothDetailsProfilesController(mContext, mFragment, mLocalManager,
|
initController(List.of());
|
||||||
mCachedDevice, mLifecycle);
|
|
||||||
mProfiles.setKey(mController.getPreferenceKey());
|
|
||||||
mController.mProfilesContainer = mProfiles;
|
|
||||||
mScreen.addPreference(mProfiles);
|
|
||||||
BluetoothProperties.le_audio_allow_list(Lists.newArrayList(LE_DEVICE_MODEL));
|
BluetoothProperties.le_audio_allow_list(Lists.newArrayList(LE_DEVICE_MODEL));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -554,6 +550,36 @@ public class BluetoothDetailsProfilesControllerTest extends BluetoothDetailsCont
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void prefKeyInBlockingList_hideToggle() {
|
public void prefKeyInBlockingList_hideToggle() {
|
||||||
|
initController(List.of("A2DP"));
|
||||||
|
setupDevice(makeDefaultDeviceConfig());
|
||||||
|
|
||||||
|
addA2dpProfileToDevice(true, true, true);
|
||||||
|
when(mFeatureProvider.getInvisibleProfilePreferenceKeys(any(), any()))
|
||||||
|
.thenReturn(ImmutableSet.of());
|
||||||
|
|
||||||
|
showScreen(mController);
|
||||||
|
|
||||||
|
List<SwitchPreferenceCompat> switches = getProfileSwitches(false);
|
||||||
|
assertThat(switches.get(0).isVisible()).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void prefKeyNotInBlockingList_showToggle() {
|
||||||
|
initController(List.of());
|
||||||
|
setupDevice(makeDefaultDeviceConfig());
|
||||||
|
|
||||||
|
addA2dpProfileToDevice(true, true, true);
|
||||||
|
when(mFeatureProvider.getInvisibleProfilePreferenceKeys(any(), any()))
|
||||||
|
.thenReturn(ImmutableSet.of());
|
||||||
|
|
||||||
|
showScreen(mController);
|
||||||
|
|
||||||
|
List<SwitchPreferenceCompat> switches = getProfileSwitches(false);
|
||||||
|
assertThat(switches.get(0).isVisible()).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void prefKeyInFeatureProviderBlockingList_hideToggle() {
|
||||||
setupDevice(makeDefaultDeviceConfig());
|
setupDevice(makeDefaultDeviceConfig());
|
||||||
|
|
||||||
addA2dpProfileToDevice(true, true, true);
|
addA2dpProfileToDevice(true, true, true);
|
||||||
@@ -567,7 +593,7 @@ public class BluetoothDetailsProfilesControllerTest extends BluetoothDetailsCont
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void prefKeyNotInBlockingList_showToggle() {
|
public void prefKeyNotInFeatureProviderBlockingList_showToggle() {
|
||||||
setupDevice(makeDefaultDeviceConfig());
|
setupDevice(makeDefaultDeviceConfig());
|
||||||
|
|
||||||
addA2dpProfileToDevice(true, true, true);
|
addA2dpProfileToDevice(true, true, true);
|
||||||
@@ -627,4 +653,13 @@ public class BluetoothDetailsProfilesControllerTest extends BluetoothDetailsCont
|
|||||||
assertThat(switches.getFirst().getTitle()).isEqualTo(
|
assertThat(switches.getFirst().getTitle()).isEqualTo(
|
||||||
mContext.getString(mLeAudioProfile.getNameResource(mDevice)));
|
mContext.getString(mLeAudioProfile.getNameResource(mDevice)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void initController(List<String> invisibleProfiles) {
|
||||||
|
mController = new BluetoothDetailsProfilesController(mContext, mFragment, mLocalManager,
|
||||||
|
mCachedDevice, mLifecycle, invisibleProfiles);
|
||||||
|
mProfiles.setKey(mController.getPreferenceKey());
|
||||||
|
mController.mProfilesContainer = mProfiles;
|
||||||
|
mScreen.removeAll();
|
||||||
|
mScreen.addPreference(mProfiles);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -122,10 +122,11 @@ class DeviceDetailsFragmentFormatterTest {
|
|||||||
.thenReturn(
|
.thenReturn(
|
||||||
DeviceSettingConfigModel(
|
DeviceSettingConfigModel(
|
||||||
listOf(
|
listOf(
|
||||||
DeviceSettingConfigItemModel.BuiltinItem(
|
DeviceSettingConfigItemModel.BuiltinItem.CommonBuiltinItem(
|
||||||
DeviceSettingId.DEVICE_SETTING_ID_HEADER,
|
DeviceSettingId.DEVICE_SETTING_ID_HEADER,
|
||||||
"bluetooth_device_header"),
|
"bluetooth_device_header"
|
||||||
DeviceSettingConfigItemModel.BuiltinItem(
|
),
|
||||||
|
DeviceSettingConfigItemModel.BuiltinItem.CommonBuiltinItem(
|
||||||
DeviceSettingId.DEVICE_SETTING_ID_ACTION_BUTTONS, "action_buttons"),
|
DeviceSettingId.DEVICE_SETTING_ID_ACTION_BUTTONS, "action_buttons"),
|
||||||
),
|
),
|
||||||
listOf(),
|
listOf(),
|
||||||
@@ -203,10 +204,10 @@ class DeviceDetailsFragmentFormatterTest {
|
|||||||
.thenReturn(
|
.thenReturn(
|
||||||
DeviceSettingConfigModel(
|
DeviceSettingConfigModel(
|
||||||
listOf(
|
listOf(
|
||||||
DeviceSettingConfigItemModel.BuiltinItem(
|
DeviceSettingConfigItemModel.BuiltinItem.CommonBuiltinItem(
|
||||||
DeviceSettingId.DEVICE_SETTING_ID_HEADER,
|
DeviceSettingId.DEVICE_SETTING_ID_HEADER,
|
||||||
"bluetooth_device_header"),
|
"bluetooth_device_header"),
|
||||||
DeviceSettingConfigItemModel.BuiltinItem(
|
DeviceSettingConfigItemModel.BuiltinItem.CommonBuiltinItem(
|
||||||
DeviceSettingId.DEVICE_SETTING_ID_KEYBOARD_SETTINGS,
|
DeviceSettingId.DEVICE_SETTING_ID_KEYBOARD_SETTINGS,
|
||||||
"keyboard_settings"),
|
"keyboard_settings"),
|
||||||
),
|
),
|
||||||
@@ -227,12 +228,12 @@ class DeviceDetailsFragmentFormatterTest {
|
|||||||
.thenReturn(
|
.thenReturn(
|
||||||
DeviceSettingConfigModel(
|
DeviceSettingConfigModel(
|
||||||
listOf(
|
listOf(
|
||||||
DeviceSettingConfigItemModel.BuiltinItem(
|
DeviceSettingConfigItemModel.BuiltinItem.CommonBuiltinItem(
|
||||||
DeviceSettingId.DEVICE_SETTING_ID_HEADER,
|
DeviceSettingId.DEVICE_SETTING_ID_HEADER,
|
||||||
"bluetooth_device_header"),
|
"bluetooth_device_header"),
|
||||||
DeviceSettingConfigItemModel.AppProvidedItem(
|
DeviceSettingConfigItemModel.AppProvidedItem(
|
||||||
DeviceSettingId.DEVICE_SETTING_ID_ANC),
|
DeviceSettingId.DEVICE_SETTING_ID_ANC),
|
||||||
DeviceSettingConfigItemModel.BuiltinItem(
|
DeviceSettingConfigItemModel.BuiltinItem.CommonBuiltinItem(
|
||||||
DeviceSettingId.DEVICE_SETTING_ID_KEYBOARD_SETTINGS,
|
DeviceSettingId.DEVICE_SETTING_ID_KEYBOARD_SETTINGS,
|
||||||
"keyboard_settings"),
|
"keyboard_settings"),
|
||||||
),
|
),
|
||||||
|
@@ -282,10 +282,10 @@ class BluetoothDeviceDetailsViewModelTest {
|
|||||||
|
|
||||||
private companion object {
|
private companion object {
|
||||||
val BUILTIN_SETTING_ITEM_1 =
|
val BUILTIN_SETTING_ITEM_1 =
|
||||||
DeviceSettingConfigItemModel.BuiltinItem(
|
DeviceSettingConfigItemModel.BuiltinItem.CommonBuiltinItem(
|
||||||
DeviceSettingId.DEVICE_SETTING_ID_HEADER, "bluetooth_device_header")
|
DeviceSettingId.DEVICE_SETTING_ID_HEADER, "bluetooth_device_header")
|
||||||
val BUILDIN_SETTING_ITEM_2 =
|
val BUILDIN_SETTING_ITEM_2 =
|
||||||
DeviceSettingConfigItemModel.BuiltinItem(
|
DeviceSettingConfigItemModel.BuiltinItem.CommonBuiltinItem(
|
||||||
DeviceSettingId.DEVICE_SETTING_ID_ACTION_BUTTONS, "action_buttons")
|
DeviceSettingId.DEVICE_SETTING_ID_ACTION_BUTTONS, "action_buttons")
|
||||||
val SETTING_ITEM_HELP = DeviceSettingConfigItemModel.AppProvidedItem(12345)
|
val SETTING_ITEM_HELP = DeviceSettingConfigItemModel.AppProvidedItem(12345)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user