Merge "Fix for GestureShortcutOptionControllerTest" into main
diff --git a/res/layout/preference_volume_slider.xml b/res/layout/preference_volume_slider.xml
index 3377231..50095f4 100644
--- a/res/layout/preference_volume_slider.xml
+++ b/res/layout/preference_volume_slider.xml
@@ -42,6 +42,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
+ android:textAlignment="viewStart"
android:textAppearance="?android:attr/textAppearanceListItem"
android:ellipsize="marquee"
android:fadingEdge="horizontal"/>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index fb95aa3..7e363e6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -9762,8 +9762,10 @@
<string name="launch_by_default">Open by default</string>
<string name="app_launch_open_domain_urls_title">Open supported links</string>
+ <string name="app_launch_open_in_app">In the app</string>
+ <string name="app_launch_open_in_browser">In your browser</string>
<!-- Preference title for Supported links open in this app. [CHAR LIMIT=60] -->
- <string name="app_launch_top_intro_message">Allow web links to open in this app</string>
+ <string name="app_launch_top_intro_message">Choose how to open web links for this app</string>
<!-- Preference title for Links to open in this app. [CHAR LIMIT=60] -->
<string name="app_launch_links_category">Links to open in this app</string>
diff --git a/res/values/themes.xml b/res/values/themes.xml
index e91ca49..64c8904 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -114,13 +114,7 @@
<item name="android:windowSoftInputMode">adjustResize</item>
</style>
- <style name="Theme.AlertDialog.Base" parent="@style/Theme.AppCompat.DayNight.Dialog.Alert">
- <item name="colorAccent">@android:color/system_primary_light</item>
- <item name="android:colorError">@color/settings_dialog_colorError</item>
- <item name="android:colorBackground">@android:color/system_surface_container_high_light</item>
- </style>
-
- <style name="Theme.AlertDialog" parent="Theme.AlertDialog.Base">
+ <style name="Theme.AlertDialog" parent="@style/Theme.AppCompat.DayNight.Dialog.Alert">
<item name="android:windowSoftInputMode">adjustResize</item>
<item name="android:clipToPadding">true</item>
<item name="android:clipChildren">true</item>
diff --git a/res/xml/installed_app_launch_settings.xml b/res/xml/installed_app_launch_settings.xml
index 2268d5c..ffd73bc 100644
--- a/res/xml/installed_app_launch_settings.xml
+++ b/res/xml/installed_app_launch_settings.xml
@@ -19,9 +19,15 @@
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="@string/launch_by_default">
- <com.android.settingslib.widget.MainSwitchPreference
- android:key="open_by_default_supported_links"
- android:title="@string/app_launch_open_domain_urls_title"/>
+ <PreferenceCategory>
+ <com.android.settingslib.widget.SelectorWithWidgetPreference
+ android:key="app_launch_open_in_app"
+ android:title="@string/app_launch_open_in_app"/>
+
+ <com.android.settingslib.widget.SelectorWithWidgetPreference
+ android:key="app_launch_open_in_browser"
+ android:title="@string/app_launch_open_in_browser"/>
+ </PreferenceCategory>
<PreferenceCategory
android:layout="@layout/preference_category_no_label"
diff --git a/src/com/android/settings/applications/intentpicker/AppLaunchSettings.java b/src/com/android/settings/applications/intentpicker/AppLaunchSettings.java
index 676c35a..4b2f348 100644
--- a/src/com/android/settings/applications/intentpicker/AppLaunchSettings.java
+++ b/src/com/android/settings/applications/intentpicker/AppLaunchSettings.java
@@ -20,6 +20,7 @@
import static android.content.pm.verify.domain.DomainVerificationUserState.DOMAIN_STATE_SELECTED;
import static android.content.pm.verify.domain.DomainVerificationUserState.DOMAIN_STATE_VERIFIED;
+import android.annotation.Nullable;
import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.appwidget.AppWidgetManager;
@@ -35,10 +36,9 @@
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
-import android.widget.CompoundButton;
-import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.TextView;
+import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog;
import androidx.preference.Preference;
@@ -51,7 +51,7 @@
import com.android.settings.widget.EntityHeaderController;
import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.widget.FooterPreference;
-import com.android.settingslib.widget.MainSwitchPreference;
+import com.android.settingslib.widget.SelectorWithWidgetPreference;
import java.util.HashMap;
import java.util.List;
@@ -62,10 +62,11 @@
/** The page of the Open by default */
public class AppLaunchSettings extends AppInfoBase implements
- Preference.OnPreferenceChangeListener, OnCheckedChangeListener {
+ Preference.OnPreferenceChangeListener, SelectorWithWidgetPreference.OnClickListener {
private static final String TAG = "AppLaunchSettings";
// Preference keys
- private static final String MAIN_SWITCH_PREF_KEY = "open_by_default_supported_links";
+ private static final String OPEN_IN_APP_PREF_KEY = "app_launch_open_in_app";
+ private static final String OPEN_IN_BROWSER_PREF_KEY = "app_launch_open_in_browser";
private static final String VERIFIED_LINKS_PREF_KEY = "open_by_default_verified_links";
private static final String ADD_LINK_PREF_KEY = "open_by_default_add_link";
private static final String CLEAR_DEFAULTS_PREF_KEY = "app_launch_clear_defaults";
@@ -86,7 +87,10 @@
public static final String APP_PACKAGE_KEY = "app_package";
private ClearDefaultsPreference mClearDefaultsPreference;
- private MainSwitchPreference mMainSwitchPreference;
+ @Nullable
+ private SelectorWithWidgetPreference mOpenInAppSelector;
+ @Nullable
+ private SelectorWithWidgetPreference mOpenInBrowserSelector;
private Preference mAddLinkPreference;
private PreferenceCategory mMainPreferenceCategory;
private PreferenceCategory mSelectedLinksPreferenceCategory;
@@ -168,20 +172,20 @@
}
@Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- IntentPickerUtils.logd("onSwitchChanged: isChecked=" + isChecked);
- if (mMainSwitchPreference != null) { //mMainSwitchPreference synced with Switch
- mMainSwitchPreference.setChecked(isChecked);
- }
+ public void onRadioButtonClicked(@NonNull SelectorWithWidgetPreference selected) {
+ final boolean openSupportedLinks = selected.getKey().equals(OPEN_IN_APP_PREF_KEY);
+ IntentPickerUtils.logd("onRadioButtonClicked: openInApp =" + openSupportedLinks);
+ setOpenByDefaultPreference(openSupportedLinks /* openInApp */);
+
if (mMainPreferenceCategory != null) {
- mMainPreferenceCategory.setVisible(isChecked);
+ mMainPreferenceCategory.setVisible(openSupportedLinks);
}
if (mDomainVerificationManager != null) {
try {
mDomainVerificationManager.setDomainVerificationLinkHandlingAllowed(mPackageName,
- isChecked);
+ openSupportedLinks);
} catch (PackageManager.NameNotFoundException e) {
- Log.w(TAG, "onSwitchChanged: " + e.getMessage());
+ Log.w(TAG, "onRadioButtonClicked: " + e.getMessage());
}
}
}
@@ -224,7 +228,8 @@
}
private void initMainSwitchAndCategories() {
- mMainSwitchPreference = (MainSwitchPreference) findPreference(MAIN_SWITCH_PREF_KEY);
+ mOpenInAppSelector = findPreference(OPEN_IN_APP_PREF_KEY);
+ mOpenInBrowserSelector = findPreference(OPEN_IN_BROWSER_PREF_KEY);
mMainPreferenceCategory = findPreference(MAIN_PREF_CATEGORY_KEY);
mSelectedLinksPreferenceCategory = findPreference(SELECTED_LINKS_CATEGORY_KEY);
// Initialize the "Other Default Category" section
@@ -235,14 +240,15 @@
final DomainVerificationUserState userState =
IntentPickerUtils.getDomainVerificationUserState(mDomainVerificationManager,
mPackageName);
- if (userState == null) {
+ if (userState == null || mOpenInAppSelector == null || mOpenInBrowserSelector == null) {
disabledPreference();
return false;
}
IntentPickerUtils.logd("isLinkHandlingAllowed() : " + userState.isLinkHandlingAllowed());
- mMainSwitchPreference.updateStatus(userState.isLinkHandlingAllowed());
- mMainSwitchPreference.addOnSwitchChangeListener(this);
+ setOpenByDefaultPreference(userState.isLinkHandlingAllowed());
+ mOpenInAppSelector.setOnClickListener(this);
+ mOpenInBrowserSelector.setOnClickListener(this);
mMainPreferenceCategory.setVisible(userState.isLinkHandlingAllowed());
return true;
}
@@ -260,6 +266,12 @@
verifiedLinksPreference.setEnabled(verifiedLinksNo > 0);
}
+ private void setOpenByDefaultPreference(boolean openInApp) {
+ if (mOpenInBrowserSelector == null || mOpenInAppSelector == null) return;
+ mOpenInAppSelector.setChecked(openInApp);
+ mOpenInBrowserSelector.setChecked(!openInApp);
+ }
+
private void showVerifiedLinksDialog() {
final int linksNo = getLinksNumber(DOMAIN_STATE_VERIFIED);
if (linksNo == 0) {
@@ -360,9 +372,12 @@
}
private void disabledPreference() {
- mMainSwitchPreference.updateStatus(false);
- mMainSwitchPreference.setSelectable(false);
- mMainSwitchPreference.setEnabled(false);
+ if (mOpenInAppSelector == null ||mOpenInBrowserSelector == null) return;
+ setOpenByDefaultPreference(false /* openInApp */);
+ mOpenInAppSelector.setSelectable(false);
+ mOpenInAppSelector.setEnabled(false);
+ mOpenInBrowserSelector.setSelectable(false);
+ mOpenInBrowserSelector.setEnabled(false);
mMainPreferenceCategory.setVisible(false);
}
diff --git a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionScreen.kt b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionScreen.kt
index 0908f9e..0075068 100644
--- a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionScreen.kt
+++ b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionScreen.kt
@@ -48,8 +48,8 @@
override fun getPreferenceHierarchy(context: Context) =
preferenceHierarchy(this) {
+PreferenceWidget("os_firmware_version", R.string.firmware_version)
- +PreferenceWidget("security_key", R.string.security_patch)
- +PreferenceWidget("module_version", R.string.module_version)
+ +SecurityPatchLevelPreference()
+ +MainlineModuleVersionPreference()
+BasebandVersionPreference()
+KernelVersionPreference()
+SimpleBuildNumberPreference()
diff --git a/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreference.kt b/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreference.kt
new file mode 100644
index 0000000..fae1a94
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreference.kt
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2024 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.deviceinfo.firmwareversion
+
+import android.content.Context
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.text.format.DateFormat
+import android.util.Log
+import androidx.preference.Preference
+import com.android.settings.R
+import com.android.settings.flags.Flags
+import com.android.settings.utils.getLocale
+import com.android.settingslib.metadata.PreferenceAvailabilityProvider
+import com.android.settingslib.metadata.PreferenceMetadata
+import com.android.settingslib.metadata.PreferenceSummaryProvider
+import com.android.settingslib.preference.PreferenceBinding
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.Date
+import java.util.TimeZone
+
+// LINT.IfChange
+class MainlineModuleVersionPreference :
+ PreferenceMetadata,
+ PreferenceSummaryProvider,
+ PreferenceAvailabilityProvider,
+ PreferenceBinding {
+
+ private var moduleVersion: String? = null
+
+ override val key: String
+ get() = "module_version"
+
+ override val title: Int
+ get() = R.string.module_version
+
+ override fun getSummary(context: Context): CharSequence? {
+ val version = getModuleVersion(context)
+ if (version.isEmpty()) return null
+
+ val locale = context.getLocale()
+ fun parseDate(pattern: String): Date? {
+ val simpleDateFormat = SimpleDateFormat(pattern, locale)
+ simpleDateFormat.timeZone = TimeZone.getDefault()
+ return try {
+ simpleDateFormat.parse(version)
+ } catch (e: ParseException) {
+ null
+ }
+ }
+
+ val date = parseDate("yyyy-MM-dd") ?: parseDate("yyyy-MM")
+ return if (date == null) {
+ Log.w(TAG, "Cannot parse mainline versionName ($version) as date")
+ version
+ } else {
+ DateFormat.format(DateFormat.getBestDateTimePattern(locale, "dMMMMyyyy"), date)
+ }
+ }
+
+ override fun intent(context: Context): Intent? {
+ val packageManager = context.packageManager
+ val intentPackage =
+ if (Flags.mainlineModuleExplicitIntent()) {
+ context.getString(R.string.config_mainline_module_update_package)
+ } else {
+ null
+ }
+ fun String.resolveIntent() =
+ Intent(this).let {
+ if (intentPackage != null) it.setPackage(intentPackage)
+ if (packageManager.resolveActivity(it, 0) != null) it else null
+ }
+
+ return MODULE_UPDATE_ACTION_V2.resolveIntent() ?: MODULE_UPDATE_ACTION.resolveIntent()
+ }
+
+ override fun isAvailable(context: Context) = getModuleVersion(context).isNotEmpty()
+
+ override fun bind(preference: Preference, metadata: PreferenceMetadata) {
+ super.bind(preference, metadata)
+ preference.isSelectable = preference.intent != null
+ preference.isCopyingEnabled = true
+ }
+
+ private fun getModuleVersion(context: Context): String =
+ moduleVersion ?: context.getVersion().also { moduleVersion = it }
+
+ private fun Context.getVersion(): String {
+ val moduleProvider =
+ getString(com.android.internal.R.string.config_defaultModuleMetadataProvider)
+ if (moduleProvider.isEmpty()) return ""
+ return try {
+ packageManager.getPackageInfo(moduleProvider, 0)?.versionName ?: ""
+ } catch (e: PackageManager.NameNotFoundException) {
+ Log.e(TAG, "Failed to get mainline version.", e)
+ ""
+ }
+ }
+
+ companion object {
+ private const val TAG = "MainlineModulePreference"
+ const val MODULE_UPDATE_ACTION = "android.settings.MODULE_UPDATE_SETTINGS"
+ const val MODULE_UPDATE_ACTION_V2 = "android.settings.MODULE_UPDATE_VERSIONS"
+ }
+}
+// LINT.ThenChange(MainlineModuleVersionPreferenceController.java)
diff --git a/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceController.java b/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceController.java
index 4c02feb..b65497f 100644
--- a/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceController.java
@@ -39,6 +39,7 @@
import java.util.Optional;
import java.util.TimeZone;
+// LINT.IfChange
public class MainlineModuleVersionPreferenceController extends BasePreferenceController {
@VisibleForTesting
@@ -141,3 +142,4 @@
return Optional.empty();
}
}
+// LINT.ThenChange(MainlineModuleVersionPreference.kt)
diff --git a/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreference.kt b/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreference.kt
new file mode 100644
index 0000000..7af389e
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreference.kt
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2024 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.deviceinfo.firmwareversion
+
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import androidx.preference.Preference
+import com.android.settings.R
+import com.android.settings.utils.getLocale
+import com.android.settingslib.DeviceInfoUtils
+import com.android.settingslib.metadata.PreferenceAvailabilityProvider
+import com.android.settingslib.metadata.PreferenceMetadata
+import com.android.settingslib.metadata.PreferenceSummaryProvider
+import com.android.settingslib.preference.PreferenceBinding
+
+// LINT.IfChange
+class SecurityPatchLevelPreference :
+ PreferenceMetadata,
+ PreferenceAvailabilityProvider,
+ PreferenceSummaryProvider,
+ PreferenceBinding {
+
+ private var currentPatch: String? = null
+
+ override val key: String
+ get() = "security_key"
+
+ override val title: Int
+ get() = R.string.security_patch
+
+ override fun intent(context: Context): Intent? =
+ Intent(Intent.ACTION_VIEW)
+ .setData(Uri.parse("https://source.android.com/docs/security/bulletin/"))
+
+ override fun isAvailable(context: Context) = context.getPatch().isNotEmpty()
+
+ override fun getSummary(context: Context) = context.getPatch()
+
+ private fun Context.getPatch(): String =
+ currentPatch
+ ?: (DeviceInfoUtils.getSecurityPatch(getLocale()) ?: "").also { currentPatch = it }
+
+ override fun bind(preference: Preference, metadata: PreferenceMetadata) {
+ super.bind(preference, metadata)
+ preference.isCopyingEnabled = true
+ }
+}
+// LINT.ThenChange(SecurityPatchLevelPreferenceController.java)
diff --git a/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceController.java b/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceController.java
index dcb5a37..b4648ee 100644
--- a/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceController.java
@@ -16,6 +16,7 @@
package com.android.settings.deviceinfo.firmwareversion;
+// LINT.IfChange
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -73,3 +74,4 @@
return true;
}
}
+// LINT.ThenChange(SecurityPatchLevelPreference.kt)
diff --git a/src/com/android/settings/notification/zen/ZenModeAutomationSettings.java b/src/com/android/settings/notification/zen/ZenModeAutomationSettings.java
index 5f31781..904b554 100644
--- a/src/com/android/settings/notification/zen/ZenModeAutomationSettings.java
+++ b/src/com/android/settings/notification/zen/ZenModeAutomationSettings.java
@@ -30,18 +30,15 @@
import androidx.fragment.app.Fragment;
import com.android.settings.R;
-import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.utils.ManagedServiceSettings;
import com.android.settings.utils.ZenServiceListing;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-@SearchIndexable
public class ZenModeAutomationSettings extends ZenModeSettingsBase {
public static final String DELETE = "DELETE_RULE";
protected final ManagedServiceSettings.Config CONFIG = getConditionProviderConfig();
@@ -133,25 +130,4 @@
return super.onOptionsItemSelected(item);
}
}
-
- /**
- * For Search.
- */
- public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider(R.xml.zen_mode_automation_settings) {
-
- @Override
- public List<String> getNonIndexableKeys(Context context) {
- final List<String> keys = super.getNonIndexableKeys(context);
- keys.add(ZenModeAddAutomaticRulePreferenceController.KEY);
- keys.add(ZenModeAutomaticRulesPreferenceController.KEY);
- return keys;
- }
-
- @Override
- public List<AbstractPreferenceController> createPreferenceControllers(
- Context context) {
- return buildPreferenceControllers(context, null, null, null);
- }
- };
}
diff --git a/src/com/android/settings/notification/zen/ZenModeBlockedEffectsSettings.java b/src/com/android/settings/notification/zen/ZenModeBlockedEffectsSettings.java
index c2962dc..2e5d33f 100644
--- a/src/com/android/settings/notification/zen/ZenModeBlockedEffectsSettings.java
+++ b/src/com/android/settings/notification/zen/ZenModeBlockedEffectsSettings.java
@@ -29,16 +29,13 @@
import android.os.Bundle;
import com.android.settings.R;
-import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.search.Indexable;
-import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
import java.util.List;
-@SearchIndexable
public class ZenModeBlockedEffectsSettings extends ZenModeSettingsBase implements Indexable {
@Override
@@ -88,16 +85,4 @@
public int getMetricsCategory() {
return SettingsEnums.ZEN_WHAT_TO_BLOCK;
}
-
- /**
- * For Search.
- */
- public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider(R.xml.zen_mode_block_settings) {
-
- @Override
- public List<AbstractPreferenceController> createPreferenceControllers(Context context) {
- return buildPreferenceControllers(context, null);
- }
- };
}
diff --git a/src/com/android/settings/notification/zen/ZenModeBypassingAppsSettings.java b/src/com/android/settings/notification/zen/ZenModeBypassingAppsSettings.java
index 89a80f0..64489cb 100644
--- a/src/com/android/settings/notification/zen/ZenModeBypassingAppsSettings.java
+++ b/src/com/android/settings/notification/zen/ZenModeBypassingAppsSettings.java
@@ -25,15 +25,12 @@
import com.android.settings.R;
import com.android.settings.notification.NotificationBackend;
-import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.search.Indexable;
-import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
import java.util.List;
-@SearchIndexable
public class ZenModeBypassingAppsSettings extends ZenModeSettingsBase implements
Indexable {
private final String TAG = "ZenBypassingApps";
@@ -74,17 +71,4 @@
public int getMetricsCategory() {
return SettingsEnums.NOTIFICATION_ZEN_MODE_OVERRIDING_APPS;
}
-
- /**
- * For Search.
- */
- public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider(R.xml.zen_mode_bypassing_apps) {
-
- @Override
- public List<AbstractPreferenceController> createPreferenceControllers(
- Context context) {
- return buildPreferenceControllers(context, null, null, null);
- }
- };
}
diff --git a/src/com/android/settings/notification/zen/ZenModeCallsSettings.java b/src/com/android/settings/notification/zen/ZenModeCallsSettings.java
index 93e97b1..76c6fef 100644
--- a/src/com/android/settings/notification/zen/ZenModeCallsSettings.java
+++ b/src/com/android/settings/notification/zen/ZenModeCallsSettings.java
@@ -18,14 +18,11 @@
import android.app.settings.SettingsEnums;
import android.content.Context;
-import android.provider.SearchIndexableResource;
import com.android.settings.R;
import com.android.settings.notification.NotificationBackend;
-import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
import java.util.List;
@@ -33,7 +30,6 @@
/**
* DND Calls Settings page to determine which priority senders can bypass DND.
*/
-@SearchIndexable
public class ZenModeCallsSettings extends ZenModeSettingsBase {
@Override
@@ -64,27 +60,4 @@
public int getMetricsCategory() {
return SettingsEnums.DND_CALLS;
}
-
- /**
- * For Search.
- */
- public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider() {
- @Override
- public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
- boolean enabled) {
- final ArrayList<SearchIndexableResource> result = new ArrayList<>();
-
- final SearchIndexableResource sir = new SearchIndexableResource(context);
- sir.xmlResId = R.xml.zen_mode_calls_settings;
- result.add(sir);
- return result;
- }
-
- @Override
- public List<AbstractPreferenceController> createPreferenceControllers(
- Context context) {
- return buildPreferenceControllers(context, null);
- }
- };
}
diff --git a/src/com/android/settings/notification/zen/ZenModeMessagesSettings.java b/src/com/android/settings/notification/zen/ZenModeMessagesSettings.java
index 3405c43..d05016e 100644
--- a/src/com/android/settings/notification/zen/ZenModeMessagesSettings.java
+++ b/src/com/android/settings/notification/zen/ZenModeMessagesSettings.java
@@ -18,14 +18,11 @@
import android.app.settings.SettingsEnums;
import android.content.Context;
-import android.provider.SearchIndexableResource;
import com.android.settings.R;
import com.android.settings.notification.NotificationBackend;
-import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
import java.util.List;
@@ -34,7 +31,6 @@
* DND Messages Settings page to determine which priority senders can bypass DND.
* "Messages" include SMS, MMS, and messaging apps.
*/
-@SearchIndexable
public class ZenModeMessagesSettings extends ZenModeSettingsBase {
@Override
@@ -62,27 +58,4 @@
public int getMetricsCategory() {
return SettingsEnums.DND_MESSAGES;
}
-
- /**
- * For Search.
- */
- public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider() {
- @Override
- public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
- boolean enabled) {
- final ArrayList<SearchIndexableResource> result = new ArrayList<>();
-
- final SearchIndexableResource sir = new SearchIndexableResource(context);
- sir.xmlResId = R.xml.zen_mode_messages_settings;
- result.add(sir);
- return result;
- }
-
- @Override
- public List<AbstractPreferenceController> createPreferenceControllers(
- Context context) {
- return buildPreferenceControllers(context, null);
- }
- };
}
diff --git a/src/com/android/settings/notification/zen/ZenModePeopleSettings.java b/src/com/android/settings/notification/zen/ZenModePeopleSettings.java
index 2b66482..ec491d8 100644
--- a/src/com/android/settings/notification/zen/ZenModePeopleSettings.java
+++ b/src/com/android/settings/notification/zen/ZenModePeopleSettings.java
@@ -26,16 +26,13 @@
import com.android.settings.R;
import com.android.settings.notification.NotificationBackend;
-import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.search.Indexable;
-import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
import java.util.List;
-@SearchIndexable
public class ZenModePeopleSettings extends ZenModeSettingsBase implements Indexable {
@Override
@@ -74,18 +71,4 @@
public int getMetricsCategory() {
return SettingsEnums.DND_PEOPLE;
}
-
- /**
- * For Search.
- */
- public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider(R.xml.zen_mode_people_settings) {
-
- @Override
- public List<AbstractPreferenceController> createPreferenceControllers(
- Context context) {
- return buildPreferenceControllers(context, null, null, null,
- null, null);
- }
- };
}
diff --git a/src/com/android/settings/notification/zen/ZenModeRestrictNotificationsSettings.java b/src/com/android/settings/notification/zen/ZenModeRestrictNotificationsSettings.java
index f121430..162f3a0 100644
--- a/src/com/android/settings/notification/zen/ZenModeRestrictNotificationsSettings.java
+++ b/src/com/android/settings/notification/zen/ZenModeRestrictNotificationsSettings.java
@@ -21,17 +21,14 @@
import android.os.Bundle;
import com.android.settings.R;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settingslib.search.Indexable;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.search.SearchIndexable;
+import com.android.settingslib.search.Indexable;
import com.android.settingslib.widget.FooterPreference;
import java.util.ArrayList;
import java.util.List;
-@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class ZenModeRestrictNotificationsSettings extends ZenModeSettingsBase implements Indexable {
@Override
@@ -72,16 +69,4 @@
public int getMetricsCategory() {
return SettingsEnums.SETTINGS_ZEN_NOTIFICATIONS;
}
-
- /**
- * For Search.
- */
- public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider(R.xml.zen_mode_restrict_notifications_settings) {
-
- @Override
- public List<AbstractPreferenceController> createPreferenceControllers(Context context) {
- return buildPreferenceControllers(context, null);
- }
- };
}
diff --git a/src/com/android/settings/notification/zen/ZenModeSettings.java b/src/com/android/settings/notification/zen/ZenModeSettings.java
index a707e53..368528c 100644
--- a/src/com/android/settings/notification/zen/ZenModeSettings.java
+++ b/src/com/android/settings/notification/zen/ZenModeSettings.java
@@ -42,10 +42,8 @@
import androidx.fragment.app.FragmentManager;
import com.android.settings.R;
-import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
import java.util.HashMap;
@@ -55,7 +53,6 @@
import java.util.Map.Entry;
import java.util.function.Predicate;
-@SearchIndexable
public class ZenModeSettings extends ZenModeSettingsBase {
@Override
public void onResume() {
@@ -354,25 +351,4 @@
return "";
}
}
-
- /**
- * For Search.
- */
- public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider(R.xml.zen_mode_settings) {
-
- @Override
- public List<String> getNonIndexableKeys(Context context) {
- List<String> keys = super.getNonIndexableKeys(context);
- keys.add(ZenModeDurationPreferenceController.KEY);
- return keys;
- }
-
- @Override
- public List<AbstractPreferenceController> createPreferenceControllers(Context
- context) {
- return buildPreferenceControllers(context, null, null,
- null, null);
- }
- };
}
diff --git a/src/com/android/settings/notification/zen/ZenModeSoundVibrationSettings.java b/src/com/android/settings/notification/zen/ZenModeSoundVibrationSettings.java
index 61e84fc..8863677 100644
--- a/src/com/android/settings/notification/zen/ZenModeSoundVibrationSettings.java
+++ b/src/com/android/settings/notification/zen/ZenModeSoundVibrationSettings.java
@@ -20,11 +20,9 @@
import android.content.Context;
import com.android.settings.R;
-import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.search.Indexable;
-import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
import java.util.List;
@@ -32,7 +30,6 @@
/**
* Settings > Sound > Do Not Disturb > Alarms & Other Interruptions
*/
-@SearchIndexable
public class ZenModeSoundVibrationSettings extends ZenModeSettingsBase implements Indexable {
@Override
@@ -61,22 +58,4 @@
public int getMetricsCategory() {
return SettingsEnums.NOTIFICATION_ZEN_MODE_PRIORITY;
}
-
- /**
- * For Search.
- */
- public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider(R.xml.zen_mode_sound_vibration_settings) {
-
- @Override
- public List<String> getNonIndexableKeys(Context context) {
- final List<String> keys = super.getNonIndexableKeys(context);
- return keys;
- }
-
- @Override
- public List<AbstractPreferenceController> createPreferenceControllers(Context context) {
- return buildPreferenceControllers(context, null);
- }
- };
}
diff --git a/src/com/android/settings/utils/ContextUtils.kt b/src/com/android/settings/utils/ContextUtils.kt
new file mode 100644
index 0000000..76b1390
--- /dev/null
+++ b/src/com/android/settings/utils/ContextUtils.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2024 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.utils
+
+import android.content.Context
+import java.util.Locale
+
+/** Returns the locale of context. */
+fun Context.getLocale(): Locale {
+ val configuration = resources.configuration ?: return Locale.getDefault()
+ val locales = configuration.locales
+ return if (locales.isEmpty) configuration.locale else locales.get(0)
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFragmentTest.java
index e9e20a4..e40f21c 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFragmentTest.java
@@ -28,6 +28,10 @@
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+import android.provider.Flags;
import androidx.fragment.app.FragmentActivity;
import androidx.preference.PreferenceManager;
@@ -57,6 +61,8 @@
public class AccessibilityButtonFragmentTest {
@Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+ @Rule
public MockitoRule mMockitoRule = MockitoJUnit.rule();
@Spy
private final Context mContext = ApplicationProvider.getApplicationContext();
@@ -84,6 +90,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
public void onCreate_navigationGestureEnabled_setCorrectTitle() {
when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode))
.thenReturn(NAV_BAR_MODE_GESTURAL);
@@ -96,7 +103,20 @@
}
@Test
- public void onCreate_navigationGestureDisabled_setCorrectTitle() {
+ @EnableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
+ public void onCreate_navigationGestureEnabled_gestureFlag_setCorrectTitle() {
+ when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode))
+ .thenReturn(NAV_BAR_MODE_GESTURAL);
+
+ mFragment.onAttach(mContext);
+ mFragment.onCreate(Bundle.EMPTY);
+
+ assertThat(mFragment.getActivity().getTitle().toString()).isEqualTo(
+ mContext.getString(R.string.accessibility_button_title));
+ }
+
+ @Test
+ public void onCreate_navigationBarEnabled_setCorrectTitle() {
when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode))
.thenReturn(NAV_BAR_MODE_2BUTTON);
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonGesturePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonGesturePreferenceControllerTest.java
index 3976056..83517c3 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonGesturePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonGesturePreferenceControllerTest.java
@@ -30,6 +30,10 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+import android.provider.Flags;
import android.provider.Settings;
import androidx.preference.ListPreference;
@@ -49,6 +53,8 @@
public class AccessibilityButtonGesturePreferenceControllerTest {
@Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+ @Rule
public final MockitoRule mockito = MockitoJUnit.rule();
@Spy
@@ -67,6 +73,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
public void getAvailabilityStatus_navigationGestureEnabled_returnAvailable() {
when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode))
.thenReturn(NAV_BAR_MODE_GESTURAL);
@@ -75,6 +82,16 @@
}
@Test
+ @EnableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
+ public void
+ getAvailabilityStatus_navigationGestureEnabled_gestureFlag_conditionallyUnavailable() {
+ when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode))
+ .thenReturn(NAV_BAR_MODE_GESTURAL);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
+ }
+
+ @Test
public void getAvailabilityStatus_navigationGestureDisabled_returnConditionallyUnavailable() {
when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode))
.thenReturn(NAV_BAR_MODE_2BUTTON);
diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java
index b461cab..414fe63 100644
--- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java
@@ -18,6 +18,7 @@
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
import static com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment.SHORTCUT_SETTINGS;
import static com.google.android.setupcompat.util.WizardManagerHelper.EXTRA_IS_DEFERRED_SETUP;
@@ -36,6 +37,7 @@
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
+import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
@@ -240,6 +242,7 @@
}
@Test
+ @DisableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
public void onSoftwareShortcutSettingChanged_softwareControllersUpdated() {
mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
mFragmentScenario.moveToState(Lifecycle.State.CREATED);
@@ -256,6 +259,27 @@
}
@Test
+ @EnableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
+ public void onSoftwareShortcutSettingsChanged_softwareControllersUpdated() {
+ mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
+ mFragmentScenario.moveToState(Lifecycle.State.CREATED);
+
+ ShortcutUtils.optInValueToSettings(
+ mContext, ShortcutConstants.UserShortcutType.SOFTWARE, TARGET);
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+
+ mFragmentScenario.onFragment(fragment -> {
+ TwoStatePreference preference = fragment.findPreference(
+ mContext.getString(R.string.accessibility_shortcut_fab_pref));
+ assertThat(preference.isChecked()).isTrue();
+ preference = fragment.findPreference(
+ mContext.getString(R.string.accessibility_shortcut_gesture_pref));
+ assertThat(preference.isChecked()).isFalse();
+ });
+ }
+
+ @Test
+ @DisableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
public void onSoftwareShortcutModeChanged_softwareControllersUpdated() {
mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
mFragmentScenario.moveToState(Lifecycle.State.CREATED);
@@ -309,6 +333,7 @@
}
@Test
+ @DisableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
public void fragmentResumed_enableTouchExploration_gestureShortcutOptionSummaryUpdated() {
String expectedSummary = StringUtil.getIcuPluralsString(mContext, 3,
R.string.accessibility_shortcut_edit_dialog_summary_gesture)
@@ -330,6 +355,26 @@
}
@Test
+ @EnableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
+ public void fragmentResumed_enableTouchExploration_gestureFlag_gestureSummaryUpdated() {
+ String expectedSummary = StringUtil.getIcuPluralsString(mContext, 3,
+ R.string.accessibility_shortcut_edit_dialog_summary_gesture);
+ mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
+ mFragmentScenario.moveToState(Lifecycle.State.RESUMED);
+
+ ShadowAccessibilityManager am = shadowOf(
+ mContext.getSystemService(AccessibilityManager.class));
+ am.setTouchExplorationEnabled(true);
+
+ mFragmentScenario.onFragment(fragment -> {
+ Preference preference = fragment.findPreference(
+ mContext.getString(R.string.accessibility_shortcut_gesture_pref));
+ assertThat(preference.getSummary().toString()).isEqualTo(expectedSummary);
+ });
+ }
+
+ @Test
+ @DisableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
public void fragmentPaused_enableTouchExploration_gestureShortcutOptionSummaryNotUpdated() {
String expectedSummary = StringUtil.getIcuPluralsString(mContext, 2,
R.string.accessibility_shortcut_edit_dialog_summary_gesture)
@@ -351,6 +396,25 @@
}
@Test
+ @EnableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
+ public void fragmentPaused_enableTouchExploration_gestureFlag_gestureSummaryNotUpdated() {
+ String expectedSummary = StringUtil.getIcuPluralsString(mContext, 2,
+ R.string.accessibility_shortcut_edit_dialog_summary_gesture);
+ mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
+ mFragmentScenario.moveToState(Lifecycle.State.RESUMED).moveToState(Lifecycle.State.STARTED);
+
+ ShadowAccessibilityManager am = shadowOf(
+ mContext.getSystemService(AccessibilityManager.class));
+ am.setTouchExplorationEnabled(true);
+
+ mFragmentScenario.onFragment(fragment -> {
+ Preference preference = fragment.findPreference(
+ mContext.getString(R.string.accessibility_shortcut_gesture_pref));
+ assertThat(preference.getSummary().toString()).isEqualTo(expectedSummary);
+ });
+ }
+
+ @Test
@EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void fragmentResumed_enableTouchExploration_qsShortcutOptionSummaryUpdated() {
String expectedSummary = StringUtil.getIcuPluralsString(mContext, 2,
@@ -441,7 +505,7 @@
assertThat(
PreferredShortcuts.retrieveUserShortcutType(
mContext, TARGET)
- ).isEqualTo(ShortcutConstants.UserShortcutType.SOFTWARE);
+ ).isEqualTo(SOFTWARE);
// Update the chosen shortcut type to Volume keys while the fragment is in the background
ShortcutUtils.optInValueToSettings(
mContext, ShortcutConstants.UserShortcutType.HARDWARE, TARGET);
@@ -461,7 +525,7 @@
assertThat(
PreferredShortcuts.retrieveUserShortcutType(
mContext, TARGET)
- ).isEqualTo(ShortcutConstants.UserShortcutType.SOFTWARE);
+ ).isEqualTo(SOFTWARE);
ShortcutUtils.optInValueToSettings(
mContext, ShortcutConstants.UserShortcutType.HARDWARE, TARGET);
diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/GestureShortcutOptionControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/GestureShortcutOptionControllerTest.java
index 1c9979f..a58cf07 100644
--- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/GestureShortcutOptionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/GestureShortcutOptionControllerTest.java
@@ -133,6 +133,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
public void getSummary_touchExplorationEnabled_notInSuw_verifySummary() {
enableTouchExploration(true);
mController.setInSetupWizard(false);
@@ -148,6 +149,19 @@
}
@Test
+ @EnableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
+ public void getSummary_touchExplorationEnabled_notInSuw_gestureFlag_verifySummary() {
+ enableTouchExploration(true);
+ mController.setInSetupWizard(false);
+ String expected = StringUtil.getIcuPluralsString(
+ mContext,
+ /* count= */ 3,
+ R.string.accessibility_shortcut_edit_dialog_summary_gesture);
+
+ assertThat(mController.getSummary().toString()).isEqualTo(expected);
+ }
+
+ @Test
public void getSummary_touchExplorationEnabled_inSuw_verifySummary() {
enableTouchExploration(true);
mController.setInSetupWizard(true);
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceControllerTest.java
index 7cd6734..f6e4d2a 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceControllerTest.java
@@ -47,6 +47,7 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
+// LINT.IfChange
@RunWith(RobolectricTestRunner.class)
public class MainlineModuleVersionPreferenceControllerTest {
@@ -222,3 +223,4 @@
when(mPackageManager.getPackageInfo(eq(provider), anyInt())).thenReturn(info);
}
}
+// LINT.ThenChange(MainlineModuleVersionPreferenceTest.kt)
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceTest.kt b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceTest.kt
new file mode 100644
index 0000000..8fc1a2b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceTest.kt
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2024 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.deviceinfo.firmwareversion
+
+import android.content.ContextWrapper
+import android.content.Intent
+import android.content.pm.PackageInfo
+import android.content.pm.PackageManager
+import android.content.pm.ResolveInfo
+import android.content.res.Resources
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
+import androidx.preference.Preference
+import androidx.test.core.app.ApplicationProvider
+import com.android.settings.R
+import com.android.settings.deviceinfo.firmwareversion.MainlineModuleVersionPreference.Companion.MODULE_UPDATE_ACTION
+import com.android.settings.deviceinfo.firmwareversion.MainlineModuleVersionPreference.Companion.MODULE_UPDATE_ACTION_V2
+import com.android.settings.flags.Flags
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.any
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.eq
+import org.mockito.kotlin.KStubbing
+import org.mockito.kotlin.doAnswer
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.doThrow
+import org.mockito.kotlin.mock
+import org.robolectric.RobolectricTestRunner
+
+// LINT.IfChange
+@RunWith(RobolectricTestRunner::class)
+class MainlineModuleVersionPreferenceTest {
+ @get:Rule val setFlagsRule = SetFlagsRule()
+
+ private lateinit var mockPackageManager: PackageManager
+ private lateinit var mockResources: Resources
+
+ private val context =
+ object : ContextWrapper(ApplicationProvider.getApplicationContext()) {
+ override fun getPackageManager(): PackageManager = mockPackageManager
+
+ override fun getResources(): Resources = mockResources
+ }
+
+ private val mainlineModuleVersionPreference = MainlineModuleVersionPreference()
+
+ @Test
+ fun isAvailable_noMainlineModuleProvider_unavailable() {
+ createMocks("", null)
+ assertThat(mainlineModuleVersionPreference.isAvailable(context)).isFalse()
+ }
+
+ @Test
+ fun isAvailable_noMainlineModulePackageInfo_unavailable() {
+ createMocks("test.provider", PackageManager.NameNotFoundException())
+ assertThat(mainlineModuleVersionPreference.isAvailable(context)).isFalse()
+ }
+
+ @Test
+ fun isAvailable_hasMainlineModulePackageInfo_available() {
+ createMocks("test.provider", "test version 123")
+ assertThat(mainlineModuleVersionPreference.isAvailable(context)).isTrue()
+ }
+
+ @Test
+ fun getSummary_versionIsNull() {
+ createMocks("test.provider", PackageInfo())
+ assertThat(mainlineModuleVersionPreference.getSummary(context)).isNull()
+ }
+
+ @Test
+ fun getSummary_versionIsEmpty() {
+ createMocks("test.provider", "")
+ assertThat(mainlineModuleVersionPreference.getSummary(context)).isNull()
+ }
+
+ @Test
+ fun getSummary_versionIsNotDate() {
+ createMocks("test.provider", "a")
+ assertThat(mainlineModuleVersionPreference.getSummary(context)).isEqualTo("a")
+ }
+
+ @Test
+ fun getSummary_versionIsMonth() {
+ createMocks("test.provider", "2019-05")
+ assertThat(mainlineModuleVersionPreference.getSummary(context)).isEqualTo("May 1, 2019")
+ }
+
+ @Test
+ fun getSummary_versionIsDate() {
+ createMocks("test.provider", "2019-05-13")
+ assertThat(mainlineModuleVersionPreference.getSummary(context)).isEqualTo("May 13, 2019")
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_MAINLINE_MODULE_EXPLICIT_INTENT)
+ fun intentV2_preferenceShouldBeSelectable() {
+ intent_preferenceShouldBeSelectable(MODULE_UPDATE_ACTION_V2, MODULE_PACKAGE)
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_MAINLINE_MODULE_EXPLICIT_INTENT)
+ fun intent_preferenceShouldBeSelectable() {
+ intent_preferenceShouldBeSelectable(MODULE_UPDATE_ACTION, null)
+ }
+
+ private fun intent_preferenceShouldBeSelectable(action: String, intentPackage: String?) {
+ createMocks("test.provider", "test version 123") {
+ on { resolveActivity(any(), anyInt()) } doAnswer
+ {
+ when {
+ (it.arguments[0] as Intent).action == action -> ResolveInfo()
+ else -> null
+ }
+ }
+ }
+
+ val preference = Preference(context)
+ mainlineModuleVersionPreference.bind(preference, mainlineModuleVersionPreference)
+
+ val intent = preference.intent!!
+ assertThat(intent.action).isEqualTo(action)
+ assertThat(preference.isSelectable).isTrue()
+ assertThat(intent.`package`).isEqualTo(intentPackage)
+ }
+
+ @Test
+ fun intent_null() {
+ createMocks("test.provider", "test version 123")
+
+ val preference = Preference(context)
+ mainlineModuleVersionPreference.bind(preference, mainlineModuleVersionPreference)
+
+ assertThat(preference.intent).isNull()
+ assertThat(preference.isSelectable).isFalse()
+ }
+
+ private fun createMocks(
+ pkg: String,
+ pkgInfo: Any?,
+ stubbing: KStubbing<PackageManager>.() -> Unit = {},
+ ) {
+ mockResources = mock {
+ on { getString(R.string.config_mainline_module_update_package) } doReturn MODULE_PACKAGE
+ on {
+ getString(com.android.internal.R.string.config_defaultModuleMetadataProvider)
+ } doReturn pkg
+ }
+
+ mockPackageManager = mock {
+ when (pkgInfo) {
+ is PackageInfo -> on { getPackageInfo(eq(pkg), anyInt()) } doReturn pkgInfo
+ is String ->
+ on { getPackageInfo(eq(pkg), anyInt()) } doReturn
+ PackageInfo().apply { versionName = pkgInfo }
+ is Exception -> on { getPackageInfo(eq(pkg), anyInt()) } doThrow pkgInfo
+ else -> {}
+ }
+ stubbing.invoke(this)
+ }
+ }
+
+ companion object {
+ const val MODULE_PACKAGE = "com.android.vending"
+ }
+}
+// LINT.ThenChange(MainlineModuleVersionPreferenceControllerTest.java)
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceControllerTest.java
index ccc91e6..8bafc23 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceControllerTest.java
@@ -46,6 +46,7 @@
import java.util.Collections;
+// LINT.IfChange
@RunWith(RobolectricTestRunner.class)
public class SecurityPatchLevelPreferenceControllerTest {
@@ -108,3 +109,4 @@
verify(mContext).startActivity(any());
}
}
+// LINT.ThenChange(SecurityPatchLevelPreferenceTest.kt)
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceTest.kt b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceTest.kt
new file mode 100644
index 0000000..695c0b6
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceTest.kt
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2024 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.deviceinfo.firmwareversion
+
+import android.content.Context
+import android.os.Build
+import androidx.test.core.app.ApplicationProvider
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.util.ReflectionHelpers
+
+// LINT.IfChange
+@RunWith(RobolectricTestRunner::class)
+class SecurityPatchLevelPreferenceTest {
+ private val context: Context = ApplicationProvider.getApplicationContext()
+
+ private val securityPatchLevelPreference = SecurityPatchLevelPreference()
+
+ @Test
+ fun isAvailable_noPatch_unavailable() {
+ setSecurityPatch("")
+ assertThat(securityPatchLevelPreference.isAvailable(context)).isFalse()
+ }
+
+ @Test
+ fun isAvailable_hasPatch_available() {
+ setSecurityPatch("foobar")
+ assertThat(securityPatchLevelPreference.isAvailable(context)).isTrue()
+ }
+
+ @Test
+ fun getSummary_patchIsDate() {
+ setSecurityPatch("2024-09-24")
+ assertThat(securityPatchLevelPreference.getSummary(context)).isEqualTo("September 24, 2024")
+ }
+
+ @Test
+ fun getSummary_patchIsNotDate() {
+ setSecurityPatch("foobar")
+ assertThat(securityPatchLevelPreference.getSummary(context)).isEqualTo("foobar")
+ }
+
+ private fun setSecurityPatch(patch: String) {
+ ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SECURITY_PATCH", patch)
+ }
+}
+// LINT.ThenChange(SecurityPatchLevelPreferenceControllerTest.java)
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenModeSettingsTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenModeSettingsTest.java
index 27c4ec4..22d6963 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenModeSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenModeSettingsTest.java
@@ -98,13 +98,4 @@
assertThat(mBuilder.getCallsSettingSummary(policy))
.isEqualTo("Starred contacts and repeat callers");
}
-
- @Test
- public void searchProvider_shouldIndexDefaultXml() {
- final List<SearchIndexableResource> sir = ZenModeSettings.SEARCH_INDEX_DATA_PROVIDER
- .getXmlResourcesToIndex(mContext, true /* enabled */);
-
- assertThat(sir).hasSize(1);
- assertThat(sir.get(0).xmlResId).isEqualTo(R.xml.zen_mode_settings);
- }
}