diff --git a/res/xml/captioning_settings.xml b/res/xml/captioning_settings.xml
index 8cf05bea9fa..747923fe044 100644
--- a/res/xml/captioning_settings.xml
+++ b/res/xml/captioning_settings.xml
@@ -22,7 +22,8 @@
+ android:title="@string/accessibility_captioning_preference_intro"
+ settings:searchable="false"/>
+ android:title="@string/captioning_more_options_title"
+ settings:searchable="false" />
refreshShowingCustom());
+ this(context, preferenceKey, new CaptionHelper(context),
+ new AccessibilitySettingsContentObserver(new Handler(Looper.getMainLooper())));
}
@VisibleForTesting
- CaptioningCustomController(Context context, String preferenceKey,
+ CaptioningCustomController(
+ Context context, String preferenceKey, CaptionHelper captionHelper,
AccessibilitySettingsContentObserver contentObserver) {
- this(context, preferenceKey);
+ super(context, preferenceKey);
+ mCaptionHelper = new CaptionHelper(context);
+ mContentResolver = context.getContentResolver();
mSettingsContentObserver = contentObserver;
+ mSettingsContentObserver.registerKeysToObserverCallback(CAPTIONING_FEATURE_KEYS, key -> {
+ if (mCustom != null) {
+ mCustom.setVisible(shouldShowPreference());
+ }
+ });
}
@Override
public int getAvailabilityStatus() {
- return AVAILABLE;
+ if (com.android.settings.accessibility.Flags.fixA11ySettingsSearch()) {
+ return (shouldShowPreference()) ? AVAILABLE : AVAILABLE_UNSEARCHABLE;
+ } else {
+ return AVAILABLE;
+ }
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mCustom = screen.findPreference(getPreferenceKey());
- refreshShowingCustom();
+ if (mCustom != null) {
+ mCustom.setVisible(shouldShowPreference());
+ }
}
@Override
@@ -88,9 +99,7 @@ public class CaptioningCustomController extends BasePreferenceController
mSettingsContentObserver.unregister(mContentResolver);
}
- private void refreshShowingCustom() {
- final boolean isCustomPreset =
- mCaptionHelper.getRawUserStyle() == CaptioningManager.CaptionStyle.PRESET_CUSTOM;
- mCustom.setVisible(isCustomPreset);
+ private boolean shouldShowPreference() {
+ return mCaptionHelper.getRawUserStyle() == CaptioningManager.CaptionStyle.PRESET_CUSTOM;
}
}
diff --git a/src/com/android/settings/accessibility/CaptioningWindowColorController.java b/src/com/android/settings/accessibility/CaptioningWindowColorController.java
index 238a75a8b6a..b72b9739084 100644
--- a/src/com/android/settings/accessibility/CaptioningWindowColorController.java
+++ b/src/com/android/settings/accessibility/CaptioningWindowColorController.java
@@ -19,10 +19,12 @@ package com.android.settings.accessibility;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
+import android.view.accessibility.CaptioningManager;
import android.view.accessibility.CaptioningManager.CaptionStyle;
import androidx.preference.PreferenceScreen;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.accessibility.ListDialogPreference.OnValueChangedListener;
import com.android.settings.core.BasePreferenceController;
@@ -34,14 +36,26 @@ public class CaptioningWindowColorController extends BasePreferenceController
private final CaptionHelper mCaptionHelper;
private int mCachedNonDefaultOpacity = CaptionStyle.COLOR_UNSPECIFIED;
- public CaptioningWindowColorController(Context context, String preferenceKey) {
+ @VisibleForTesting
+ CaptioningWindowColorController(Context context, String preferenceKey,
+ CaptionHelper captionHelper) {
super(context, preferenceKey);
- mCaptionHelper = new CaptionHelper(context);
+ mCaptionHelper = captionHelper;
+ }
+
+ public CaptioningWindowColorController(Context context, String preferenceKey) {
+ this(context, preferenceKey, new CaptionHelper(context));
}
@Override
public int getAvailabilityStatus() {
- return AVAILABLE;
+ if (com.android.settings.accessibility.Flags.fixA11ySettingsSearch()) {
+ return (mCaptionHelper.getRawUserStyle()
+ == CaptioningManager.CaptionStyle.PRESET_CUSTOM)
+ ? AVAILABLE : AVAILABLE_UNSEARCHABLE;
+ } else {
+ return AVAILABLE;
+ }
}
@Override
diff --git a/src/com/android/settings/accessibility/CaptioningWindowOpacityController.java b/src/com/android/settings/accessibility/CaptioningWindowOpacityController.java
index ef288039780..0e6c6ff4822 100644
--- a/src/com/android/settings/accessibility/CaptioningWindowOpacityController.java
+++ b/src/com/android/settings/accessibility/CaptioningWindowOpacityController.java
@@ -18,9 +18,11 @@ package com.android.settings.accessibility;
import android.content.Context;
import android.content.res.Resources;
+import android.view.accessibility.CaptioningManager;
import androidx.preference.PreferenceScreen;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.accessibility.ListDialogPreference.OnValueChangedListener;
import com.android.settings.core.BasePreferenceController;
@@ -31,14 +33,26 @@ public class CaptioningWindowOpacityController extends BasePreferenceController
private final CaptionHelper mCaptionHelper;
- public CaptioningWindowOpacityController(Context context, String preferenceKey) {
+ @VisibleForTesting
+ CaptioningWindowOpacityController(Context context, String preferenceKey,
+ CaptionHelper captionHelper) {
super(context, preferenceKey);
- mCaptionHelper = new CaptionHelper(context);
+ mCaptionHelper = captionHelper;
+ }
+
+ public CaptioningWindowOpacityController(Context context, String preferenceKey) {
+ this(context, preferenceKey, new CaptionHelper(context));
}
@Override
public int getAvailabilityStatus() {
- return AVAILABLE;
+ if (com.android.settings.accessibility.Flags.fixA11ySettingsSearch()) {
+ return (mCaptionHelper.getRawUserStyle()
+ == CaptioningManager.CaptionStyle.PRESET_CUSTOM)
+ ? AVAILABLE : AVAILABLE_UNSEARCHABLE;
+ } else {
+ return AVAILABLE;
+ }
}
@Override
diff --git a/src/com/android/settings/accounts/AccountTypePreferenceLoader.java b/src/com/android/settings/accounts/AccountTypePreferenceLoader.java
index 3b254e9b844..71c71346adb 100644
--- a/src/com/android/settings/accounts/AccountTypePreferenceLoader.java
+++ b/src/com/android/settings/accounts/AccountTypePreferenceLoader.java
@@ -20,6 +20,7 @@ package com.android.settings.accounts;
import android.accounts.Account;
import android.accounts.AuthenticatorDescription;
import android.content.ClipData;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
@@ -186,9 +187,9 @@ public class AccountTypePreferenceLoader {
prefIntent, mUserHandle);
} else {
Log.e(TAG,
- "Refusing to launch authenticator intent because"
- + "it exploits Settings permissions: "
- + prefIntent);
+ "Refusing to launch authenticator intent because "
+ + "it exploits Settings permissions: "
+ + prefIntent);
}
return true;
}
@@ -242,13 +243,19 @@ public class AccountTypePreferenceLoader {
}
/**
- * Determines if the supplied Intent is safe. A safe intent is one that is
- * will launch a exported=true activity or owned by the same uid as the
+ * Determines if the supplied Intent is safe. A safe intent is one that
+ * will launch an exported=true activity or owned by the same uid as the
* authenticator supplying the intent.
*/
- private boolean isSafeIntent(PackageManager pm, Intent intent, String acccountType) {
+ @VisibleForTesting
+ boolean isSafeIntent(PackageManager pm, Intent intent, String accountType) {
+ if (TextUtils.equals(intent.getScheme(), ContentResolver.SCHEME_CONTENT)) {
+ Log.e(TAG, "Intent with a content scheme is unsafe.");
+ return false;
+ }
+
AuthenticatorDescription authDesc =
- mAuthenticatorHelper.getAccountTypeDescription(acccountType);
+ mAuthenticatorHelper.getAccountTypeDescription(accountType);
ResolveInfo resolveInfo = pm.resolveActivityAsUser(intent, 0, mUserHandle.getIdentifier());
if (resolveInfo == null) {
return false;
diff --git a/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java
index 22a39c8686a..14f55b81264 100644
--- a/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java
@@ -77,9 +77,9 @@ public class AvailableMediaBluetoothDeviceUpdater extends BluetoothDeviceUpdater
// It would show in Available Devices group if the audio sharing flag is disabled or
// the device is not in the audio sharing session.
if (cachedDevice.isConnectedLeAudioDevice()) {
- if (BluetoothUtils.isAudioSharingEnabled()
+ if (BluetoothUtils.isAudioSharingUIAvailable(mContext)
&& BluetoothUtils.hasConnectedBroadcastSource(
- cachedDevice, mLocalBtManager)) {
+ cachedDevice, mLocalBtManager)) {
Log.d(
TAG,
"Filter out device : "
diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePairingDetailBase.java b/src/com/android/settings/bluetooth/BluetoothDevicePairingDetailBase.java
index 387bf837ce4..36a14aa54fc 100644
--- a/src/com/android/settings/bluetooth/BluetoothDevicePairingDetailBase.java
+++ b/src/com/android/settings/bluetooth/BluetoothDevicePairingDetailBase.java
@@ -228,19 +228,19 @@ public abstract class BluetoothDevicePairingDetailBase extends DeviceListPrefere
final BluetoothDevice device = cachedDevice.getDevice();
if (device != null
&& mSelectedList.contains(device)) {
- if (!BluetoothUtils.isAudioSharingEnabled()) {
+ if (BluetoothUtils.isAudioSharingUIAvailable(getContext())) {
+ if (bluetoothProfile == BluetoothProfile.LE_AUDIO_BROADCAST_ASSISTANT
+ && state == BluetoothAdapter.STATE_CONNECTED
+ && device.equals(mJustBonded)
+ && mShouldTriggerAudioSharingShareThenPairFlow) {
+ Log.d(getLogTag(),
+ "onProfileConnectionStateChanged, assistant profile connected");
+ dismissConnectingDialog();
+ mHandler.removeMessages(AUTO_DISMISS_MESSAGE_ID);
+ finishFragmentWithResultForAudioSharing(device);
+ }
+ } else {
finish();
- return;
- }
- if (bluetoothProfile == BluetoothProfile.LE_AUDIO_BROADCAST_ASSISTANT
- && state == BluetoothAdapter.STATE_CONNECTED
- && device.equals(mJustBonded)
- && mShouldTriggerAudioSharingShareThenPairFlow) {
- Log.d(getLogTag(),
- "onProfileConnectionStateChanged, assistant profile connected");
- dismissConnectingDialog();
- mHandler.removeMessages(AUTO_DISMISS_MESSAGE_ID);
- finishFragmentWithResultForAudioSharing(device);
}
} else {
onDeviceDeleted(cachedDevice);
@@ -309,15 +309,17 @@ public abstract class BluetoothDevicePairingDetailBase extends DeviceListPrefere
@VisibleForTesting
boolean shouldTriggerAudioSharingShareThenPairFlow() {
- if (!BluetoothUtils.isAudioSharingEnabled()) return false;
- Activity activity = getActivity();
- Intent intent = activity == null ? null : activity.getIntent();
- Bundle args =
- intent == null ? null :
- intent.getBundleExtra(
- SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
- return args != null
- && args.getBoolean(EXTRA_PAIR_AND_JOIN_SHARING, false);
+ if (BluetoothUtils.isAudioSharingUIAvailable(getContext())) {
+ Activity activity = getActivity();
+ Intent intent = activity == null ? null : activity.getIntent();
+ Bundle args =
+ intent == null ? null :
+ intent.getBundleExtra(
+ SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
+ return args != null
+ && args.getBoolean(EXTRA_PAIR_AND_JOIN_SHARING, false);
+ }
+ return false;
}
private void addOnMetadataChangedListener(@Nullable BluetoothDevice device) {
diff --git a/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java b/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java
index c67995a2456..432317a3dd3 100644
--- a/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java
+++ b/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java
@@ -179,7 +179,7 @@ public class AvailableMediaDeviceGroupController extends BasePreferenceControlle
super(context, KEY);
mBtManager = Utils.getLocalBtManager(mContext);
mExecutor = Executors.newSingleThreadExecutor();
- if (BluetoothUtils.isAudioSharingEnabled()) {
+ if (BluetoothUtils.isAudioSharingUIAvailable(mContext)) {
mBroadcast =
mBtManager == null
? null
@@ -200,7 +200,7 @@ public class AvailableMediaDeviceGroupController extends BasePreferenceControlle
Log.d(TAG, "onStart() Bluetooth is not supported on this device");
return;
}
- if (BluetoothUtils.isAudioSharingEnabled()) {
+ if (BluetoothUtils.isAudioSharingUIAvailable(mContext)) {
registerAudioSharingCallbacks();
}
mBtManager.getEventManager().registerCallback(this);
@@ -216,7 +216,7 @@ public class AvailableMediaDeviceGroupController extends BasePreferenceControlle
Log.d(TAG, "onStop() Bluetooth is not supported on this device");
return;
}
- if (BluetoothUtils.isAudioSharingEnabled()) {
+ if (BluetoothUtils.isAudioSharingUIAvailable(mContext)) {
unregisterAudioSharingCallbacks();
}
if (mBluetoothDeviceUpdater != null) {
@@ -278,7 +278,7 @@ public class AvailableMediaDeviceGroupController extends BasePreferenceControlle
public void onDeviceClick(Preference preference) {
final CachedBluetoothDevice cachedDevice =
((BluetoothDevicePreference) preference).getBluetoothDevice();
- if (BluetoothUtils.isAudioSharingEnabled() && mDialogHandler != null) {
+ if (BluetoothUtils.isAudioSharingUIAvailable(mContext) && mDialogHandler != null) {
mDialogHandler.handleDeviceConnected(cachedDevice, /* userTriggered= */ true);
FeatureFactory.getFeatureFactory().getMetricsFeatureProvider()
.action(mContext, SettingsEnums.ACTION_MEDIA_DEVICE_CLICK);
@@ -294,7 +294,7 @@ public class AvailableMediaDeviceGroupController extends BasePreferenceControlle
fragment.getContext(),
AvailableMediaDeviceGroupController.this,
fragment.getMetricsCategory());
- if (BluetoothUtils.isAudioSharingEnabled()) {
+ if (BluetoothUtils.isAudioSharingUIAvailable(mContext)) {
mDialogHandler = new AudioSharingDialogHandler(mContext, fragment);
}
}
@@ -341,7 +341,7 @@ public class AvailableMediaDeviceGroupController extends BasePreferenceControlle
if (isAudioModeOngoingCall(mContext)) {
// in phone call
titleResId = R.string.connected_device_call_device_title;
- } else if (BluetoothUtils.isAudioSharingEnabled()
+ } else if (BluetoothUtils.isAudioSharingUIAvailable(mContext)
&& BluetoothUtils.isBroadcasting(mBtManager)) {
// without phone call, in audio sharing
titleResId = R.string.audio_sharing_media_device_group_title;
diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
index 37b71863e54..65258fc7257 100644
--- a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
@@ -80,7 +80,7 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment {
+ ", action : "
+ action);
}
- if (BluetoothUtils.isAudioSharingEnabled()) {
+ if (BluetoothUtils.isAudioSharingUIAvailable(context)) {
use(AudioSharingDevicePreferenceController.class).init(this);
}
use(AvailableMediaDeviceGroupController.class).init(this);
diff --git a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
index 4423c65e00b..24294b0e328 100644
--- a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
+++ b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
@@ -54,10 +54,8 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private static final int MAX_DEVICE_NUM = 3;
- private static final int DOCK_DEVICE_INDEX = 9;
private static final String KEY_SEE_ALL = "previously_connected_devices_see_all";
- private final List mDevicesList = new ArrayList<>();
private final List mDockDevicesList = new ArrayList<>();
private final Map mDevicePreferenceMap = new HashMap<>();
private final BluetoothAdapter mBluetoothAdapter;
@@ -118,6 +116,8 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
mContext.registerReceiver(mReceiver, mIntentFilter,
Context.RECEIVER_EXPORTED_UNAUDITED);
mBluetoothDeviceUpdater.refreshPreference();
+ Log.d(TAG, "Updating preference group by onStart on thread "
+ + Thread.currentThread().getName());
updatePreferenceGroup();
}
@@ -146,55 +146,11 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
if (DEBUG) {
Log.d(TAG, "onDeviceAdded() " + preference.getTitle());
}
+ Log.d(TAG, "Updating preference group by onDeviceAdded on thread "
+ + Thread.currentThread().getName());
updatePreferenceGroup();
}
- private void addPreference(int index, Preference preference) {
- if (preference instanceof BluetoothDevicePreference) {
- if (index >= 0 && mDevicesList.size() >= index) {
- mDevicesList.add(index, preference);
- } else {
- mDevicesList.add(preference);
- }
- } else {
- mDockDevicesList.add(preference);
- }
- addPreference();
- }
-
- private void addPreference() {
- mPreferenceGroup.removeAll();
- mPreferenceGroup.addPreference(mSeeAllPreference);
- final int size = getDeviceListSize();
- for (int i = 0; i < size; i++) {
- if (DEBUG) {
- Log.d(TAG, "addPreference() add device : " + mDevicesList.get(i).getTitle());
- }
- mDevicesList.get(i).setOrder(i);
- mPreferenceGroup.addPreference(mDevicesList.get(i));
- }
- if (mDockDevicesList.size() > 0) {
- for (int i = 0; i < getDockDeviceListSize(MAX_DEVICE_NUM - size); i++) {
- if (DEBUG) {
- Log.d(TAG, "addPreference() add dock device : "
- + mDockDevicesList.get(i).getTitle());
- }
- mDockDevicesList.get(i).setOrder(DOCK_DEVICE_INDEX);
- mPreferenceGroup.addPreference(mDockDevicesList.get(i));
- }
- }
- }
-
- private int getDeviceListSize() {
- return mDevicesList.size() >= MAX_DEVICE_NUM
- ? MAX_DEVICE_NUM : mDevicesList.size();
- }
-
- private int getDockDeviceListSize(int availableSize) {
- return mDockDevicesList.size() >= availableSize
- ? availableSize : mDockDevicesList.size();
- }
-
@Override
public void onDeviceRemoved(Preference preference) {
if (preference instanceof BluetoothDevicePreference) {
@@ -207,19 +163,22 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
if (DEBUG) {
Log.d(TAG, "onDeviceRemoved() " + preference.getTitle());
}
+ Log.d(TAG, "Updating preference group by onDeviceRemoved on thread "
+ + Thread.currentThread().getName());
updatePreferenceGroup();
}
/** Sort the preferenceGroup by most recently used. */
public void updatePreferenceGroup() {
mPreferenceGroup.removeAll();
- mPreferenceGroup.addPreference(mSeeAllPreference);
if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) {
// Bluetooth is supported
int order = 0;
for (BluetoothDevice device : mBluetoothAdapter.getMostRecentlyConnectedDevices()) {
Preference preference = mDevicePreferenceMap.getOrDefault(device, null);
if (preference != null) {
+ Log.d(TAG, "Adding preference with order " + order + " when there are "
+ + mPreferenceGroup.getPreferenceCount());
preference.setOrder(order);
mPreferenceGroup.addPreference(preference);
order += 1;
@@ -237,6 +196,7 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
order += 1;
}
}
+ mPreferenceGroup.addPreference(mSeeAllPreference);
updatePreferenceVisibility();
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingActivity.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingActivity.java
index 08b21a1e79c..7f135ce19d7 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingActivity.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingActivity.java
@@ -25,7 +25,7 @@ public class AudioSharingActivity extends SettingsActivity {
@Override
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
- if (!BluetoothUtils.isAudioSharingEnabled()) {
+ if (!BluetoothUtils.isAudioSharingUIAvailable(this)) {
finish();
}
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBasePreferenceController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBasePreferenceController.java
index 96c5d453dcd..6410f96aefe 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBasePreferenceController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBasePreferenceController.java
@@ -55,7 +55,8 @@ public abstract class AudioSharingBasePreferenceController extends BasePreferenc
@Override
public int getAvailabilityStatus() {
- return BluetoothUtils.isAudioSharingEnabled() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ return (BluetoothUtils.isAudioSharingUIAvailable(mContext))
+ ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
@Override
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdater.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdater.java
index 6fd6f18bc24..e5b984d707c 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdater.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingBluetoothDeviceUpdater.java
@@ -55,7 +55,7 @@ public class AudioSharingBluetoothDeviceUpdater extends BluetoothDeviceUpdater
if (isDeviceConnected(cachedDevice) && isDeviceInCachedDevicesList(cachedDevice)) {
// If device is LE audio device and has a broadcast source,
// it would show in audio sharing devices group.
- if (BluetoothUtils.isAudioSharingEnabled()
+ if (BluetoothUtils.isAudioSharingUIAvailable(mContext)
&& cachedDevice.isConnectedLeAudioDevice()
&& BluetoothUtils.hasConnectedBroadcastSource(cachedDevice, mLocalBtManager)) {
isFilterMatched = true;
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingCallAudioDialogFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingCallAudioDialogFragment.java
index fa9f94d83c4..f3e3978d468 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingCallAudioDialogFragment.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingCallAudioDialogFragment.java
@@ -65,27 +65,32 @@ public class AudioSharingCallAudioDialogFragment extends InstrumentedDialogFragm
* @param listener The callback to handle the user action on this dialog.
*/
public static void show(
- @NonNull Fragment host,
+ @Nullable Fragment host,
@NonNull List deviceItems,
int checkedItemIndex,
@NonNull DialogEventListener listener) {
- if (!BluetoothUtils.isAudioSharingEnabled()) return;
- final FragmentManager manager;
- try {
- manager = host.getChildFragmentManager();
- } catch (IllegalStateException e) {
- Log.d(TAG, "Fail to show dialog: " + e.getMessage());
+ if (host == null) {
+ Log.d(TAG, "Fail to show dialog, host is null");
return;
}
- sListener = listener;
- if (manager.findFragmentByTag(TAG) == null) {
- final Bundle bundle = new Bundle();
- bundle.putParcelableList(BUNDLE_KEY_DEVICE_ITEMS, deviceItems);
- bundle.putInt(BUNDLE_KEY_CHECKED_ITEM_INDEX, checkedItemIndex);
- final AudioSharingCallAudioDialogFragment dialog =
- new AudioSharingCallAudioDialogFragment();
- dialog.setArguments(bundle);
- dialog.show(manager, TAG);
+ if (BluetoothUtils.isAudioSharingUIAvailable(host.getContext())) {
+ final FragmentManager manager;
+ try {
+ manager = host.getChildFragmentManager();
+ } catch (IllegalStateException e) {
+ Log.d(TAG, "Fail to show dialog: " + e.getMessage());
+ return;
+ }
+ sListener = listener;
+ if (manager.findFragmentByTag(TAG) == null) {
+ final Bundle bundle = new Bundle();
+ bundle.putParcelableList(BUNDLE_KEY_DEVICE_ITEMS, deviceItems);
+ bundle.putInt(BUNDLE_KEY_CHECKED_ITEM_INDEX, checkedItemIndex);
+ final AudioSharingCallAudioDialogFragment dialog =
+ new AudioSharingCallAudioDialogFragment();
+ dialog.setArguments(bundle);
+ dialog.show(manager, TAG);
+ }
}
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingCompatibilityPreferenceController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingCompatibilityPreferenceController.java
index 52df1d33a0d..6ce111baee3 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingCompatibilityPreferenceController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingCompatibilityPreferenceController.java
@@ -155,7 +155,8 @@ public class AudioSharingCompatibilityPreferenceController extends TogglePrefere
@Override
public int getAvailabilityStatus() {
- return BluetoothUtils.isAudioSharingEnabled() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ return BluetoothUtils.isAudioSharingUIAvailable(mContext) ? AVAILABLE
+ : UNSUPPORTED_ON_DEVICE;
}
@Override
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingConfirmDialogFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingConfirmDialogFragment.java
index 9b60df43029..47dd10f60a4 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingConfirmDialogFragment.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingConfirmDialogFragment.java
@@ -44,23 +44,28 @@ public class AudioSharingConfirmDialogFragment extends InstrumentedDialogFragmen
*
* @param host The Fragment this dialog will be hosted.
*/
- public static void show(Fragment host) {
- if (!BluetoothUtils.isAudioSharingEnabled()) return;
- final FragmentManager manager;
- try {
- manager = host.getChildFragmentManager();
- } catch (IllegalStateException e) {
- Log.d(TAG, "Fail to show dialog: " + e.getMessage());
+ public static void show(@Nullable Fragment host) {
+ if (host == null) {
+ Log.d(TAG, "Fail to show dialog, host is null");
return;
}
- AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
- if (dialog != null) {
- Log.d(TAG, "Dialog is showing, return.");
- return;
+ if (BluetoothUtils.isAudioSharingUIAvailable(host.getContext())) {
+ final FragmentManager manager;
+ try {
+ manager = host.getChildFragmentManager();
+ } catch (IllegalStateException e) {
+ Log.d(TAG, "Fail to show dialog: " + e.getMessage());
+ return;
+ }
+ AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
+ if (dialog != null) {
+ Log.d(TAG, "Dialog is showing, return.");
+ return;
+ }
+ Log.d(TAG, "Show up the confirm dialog.");
+ AudioSharingConfirmDialogFragment dialogFrag = new AudioSharingConfirmDialogFragment();
+ dialogFrag.show(manager, TAG);
}
- Log.d(TAG, "Show up the confirm dialog.");
- AudioSharingConfirmDialogFragment dialogFrag = new AudioSharingConfirmDialogFragment();
- dialogFrag.show(manager, TAG);
}
@Override
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDashboardFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDashboardFragment.java
index 786e1dccc05..ce0a4658ff7 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDashboardFragment.java
@@ -45,6 +45,7 @@ public class AudioSharingDashboardFragment extends DashboardFragment
public static final int SHARE_THEN_PAIR_REQUEST_CODE = 1002;
SettingsMainSwitchBar mMainSwitchBar;
+ private Context mContext;
private AudioSharingDeviceVolumeGroupController mAudioSharingDeviceVolumeGroupController;
private AudioSharingCallAudioPreferenceController mAudioSharingCallAudioPreferenceController;
private AudioSharingPlaySoundPreferenceController mAudioSharingPlaySoundPreferenceController;
@@ -78,6 +79,7 @@ public class AudioSharingDashboardFragment extends DashboardFragment
@Override
public void onAttach(Context context) {
super.onAttach(context);
+ mContext = context;
mAudioSharingDeviceVolumeGroupController =
use(AudioSharingDeviceVolumeGroupController.class);
mAudioSharingDeviceVolumeGroupController.init(this);
@@ -107,23 +109,25 @@ public class AudioSharingDashboardFragment extends DashboardFragment
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
- if (!BluetoothUtils.isAudioSharingEnabled()) return;
- // In share then pair flow, after users be routed to pair new device page and successfully
- // pair and connect an LEA headset, the pair fragment will be finished with RESULT_OK
- // and EXTRA_BT_DEVICE_TO_AUTO_ADD_SOURCE, pass the BT device to switch bar controller,
- // which is responsible for adding source to the device with loading indicator.
- if (requestCode == SHARE_THEN_PAIR_REQUEST_CODE) {
- if (resultCode == Activity.RESULT_OK) {
- BluetoothDevice btDevice =
- data != null
- ? data.getParcelableExtra(EXTRA_BT_DEVICE_TO_AUTO_ADD_SOURCE,
- BluetoothDevice.class)
- : null;
- Log.d(TAG, "onActivityResult: RESULT_OK with device = " + btDevice);
- if (btDevice != null) {
- var unused = ThreadUtils.postOnBackgroundThread(
- () -> mAudioSharingSwitchBarController.handleAutoAddSourceAfterPair(
- btDevice));
+ if (BluetoothUtils.isAudioSharingUIAvailable(mContext)) {
+ // In share then pair flow, after users be routed to pair new device page and
+ // successfully pair and connect an LEA headset, the pair fragment will be finished with
+ // RESULT_OK and EXTRA_BT_DEVICE_TO_AUTO_ADD_SOURCE, pass the BT device to switch bar
+ // controller, which is responsible for adding source to the device with loading
+ // indicator.
+ if (requestCode == SHARE_THEN_PAIR_REQUEST_CODE) {
+ if (resultCode == Activity.RESULT_OK) {
+ BluetoothDevice btDevice =
+ data != null
+ ? data.getParcelableExtra(EXTRA_BT_DEVICE_TO_AUTO_ADD_SOURCE,
+ BluetoothDevice.class)
+ : null;
+ Log.d(TAG, "onActivityResult: RESULT_OK with device = " + btDevice);
+ if (btDevice != null) {
+ var unused = ThreadUtils.postOnBackgroundThread(
+ () -> mAudioSharingSwitchBarController.handleAutoAddSourceAfterPair(
+ btDevice));
+ }
}
}
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java
index 47623e4f197..6069d6fac0b 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java
@@ -308,7 +308,8 @@ public class AudioSharingDevicePreferenceController extends BasePreferenceContro
@Override
public int getAvailabilityStatus() {
- return BluetoothUtils.isAudioSharingEnabled() && mBluetoothDeviceUpdater != null
+ return (BluetoothUtils.isAudioSharingUIAvailable(mContext)
+ && mBluetoothDeviceUpdater != null)
? AVAILABLE_UNSEARCHABLE
: UNSUPPORTED_ON_DEVICE;
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogFragment.java
index 54a758c82d3..1bf54926d3c 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogFragment.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogFragment.java
@@ -84,37 +84,42 @@ public class AudioSharingDialogFragment extends InstrumentedDialogFragment {
* @param eventData The eventData to log with for dialog onClick events.
*/
public static void show(
- @NonNull Fragment host,
+ @Nullable Fragment host,
@NonNull List deviceItems,
@NonNull DialogEventListener listener,
@NonNull Pair[] eventData) {
- if (!BluetoothUtils.isAudioSharingEnabled()) return;
- final FragmentManager manager;
- try {
- manager = host.getChildFragmentManager();
- } catch (IllegalStateException e) {
- Log.d(TAG, "Fail to show dialog: " + e.getMessage());
+ if (host == null) {
+ Log.d(TAG, "Fail to show dialog, host is null");
return;
}
- Lifecycle.State currentState = host.getLifecycle().getCurrentState();
- if (!currentState.isAtLeast(Lifecycle.State.STARTED)) {
- Log.d(TAG, "Fail to show dialog with state: " + currentState);
- return;
+ if (BluetoothUtils.isAudioSharingUIAvailable(host.getContext())) {
+ final FragmentManager manager;
+ try {
+ manager = host.getChildFragmentManager();
+ } catch (IllegalStateException e) {
+ Log.d(TAG, "Fail to show dialog: " + e.getMessage());
+ return;
+ }
+ Lifecycle.State currentState = host.getLifecycle().getCurrentState();
+ if (!currentState.isAtLeast(Lifecycle.State.STARTED)) {
+ Log.d(TAG, "Fail to show dialog with state: " + currentState);
+ return;
+ }
+ sHost = host;
+ sListener = listener;
+ sEventData = eventData;
+ AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
+ if (dialog != null) {
+ Log.d(TAG, "Dialog is showing, return.");
+ return;
+ }
+ Log.d(TAG, "Show up the dialog.");
+ final Bundle bundle = new Bundle();
+ bundle.putParcelableList(BUNDLE_KEY_DEVICE_ITEMS, deviceItems);
+ AudioSharingDialogFragment dialogFrag = new AudioSharingDialogFragment();
+ dialogFrag.setArguments(bundle);
+ dialogFrag.show(manager, TAG);
}
- sHost = host;
- sListener = listener;
- sEventData = eventData;
- AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
- if (dialog != null) {
- Log.d(TAG, "Dialog is showing, return.");
- return;
- }
- Log.d(TAG, "Show up the dialog.");
- final Bundle bundle = new Bundle();
- bundle.putParcelableList(BUNDLE_KEY_DEVICE_ITEMS, deviceItems);
- AudioSharingDialogFragment dialogFrag = new AudioSharingDialogFragment();
- dialogFrag.setArguments(bundle);
- dialogFrag.show(manager, TAG);
}
/** Return the tag of {@link AudioSharingDialogFragment} dialog. */
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDisconnectDialogFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDisconnectDialogFragment.java
index fbd2e635f82..b4ce2d1575b 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDisconnectDialogFragment.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDisconnectDialogFragment.java
@@ -80,72 +80,67 @@ public class AudioSharingDisconnectDialogFragment extends InstrumentedDialogFrag
* @param eventData The eventData to log with for dialog onClick events.
*/
public static void show(
- @NonNull Fragment host,
+ @Nullable Fragment host,
@NonNull List deviceItems,
@NonNull CachedBluetoothDevice newDevice,
@NonNull DialogEventListener listener,
@NonNull Pair[] eventData) {
- if (!BluetoothUtils.isAudioSharingEnabled()) return;
- final FragmentManager manager;
- try {
- manager = host.getChildFragmentManager();
- } catch (IllegalStateException e) {
- Log.d(TAG, "Fail to show dialog: " + e.getMessage());
+ if (host == null) {
+ Log.d(TAG, "Fail to show dialog, host is null");
return;
}
- Lifecycle.State currentState = host.getLifecycle().getCurrentState();
- if (!currentState.isAtLeast(Lifecycle.State.STARTED)) {
- Log.d(TAG, "Fail to show dialog with state: " + currentState);
- return;
- }
- AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
- if (dialog != null) {
- int newGroupId = BluetoothUtils.getGroupId(newDevice);
- if (sNewDevice != null && newGroupId == BluetoothUtils.getGroupId(sNewDevice)) {
- Log.d(
- TAG,
- String.format(
- Locale.US,
- "Dialog is showing for the same device group %d, "
- + "update the content.",
- newGroupId));
- sListener = listener;
- sNewDevice = newDevice;
- sEventData = eventData;
+ if (BluetoothUtils.isAudioSharingUIAvailable(host.getContext())) {
+ final FragmentManager manager;
+ try {
+ manager = host.getChildFragmentManager();
+ } catch (IllegalStateException e) {
+ Log.d(TAG, "Fail to show dialog: " + e.getMessage());
return;
- } else {
- Log.d(
- TAG,
- String.format(
- Locale.US,
- "Dialog is showing for new device group %d, "
- + "dismiss current dialog.",
- newGroupId));
- dialog.dismiss();
- var unused =
- ThreadUtils.postOnBackgroundThread(
- () ->
- FeatureFactory.getFeatureFactory()
- .getMetricsFeatureProvider()
- .action(
- dialog.getContext(),
- SettingsEnums
- .ACTION_AUDIO_SHARING_DIALOG_AUTO_DISMISS,
- SettingsEnums
- .DIALOG_AUDIO_SHARING_SWITCH_DEVICE));
}
+ Lifecycle.State currentState = host.getLifecycle().getCurrentState();
+ if (!currentState.isAtLeast(Lifecycle.State.STARTED)) {
+ Log.d(TAG, "Fail to show dialog with state: " + currentState);
+ return;
+ }
+ AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
+ if (dialog != null) {
+ int newGroupId = BluetoothUtils.getGroupId(newDevice);
+ if (sNewDevice != null && newGroupId == BluetoothUtils.getGroupId(sNewDevice)) {
+ Log.d(
+ TAG,
+ String.format(
+ Locale.US,
+ "Dialog is showing for the same device group %d, "
+ + "update the content.",
+ newGroupId));
+ sListener = listener;
+ sNewDevice = newDevice;
+ sEventData = eventData;
+ return;
+ } else {
+ Log.d(
+ TAG,
+ String.format(
+ Locale.US,
+ "Dialog is showing for new device group %d, "
+ + "dismiss current dialog.",
+ newGroupId));
+ dialog.dismiss();
+ logDialogAutoDismiss(dialog);
+ }
+ }
+ sListener = listener;
+ sNewDevice = newDevice;
+ sEventData = eventData;
+ Log.d(TAG, "Show up the dialog.");
+ final Bundle bundle = new Bundle();
+ bundle.putParcelableList(BUNDLE_KEY_DEVICE_TO_DISCONNECT_ITEMS, deviceItems);
+ bundle.putString(BUNDLE_KEY_NEW_DEVICE_NAME, newDevice.getName());
+ AudioSharingDisconnectDialogFragment dialogFrag =
+ new AudioSharingDisconnectDialogFragment();
+ dialogFrag.setArguments(bundle);
+ dialogFrag.show(manager, TAG);
}
- sListener = listener;
- sNewDevice = newDevice;
- sEventData = eventData;
- Log.d(TAG, "Show up the dialog.");
- final Bundle bundle = new Bundle();
- bundle.putParcelableList(BUNDLE_KEY_DEVICE_TO_DISCONNECT_ITEMS, deviceItems);
- bundle.putString(BUNDLE_KEY_NEW_DEVICE_NAME, newDevice.getName());
- AudioSharingDisconnectDialogFragment dialogFrag =
- new AudioSharingDisconnectDialogFragment();
- dialogFrag.setArguments(bundle);
- dialogFrag.show(manager, TAG);
}
/** Return the tag of {@link AudioSharingDisconnectDialogFragment} dialog. */
@@ -216,4 +211,17 @@ public class AudioSharingDisconnectDialogFragment extends InstrumentedDialogFrag
AudioSharingDeviceAdapter.ActionType.REMOVE));
return builder.build();
}
+
+ private static void logDialogAutoDismiss(AlertDialog dialog) {
+ var unused =
+ ThreadUtils.postOnBackgroundThread(
+ () -> FeatureFactory.getFeatureFactory()
+ .getMetricsFeatureProvider()
+ .action(
+ dialog.getContext(),
+ SettingsEnums
+ .ACTION_AUDIO_SHARING_DIALOG_AUTO_DISMISS,
+ SettingsEnums
+ .DIALOG_AUDIO_SHARING_SWITCH_DEVICE));
+ }
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingErrorDialogFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingErrorDialogFragment.java
index 94d4a698623..752ea0aad28 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingErrorDialogFragment.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingErrorDialogFragment.java
@@ -46,27 +46,32 @@ public class AudioSharingErrorDialogFragment extends InstrumentedDialogFragment
* @param host The Fragment this dialog will be hosted.
*/
public static void show(@Nullable Fragment host) {
- if (host == null || !BluetoothUtils.isAudioSharingEnabled()) return;
- final FragmentManager manager;
- try {
- manager = host.getChildFragmentManager();
- } catch (IllegalStateException e) {
- Log.d(TAG, "Fail to show dialog: " + e.getMessage());
+ if (host == null) {
+ Log.d(TAG, "Fail to show dialog, host is null");
return;
}
- Lifecycle.State currentState = host.getLifecycle().getCurrentState();
- if (!currentState.isAtLeast(Lifecycle.State.STARTED)) {
- Log.d(TAG, "Fail to show dialog with state: " + currentState);
- return;
+ if (BluetoothUtils.isAudioSharingUIAvailable(host.getContext())) {
+ final FragmentManager manager;
+ try {
+ manager = host.getChildFragmentManager();
+ } catch (IllegalStateException e) {
+ Log.d(TAG, "Fail to show dialog: " + e.getMessage());
+ return;
+ }
+ Lifecycle.State currentState = host.getLifecycle().getCurrentState();
+ if (!currentState.isAtLeast(Lifecycle.State.STARTED)) {
+ Log.d(TAG, "Fail to show dialog with state: " + currentState);
+ return;
+ }
+ AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
+ if (dialog != null) {
+ Log.d(TAG, "Dialog is showing, return.");
+ return;
+ }
+ Log.d(TAG, "Show up the error dialog.");
+ AudioSharingErrorDialogFragment dialogFrag = new AudioSharingErrorDialogFragment();
+ dialogFrag.show(manager, TAG);
}
- AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
- if (dialog != null) {
- Log.d(TAG, "Dialog is showing, return.");
- return;
- }
- Log.d(TAG, "Show up the error dialog.");
- AudioSharingErrorDialogFragment dialogFrag = new AudioSharingErrorDialogFragment();
- dialogFrag.show(manager, TAG);
}
@Override
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingIncompatibleDialogFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingIncompatibleDialogFragment.java
index e8ab716fe5f..2f34fa1ee4a 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingIncompatibleDialogFragment.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingIncompatibleDialogFragment.java
@@ -62,32 +62,37 @@ public class AudioSharingIncompatibleDialogFragment extends InstrumentedDialogFr
*/
public static void show(@Nullable Fragment host, @NonNull String deviceName,
@NonNull DialogEventListener listener) {
- if (host == null || !BluetoothUtils.isAudioSharingEnabled()) return;
- final FragmentManager manager;
- try {
- manager = host.getChildFragmentManager();
- } catch (IllegalStateException e) {
- Log.d(TAG, "Fail to show dialog: " + e.getMessage());
+ if (host == null) {
+ Log.d(TAG, "Fail to show dialog, host is null");
return;
}
- Lifecycle.State currentState = host.getLifecycle().getCurrentState();
- if (!currentState.isAtLeast(Lifecycle.State.STARTED)) {
- Log.d(TAG, "Fail to show dialog with state: " + currentState);
- return;
+ if (BluetoothUtils.isAudioSharingUIAvailable(host.getContext())) {
+ final FragmentManager manager;
+ try {
+ manager = host.getChildFragmentManager();
+ } catch (IllegalStateException e) {
+ Log.d(TAG, "Fail to show dialog: " + e.getMessage());
+ return;
+ }
+ Lifecycle.State currentState = host.getLifecycle().getCurrentState();
+ if (!currentState.isAtLeast(Lifecycle.State.STARTED)) {
+ Log.d(TAG, "Fail to show dialog with state: " + currentState);
+ return;
+ }
+ sListener = listener;
+ AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
+ if (dialog != null) {
+ Log.d(TAG, "Dialog is showing, return.");
+ return;
+ }
+ Log.d(TAG, "Show up the incompatible device dialog.");
+ final Bundle bundle = new Bundle();
+ bundle.putString(BUNDLE_KEY_DEVICE_NAME, deviceName);
+ AudioSharingIncompatibleDialogFragment dialogFrag =
+ new AudioSharingIncompatibleDialogFragment();
+ dialogFrag.setArguments(bundle);
+ dialogFrag.show(manager, TAG);
}
- sListener = listener;
- AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
- if (dialog != null) {
- Log.d(TAG, "Dialog is showing, return.");
- return;
- }
- Log.d(TAG, "Show up the incompatible device dialog.");
- final Bundle bundle = new Bundle();
- bundle.putString(BUNDLE_KEY_DEVICE_NAME, deviceName);
- AudioSharingIncompatibleDialogFragment dialogFrag =
- new AudioSharingIncompatibleDialogFragment();
- dialogFrag.setArguments(bundle);
- dialogFrag.show(manager, TAG);
}
@Override
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingJoinDialogFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingJoinDialogFragment.java
index a952c488156..f5f3b2cd8f2 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingJoinDialogFragment.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingJoinDialogFragment.java
@@ -77,39 +77,45 @@ public class AudioSharingJoinDialogFragment extends InstrumentedDialogFragment {
* @param eventData The eventData to log with for dialog onClick events.
*/
public static void show(
- @NonNull Fragment host,
+ @Nullable Fragment host,
@NonNull List deviceItems,
@NonNull CachedBluetoothDevice newDevice,
@NonNull DialogEventListener listener,
@NonNull Pair[] eventData) {
- if (!BluetoothUtils.isAudioSharingEnabled()) return;
- final FragmentManager manager;
- try {
- manager = host.getChildFragmentManager();
- } catch (IllegalStateException e) {
- Log.d(TAG, "Fail to show dialog: " + e.getMessage());
+ if (host == null) {
+ Log.d(TAG, "Fail to show dialog, host is null");
return;
}
- Lifecycle.State currentState = host.getLifecycle().getCurrentState();
- if (!currentState.isAtLeast(Lifecycle.State.STARTED)) {
- Log.d(TAG, "Fail to show dialog with state: " + currentState);
- return;
- }
- sListener = listener;
- sNewDevice = newDevice;
- sEventData = eventData;
- AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
- if (dialog != null) {
- Log.d(TAG, "Dialog is showing, update the content.");
- updateDialog(deviceItems, newDevice.getName(), dialog);
- } else {
- Log.d(TAG, "Show up the dialog.");
- final Bundle bundle = new Bundle();
- bundle.putParcelableList(BUNDLE_KEY_DEVICE_ITEMS, deviceItems);
- bundle.putString(BUNDLE_KEY_NEW_DEVICE_NAME, newDevice.getName());
- final AudioSharingJoinDialogFragment dialogFrag = new AudioSharingJoinDialogFragment();
- dialogFrag.setArguments(bundle);
- dialogFrag.show(manager, TAG);
+ if (BluetoothUtils.isAudioSharingUIAvailable(host.getContext())) {
+ final FragmentManager manager;
+ try {
+ manager = host.getChildFragmentManager();
+ } catch (IllegalStateException e) {
+ Log.d(TAG, "Fail to show dialog: " + e.getMessage());
+ return;
+ }
+ Lifecycle.State currentState = host.getLifecycle().getCurrentState();
+ if (!currentState.isAtLeast(Lifecycle.State.STARTED)) {
+ Log.d(TAG, "Fail to show dialog with state: " + currentState);
+ return;
+ }
+ sListener = listener;
+ sNewDevice = newDevice;
+ sEventData = eventData;
+ AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
+ if (dialog != null) {
+ Log.d(TAG, "Dialog is showing, update the content.");
+ updateDialog(deviceItems, newDevice.getName(), dialog);
+ } else {
+ Log.d(TAG, "Show up the dialog.");
+ final Bundle bundle = new Bundle();
+ bundle.putParcelableList(BUNDLE_KEY_DEVICE_ITEMS, deviceItems);
+ bundle.putString(BUNDLE_KEY_NEW_DEVICE_NAME, newDevice.getName());
+ final AudioSharingJoinDialogFragment dialogFrag =
+ new AudioSharingJoinDialogFragment();
+ dialogFrag.setArguments(bundle);
+ dialogFrag.show(manager, TAG);
+ }
}
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreferenceController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreferenceController.java
index a1a969840d2..c017ecc8779 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreferenceController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreferenceController.java
@@ -174,7 +174,8 @@ public class AudioSharingNamePreferenceController extends BasePreferenceControll
@Override
public int getAvailabilityStatus() {
- return BluetoothUtils.isAudioSharingEnabled() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ return BluetoothUtils.isAudioSharingUIAvailable(mContext) ? AVAILABLE
+ : UNSUPPORTED_ON_DEVICE;
}
@Override
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreferenceController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreferenceController.java
index 7cc8058117c..3a741e43ea3 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreferenceController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPasswordPreferenceController.java
@@ -113,7 +113,8 @@ public class AudioSharingPasswordPreferenceController extends BasePreferenceCont
@Override
public int getAvailabilityStatus() {
- return BluetoothUtils.isAudioSharingEnabled() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ return BluetoothUtils.isAudioSharingUIAvailable(mContext) ? AVAILABLE
+ : UNSUPPORTED_ON_DEVICE;
}
@Override
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPlaySoundPreferenceController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPlaySoundPreferenceController.java
index 59494db6b90..09a3036e073 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPlaySoundPreferenceController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPlaySoundPreferenceController.java
@@ -57,7 +57,7 @@ public class AudioSharingPlaySoundPreferenceController
@Override
public int getAvailabilityStatus() {
- return (mRingtone != null && BluetoothUtils.isAudioSharingEnabled())
+ return (mRingtone != null && BluetoothUtils.isAudioSharingUIAvailable(mContext))
? AVAILABLE
: UNSUPPORTED_ON_DEVICE;
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPreferenceController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPreferenceController.java
index 3c078efa597..f3effbdf617 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPreferenceController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingPreferenceController.java
@@ -135,7 +135,8 @@ public class AudioSharingPreferenceController extends BasePreferenceController
@Override
public int getAvailabilityStatus() {
- return BluetoothUtils.isAudioSharingEnabled() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ return BluetoothUtils.isAudioSharingUIAvailable(mContext) ? AVAILABLE
+ : UNSUPPORTED_ON_DEVICE;
}
@Override
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingProgressDialogFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingProgressDialogFragment.java
index 840c7bbeb45..9d112e6503f 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingProgressDialogFragment.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingProgressDialogFragment.java
@@ -65,55 +65,66 @@ public class AudioSharingProgressDialogFragment extends InstrumentedDialogFragme
* @param message The content to be shown on the dialog.
*/
public static void show(@Nullable Fragment host, @NonNull String message) {
- if (host == null || !BluetoothUtils.isAudioSharingEnabled()) return;
- final FragmentManager manager;
- try {
- manager = host.getChildFragmentManager();
- } catch (IllegalStateException e) {
- Log.d(TAG, "Fail to show dialog: " + e.getMessage());
+ if (host == null) {
+ Log.d(TAG, "Fail to show dialog, host is null");
return;
}
- Lifecycle.State currentState = host.getLifecycle().getCurrentState();
- if (!currentState.isAtLeast(Lifecycle.State.STARTED)) {
- Log.d(TAG, "Fail to show dialog with state: " + currentState);
- return;
- }
- AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
- if (dialog != null) {
- if (!sMessage.equals(message)) {
- Log.d(TAG, "Update dialog message.");
- TextView messageView = dialog.findViewById(R.id.message);
- if (messageView != null) {
- messageView.setText(message);
- }
- sMessage = message;
+ if (BluetoothUtils.isAudioSharingUIAvailable(host.getContext())) {
+ final FragmentManager manager;
+ try {
+ manager = host.getChildFragmentManager();
+ } catch (IllegalStateException e) {
+ Log.d(TAG, "Fail to show dialog: " + e.getMessage());
+ return;
}
- Log.d(TAG, "Dialog is showing, return.");
- return;
+ Lifecycle.State currentState = host.getLifecycle().getCurrentState();
+ if (!currentState.isAtLeast(Lifecycle.State.STARTED)) {
+ Log.d(TAG, "Fail to show dialog with state: " + currentState);
+ return;
+ }
+ AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
+ if (dialog != null) {
+ if (!sMessage.equals(message)) {
+ Log.d(TAG, "Update dialog message.");
+ TextView messageView = dialog.findViewById(R.id.message);
+ if (messageView != null) {
+ messageView.setText(message);
+ }
+ sMessage = message;
+ }
+ Log.d(TAG, "Dialog is showing, return.");
+ return;
+ }
+ sMessage = message;
+ Log.d(TAG, "Show up the progress dialog.");
+ Bundle args = new Bundle();
+ args.putString(BUNDLE_KEY_MESSAGE, message);
+ AudioSharingProgressDialogFragment dialogFrag =
+ new AudioSharingProgressDialogFragment();
+ dialogFrag.setArguments(args);
+ dialogFrag.show(manager, TAG);
}
- sMessage = message;
- Log.d(TAG, "Show up the progress dialog.");
- Bundle args = new Bundle();
- args.putString(BUNDLE_KEY_MESSAGE, message);
- AudioSharingProgressDialogFragment dialogFrag = new AudioSharingProgressDialogFragment();
- dialogFrag.setArguments(args);
- dialogFrag.show(manager, TAG);
}
/** Dismiss the {@link AudioSharingProgressDialogFragment} dialog. */
public static void dismiss(@Nullable Fragment host) {
- if (host == null || !BluetoothUtils.isAudioSharingEnabled()) return;
- final FragmentManager manager;
- try {
- manager = host.getChildFragmentManager();
- } catch (IllegalStateException e) {
- Log.d(TAG, "Fail to dismiss dialog: " + e.getMessage());
+ if (host == null) {
+ Log.d(TAG, "Fail to dismiss dialog, host is null");
return;
}
- AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
- if (dialog != null) {
- Log.d(TAG, "Dialog is showing, dismiss.");
- dialog.dismiss();
+ if (BluetoothUtils.isAudioSharingUIAvailable(host.getContext())) {
+ final FragmentManager manager;
+ try {
+ manager = host.getChildFragmentManager();
+ } catch (IllegalStateException e) {
+ Log.d(TAG, "Fail to dismiss dialog: " + e.getMessage());
+ return;
+ }
+ AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
+ if (dialog != null) {
+ Log.d(TAG, "Dialog is showing, dismiss.");
+ dialog.dismiss();
+ }
}
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiver.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiver.java
index 013b4d402da..740fb359afc 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiver.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiver.java
@@ -62,7 +62,7 @@ public class AudioSharingReceiver extends BroadcastReceiver {
intent.getIntExtra(
LocalBluetoothLeBroadcast.EXTRA_LE_AUDIO_SHARING_STATE, -1);
if (state == LocalBluetoothLeBroadcast.BROADCAST_STATE_ON) {
- if (!BluetoothUtils.isAudioSharingEnabled()) {
+ if (!BluetoothUtils.isAudioSharingUIAvailable(context)) {
Log.w(TAG, "Skip showSharingNotification, feature disabled.");
return;
}
@@ -85,7 +85,7 @@ public class AudioSharingReceiver extends BroadcastReceiver {
}
break;
case ACTION_LE_AUDIO_SHARING_STOP:
- if (BluetoothUtils.isAudioSharingEnabled()) {
+ if (BluetoothUtils.isAudioSharingUIAvailable(context)) {
LocalBluetoothManager manager = Utils.getLocalBtManager(context);
if (BluetoothUtils.isBroadcasting(manager)) {
AudioSharingUtils.stopBroadcasting(manager);
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragment.java
index 2bd79c942bb..047f2fcf8d3 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragment.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragment.java
@@ -77,70 +77,66 @@ public class AudioSharingStopDialogFragment extends InstrumentedDialogFragment {
* @param eventData The eventData to log with for dialog onClick events.
*/
public static void show(
- @NonNull Fragment host,
+ @Nullable Fragment host,
@NonNull List deviceItems,
@NonNull CachedBluetoothDevice newDevice,
@NonNull DialogEventListener listener,
@NonNull Pair[] eventData) {
- if (!BluetoothUtils.isAudioSharingEnabled()) return;
- final FragmentManager manager;
- try {
- manager = host.getChildFragmentManager();
- } catch (IllegalStateException e) {
- Log.d(TAG, "Fail to show dialog: " + e.getMessage());
+ if (host == null) {
+ Log.d(TAG, "Fail to show dialog, host is null");
return;
}
- Lifecycle.State currentState = host.getLifecycle().getCurrentState();
- if (!currentState.isAtLeast(Lifecycle.State.STARTED)) {
- Log.d(TAG, "Fail to show dialog with state: " + currentState);
- return;
- }
- AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
- if (dialog != null) {
- int newGroupId = BluetoothUtils.getGroupId(newDevice);
- if (sCachedDevice != null
- && newGroupId == BluetoothUtils.getGroupId(sCachedDevice)) {
- Log.d(
- TAG,
- String.format(
- Locale.US,
- "Dialog is showing for the same device group %d, return.",
- newGroupId));
- sListener = listener;
- sCachedDevice = newDevice;
- sEventData = eventData;
+ if (BluetoothUtils.isAudioSharingUIAvailable(host.getContext())) {
+ final FragmentManager manager;
+ try {
+ manager = host.getChildFragmentManager();
+ } catch (IllegalStateException e) {
+ Log.d(TAG, "Fail to show dialog: " + e.getMessage());
return;
- } else {
- Log.d(
- TAG,
- String.format(
- Locale.US,
- "Dialog is showing for new device group %d, "
- + "dismiss current dialog.",
- newGroupId));
- dialog.dismiss();
- var unused =
- ThreadUtils.postOnBackgroundThread(
- () ->
- FeatureFactory.getFeatureFactory()
- .getMetricsFeatureProvider()
- .action(
- dialog.getContext(),
- SettingsEnums
- .ACTION_AUDIO_SHARING_DIALOG_AUTO_DISMISS,
- SettingsEnums.DIALOG_STOP_AUDIO_SHARING));
}
+ Lifecycle.State currentState = host.getLifecycle().getCurrentState();
+ if (!currentState.isAtLeast(Lifecycle.State.STARTED)) {
+ Log.d(TAG, "Fail to show dialog with state: " + currentState);
+ return;
+ }
+ AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG);
+ if (dialog != null) {
+ int newGroupId = BluetoothUtils.getGroupId(newDevice);
+ if (sCachedDevice != null
+ && newGroupId == BluetoothUtils.getGroupId(sCachedDevice)) {
+ Log.d(
+ TAG,
+ String.format(
+ Locale.US,
+ "Dialog is showing for the same device group %d, return.",
+ newGroupId));
+ sListener = listener;
+ sCachedDevice = newDevice;
+ sEventData = eventData;
+ return;
+ } else {
+ Log.d(
+ TAG,
+ String.format(
+ Locale.US,
+ "Dialog is showing for new device group %d, "
+ + "dismiss current dialog.",
+ newGroupId));
+ dialog.dismiss();
+ logDialogAutoDismiss(dialog);
+ }
+ }
+ sListener = listener;
+ sCachedDevice = newDevice;
+ sEventData = eventData;
+ Log.d(TAG, "Show up the dialog.");
+ final Bundle bundle = new Bundle();
+ bundle.putParcelableList(BUNDLE_KEY_DEVICE_TO_DISCONNECT_ITEMS, deviceItems);
+ bundle.putString(BUNDLE_KEY_NEW_DEVICE_NAME, newDevice.getName());
+ AudioSharingStopDialogFragment dialogFrag = new AudioSharingStopDialogFragment();
+ dialogFrag.setArguments(bundle);
+ dialogFrag.show(manager, TAG);
}
- sListener = listener;
- sCachedDevice = newDevice;
- sEventData = eventData;
- Log.d(TAG, "Show up the dialog.");
- final Bundle bundle = new Bundle();
- bundle.putParcelableList(BUNDLE_KEY_DEVICE_TO_DISCONNECT_ITEMS, deviceItems);
- bundle.putString(BUNDLE_KEY_NEW_DEVICE_NAME, newDevice.getName());
- AudioSharingStopDialogFragment dialogFrag = new AudioSharingStopDialogFragment();
- dialogFrag.setArguments(bundle);
- dialogFrag.show(manager, TAG);
}
/** Return the tag of {@link AudioSharingStopDialogFragment} dialog. */
@@ -221,4 +217,16 @@ public class AudioSharingStopDialogFragment extends InstrumentedDialogFragment {
AudioSharingDialogHelper.updateMessageStyle(dialog);
return dialog;
}
+
+ private static void logDialogAutoDismiss(AlertDialog dialog) {
+ var unused =
+ ThreadUtils.postOnBackgroundThread(
+ () -> FeatureFactory.getFeatureFactory()
+ .getMetricsFeatureProvider()
+ .action(
+ dialog.getContext(),
+ SettingsEnums
+ .ACTION_AUDIO_SHARING_DIALOG_AUTO_DISMISS,
+ SettingsEnums.DIALOG_STOP_AUDIO_SHARING));
+ }
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java
index 14da750d736..537eee09af0 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java
@@ -426,9 +426,7 @@ public class AudioSharingSwitchBarController extends BasePreferenceController
() -> {
mSwitchBar.setEnabled(true);
mSwitchBar.setChecked(false);
- if (mFragment != null) {
- AudioSharingConfirmDialogFragment.show(mFragment);
- }
+ AudioSharingConfirmDialogFragment.show(mFragment);
});
return;
}
@@ -447,7 +445,8 @@ public class AudioSharingSwitchBarController extends BasePreferenceController
@Override
public int getAvailabilityStatus() {
- return BluetoothUtils.isAudioSharingEnabled() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ return BluetoothUtils.isAudioSharingUIAvailable(mContext) ? AVAILABLE
+ : UNSUPPORTED_ON_DEVICE;
}
@Override
@@ -733,13 +732,8 @@ public class AudioSharingSwitchBarController extends BasePreferenceController
};
AudioSharingUtils.postOnMainThread(
mContext,
- () -> {
- // Check nullability to pass NullAway check
- if (mFragment != null) {
- AudioSharingDialogFragment.show(
- mFragment, mDeviceItemsForSharing, listener, eventData);
- }
- });
+ () -> AudioSharingDialogFragment.show(
+ mFragment, mDeviceItemsForSharing, listener, eventData));
}
private void showErrorDialog() {
diff --git a/src/com/android/settings/connecteddevice/audiosharing/StreamSettingsCategoryController.java b/src/com/android/settings/connecteddevice/audiosharing/StreamSettingsCategoryController.java
index 40f86d0d81b..0ee71cb0a5e 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/StreamSettingsCategoryController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/StreamSettingsCategoryController.java
@@ -91,7 +91,8 @@ public class StreamSettingsCategoryController extends BasePreferenceController
@Override
public int getAvailabilityStatus() {
- return BluetoothUtils.isAudioSharingEnabled() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ return BluetoothUtils.isAudioSharingUIAvailable(mContext) ? AVAILABLE
+ : UNSUPPORTED_ON_DEVICE;
}
@Override
diff --git a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamConfirmDialog.java b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamConfirmDialog.java
index 958740b5afe..df9c26eec01 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamConfirmDialog.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamConfirmDialog.java
@@ -214,15 +214,16 @@ public class AudioStreamConfirmDialog extends InstrumentedDialogFragment {
}
private int getDialogId(boolean hasMetadata, boolean hasConnectedDevice) {
- if (!BluetoothUtils.isAudioSharingEnabled()) {
+ if (BluetoothUtils.isAudioSharingUIAvailable(mContext)) {
+ if (!hasConnectedDevice) {
+ return SettingsEnums.DIALOG_AUDIO_STREAM_CONFIRM_NO_LE_DEVICE;
+ }
+ return hasMetadata
+ ? SettingsEnums.DIALOG_AUDIO_STREAM_CONFIRM_LISTEN
+ : SettingsEnums.DIALOG_AUDIO_STREAM_CONFIRM_DATA_ERROR;
+ } else {
return SettingsEnums.DIALOG_AUDIO_STREAM_CONFIRM_FEATURE_UNSUPPORTED;
}
- if (!hasConnectedDevice) {
- return SettingsEnums.DIALOG_AUDIO_STREAM_CONFIRM_NO_LE_DEVICE;
- }
- return hasMetadata
- ? SettingsEnums.DIALOG_AUDIO_STREAM_CONFIRM_LISTEN
- : SettingsEnums.DIALOG_AUDIO_STREAM_CONFIRM_DATA_ERROR;
}
@Nullable
diff --git a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamConfirmDialogActivity.java b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamConfirmDialogActivity.java
index 3437524d995..902501a60e8 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamConfirmDialogActivity.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamConfirmDialogActivity.java
@@ -50,7 +50,7 @@ public class AudioStreamConfirmDialogActivity extends SettingsActivity
@Override
protected void createUiFromIntent(@Nullable Bundle savedState, Intent intent) {
- if (BluetoothUtils.isAudioSharingEnabled()
+ if (BluetoothUtils.isAudioSharingUIAvailable(this)
&& !AudioSharingUtils.isAudioSharingProfileReady(mProfileManager)) {
Log.d(TAG, "createUiFromIntent() : supported but not ready, skip createUiFromIntent");
mSavedState = savedState;
@@ -67,7 +67,7 @@ public class AudioStreamConfirmDialogActivity extends SettingsActivity
@Override
public void onStart() {
- if (BluetoothUtils.isAudioSharingEnabled()
+ if (BluetoothUtils.isAudioSharingUIAvailable(this)
&& !AudioSharingUtils.isAudioSharingProfileReady(mProfileManager)) {
Log.d(TAG, "onStart() : supported but not ready, listen to service ready");
if (mProfileManager != null) {
@@ -87,7 +87,7 @@ public class AudioStreamConfirmDialogActivity extends SettingsActivity
@Override
public void onServiceConnected() {
- if (BluetoothUtils.isAudioSharingEnabled()
+ if (BluetoothUtils.isAudioSharingUIAvailable(this)
&& AudioSharingUtils.isAudioSharingProfileReady(mProfileManager)) {
if (mProfileManager != null) {
mProfileManager.removeServiceListener(this);
diff --git a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamMediaService.java b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamMediaService.java
index d1af8d9d8b7..5d26352674f 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamMediaService.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamMediaService.java
@@ -122,7 +122,7 @@ public class AudioStreamMediaService extends Service {
@Override
public void onCreate() {
- if (!BluetoothUtils.isAudioSharingEnabled()) {
+ if (!BluetoothUtils.isAudioSharingUIAvailable(this)) {
return;
}
Log.d(TAG, "onCreate()");
@@ -181,32 +181,32 @@ public class AudioStreamMediaService extends Service {
public void onDestroy() {
Log.d(TAG, "onDestroy()");
super.onDestroy();
- if (!BluetoothUtils.isAudioSharingEnabled()) {
- return;
- }
- if (mDevices != null) {
- mDevices.clear();
- mDevices = null;
- }
- synchronized (mLocalSessionLock) {
- if (mLocalSession != null) {
- mLocalSession.release();
- mLocalSession = null;
+ if (BluetoothUtils.isAudioSharingUIAvailable(this)) {
+ if (mDevices != null) {
+ mDevices.clear();
+ mDevices = null;
}
+ synchronized (mLocalSessionLock) {
+ if (mLocalSession != null) {
+ mLocalSession.release();
+ mLocalSession = null;
+ }
+ }
+ mExecutor.execute(
+ () -> {
+ if (mLocalBtManager != null) {
+ mLocalBtManager.getEventManager().unregisterCallback(
+ mBluetoothCallback);
+ }
+ if (mLeBroadcastAssistant != null && mBroadcastAssistantCallback != null) {
+ mLeBroadcastAssistant.unregisterServiceCallBack(
+ mBroadcastAssistantCallback);
+ }
+ if (mVolumeControl != null && mVolumeControlCallback != null) {
+ mVolumeControl.unregisterCallback(mVolumeControlCallback);
+ }
+ });
}
- mExecutor.execute(
- () -> {
- if (mLocalBtManager != null) {
- mLocalBtManager.getEventManager().unregisterCallback(mBluetoothCallback);
- }
- if (mLeBroadcastAssistant != null && mBroadcastAssistantCallback != null) {
- mLeBroadcastAssistant.unregisterServiceCallBack(
- mBroadcastAssistantCallback);
- }
- if (mVolumeControl != null && mVolumeControlCallback != null) {
- mVolumeControl.unregisterCallback(mVolumeControlCallback);
- }
- });
}
@Override
diff --git a/src/com/android/settings/network/MobileNetworkListScreen.kt b/src/com/android/settings/network/MobileNetworkListScreen.kt
index 93d8ee671d1..51c068bfbb3 100644
--- a/src/com/android/settings/network/MobileNetworkListScreen.kt
+++ b/src/com/android/settings/network/MobileNetworkListScreen.kt
@@ -16,6 +16,8 @@
package com.android.settings.network
import android.content.Context
+import android.os.UserManager
+import com.android.settings.PreferenceRestrictionMixin
import com.android.settings.R
import com.android.settings.flags.Flags
import com.android.settingslib.metadata.ProvidePreferenceScreen
@@ -23,7 +25,7 @@ import com.android.settingslib.metadata.preferenceHierarchy
import com.android.settingslib.preference.PreferenceScreenCreator
@ProvidePreferenceScreen
-class MobileNetworkListScreen : PreferenceScreenCreator {
+class MobileNetworkListScreen : PreferenceScreenCreator, PreferenceRestrictionMixin {
override val key: String
get() = KEY
@@ -36,6 +38,11 @@ class MobileNetworkListScreen : PreferenceScreenCreator {
override val keywords: Int
get() = R.string.keywords_more_mobile_networks
+ override fun isEnabled(context: Context) = super.isEnabled(context)
+
+ override val restrictionKey: String
+ get() = UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS
+
override fun isFlagEnabled(context: Context) = Flags.catalystMobileNetworkList()
override fun hasCompleteHierarchy() = false
diff --git a/src/com/android/settings/network/NetworkProviderScreen.kt b/src/com/android/settings/network/NetworkProviderScreen.kt
index fa3ed788b2a..77ecf3aaa85 100644
--- a/src/com/android/settings/network/NetworkProviderScreen.kt
+++ b/src/com/android/settings/network/NetworkProviderScreen.kt
@@ -16,6 +16,8 @@
package com.android.settings.network
import android.content.Context
+import android.os.UserManager
+import com.android.settings.PreferenceRestrictionMixin
import com.android.settings.R
import com.android.settings.flags.Flags
import com.android.settingslib.metadata.PreferenceAvailabilityProvider
@@ -24,7 +26,8 @@ import com.android.settingslib.metadata.preferenceHierarchy
import com.android.settingslib.preference.PreferenceScreenCreator
@ProvidePreferenceScreen
-class NetworkProviderScreen : PreferenceScreenCreator, PreferenceAvailabilityProvider {
+class NetworkProviderScreen :
+ PreferenceScreenCreator, PreferenceAvailabilityProvider, PreferenceRestrictionMixin {
override val key: String
get() = KEY
@@ -40,6 +43,11 @@ class NetworkProviderScreen : PreferenceScreenCreator, PreferenceAvailabilityPro
override fun isAvailable(context: Context) =
context.resources.getBoolean(R.bool.config_show_internet_settings)
+ override fun isEnabled(context: Context) = super.isEnabled(context)
+
+ override val restrictionKey: String
+ get() = UserManager.DISALLOW_CONFIG_WIFI
+
override fun isFlagEnabled(context: Context) = Flags.catalystInternetSettings()
override fun hasCompleteHierarchy() = false
diff --git a/src/com/android/settings/network/tether/TetherScreen.kt b/src/com/android/settings/network/tether/TetherScreen.kt
index 20dc4b704fc..542fd5f743c 100644
--- a/src/com/android/settings/network/tether/TetherScreen.kt
+++ b/src/com/android/settings/network/tether/TetherScreen.kt
@@ -17,6 +17,8 @@ package com.android.settings.network.tether
import android.content.Context
import android.net.TetheringManager
+import android.os.UserManager
+import com.android.settings.PreferenceRestrictionMixin
import com.android.settings.R
import com.android.settings.flags.Flags
import com.android.settings.network.TetherPreferenceController
@@ -28,7 +30,8 @@ import com.android.settingslib.metadata.preferenceHierarchy
import com.android.settingslib.preference.PreferenceScreenCreator
@ProvidePreferenceScreen
-class TetherScreen : PreferenceScreenCreator, PreferenceAvailabilityProvider {
+class TetherScreen :
+ PreferenceScreenCreator, PreferenceAvailabilityProvider, PreferenceRestrictionMixin {
override val key: String
get() = KEY
@@ -49,6 +52,11 @@ class TetherScreen : PreferenceScreenCreator, PreferenceAvailabilityProvider {
override fun isAvailable(context: Context) = TetherUtil.isTetherAvailable(context)
+ override fun isEnabled(context: Context) = super.isEnabled(context)
+
+ override val restrictionKey: String
+ get() = UserManager.DISALLOW_CONFIG_TETHERING
+
override fun isFlagEnabled(context: Context) = Flags.catalystTetherSettings()
override fun hasCompleteHierarchy() = false
diff --git a/tests/robotests/src/com/android/settings/accessibility/CaptioningCustomControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/CaptioningCustomControllerTest.java
index 838d9e04b7b..e0e5d4981b6 100644
--- a/tests/robotests/src/com/android/settings/accessibility/CaptioningCustomControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/CaptioningCustomControllerTest.java
@@ -23,6 +23,9 @@ import static org.mockito.Mockito.when;
import android.content.ContentResolver;
import android.content.Context;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.view.accessibility.CaptioningManager.CaptionStyle;
@@ -49,6 +52,8 @@ public class CaptioningCustomControllerTest {
@Rule
public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@Mock
private PreferenceScreen mScreen;
@Mock
@@ -57,22 +62,43 @@ public class CaptioningCustomControllerTest {
private ContentResolver mContentResolver;
private CaptioningCustomController mController;
private Preference mPreference;
+ private CaptionHelper mCaptionHelper;
@Before
public void setUp() {
mContentResolver = mContext.getContentResolver();
- mController = new CaptioningCustomController(mContext, PREF_KEY,
+ mCaptionHelper = new CaptionHelper(mContext);
+ mController = new CaptioningCustomController(mContext, PREF_KEY, mCaptionHelper,
mAccessibilitySettingsContentObserver);
mPreference = new Preference(mContext);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
}
@Test
+ @DisableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
public void getAvailabilityStatus_shouldReturnAvailable() {
assertThat(mController.getAvailabilityStatus())
.isEqualTo(BasePreferenceController.AVAILABLE);
}
+ @Test
+ @EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+ public void getAvailabilityStatus_customCaption_shouldReturnAvailable() {
+ mCaptionHelper.setRawUserStyle(CaptionStyle.PRESET_CUSTOM);
+
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.AVAILABLE);
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+ public void getAvailabilityStatus_notCustom_shouldReturnUnsearchable() {
+ mCaptionHelper.setRawUserStyle(0);
+
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.AVAILABLE_UNSEARCHABLE);
+ }
+
@Test
public void displayPreference_byDefault_shouldIsInvisible() {
diff --git a/tests/robotests/src/com/android/settings/accessibility/CaptioningWindowColorControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/CaptioningWindowColorControllerTest.java
index 12582145c20..e39c57e8837 100644
--- a/tests/robotests/src/com/android/settings/accessibility/CaptioningWindowColorControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/CaptioningWindowColorControllerTest.java
@@ -24,6 +24,9 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import android.content.Context;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.util.AttributeSet;
import android.view.accessibility.CaptioningManager;
@@ -53,16 +56,21 @@ public class CaptioningWindowColorControllerTest {
@Rule
public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@Mock
private PreferenceScreen mScreen;
private final Context mContext = ApplicationProvider.getApplicationContext();
private CaptioningWindowColorController mController;
private ColorPreference mPreference;
private ShadowCaptioningManager mShadowCaptioningManager;
+ private CaptionHelper mCaptionHelper;
@Before
public void setUp() {
- mController = new CaptioningWindowColorController(mContext, "captioning_window_color");
+ mCaptionHelper = new CaptionHelper(mContext);
+ mController = new CaptioningWindowColorController(
+ mContext, "captioning_window_color", mCaptionHelper);
final AttributeSet attributeSet = Robolectric.buildAttributeSet().build();
mPreference = new ColorPreference(mContext, attributeSet);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
@@ -71,11 +79,30 @@ public class CaptioningWindowColorControllerTest {
}
@Test
+ @DisableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
public void getAvailabilityStatus_shouldReturnAvailable() {
assertThat(mController.getAvailabilityStatus())
.isEqualTo(BasePreferenceController.AVAILABLE);
}
+ @Test
+ @EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+ public void getAvailabilityStatus_customCaption_shouldReturnAvailable() {
+ mCaptionHelper.setRawUserStyle(CaptionStyle.PRESET_CUSTOM);
+
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.AVAILABLE);
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+ public void getAvailabilityStatus_noCustom_shouldReturnUnsearchable() {
+ mCaptionHelper.setRawUserStyle(0);
+
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.AVAILABLE_UNSEARCHABLE);
+ }
+
@Test
public void getSummary_defaultValue_shouldReturnNone() {
mController.displayPreference(mScreen);
diff --git a/tests/robotests/src/com/android/settings/accessibility/CaptioningWindowOpacityControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/CaptioningWindowOpacityControllerTest.java
index 0e872a09d09..2b41eb053d9 100644
--- a/tests/robotests/src/com/android/settings/accessibility/CaptioningWindowOpacityControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/CaptioningWindowOpacityControllerTest.java
@@ -24,6 +24,9 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import android.content.Context;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.util.AttributeSet;
import android.view.accessibility.CaptioningManager;
@@ -48,19 +51,24 @@ import org.robolectric.shadows.ShadowCaptioningManager;
/** Tests for {@link CaptioningWindowOpacityController}. */
@RunWith(RobolectricTestRunner.class)
public class CaptioningWindowOpacityControllerTest {
-
@Rule
public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
@Mock
private PreferenceScreen mScreen;
private final Context mContext = ApplicationProvider.getApplicationContext();
private CaptioningWindowOpacityController mController;
private ColorPreference mPreference;
private ShadowCaptioningManager mShadowCaptioningManager;
+ private CaptionHelper mCaptionHelper;
@Before
public void setUp() {
- mController = new CaptioningWindowOpacityController(mContext, "captioning_window_opacity");
+ mCaptionHelper = new CaptionHelper(mContext);
+ mController = new CaptioningWindowOpacityController(
+ mContext, "captioning_window_opacity", mCaptionHelper);
final AttributeSet attributeSet = Robolectric.buildAttributeSet().build();
mPreference = new ColorPreference(mContext, attributeSet);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
@@ -69,11 +77,30 @@ public class CaptioningWindowOpacityControllerTest {
}
@Test
+ @DisableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
public void getAvailabilityStatus_shouldReturnAvailable() {
assertThat(mController.getAvailabilityStatus())
.isEqualTo(BasePreferenceController.AVAILABLE);
}
+ @Test
+ @EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+ public void getAvailabilityStatus_customCaption_shouldReturnAvailable() {
+ mCaptionHelper.setRawUserStyle(CaptioningManager.CaptionStyle.PRESET_CUSTOM);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(
+ BasePreferenceController.AVAILABLE);
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
+ public void getAvailabilityStatus_notCustom_shouldReturnUnsearchable() {
+ mCaptionHelper.setRawUserStyle(0);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(
+ BasePreferenceController.AVAILABLE_UNSEARCHABLE);
+ }
+
@Test
public void getSummary_defaultValue_shouldReturnNonTransparent() {
mController.displayPreference(mScreen);
diff --git a/tests/robotests/src/com/android/settings/accounts/AccountTypePreferenceLoaderTest.java b/tests/robotests/src/com/android/settings/accounts/AccountTypePreferenceLoaderTest.java
index efa5fea7416..0b9c6c357a4 100644
--- a/tests/robotests/src/com/android/settings/accounts/AccountTypePreferenceLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/AccountTypePreferenceLoaderTest.java
@@ -30,8 +30,11 @@ import static org.mockito.Mockito.when;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AuthenticatorDescription;
+import android.content.ClipData;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.PackageManager;
+import android.net.Uri;
import android.os.UserHandle;
import androidx.collection.ArraySet;
@@ -250,4 +253,13 @@ public class AccountTypePreferenceLoaderTest {
mPrefLoader.filterBlockedFragments(parent, Set.of("nomatch", "other"));
verify(pref).setOnPreferenceClickListener(any());
}
+
+ @Test
+ public void isSafeIntent_hasContextScheme_returnFalse() {
+ Intent intent = new Intent();
+ intent.setClipData(ClipData.newRawUri(null,
+ Uri.parse("content://com.android.settings.files/my_cache/NOTICE.html")));
+
+ assertThat(mPrefLoader.isSafeIntent(mPackageManager, intent, mAccount.type)).isFalse();
+ }
}