diff --git a/res/layout/wifi_dpp_qrcode_scanner_fragment.xml b/res/layout/wifi_dpp_qrcode_scanner_fragment.xml
index 84470ba9a7d..ca2213f062e 100644
--- a/res/layout/wifi_dpp_qrcode_scanner_fragment.xml
+++ b/res/layout/wifi_dpp_qrcode_scanner_fragment.xml
@@ -23,59 +23,46 @@
android:icon="@drawable/ic_scan_32dp"
app:sudDescriptionText="@string/wifi_dpp_scan_qr_code_join_unknown_network">
-
+ android:layout_height="match_parent">
-
+
-
+ android:layout_height="match_parent" />
-
-
-
-
+
+
-
-
-
-
-
-
-
+
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a90a3f7bd03..c0917ffcefd 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3020,8 +3020,6 @@
Bluetooth & Wi\u2011Fi have been reset
-
- Erase
Erase eSIMs
@@ -10189,8 +10187,7 @@
You can uninstall the creditor app
-
- Device Lock
+ Financed device info
{count, plural,
diff --git a/res/values/themes.xml b/res/values/themes.xml
index eeba1c77aca..e3c1b20cf3f 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -132,6 +132,8 @@
- adjustResize
- true
- true
+ - locale
+ - locale
- @style/Widget.ActionBar
diff --git a/res/xml/more_security_privacy_settings.xml b/res/xml/more_security_privacy_settings.xml
index 1a9d788ea76..47ea3e02a18 100644
--- a/res/xml/more_security_privacy_settings.xml
+++ b/res/xml/more_security_privacy_settings.xml
@@ -147,8 +147,8 @@
settings:controller="com.android.settings.enterprise.FinancedPrivacyPreferenceController"/>
diff --git a/res/xml/security_advanced_settings.xml b/res/xml/security_advanced_settings.xml
index 8223f509c1d..f52fb12d1fb 100644
--- a/res/xml/security_advanced_settings.xml
+++ b/res/xml/security_advanced_settings.xml
@@ -59,8 +59,8 @@
settings:controller="com.android.settings.enterprise.FinancedPrivacyPreferenceController"/>
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
index 724947c2fd6..aaedebd7634 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
@@ -99,7 +99,7 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
mIsLeContactSharingEnabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI,
SettingsUIDeviceConfig.BT_LE_AUDIO_CONTACT_SHARING_ENABLED, true);
mIsLeAudioToggleEnabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI,
- SettingsUIDeviceConfig.BT_LE_AUDIO_DEVICE_DETAIL_ENABLED, false)
+ SettingsUIDeviceConfig.BT_LE_AUDIO_DEVICE_DETAIL_ENABLED, true)
|| DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_BLUETOOTH,
CONFIG_LE_AUDIO_ENABLED_BY_DEFAULT, false);
// Call refresh here even though it will get called later in onResume, to avoid the
diff --git a/src/com/android/settings/dashboard/CategoryManager.java b/src/com/android/settings/dashboard/CategoryManager.java
index 8ea5cf42cb3..2206af96f20 100644
--- a/src/com/android/settings/dashboard/CategoryManager.java
+++ b/src/com/android/settings/dashboard/CategoryManager.java
@@ -34,6 +34,8 @@ import com.android.settingslib.drawer.ProviderTile;
import com.android.settingslib.drawer.Tile;
import com.android.settingslib.drawer.TileUtils;
+import com.google.android.setupcompat.util.WizardManagerHelper;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -79,6 +81,9 @@ public class CategoryManager {
}
public synchronized List getCategories(Context context) {
+ if (!WizardManagerHelper.isUserSetupComplete(context)) {
+ return new ArrayList<>();
+ }
tryInitCategories(context);
return mCategories;
}
@@ -142,6 +147,10 @@ public class CategoryManager {
}
private synchronized void tryInitCategories(Context context, boolean forceClearCache) {
+ if (!WizardManagerHelper.isUserSetupComplete(context)) {
+ // Don't init while setup wizard is still running.
+ return;
+ }
if (mCategories == null) {
final boolean firstLoading = mCategoryByKeyMap.isEmpty();
if (forceClearCache) {
diff --git a/src/com/android/settings/development/BluetoothLeAudioDeviceDetailsPreferenceController.java b/src/com/android/settings/development/BluetoothLeAudioDeviceDetailsPreferenceController.java
index a54c594c84d..298ced091a9 100644
--- a/src/com/android/settings/development/BluetoothLeAudioDeviceDetailsPreferenceController.java
+++ b/src/com/android/settings/development/BluetoothLeAudioDeviceDetailsPreferenceController.java
@@ -40,6 +40,7 @@ public class BluetoothLeAudioDeviceDetailsPreferenceController
private static final String PREFERENCE_KEY = "bluetooth_show_leaudio_device_details";
private static final String CONFIG_LE_AUDIO_ENABLED_BY_DEFAULT = "le_audio_enabled_by_default";
+ private static final boolean LE_AUDIO_DEVICE_DETAIL_DEFAULT_VALUE = true;
static int sLeAudioSupportedStateCache = BluetoothStatusCodes.ERROR_UNKNOWN;
@VisibleForTesting
@@ -75,7 +76,7 @@ public class BluetoothLeAudioDeviceDetailsPreferenceController
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_SETTINGS_UI,
SettingsUIDeviceConfig.BT_LE_AUDIO_DEVICE_DETAIL_ENABLED,
- isEnabled ? "true" : "false", false);
+ isEnabled ? "true" : "false", LE_AUDIO_DEVICE_DETAIL_DEFAULT_VALUE);
return true;
}
@@ -87,7 +88,8 @@ public class BluetoothLeAudioDeviceDetailsPreferenceController
final boolean leAudioDeviceDetailEnabled = DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_SETTINGS_UI,
- SettingsUIDeviceConfig.BT_LE_AUDIO_DEVICE_DETAIL_ENABLED, false);
+ SettingsUIDeviceConfig.BT_LE_AUDIO_DEVICE_DETAIL_ENABLED,
+ LE_AUDIO_DEVICE_DETAIL_DEFAULT_VALUE);
final boolean leAudioEnabledByDefault = DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_BLUETOOTH, CONFIG_LE_AUDIO_ENABLED_BY_DEFAULT, false);
@@ -102,6 +104,7 @@ public class BluetoothLeAudioDeviceDetailsPreferenceController
// Reset the toggle to null when the developer option is disabled
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_SETTINGS_UI,
- SettingsUIDeviceConfig.BT_LE_AUDIO_DEVICE_DETAIL_ENABLED, "null", false);
+ SettingsUIDeviceConfig.BT_LE_AUDIO_DEVICE_DETAIL_ENABLED, "null",
+ LE_AUDIO_DEVICE_DETAIL_DEFAULT_VALUE);
}
}
diff --git a/src/com/android/settings/network/EraseEuiccDataDialogFragment.java b/src/com/android/settings/network/EraseEuiccDataDialogFragment.java
index 32903bde7ba..0200e524b07 100644
--- a/src/com/android/settings/network/EraseEuiccDataDialogFragment.java
+++ b/src/com/android/settings/network/EraseEuiccDataDialogFragment.java
@@ -23,7 +23,6 @@ import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
-import android.os.RecoverySystem;
import android.util.Log;
import androidx.annotation.NonNull;
@@ -62,7 +61,7 @@ public class EraseEuiccDataDialogFragment extends InstrumentedDialogFragment imp
return new AlertDialog.Builder(getActivity())
.setTitle(R.string.reset_esim_title)
.setMessage(R.string.reset_esim_desc)
- .setPositiveButton(R.string.erase_euicc_data_button, this)
+ .setPositiveButton(R.string.erase_sim_confirm_button, this)
.setNegativeButton(R.string.cancel, null)
.setOnDismissListener(this)
.create();
diff --git a/src/com/android/settings/shortcut/CreateShortcutPreferenceController.java b/src/com/android/settings/shortcut/CreateShortcutPreferenceController.java
index 89ee19bc8a7..bf953489be9 100644
--- a/src/com/android/settings/shortcut/CreateShortcutPreferenceController.java
+++ b/src/com/android/settings/shortcut/CreateShortcutPreferenceController.java
@@ -46,10 +46,12 @@ import androidx.preference.PreferenceGroup;
import com.android.settings.R;
import com.android.settings.Settings;
import com.android.settings.Settings.TetherSettingsActivity;
+import com.android.settings.Settings.WifiTetherSettingsActivity;
import com.android.settings.activityembedding.ActivityEmbeddingUtils;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.gestures.OneHandedSettingsUtils;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.wifi.WifiUtils;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import java.util.ArrayList;
@@ -192,6 +194,12 @@ public class CreateShortcutPreferenceController extends BasePreferenceController
continue;
}
}
+ if (info.activityInfo.name.endsWith(WifiTetherSettingsActivity.class.getSimpleName())) {
+ if (!canShowWifiHotspot()) {
+ Log.d(TAG, "Skipping Wi-Fi hotspot settings:" + info.activityInfo);
+ continue;
+ }
+ }
if (!info.activityInfo.applicationInfo.isSystemApp()) {
Log.d(TAG, "Skipping non-system app: " + info.activityInfo);
continue;
@@ -202,6 +210,11 @@ public class CreateShortcutPreferenceController extends BasePreferenceController
return shortcuts;
}
+ @VisibleForTesting
+ boolean canShowWifiHotspot() {
+ return WifiUtils.canShowWifiHotspot(mContext);
+ }
+
private void logCreateShortcut(ResolveInfo info) {
if (info == null || info.activityInfo == null) {
return;
diff --git a/src/com/android/settings/sim/SimDialogActivity.java b/src/com/android/settings/sim/SimDialogActivity.java
index dcfa9832458..7d399387191 100644
--- a/src/com/android/settings/sim/SimDialogActivity.java
+++ b/src/com/android/settings/sim/SimDialogActivity.java
@@ -39,10 +39,12 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.network.CarrierConfigCache;
import com.android.settings.network.SubscriptionUtil;
import com.android.settings.network.ims.WifiCallingQueryImsState;
+import com.android.settings.network.telephony.MobileNetworkUtils;
import com.android.settings.network.telephony.SubscriptionActionDialogActivity;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -77,7 +79,10 @@ public class SimDialogActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
+ if (isUiRestricted()) {
+ finish();
+ return;
+ }
if (!SubscriptionUtil.isSimHardwareVisible(this)) {
Log.d(TAG, "Not support on device without SIM.");
finish();
@@ -91,6 +96,15 @@ public class SimDialogActivity extends FragmentActivity {
showOrUpdateDialog();
}
+ @VisibleForTesting
+ boolean isUiRestricted() {
+ if (MobileNetworkUtils.isMobileNetworkUserRestricted(getApplicationContext())) {
+ Log.e(TAG, "This setting isn't available due to user restriction.");
+ return true;
+ }
+ return false;
+ }
+
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
diff --git a/src/com/android/settings/spa/system/AppLanguages.kt b/src/com/android/settings/spa/system/AppLanguages.kt
index f53a63d8be8..b878aa72ee0 100644
--- a/src/com/android/settings/spa/system/AppLanguages.kt
+++ b/src/com/android/settings/spa/system/AppLanguages.kt
@@ -41,6 +41,7 @@ object AppLanguagesPageProvider : SettingsPageProvider {
AppListPage(
title = stringResource(R.string.app_locales_picker_menu_title),
listModel = rememberContext(::AppLanguagesListModel),
+ noMoreOptions = true,
header = {
Box(Modifier.padding(SettingsDimension.itemPadding)) {
SettingsBody(stringResource(R.string.desc_app_locale_selection_supported))
diff --git a/tests/robotests/src/com/android/settings/shortcut/CreateShortcutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/shortcut/CreateShortcutPreferenceControllerTest.java
index 49c1551c5d3..df1fec38b56 100644
--- a/tests/robotests/src/com/android/settings/shortcut/CreateShortcutPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/shortcut/CreateShortcutPreferenceControllerTest.java
@@ -84,7 +84,7 @@ public class CreateShortcutPreferenceControllerTest {
mShadowConnectivityManager = ShadowConnectivityManager.getShadow();
mShadowConnectivityManager.setTetheringSupported(true);
- mController = new CreateShortcutPreferenceController(mContext, "key");
+ mController = spy(new CreateShortcutPreferenceController(mContext, "key"));
mController.setActivity(mHost);
}
@@ -159,27 +159,39 @@ public class CreateShortcutPreferenceControllerTest {
@Test
public void queryShortcuts_setSupportOneHandedMode_ShouldEnableShortcuts() {
SystemProperties.set(SUPPORT_ONE_HANDED_MODE, "true");
+ setupActivityInfo(Settings.OneHandedSettingsActivity.class.getSimpleName());
- setupOneHandedModeActivityInfo();
- final List info = mController.queryShortcuts();
-
- assertThat(info).hasSize(1);
+ assertThat(mController.queryShortcuts()).hasSize(1);
}
@Test
public void queryShortcuts_setUnsupportOneHandedMode_ShouldDisableShortcuts() {
SystemProperties.set(SUPPORT_ONE_HANDED_MODE, "false");
+ setupActivityInfo(Settings.OneHandedSettingsActivity.class.getSimpleName());
- setupOneHandedModeActivityInfo();
- final List info = mController.queryShortcuts();
-
- assertThat(info).hasSize(0);
+ assertThat(mController.queryShortcuts()).hasSize(0);
}
- private void setupOneHandedModeActivityInfo() {
- final ResolveInfo ri = new ResolveInfo();
+ @Test
+ public void queryShortcuts_configShowWifiHotspot_ShouldEnableShortcuts() {
+ when(mController.canShowWifiHotspot()).thenReturn(true);
+ setupActivityInfo(Settings.WifiTetherSettingsActivity.class.getSimpleName());
+
+ assertThat(mController.queryShortcuts()).hasSize(1);
+ }
+
+ @Test
+ public void queryShortcuts_configNotShowWifiHotspot_ShouldDisableShortcuts() {
+ when(mController.canShowWifiHotspot()).thenReturn(false);
+ setupActivityInfo(Settings.WifiTetherSettingsActivity.class.getSimpleName());
+
+ assertThat(mController.queryShortcuts()).hasSize(0);
+ }
+
+ private void setupActivityInfo(String name) {
+ ResolveInfo ri = new ResolveInfo();
ri.activityInfo = new ActivityInfo();
- ri.activityInfo.name = Settings.OneHandedSettingsActivity.class.getSimpleName();
+ ri.activityInfo.name = name;
ri.activityInfo.applicationInfo = new ApplicationInfo();
ri.activityInfo.applicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
diff --git a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
index b75fa8cfe1c..c54b750cb55 100644
--- a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
@@ -190,6 +190,7 @@ public class BatteryTestUtils {
when(mockUsbPort.getStatus()).thenReturn(mockUsbPortStatus);
when(mockUsbPort.supportsComplianceWarnings()).thenReturn(true);
when(mockUsbPortStatus.isConnected()).thenReturn(true);
- when(mockUsbPortStatus.getComplianceWarnings()).thenReturn(new int[]{1});
+ when(mockUsbPortStatus.getComplianceWarnings())
+ .thenReturn(new int[]{UsbPortStatus.COMPLIANCE_WARNING_OTHER});
}
}
diff --git a/tests/unit/src/com/android/settings/sim/SimDialogActivityTest.java b/tests/unit/src/com/android/settings/sim/SimDialogActivityTest.java
new file mode 100644
index 00000000000..a2320341c62
--- /dev/null
+++ b/tests/unit/src/com/android/settings/sim/SimDialogActivityTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2023 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.sim;
+
+import static android.os.UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.UserManager;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+@RunWith(AndroidJUnit4.class)
+@UiThreadTest
+public class SimDialogActivityTest {
+ @Rule
+ public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Spy
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ @Mock
+ private UserManager mUserManager;
+
+ private MockSimDialogActivity mActivity;
+
+ @Before
+ public void setUp() {
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
+ when(mUserManager.isGuestUser()).thenReturn(false);
+ when(mUserManager.hasUserRestriction(DISALLOW_CONFIG_MOBILE_NETWORKS)).thenReturn(false);
+
+ mActivity = new MockSimDialogActivity();
+ }
+
+ @Test
+ public void isUiRestricted_normally_returnFalse() {
+ assertThat(mActivity.isUiRestricted()).isFalse();
+ }
+
+ @Test
+ public void isUiRestricted_isGuestUser_returnTrue() {
+ when(mUserManager.isGuestUser()).thenReturn(true);
+
+ assertThat(mActivity.isUiRestricted()).isTrue();
+ }
+
+ @Test
+ public void isUiRestricted_hasUserRestriction_returnTrue() {
+ when(mUserManager.hasUserRestriction(DISALLOW_CONFIG_MOBILE_NETWORKS)).thenReturn(true);
+
+ assertThat(mActivity.isUiRestricted()).isTrue();
+ }
+
+ public class MockSimDialogActivity extends SimDialogActivity {
+ @Override
+ public Context getApplicationContext() {
+ return mContext;
+ }
+ }
+}