diff --git a/src/com/android/settings/accessibility/AccessibilityDialogUtils.java b/src/com/android/settings/accessibility/AccessibilityDialogUtils.java
index b353805bdba..f06138f6ec2 100644
--- a/src/com/android/settings/accessibility/AccessibilityDialogUtils.java
+++ b/src/com/android/settings/accessibility/AccessibilityDialogUtils.java
@@ -180,6 +180,23 @@ public class AccessibilityDialogUtils {
return alertDialog;
}
+ /**
+ * Updates the software shortcut in edit shortcut dialog.
+ *
+ * @param context A valid context
+ * @param editShortcutDialog Need to be a type of edit shortcut dialog
+ * @return True if the update is successful
+ */
+ public static boolean updateSoftwareShortcutInDialog(Context context,
+ Dialog editShortcutDialog) {
+ final View container = editShortcutDialog.findViewById(R.id.container_layout);
+ if (container != null) {
+ initSoftwareShortcut(context, container);
+ return true;
+ }
+ return false;
+ }
+
private static AlertDialog createDialog(Context context, int dialogType,
CharSequence dialogTitle, DialogInterface.OnClickListener listener) {
diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
index 4f45b03b5a8..c25abf3486d 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -79,6 +79,7 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
protected Preference mSettingsPreference;
protected AccessibilityFooterPreferenceController mFooterPreferenceController;
protected String mPreferenceKey;
+ protected Dialog mDialog;
protected CharSequence mSettingsTitle;
protected Intent mSettingsIntent;
@@ -106,6 +107,7 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
public static final int NOT_SET = -1;
// Save user's shortcutType value when savedInstance has value (e.g. device rotated).
protected int mSavedCheckBoxValue = NOT_SET;
+ private boolean mSavedAccessibilityFloatingMenuEnabled;
// For html description of accessibility service, must follow the rule, such as
//
, a11y settings will get the resources successfully.
@@ -127,7 +129,6 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
// Restore the user shortcut type.
if (savedInstanceState != null && savedInstanceState.containsKey(
KEY_SAVED_USER_SHORTCUT_TYPE)) {
@@ -200,6 +201,8 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
mSettingsContentObserver.register(getContentResolver());
updateShortcutPreferenceData();
updateShortcutPreference();
+
+ updateEditShortcutDialogIfNeeded();
}
@Override
@@ -208,6 +211,8 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
AccessibilityManager.class);
am.removeTouchExplorationStateChangeListener(mTouchExplorationStateChangeListener);
mSettingsContentObserver.unregister(getContentResolver());
+ mSavedAccessibilityFloatingMenuEnabled = AccessibilityUtil.isFloatingMenuEnabled(
+ getContext());
super.onPause();
}
@@ -222,24 +227,23 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
@Override
public Dialog onCreateDialog(int dialogId) {
- Dialog dialog;
switch (dialogId) {
case DialogEnums.EDIT_SHORTCUT:
final CharSequence dialogTitle = getPrefContext().getString(
R.string.accessibility_shortcut_title, mPackageName);
final int dialogType = WizardManagerHelper.isAnySetupWizard(getIntent())
? DialogType.EDIT_SHORTCUT_GENERIC_SUW : DialogType.EDIT_SHORTCUT_GENERIC;
- dialog = AccessibilityDialogUtils.showEditShortcutDialog(
+ mDialog = AccessibilityDialogUtils.showEditShortcutDialog(
getPrefContext(), dialogType, dialogTitle,
this::callOnAlertDialogCheckboxClicked);
- setupEditShortcutDialog(dialog);
- return dialog;
+ setupEditShortcutDialog(mDialog);
+ return mDialog;
case DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL:
- dialog = AccessibilityGestureNavigationTutorial
+ mDialog = AccessibilityGestureNavigationTutorial
.createAccessibilityTutorialDialog(getPrefContext(),
getUserShortcutTypes());
- dialog.setCanceledOnTouchOutside(false);
- return dialog;
+ mDialog.setCanceledOnTouchOutside(false);
+ return mDialog;
default:
throw new IllegalArgumentException("Unsupported dialogId " + dialogId);
}
@@ -733,6 +737,20 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
}
}
+ private void updateEditShortcutDialogIfNeeded() {
+ if (mDialog == null || !mDialog.isShowing()) {
+ return;
+ }
+
+ // Content in software shortcut need to be adjusted depend on the accessibility button
+ // mode status which can be changed in background.
+ final boolean valueChanged = mSavedAccessibilityFloatingMenuEnabled
+ != AccessibilityUtil.isFloatingMenuEnabled(getContext());
+ if (valueChanged) {
+ AccessibilityDialogUtils.updateSoftwareShortcutInDialog(getContext(), mDialog);
+ }
+ }
+
@VisibleForTesting
void saveNonEmptyUserShortcutType(int type) {
if (type == UserShortcutType.EMPTY) {
diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
index c15217490c6..6b4a5f2b0ec 100644
--- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
@@ -38,7 +38,6 @@ import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener;
import android.widget.CheckBox;
-import androidx.appcompat.app.AlertDialog;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
@@ -132,12 +131,11 @@ public class ToggleScreenMagnificationPreferenceFragment extends
@Override
public Dialog onCreateDialog(int dialogId) {
if (mDialogDelegate != null) {
- final Dialog dialog = mDialogDelegate.onCreateDialog(dialogId);
- if (dialog != null) {
- return dialog;
+ mDialog = mDialogDelegate.onCreateDialog(dialogId);
+ if (mDialog != null) {
+ return mDialog;
}
}
- final AlertDialog dialog;
switch (dialogId) {
case DialogEnums.GESTURE_NAVIGATION_TUTORIAL:
return AccessibilityGestureNavigationTutorial
@@ -148,10 +146,10 @@ public class ToggleScreenMagnificationPreferenceFragment extends
final int dialogType = WizardManagerHelper.isAnySetupWizard(getIntent())
? DialogType.EDIT_SHORTCUT_MAGNIFICATION_SUW
: DialogType.EDIT_SHORTCUT_MAGNIFICATION;
- dialog = AccessibilityDialogUtils.showEditShortcutDialog(getPrefContext(),
+ mDialog = AccessibilityDialogUtils.showEditShortcutDialog(getPrefContext(),
dialogType, dialogTitle, this::callOnAlertDialogCheckboxClicked);
- setupMagnificationEditShortcutDialog(dialog);
- return dialog;
+ setupMagnificationEditShortcutDialog(mDialog);
+ return mDialog;
default:
return super.onCreateDialog(dialogId);
}
@@ -209,7 +207,7 @@ public class ToggleScreenMagnificationPreferenceFragment extends
}
@VisibleForTesting
- void setupMagnificationEditShortcutDialog(AlertDialog dialog) {
+ void setupMagnificationEditShortcutDialog(Dialog dialog) {
final View dialogSoftwareView = dialog.findViewById(R.id.software_shortcut);
mSoftwareTypeCheckBox = dialogSoftwareView.findViewById(R.id.checkbox);
setDialogTextAreaClickListener(dialogSoftwareView, mSoftwareTypeCheckBox);
diff --git a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java
index 8509ca06444..bcd47bc09cc 100644
--- a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java
@@ -26,6 +26,7 @@ import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.nfc.AndroidBeamPreferenceController;
import com.android.settings.print.PrintSettingPreferenceController;
import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.uwb.UwbPreferenceController;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.search.SearchIndexable;
@@ -43,6 +44,7 @@ public class AdvancedConnectedDeviceDashboardFragment extends DashboardFragment
private static final String TAG = "AdvancedConnectedDeviceFrag";
static final String KEY_BLUETOOTH = "bluetooth_settings";
+ static final String KEY_UWB = "uwb_settings";
@Override
public int getMetricsCategory() {
@@ -64,6 +66,15 @@ public class AdvancedConnectedDeviceDashboardFragment extends DashboardFragment
return R.xml.connected_devices_advanced;
}
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ UwbPreferenceController uwbPreferenceController = use(UwbPreferenceController.class);
+ if (uwbPreferenceController != null && getSettingsLifecycle() != null) {
+ getSettingsLifecycle().addObserver(uwbPreferenceController);
+ }
+ }
+
@Override
protected List createPreferenceControllers(Context context) {
return buildControllers(context, getSettingsLifecycle());
diff --git a/src/com/android/settings/uwb/UwbPreferenceController.java b/src/com/android/settings/uwb/UwbPreferenceController.java
index 877c9f2f2b4..8b330a9422f 100644
--- a/src/com/android/settings/uwb/UwbPreferenceController.java
+++ b/src/com/android/settings/uwb/UwbPreferenceController.java
@@ -24,6 +24,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
+import android.os.Handler;
import android.provider.Settings;
import android.uwb.UwbManager;
import android.uwb.UwbManager.AdapterStateCallback;
@@ -52,11 +53,13 @@ public class UwbPreferenceController extends TogglePreferenceController implemen
@VisibleForTesting
private final BroadcastReceiver mAirplaneModeChangedReceiver;
private final Executor mExecutor;
+ private final Handler mHandler;
private Preference mPreference;
public UwbPreferenceController(Context context, String key) {
super(context, key);
mExecutor = Executors.newSingleThreadExecutor();
+ mHandler = new Handler(context.getMainLooper());
if (isUwbSupportedOnDevice()) {
mUwbManager = context.getSystemService(UwbManager.class);
}
@@ -65,6 +68,8 @@ public class UwbPreferenceController extends TogglePreferenceController implemen
mAirplaneModeChangedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
+ mAirplaneModeOn = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_ON, 0) == 1;
updateState(mPreference);
}
};
@@ -114,6 +119,8 @@ public class UwbPreferenceController extends TogglePreferenceController implemen
@Override
public void onStateChanged(int state, int reason) {
+ Runnable runnable = () -> updateState(mPreference);
+ mHandler.post(runnable);
}
/** Called when activity starts being displayed to user. */
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityDialogUtilsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityDialogUtilsTest.java
new file mode 100644
index 00000000000..83bba142f78
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityDialogUtilsTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+/** Tests for {@link AccessibilityDialogUtils} */
+@RunWith(RobolectricTestRunner.class)
+public class AccessibilityDialogUtilsTest {
+
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+
+ @Before
+ public void setUp() {
+ mContext.setTheme(R.style.Theme_AppCompat);
+ }
+
+ @Test
+ public void updateSoftwareShortcutInDialog_correctDialogType_success() {
+ final AlertDialog dialog = AccessibilityDialogUtils.showEditShortcutDialog(
+ mContext, AccessibilityDialogUtils.DialogType.EDIT_SHORTCUT_GENERIC, "Title",
+ null);
+
+ assertThat(
+ AccessibilityDialogUtils.updateSoftwareShortcutInDialog(mContext, dialog)).isTrue();
+ }
+
+ @Test
+ public void updateSoftwareShortcutInDialog_useNotSupportedDialog_fail() {
+ final AlertDialog dialog = new AlertDialog.Builder(mContext).setTitle("Title").show();
+
+ assertThat(AccessibilityDialogUtils.updateSoftwareShortcutInDialog(mContext,
+ dialog)).isFalse();
+ }
+}