From 2a41717baf78164783bb02b39e998ca9b8964cac Mon Sep 17 00:00:00 2001 From: George Chang Date: Mon, 5 Aug 2024 09:31:59 +0000 Subject: [PATCH 1/9] Add intent filters for NfcTagAppsSettings This is required by NfcAdapter.ACTION_CHANGE_TAG_INTENT_PREFERENCE to expose shortcuts for tag apps. Flag: android.nfc.nfc_check_tag_intent_preference Test: adb shell am start -a android.nfc.action.CHANGE_TAG_INTENT_PREFERENCE Bug: 335916336 Change-Id: Idee7ded0f8b07ea6ff38dd646c60798847abc31a --- AndroidManifest.xml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 5cd2bb394f8..382791631fe 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -5372,6 +5372,23 @@ + + + + + + + + + + + From 4c5f8481bd36ca3b5e8c3afd1f3cf466ea59f10f Mon Sep 17 00:00:00 2001 From: mxyyiyi Date: Wed, 13 Nov 2024 15:05:04 +0800 Subject: [PATCH 2/9] Remove nested PreferenceCategory in Battery Usage page. https://screenshot.googleplex.com/83LwysPKMCRoRoG Bug: 349652542 Test: atest BatteryUsageBreakdownControllerTest Flag: EXEMPT for simple fix Change-Id: If97b5e3de9757b814ad72aa47f6491d29106b8a3 --- res/xml/power_usage_advanced.xml | 7 +- .../AnomalyAppItemPreference.java | 3 +- .../BatteryUsageBreakdownController.java | 77 ++++++++++--------- .../BatteryUsageBreakdownControllerTest.java | 39 +++++----- 4 files changed, 63 insertions(+), 63 deletions(-) diff --git a/res/xml/power_usage_advanced.xml b/res/xml/power_usage_advanced.xml index f2c3d878e19..3258b7b9ca2 100644 --- a/res/xml/power_usage_advanced.xml +++ b/res/xml/power_usage_advanced.xml @@ -59,16 +59,15 @@ - + diff --git a/src/com/android/settings/fuelgauge/batteryusage/AnomalyAppItemPreference.java b/src/com/android/settings/fuelgauge/batteryusage/AnomalyAppItemPreference.java index 2f139ecaabc..592d30833ed 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/AnomalyAppItemPreference.java +++ b/src/com/android/settings/fuelgauge/batteryusage/AnomalyAppItemPreference.java @@ -16,6 +16,7 @@ package com.android.settings.fuelgauge.batteryusage; +import android.annotation.Nullable; import android.content.Context; import android.text.TextUtils; import android.view.View; @@ -37,7 +38,7 @@ class AnomalyAppItemPreference extends PowerGaugePreference { setLayoutResource(R.layout.anomaly_app_item_preference); } - void setAnomalyHint(CharSequence anomalyHintText) { + void setAnomalyHint(@Nullable CharSequence anomalyHintText) { if (!TextUtils.equals(mAnomalyHintText, anomalyHintText)) { mAnomalyHintText = anomalyHintText; notifyChanged(); diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java index 09940b3d7f5..6fd4eb5449f 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java @@ -31,7 +31,6 @@ import android.view.View; import android.widget.AdapterView; import androidx.preference.Preference; -import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceScreen; @@ -68,11 +67,11 @@ public class BatteryUsageBreakdownController extends BasePreferenceController private static final String ROOT_PREFERENCE_KEY = "battery_usage_breakdown"; private static final String FOOTER_PREFERENCE_KEY = "battery_usage_footer"; private static final String SPINNER_PREFERENCE_KEY = "battery_usage_spinner"; - private static final String APP_LIST_PREFERENCE_KEY = "app_list"; private static final String PACKAGE_NAME_NONE = "none"; private static final String SLOT_TIMESTAMP = "slot_timestamp"; private static final String ANOMALY_KEY = "anomaly_key"; private static final String KEY_SPINNER_POSITION = "spinner_position"; + private static final int ENTRY_PREF_ORDER_OFFSET = 100; private static final List EMPTY_ENTRY_LIST = new ArrayList<>(); private static int sUiMode = Configuration.UI_MODE_NIGHT_UNDEFINED; @@ -89,8 +88,7 @@ public class BatteryUsageBreakdownController extends BasePreferenceController private SettingsSpinnerAdapter mSpinnerAdapter; @VisibleForTesting Context mPrefContext; - @VisibleForTesting PreferenceCategory mRootPreference; - @VisibleForTesting PreferenceGroup mAppListPreferenceGroup; + @VisibleForTesting PreferenceGroup mRootPreferenceGroup; @VisibleForTesting FooterPreference mFooterPreference; @VisibleForTesting BatteryDiffData mBatteryDiffData; @VisibleForTesting String mBatteryUsageBreakdownTitleLastFullChargeText; @@ -143,7 +141,7 @@ public class BatteryUsageBreakdownController extends BasePreferenceController public void onDestroy() { mHandler.removeCallbacksAndMessages(/* token= */ null); mPreferenceCache.clear(); - mAppListPreferenceGroup.removeAll(); + mRootPreferenceGroup.removeAll(); } @Override @@ -226,9 +224,8 @@ public class BatteryUsageBreakdownController extends BasePreferenceController public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mPrefContext = screen.getContext(); - mRootPreference = screen.findPreference(ROOT_PREFERENCE_KEY); + mRootPreferenceGroup = screen.findPreference(ROOT_PREFERENCE_KEY); mSpinnerPreference = screen.findPreference(SPINNER_PREFERENCE_KEY); - mAppListPreferenceGroup = screen.findPreference(APP_LIST_PREFERENCE_KEY); mFooterPreference = screen.findPreference(FOOTER_PREFERENCE_KEY); mBatteryUsageBreakdownTitleLastFullChargeText = mPrefContext.getString( @@ -242,7 +239,7 @@ public class BatteryUsageBreakdownController extends BasePreferenceController R.string.battery_usage_less_than_percent_content_description, formatPercentage); - mAppListPreferenceGroup.setOrderingAsAdded(false); + mRootPreferenceGroup.setOrderingAsAdded(false); mSpinnerAdapter = new SettingsSpinnerAdapter<>(mPrefContext); mSpinnerAdapter.addAll( new String[] { @@ -328,8 +325,9 @@ public class BatteryUsageBreakdownController extends BasePreferenceController : mPrefContext.getString( R.string.battery_usage_breakdown_title_for_slot, accessibilitySlotTimestamp); - mRootPreference.setTitle(Utils.createAccessibleSequence(displayTitle, accessibilityTitle)); - mRootPreference.setVisible(true); + mRootPreferenceGroup.setTitle( + Utils.createAccessibleSequence(displayTitle, accessibilityTitle)); + mRootPreferenceGroup.setVisible(true); } private void showFooterPreference(boolean isAllBatteryUsageEmpty) { @@ -350,7 +348,6 @@ public class BatteryUsageBreakdownController extends BasePreferenceController return; } mSpinnerPreference.setVisible(true); - mAppListPreferenceGroup.setVisible(true); mHandler.post( () -> { removeAndCacheAllUnusedPreferences(); @@ -374,7 +371,7 @@ public class BatteryUsageBreakdownController extends BasePreferenceController } final long start = System.currentTimeMillis(); final List entries = getBatteryDiffEntries(); - int prefIndex = mAppListPreferenceGroup.getPreferenceCount(); + int preferenceOrder = ENTRY_PREF_ORDER_OFFSET; for (BatteryDiffEntry entry : entries) { boolean isAdded = false; final String appLabel = entry.getAppLabel(); @@ -384,33 +381,32 @@ public class BatteryUsageBreakdownController extends BasePreferenceController continue; } final String prefKey = entry.getKey(); - AnomalyAppItemPreference pref = mAppListPreferenceGroup.findPreference(prefKey); - if (pref != null) { + AnomalyAppItemPreference preference = mRootPreferenceGroup.findPreference(prefKey); + if (preference != null) { isAdded = true; } else { - pref = (AnomalyAppItemPreference) mPreferenceCache.get(prefKey); + preference = (AnomalyAppItemPreference) mPreferenceCache.get(prefKey); } // Creates new instance if cached preference is not found. - if (pref == null) { - pref = new AnomalyAppItemPreference(mPrefContext); - pref.setKey(prefKey); - mPreferenceCache.put(prefKey, pref); + if (preference == null) { + preference = new AnomalyAppItemPreference(mPrefContext); + preference.setKey(prefKey); + mPreferenceCache.put(prefKey, preference); } - pref.setIcon(appIcon); - pref.setTitle(appLabel); - pref.setOrder(prefIndex); - pref.setSingleLineTitle(true); + preference.setIcon(appIcon); + preference.setTitle(appLabel); + preference.setOrder(++preferenceOrder); + preference.setSingleLineTitle(true); // Updates App item preference style - pref.setAnomalyHint(isAnomalyBatteryDiffEntry(entry) ? mAnomalyHintString : null); + preference.setAnomalyHint(isAnomalyBatteryDiffEntry(entry) ? mAnomalyHintString : null); // Sets the BatteryDiffEntry to preference for launching detailed page. - pref.setBatteryDiffEntry(entry); - pref.setSelectable(entry.validForRestriction()); - setPreferencePercentage(pref, entry); - setPreferenceSummary(pref, entry); + preference.setBatteryDiffEntry(entry); + preference.setSelectable(entry.validForRestriction()); + setPreferencePercentage(preference, entry); + setPreferenceSummary(preference, entry); if (!isAdded) { - mAppListPreferenceGroup.addPreference(pref); + mRootPreferenceGroup.addPreference(preference); } - prefIndex++; } Log.d( TAG, @@ -424,17 +420,22 @@ public class BatteryUsageBreakdownController extends BasePreferenceController List entries = getBatteryDiffEntries(); Set entryKeySet = new ArraySet<>(entries.size()); entries.forEach(entry -> entryKeySet.add(entry.getKey())); - final int prefsCount = mAppListPreferenceGroup.getPreferenceCount(); - for (int index = prefsCount - 1; index >= 0; index--) { - final Preference pref = mAppListPreferenceGroup.getPreference(index); - if (entryKeySet.contains(pref.getKey())) { - // The pref is still used, don't remove. + final int preferenceCount = mRootPreferenceGroup.getPreferenceCount(); + for (int index = preferenceCount - 1; index >= 0; index--) { + final Preference preference = mRootPreferenceGroup.getPreference(index); + if ((preference instanceof SettingsSpinnerPreference) + || (preference instanceof FooterPreference)) { + // Consider the app preference only and skip others continue; } - if (!TextUtils.isEmpty(pref.getKey())) { - mPreferenceCache.put(pref.getKey(), pref); + if (entryKeySet.contains(preference.getKey())) { + // Don't remove the preference if it is still in use + continue; } - mAppListPreferenceGroup.removePreference(pref); + if (!TextUtils.isEmpty(preference.getKey())) { + mPreferenceCache.put(preference.getKey(), preference); + } + mRootPreferenceGroup.removePreference(preference); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java index 85fc6e210ce..c4cbb988ae6 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java @@ -59,11 +59,12 @@ public final class BatteryUsageBreakdownControllerTest { private static final String PREF_KEY2 = "pref_key2"; private static final String PREF_SUMMARY = "fake preference summary"; private static final String KEY_SPINNER_POSITION = "spinner_position"; - private static final long TIME_LESS_THAN_HALF_MINUTE = DateUtils.MINUTE_IN_MILLIS / 2 - 1; + private static final int ENTRY_PREF_ORDER_OFFSET = 100; + private static final long TIME_LESS_THAN_HALF_MINUTE = DateUtils.MINUTE_IN_MILLIS / 2 - 1; @Mock private InstrumentedPreferenceFragment mFragment; @Mock private SettingsActivity mSettingsActivity; - @Mock private PreferenceGroup mAppListPreferenceGroup; + @Mock private PreferenceGroup mRootPreferenceGroup; @Mock private Drawable mDrawable; @Mock private BatteryHistEntry mBatteryHistEntry; @Mock private AnomalyAppItemPreference mAnomalyAppItemPreference; @@ -90,7 +91,7 @@ public final class BatteryUsageBreakdownControllerTest { .when(mFeatureFactory.powerUsageFeatureProvider) .getHideApplicationSet(); mBatteryUsageBreakdownController = createController(); - mBatteryUsageBreakdownController.mAppListPreferenceGroup = mAppListPreferenceGroup; + mBatteryUsageBreakdownController.mRootPreferenceGroup = mRootPreferenceGroup; mBatteryDiffEntry = new BatteryDiffEntry( mContext, @@ -130,7 +131,7 @@ public final class BatteryUsageBreakdownControllerTest { BatteryDiffEntry.sResourceCache.put( "fakeBatteryDiffEntryKey", new BatteryEntry.NameAndIcon("fakeName", /* icon= */ null, /* iconId= */ 1)); - doReturn(mAnomalyAppItemPreference).when(mAppListPreferenceGroup).findPreference(PREF_KEY); + doReturn(mAnomalyAppItemPreference).when(mRootPreferenceGroup).findPreference(PREF_KEY); } @Test @@ -147,7 +148,7 @@ public final class BatteryUsageBreakdownControllerTest { @Test public void onDestroy_removeAllPreferenceFromPreferenceGroup() { mBatteryUsageBreakdownController.onDestroy(); - verify(mAppListPreferenceGroup).removeAll(); + verify(mRootPreferenceGroup).removeAll(); } @Test @@ -162,11 +163,11 @@ public final class BatteryUsageBreakdownControllerTest { @Test public void addAllPreferences_addAllPreferences() { final String appLabel = "fake app label"; - doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount(); + doReturn(1).when(mRootPreferenceGroup).getPreferenceCount(); doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon(); doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel(); doReturn(PREF_KEY).when(mBatteryDiffEntry).getKey(); - doReturn(null).when(mAppListPreferenceGroup).findPreference(PREF_KEY); + doReturn(null).when(mRootPreferenceGroup).findPreference(PREF_KEY); doReturn(false).when(mBatteryDiffEntry).validForRestriction(); mBatteryUsageBreakdownController.addAllPreferences(); @@ -177,11 +178,11 @@ public final class BatteryUsageBreakdownControllerTest { mBatteryUsageBreakdownController.mPreferenceCache.get(PREF_KEY); assertThat(pref).isNotNull(); // Verifies the added preference configuration. - verify(mAppListPreferenceGroup).addPreference(pref); + verify(mRootPreferenceGroup).addPreference(pref); assertThat(pref.getKey()).isEqualTo(PREF_KEY); assertThat(pref.getTitle().toString()).isEqualTo(appLabel); assertThat(pref.getIcon()).isEqualTo(mDrawable); - assertThat(pref.getOrder()).isEqualTo(1); + assertThat(pref.getOrder()).isEqualTo(ENTRY_PREF_ORDER_OFFSET + 1); assertThat(pref.getBatteryDiffEntry()).isSameInstanceAs(mBatteryDiffEntry); assertThat(pref.isSingleLineTitle()).isTrue(); assertThat(pref.isSelectable()).isFalse(); @@ -190,20 +191,20 @@ public final class BatteryUsageBreakdownControllerTest { @Test public void addPreferenceToScreen_alreadyInScreen_notAddPreferenceAgain() { final String appLabel = "fake app label"; - doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount(); + doReturn(1).when(mRootPreferenceGroup).getPreferenceCount(); doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon(); doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel(); doReturn(PREF_KEY).when(mBatteryDiffEntry).getKey(); mBatteryUsageBreakdownController.addAllPreferences(); - verify(mAppListPreferenceGroup, never()).addPreference(any()); + verify(mRootPreferenceGroup, never()).addPreference(any()); } @Test public void removeAndCacheAllUnusedPreferences_removePref_buildCacheAndRemoveAllPreference() { - doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount(); - doReturn(mAnomalyAppItemPreference).when(mAppListPreferenceGroup).getPreference(0); + doReturn(1).when(mRootPreferenceGroup).getPreferenceCount(); + doReturn(mAnomalyAppItemPreference).when(mRootPreferenceGroup).getPreference(0); doReturn(PREF_KEY2).when(mBatteryHistEntry).getKey(); doReturn(PREF_KEY).when(mAnomalyAppItemPreference).getKey(); // Ensures the testing data is correct. @@ -213,13 +214,13 @@ public final class BatteryUsageBreakdownControllerTest { assertThat(mBatteryUsageBreakdownController.mPreferenceCache.get(PREF_KEY)) .isEqualTo(mAnomalyAppItemPreference); - verify(mAppListPreferenceGroup).removePreference(mAnomalyAppItemPreference); + verify(mRootPreferenceGroup).removePreference(mAnomalyAppItemPreference); } @Test public void removeAndCacheAllUnusedPreferences_keepPref_KeepAllPreference() { - doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount(); - doReturn(mAnomalyAppItemPreference).when(mAppListPreferenceGroup).getPreference(0); + doReturn(1).when(mRootPreferenceGroup).getPreferenceCount(); + doReturn(mAnomalyAppItemPreference).when(mRootPreferenceGroup).getPreference(0); doReturn(PREF_KEY).when(mBatteryDiffEntry).getKey(); doReturn(PREF_KEY).when(mAnomalyAppItemPreference).getKey(); // Ensures the testing data is correct. @@ -227,15 +228,13 @@ public final class BatteryUsageBreakdownControllerTest { mBatteryUsageBreakdownController.removeAndCacheAllUnusedPreferences(); - verify(mAppListPreferenceGroup, never()).removePreference(any()); + verify(mRootPreferenceGroup, never()).removePreference(any()); assertThat(mBatteryUsageBreakdownController.mPreferenceCache).isEmpty(); } @Test public void handlePreferenceTreeClick_notPowerGaugePreference_returnFalse() { - assertThat( - mBatteryUsageBreakdownController.handlePreferenceTreeClick( - mAppListPreferenceGroup)) + assertThat(mBatteryUsageBreakdownController.handlePreferenceTreeClick(mRootPreferenceGroup)) .isFalse(); verify(mMetricsFeatureProvider, never()) From a28c5e1ca520183f6d1fc7b7659cd263404105d3 Mon Sep 17 00:00:00 2001 From: Wenyu Zhang Date: Mon, 18 Nov 2024 03:21:28 +0000 Subject: [PATCH 3/9] Skip user restriction check on desktop The Catalyst user restriction check crashes the Settings app on desktop device. Skip the check for desktop device for now since this crash blocks many development/testing work. Change-Id: I27e3db48ce175381917681fe517d63bf6b4aede2 Bug: b/379130874, b/377600992 Test: verify locally on desktop device, presubmit Flag: EXEMPT_bug fix --- src/com/android/settings/SettingsPreferenceFragment.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java index 66ccb6f2648..e5a12847623 100644 --- a/src/com/android/settings/SettingsPreferenceFragment.java +++ b/src/com/android/settings/SettingsPreferenceFragment.java @@ -17,6 +17,7 @@ package com.android.settings; import static com.android.settings.SettingsActivity.EXTRA_FRAGMENT_ARG_KEY; +import static com.android.settingslib.media.PhoneMediaDevice.isDesktop; import android.app.Activity; import android.app.Dialog; @@ -186,6 +187,13 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF /** Returns if catalyst is enabled on current screen. */ protected final boolean isCatalystEnabled() { + // TODO(b/379130874): make Catalyst compatible with desktop device, such as user restriction + // check. + Context context = getContext(); + if (context != null && isDesktop(context)) { + return false; + } + return getPreferenceScreenCreator() != null; } From 26c16784d4ce94db4500bcc15ff2a87ad5db6f49 Mon Sep 17 00:00:00 2001 From: tomhsu Date: Mon, 18 Nov 2024 03:23:36 +0000 Subject: [PATCH 4/9] Make final confirmation of dialog only shows in-call state - Add a condition of in-call state to restrict dialog. Flag: EXEMPT bug fix Fix: b/374355096 Test: atest passed. Test: Manual test passed. Change-Id: I8d8505870973acbf57db8d3c5032619a31f9eb4d --- .../system/reset/ResetNetworkConfirm.kt | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/system/reset/ResetNetworkConfirm.kt b/src/com/android/settings/system/reset/ResetNetworkConfirm.kt index b353f69d9db..3412825b62d 100644 --- a/src/com/android/settings/system/reset/ResetNetworkConfirm.kt +++ b/src/com/android/settings/system/reset/ResetNetworkConfirm.kt @@ -21,6 +21,7 @@ import android.app.settings.SettingsEnums import android.content.DialogInterface import android.os.Bundle import android.os.Looper +import android.telecom.TelecomManager import android.telephony.SubscriptionManager import android.util.Log import android.view.LayoutInflater @@ -89,7 +90,12 @@ class ResetNetworkConfirm : InstrumentedFragment() { /** Configure the UI for the final confirmation interaction */ private fun View.establishFinalConfirmationState() { requireViewById(R.id.execute_reset_network).setOnClickListener { - showResetInternetDialog(); + val tm = context.getSystemService(TelecomManager::class.java) + if (tm != null && tm.isInCall) { + showResetInternetDialog(); + } else { + onResetClicked() + } } } @@ -138,9 +144,13 @@ class ResetNetworkConfirm : InstrumentedFragment() { * settings to its factory-default state. */ @VisibleForTesting - suspend fun onResetClicked() { - showProgressDialog() - resetNetwork() + fun onResetClicked() { + if (!Utils.isMonkeyRunning() && !resetStarted) { + resetStarted = true + viewLifecycleOwner.lifecycleScope.launch { + showProgressDialog() + resetNetwork() } + } } private fun showProgressDialog() { @@ -165,10 +175,7 @@ class ResetNetworkConfirm : InstrumentedFragment() { val builder = AlertDialog.Builder(requireContext()) val resetInternetClickListener = DialogInterface.OnClickListener { dialog, which -> - if (!Utils.isMonkeyRunning() && !resetStarted) { - resetStarted = true - viewLifecycleOwner.lifecycleScope.launch { onResetClicked() } - } + onResetClicked() } builder.setTitle(R.string.reset_your_internet_title) From e24189df08e8fbf5e301cee1449cddbd317fa9ba Mon Sep 17 00:00:00 2001 From: Weng Su Date: Mon, 18 Nov 2024 13:12:04 +0800 Subject: [PATCH 5/9] [Catalyst] Sync APM preference key value Bug: 375925972 Flag: com.android.settings.flags.catalyst_network_provider_and_internet_screen Test: Manual testing atest -c AirplaneModePreferenceControllerTest \ AirplaneModePreferenceControllerComponentTest Change-Id: Ibd1e6af39afa768ef40d280ca97fb39ce38bd1c0 --- .../android/settings/network/AirplaneModePreference.kt | 8 ++++++-- .../network/AirplaneModePreferenceController.java | 4 +--- .../AirplaneModePreferenceControllerComponentTest.java | 3 +-- .../network/AirplaneModePreferenceControllerTest.java | 6 ++---- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/network/AirplaneModePreference.kt b/src/com/android/settings/network/AirplaneModePreference.kt index 5b7903c2b2d..2d9fbe9da3f 100644 --- a/src/com/android/settings/network/AirplaneModePreference.kt +++ b/src/com/android/settings/network/AirplaneModePreference.kt @@ -18,7 +18,7 @@ package com.android.settings.network import android.content.Context import android.content.pm.PackageManager -import android.provider.Settings.Global.AIRPLANE_MODE_ON +import android.provider.Settings import androidx.annotation.DrawableRes import com.android.settings.R import com.android.settingslib.datastore.SettingsGlobalStore @@ -27,7 +27,7 @@ import com.android.settingslib.metadata.SwitchPreference // LINT.IfChange class AirplaneModePreference : - SwitchPreference(AIRPLANE_MODE_ON, R.string.airplane_mode), + SwitchPreference(KEY, R.string.airplane_mode), PreferenceAvailabilityProvider { override val icon: Int @@ -38,5 +38,9 @@ class AirplaneModePreference : override fun isAvailable(context: Context) = (context.resources.getBoolean(R.bool.config_show_toggle_airplane) && !context.packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)) + + companion object { + const val KEY = Settings.Global.AIRPLANE_MODE_ON + } } // LINT.ThenChange(AirplaneModePreferenceController.java) diff --git a/src/com/android/settings/network/AirplaneModePreferenceController.java b/src/com/android/settings/network/AirplaneModePreferenceController.java index 430feb10eec..ca8595f7781 100644 --- a/src/com/android/settings/network/AirplaneModePreferenceController.java +++ b/src/com/android/settings/network/AirplaneModePreferenceController.java @@ -15,8 +15,6 @@ */ package com.android.settings.network; -import static android.provider.SettingsSlicesContract.KEY_AIRPLANE_MODE; - import static com.android.settings.network.SatelliteWarningDialogActivity.EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG; import static com.android.settings.network.SatelliteWarningDialogActivity.TYPE_IS_AIRPLANE_MODE; @@ -95,7 +93,7 @@ public class AirplaneModePreferenceController extends TogglePreferenceController @Override public boolean handlePreferenceTreeClick(Preference preference) { - if (KEY_AIRPLANE_MODE.equals(preference.getKey()) && isAvailable()) { + if (AirplaneModePreference.KEY.equals(preference.getKey()) && isAvailable()) { // In ECM mode launch ECM app dialog if (mAirplaneModeEnabler.isInEcmMode()) { if (mFragment != null) { diff --git a/tests/componenttests/src/com/android/settings/network/AirplaneModePreferenceControllerComponentTest.java b/tests/componenttests/src/com/android/settings/network/AirplaneModePreferenceControllerComponentTest.java index 27e67e586c7..9617cfd1a28 100644 --- a/tests/componenttests/src/com/android/settings/network/AirplaneModePreferenceControllerComponentTest.java +++ b/tests/componenttests/src/com/android/settings/network/AirplaneModePreferenceControllerComponentTest.java @@ -20,7 +20,6 @@ import static com.google.common.truth.Truth.assertThat; import android.app.Instrumentation; import android.provider.Settings; -import android.provider.SettingsSlicesContract; import android.util.Log; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -64,7 +63,7 @@ public class AirplaneModePreferenceControllerComponentTest { public void test_on_off_airplane_mode_multiple_times() { AirplaneModePreferenceController controller = new AirplaneModePreferenceController(mInstrumentation.getTargetContext(), - SettingsSlicesContract.KEY_AIRPLANE_MODE); + AirplaneModePreference.KEY); for (int i = 0; i < 10; ++i) { Log.d(TAG, "Test #" + (i + 1)); diff --git a/tests/unit/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java index 7612805370a..2205929fedd 100644 --- a/tests/unit/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java @@ -16,8 +16,6 @@ package com.android.settings.network; -import static android.provider.SettingsSlicesContract.KEY_AIRPLANE_MODE; - import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -78,12 +76,12 @@ public class AirplaneModePreferenceControllerTest { mResolver = mContext.getContentResolver(); doReturn(mPackageManager).when(mContext).getPackageManager(); mController = new AirplaneModePreferenceController(mContext, - KEY_AIRPLANE_MODE); + AirplaneModePreference.KEY); mPreferenceManager = new PreferenceManager(mContext); mScreen = mPreferenceManager.createPreferenceScreen(mContext); mPreference = new RestrictedSwitchPreference(mContext); - mPreference.setKey(KEY_AIRPLANE_MODE); + mPreference.setKey(AirplaneModePreference.KEY); mScreen.addPreference(mPreference); mController.setFragment(null); } From 9d82dc346d3759cf6dc0aadb7fc50edc5e8df904 Mon Sep 17 00:00:00 2001 From: tomhsu Date: Mon, 18 Nov 2024 08:33:34 +0000 Subject: [PATCH 6/9] Add flag for migrating UX to Android settings app. Flag:com.android.settings.flags.satellite_oem_settings_ux_migration Bug: 378781925 Test: make pass Change-Id: I6f409817a6fb508131e0f787aca4fbfa7e2e5494 --- aconfig/settings_experience_flag_declarations.aconfig | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/aconfig/settings_experience_flag_declarations.aconfig b/aconfig/settings_experience_flag_declarations.aconfig index 17d0059608c..ae3af2441cc 100644 --- a/aconfig/settings_experience_flag_declarations.aconfig +++ b/aconfig/settings_experience_flag_declarations.aconfig @@ -17,3 +17,14 @@ flag { purpose: PURPOSE_BUGFIX } } + +flag { + name: "satellite_oem_settings_ux_migration" + namespace: "settings_experience" + description: "Migrate satellite UX to Android Settings" + bug: "378781925" + metadata { + purpose: PURPOSE_BUGFIX + } +} + From 581b9b43462f3a3ff6df2c84ed235b08c1cabca8 Mon Sep 17 00:00:00 2001 From: "Chaitanya Cheemala (xWF)" Date: Mon, 18 Nov 2024 09:56:41 +0000 Subject: [PATCH 7/9] Revert "Add intent filters for NfcTagAppsSettings" This reverts commit 2a41717baf78164783bb02b39e998ca9b8964cac. Reason for revert: Likely culprit for b/379618293 - verifying through ABTD before revert submission. This is part of the standard investigation process, and does not mean your CL will be reverted. Change-Id: I8988203a5bfa7a8e000e7833bca812d04ba30d12 --- AndroidManifest.xml | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 382791631fe..5cd2bb394f8 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -5372,23 +5372,6 @@ - - - - - - - - - - - From a2ccf8979db8a4c3adca98bf755fd70091817122 Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Mon, 18 Nov 2024 18:45:53 +0800 Subject: [PATCH 8/9] [expressive design] SimsSection Bug: 349681531 Flag: EXEMPT bug fix Test: visual Change-Id: I2d38ad81ce93d47819fa82d46f1c11a9b8c9271d --- src/com/android/settings/spa/network/SimsSection.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/spa/network/SimsSection.kt b/src/com/android/settings/spa/network/SimsSection.kt index bd55b32a5e8..7d88748785d 100644 --- a/src/com/android/settings/spa/network/SimsSection.kt +++ b/src/com/android/settings/spa/network/SimsSection.kt @@ -21,7 +21,6 @@ import android.content.Intent import android.os.UserManager import android.telephony.SubscriptionInfo import android.telephony.euicc.EuiccManager -import androidx.compose.foundation.layout.Column import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Add import androidx.compose.material.icons.outlined.SimCard @@ -44,6 +43,7 @@ import com.android.settings.network.telephony.euicc.EuiccRepository import com.android.settings.network.telephony.phoneNumberFlow import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel +import com.android.settingslib.spa.widget.ui.Category import com.android.settingslib.spa.widget.ui.SettingsIcon import com.android.settingslib.spaprivileged.model.enterprise.Restrictions import com.android.settingslib.spaprivileged.template.preference.RestrictedPreference @@ -53,7 +53,7 @@ import kotlinx.coroutines.launch @Composable fun SimsSection(subscriptionInfoList: List) { - Column { + Category { for (subInfo in subscriptionInfoList) { SimPreference(subInfo) } From c4dd7a8288189aa507d0ed329f8feaf86fda0ced Mon Sep 17 00:00:00 2001 From: Matthew DeVore Date: Tue, 12 Nov 2024 01:09:09 +0000 Subject: [PATCH 9/9] Add flag for surfacing display topology prototype This will force the topology pane to show in the displays list UI, and make the displays list UI accessible from the connected devices fragment, regardless of the number of actual devices connected. Once the display topology pane is using real data, this will still be useful to not skip the display list UI, which currently can only be shown when there is more than one external display connected. To turn off, use: $ adb shell device_config put display_manager com.android.settings.flags.display_topology_pane_in_display_list false Test: verify "External Display" is always shown in connected devices list Test: verify displays list is shown when 0 or 1 external display is connected Bug: b/352648432 Flag: com.android.settings.flags.display_topology_pane_in_display_list Change-Id: Ic9205c69d9de09e6fb8ae33e17fbf00fe5574447 --- ...settings_connecteddevice_flag_declarations.aconfig | 7 +++++++ .../display/ExternalDisplayPreferenceFragment.java | 10 +++++++++- .../display/ExternalDisplaySettingsConfiguration.java | 11 ++++++++++- .../display/ExternalDisplayUpdater.java | 5 +++++ .../ConnectedDeviceGroupControllerTest.java | 2 ++ .../display/ExternalDisplayTestBase.java | 4 +++- 6 files changed, 36 insertions(+), 3 deletions(-) diff --git a/aconfig/settings_connecteddevice_flag_declarations.aconfig b/aconfig/settings_connecteddevice_flag_declarations.aconfig index 872026027b1..eede0931b97 100644 --- a/aconfig/settings_connecteddevice_flag_declarations.aconfig +++ b/aconfig/settings_connecteddevice_flag_declarations.aconfig @@ -15,6 +15,13 @@ flag { bug: "253296253" } +flag { + name: "display_topology_pane_in_display_list" + namespace: "display_manager" + description: "Shows the connected display setting and shows the topology pane in the display list, even with only one display connected." + bug: "352648432" +} + flag { name: "enable_auth_challenge_for_usb_preferences" namespace: "safety_center" diff --git a/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java b/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java index 7b5bef625f6..c53be1aa932 100644 --- a/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java +++ b/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java @@ -22,6 +22,7 @@ import static android.view.Display.INVALID_DISPLAY; import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.EXTERNAL_DISPLAY_HELP_URL; import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.DISPLAY_ID_ARG; import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.EXTERNAL_DISPLAY_NOT_FOUND_RESOURCE; +import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.forceShowDisplayList; import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.isDisplayAllowed; import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.isUseDisplaySettingEnabled; import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.isResolutionSettingEnabled; @@ -295,13 +296,20 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen updateScreenForDisplayId(getDisplayIdArg(), screen, mInjector.getContext()); } + private boolean okayToBypassDisplayListSelection() { + if (mInjector != null && forceShowDisplayList(mInjector.getFlags())) { + return false; + } + return !mPreviouslyShownListOfDisplays; + } + private void updateScreenForDisplayId(final int displayId, @NonNull final PreferenceScreen screen, @NonNull Context context) { final var displaysToShow = getDisplaysToShow(displayId); if (displaysToShow.isEmpty() && displayId == INVALID_DISPLAY) { showTextWhenNoDisplaysToShow(screen, context); } else if (displaysToShow.size() == 1 - && ((displayId == INVALID_DISPLAY && !mPreviouslyShownListOfDisplays) + && ((displayId == INVALID_DISPLAY && okayToBypassDisplayListSelection()) || displaysToShow.get(0).getDisplayId() == displayId)) { showDisplaySettings(displaysToShow.get(0), screen, context); } else if (displayId == INVALID_DISPLAY) { diff --git a/src/com/android/settings/connecteddevice/display/ExternalDisplaySettingsConfiguration.java b/src/com/android/settings/connecteddevice/display/ExternalDisplaySettingsConfiguration.java index d0427991e42..6e56965c3ef 100644 --- a/src/com/android/settings/connecteddevice/display/ExternalDisplaySettingsConfiguration.java +++ b/src/com/android/settings/connecteddevice/display/ExternalDisplaySettingsConfiguration.java @@ -319,7 +319,16 @@ public class ExternalDisplaySettingsConfiguration { */ public static boolean isExternalDisplaySettingsPageEnabled(@NonNull FeatureFlags flags) { return flags.rotationConnectedDisplaySetting() - || flags.resolutionAndEnableConnectedDisplaySetting(); + || flags.resolutionAndEnableConnectedDisplaySetting() + || flags.displayTopologyPaneInDisplayList(); + } + + /** + * If true, indicates the display list activity should be shown even if there is only one + * display. + */ + public static boolean forceShowDisplayList(@NonNull FeatureFlags flags) { + return flags.displayTopologyPaneInDisplayList(); } static boolean isDisplayAllowed(@NonNull Display display, diff --git a/src/com/android/settings/connecteddevice/display/ExternalDisplayUpdater.java b/src/com/android/settings/connecteddevice/display/ExternalDisplayUpdater.java index 64dd7bb2fdf..99a248fe477 100644 --- a/src/com/android/settings/connecteddevice/display/ExternalDisplayUpdater.java +++ b/src/com/android/settings/connecteddevice/display/ExternalDisplayUpdater.java @@ -16,6 +16,7 @@ package com.android.settings.connecteddevice.display; +import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.forceShowDisplayList; import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.isDisplayAllowed; import android.content.Context; @@ -142,6 +143,10 @@ public class ExternalDisplayUpdater { } } + if (forceShowDisplayList(mInjector.getFlags())) { + return context.getString(R.string.external_display_off); + } + for (var display : mInjector.getAllDisplays()) { if (display != null && isDisplayAllowed(display, mInjector)) { return context.getString(R.string.external_display_off); diff --git a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceGroupControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceGroupControllerTest.java index 5a9f2bc8692..6fb2d114f46 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceGroupControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceGroupControllerTest.java @@ -17,6 +17,7 @@ package com.android.settings.connecteddevice; import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE; import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; +import static com.android.settings.flags.Flags.FLAG_DISPLAY_TOPOLOGY_PANE_IN_DISPLAY_LIST; import static com.android.settings.flags.Flags.FLAG_RESOLUTION_AND_ENABLE_CONNECTED_DISPLAY_SETTING; import static com.android.settings.flags.Flags.FLAG_ROTATION_CONNECTED_DISPLAY_SETTING; @@ -128,6 +129,7 @@ public class ConnectedDeviceGroupControllerTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); + mFakeFeatureFlags.setFlag(FLAG_DISPLAY_TOPOLOGY_PANE_IN_DISPLAY_LIST, false); mFakeFeatureFlags.setFlag(FLAG_ROTATION_CONNECTED_DISPLAY_SETTING, true); mFakeFeatureFlags.setFlag(FLAG_RESOLUTION_AND_ENABLE_CONNECTED_DISPLAY_SETTING, true); diff --git a/tests/unit/src/com/android/settings/connecteddevice/display/ExternalDisplayTestBase.java b/tests/unit/src/com/android/settings/connecteddevice/display/ExternalDisplayTestBase.java index 4cba1ef4666..874ecbd1197 100644 --- a/tests/unit/src/com/android/settings/connecteddevice/display/ExternalDisplayTestBase.java +++ b/tests/unit/src/com/android/settings/connecteddevice/display/ExternalDisplayTestBase.java @@ -16,8 +16,9 @@ package com.android.settings.connecteddevice.display; import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.VIRTUAL_DISPLAY_PACKAGE_NAME_SYSTEM_PROPERTY; -import static com.android.settings.flags.Flags.FLAG_ROTATION_CONNECTED_DISPLAY_SETTING; +import static com.android.settings.flags.Flags.FLAG_DISPLAY_TOPOLOGY_PANE_IN_DISPLAY_LIST; import static com.android.settings.flags.Flags.FLAG_RESOLUTION_AND_ENABLE_CONNECTED_DISPLAY_SETTING; +import static com.android.settings.flags.Flags.FLAG_ROTATION_CONNECTED_DISPLAY_SETTING; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; @@ -74,6 +75,7 @@ public class ExternalDisplayTestBase { mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext); doReturn(0).when(mMockedIDisplayManager).getPreferredWideGamutColorSpaceId(); mDisplayManagerGlobal = new DisplayManagerGlobal(mMockedIDisplayManager); + mFlags.setFlag(FLAG_DISPLAY_TOPOLOGY_PANE_IN_DISPLAY_LIST, false); mFlags.setFlag(FLAG_ROTATION_CONNECTED_DISPLAY_SETTING, true); mFlags.setFlag(FLAG_RESOLUTION_AND_ENABLE_CONNECTED_DISPLAY_SETTING, true); mDisplays = new Display[] {