Merge "Avoid system app crashes for absent TEXT_SERVICES_MANAGER_SERVICE in Wear" into main
diff --git a/nfc/api/current.txt b/nfc/api/current.txt
index 5b6b6c0..e7cb76c 100644
--- a/nfc/api/current.txt
+++ b/nfc/api/current.txt
@@ -205,6 +205,7 @@
method public int getSelectionModeForCategory(String);
method public boolean isDefaultServiceForAid(android.content.ComponentName, String);
method public boolean isDefaultServiceForCategory(android.content.ComponentName, String);
+ method @FlaggedApi("android.nfc.enable_card_emulation_euicc") public boolean isEuiccSupported();
method public boolean registerAidsForService(android.content.ComponentName, String, java.util.List<java.lang.String>);
method @FlaggedApi("android.nfc.nfc_read_polling_loop") public boolean registerPollingLoopFilterForService(@NonNull android.content.ComponentName, @NonNull String, boolean);
method @FlaggedApi("android.nfc.nfc_read_polling_loop") public boolean registerPollingLoopPatternFilterForService(@NonNull android.content.ComponentName, @NonNull String, boolean);
diff --git a/nfc/api/system-current.txt b/nfc/api/system-current.txt
index cc5ff81..bc8a7af 100644
--- a/nfc/api/system-current.txt
+++ b/nfc/api/system-current.txt
@@ -98,7 +98,6 @@
public final class CardEmulation {
method @FlaggedApi("android.permission.flags.wallet_role_enabled") @Nullable @RequiresPermission(android.Manifest.permission.NFC_PREFERRED_PAYMENT_INFO) public static android.content.ComponentName getPreferredPaymentService(@NonNull android.content.Context);
method @FlaggedApi("android.nfc.enable_nfc_mainline") @NonNull public java.util.List<android.nfc.cardemulation.ApduServiceInfo> getServices(@NonNull String, int);
- method @FlaggedApi("android.nfc.enable_card_emulation_euicc") public boolean isEuiccSupported();
method @FlaggedApi("android.nfc.nfc_override_recover_routing_table") public void overrideRoutingTable(@NonNull android.app.Activity, int, int);
method @FlaggedApi("android.nfc.nfc_override_recover_routing_table") public void recoverRoutingTable(@NonNull android.app.Activity);
}
diff --git a/nfc/java/android/nfc/cardemulation/CardEmulation.java b/nfc/java/android/nfc/cardemulation/CardEmulation.java
index a72a896..83ad32c 100644
--- a/nfc/java/android/nfc/cardemulation/CardEmulation.java
+++ b/nfc/java/android/nfc/cardemulation/CardEmulation.java
@@ -992,9 +992,7 @@
* Is EUICC supported as a Secure Element EE which supports off host card emulation.
*
* @return true if the device supports EUICC for off host card emulation, false otherwise.
- * @hide
*/
- @SystemApi
@FlaggedApi(android.nfc.Flags.FLAG_ENABLE_CARD_EMULATION_EUICC)
public boolean isEuiccSupported() {
return callServiceReturn(() -> sService.isEuiccSupported(), false);
diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBinding.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBinding.kt
index 9be0e71..5fcf478 100644
--- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBinding.kt
+++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBinding.kt
@@ -108,6 +108,9 @@
/** Abstract preference screen to provide preference hierarchy and binding factory. */
interface PreferenceScreenCreator : PreferenceScreenMetadata, PreferenceScreenProvider {
+ /** Returns if the flag (e.g. for rollout) is enabled on current screen. */
+ fun isFlagEnabled(context: Context): Boolean = true
+
val preferenceBindingFactory: PreferenceBindingFactory
get() = DefaultPreferenceBindingFactory
diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt
index 68f640b..a270681 100644
--- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt
+++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt
@@ -44,13 +44,8 @@
fun createPreferenceScreenFromResource() =
factory.inflate(getPreferenceScreenResId(context))
- if (!usePreferenceScreenMetadata()) return createPreferenceScreenFromResource()
-
- val screenKey = getPreferenceScreenBindingKey(context)
val screenCreator =
- (PreferenceScreenRegistry[screenKey] as? PreferenceScreenCreator)
- ?: return createPreferenceScreenFromResource()
-
+ getPreferenceScreenCreator(context) ?: return createPreferenceScreenFromResource()
val preferenceBindingFactory = screenCreator.preferenceBindingFactory
val preferenceHierarchy = screenCreator.getPreferenceHierarchy(context)
val preferenceScreen =
@@ -73,17 +68,14 @@
return preferenceScreen
}
- /**
- * Returns if preference screen metadata can be used to set up preference screen.
- *
- * This is for flagging purpose. If false (e.g. flag is disabled), xml resource is used to build
- * preference screen.
- */
- protected open fun usePreferenceScreenMetadata(): Boolean = false
-
/** Returns the xml resource to create preference screen. */
@XmlRes protected open fun getPreferenceScreenResId(context: Context): Int = 0
+ protected fun getPreferenceScreenCreator(context: Context): PreferenceScreenCreator? =
+ (PreferenceScreenRegistry[getPreferenceScreenBindingKey(context)]
+ as? PreferenceScreenCreator)
+ ?.run { if (isFlagEnabled(context)) this else null }
+
override fun getPreferenceScreenBindingKey(context: Context): String? =
arguments?.getString(EXTRA_BINDING_SCREEN_KEY)
@@ -91,19 +83,4 @@
preferenceScreenBindingHelper?.close()
super.onDestroy()
}
-
- companion object {
- /** Returns [PreferenceFragment] instance to display the preference screen of given key. */
- fun of(screenKey: String): PreferenceFragment? {
- val screenMetadata = PreferenceScreenRegistry[screenKey] ?: return null
- if (
- screenMetadata is PreferenceScreenCreator && screenMetadata.hasCompleteHierarchy()
- ) {
- return PreferenceFragment().apply {
- arguments = Bundle().apply { putString(EXTRA_BINDING_SCREEN_KEY, screenKey) }
- }
- }
- return null
- }
- }
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModelTest.kt
index e6a24e3..5c47f55 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModelTest.kt
@@ -21,13 +21,17 @@
import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
+import com.android.compose.animation.scene.Edge
import com.android.compose.animation.scene.Swipe
import com.android.compose.animation.scene.SwipeDirection
+import com.android.compose.animation.scene.UserAction
+import com.android.compose.animation.scene.UserActionResult
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.kosmos.testScope
import com.android.systemui.lifecycle.activateIn
+import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.shared.model.TransitionKeys.ToSplitShade
import com.android.systemui.shade.data.repository.shadeRepository
import com.android.systemui.shade.domain.interactor.shadeInteractor
@@ -92,4 +96,42 @@
assertThat(userActions?.get(Swipe(SwipeDirection.Down))?.transitionKey).isNull()
}
+
+ @Test
+ @DisableFlags(DualShade.FLAG_NAME)
+ fun swipeDownWithTwoFingers_singleShade_goesToQuickSettings() =
+ testScope.runTest {
+ val userActions by collectLastValue(underTest.actions)
+ shadeRepository.setShadeLayoutWide(false)
+ runCurrent()
+
+ assertThat(userActions?.get(swipeDownFromTopWithTwoFingers()))
+ .isEqualTo(UserActionResult(Scenes.QuickSettings))
+ }
+
+ @Test
+ @DisableFlags(DualShade.FLAG_NAME)
+ fun swipeDownWithTwoFingers_splitShade_goesToShade() =
+ testScope.runTest {
+ val userActions by collectLastValue(underTest.actions)
+ shadeRepository.setShadeLayoutWide(true)
+ runCurrent()
+
+ assertThat(userActions?.get(swipeDownFromTopWithTwoFingers()))
+ .isEqualTo(UserActionResult(Scenes.Shade, ToSplitShade))
+ }
+
+ @Test
+ @EnableFlags(DualShade.FLAG_NAME)
+ fun swipeDownWithTwoFingers_dualShadeEnabled_isNull() =
+ testScope.runTest {
+ val userActions by collectLastValue(underTest.actions)
+ runCurrent()
+
+ assertThat(userActions?.get(swipeDownFromTopWithTwoFingers())).isNull()
+ }
+
+ private fun swipeDownFromTopWithTwoFingers(): UserAction {
+ return Swipe(direction = SwipeDirection.Down, pointerCount = 2, fromSource = Edge.Top)
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModel.kt
index 7bf2b63..5ff507a 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/GoneUserActionsViewModel.kt
@@ -19,7 +19,6 @@
import com.android.compose.animation.scene.Edge
import com.android.compose.animation.scene.Swipe
import com.android.compose.animation.scene.SwipeDirection
-import com.android.compose.animation.scene.TransitionKey
import com.android.compose.animation.scene.UserAction
import com.android.compose.animation.scene.UserActionResult
import com.android.systemui.scene.shared.model.Overlays
@@ -38,21 +37,25 @@
shadeInteractor.shadeMode.collect { shadeMode ->
setActions(
when (shadeMode) {
- ShadeMode.Single -> fullscreenShadeActions()
- ShadeMode.Split -> fullscreenShadeActions(transitionKey = ToSplitShade)
+ ShadeMode.Single -> singleShadeActions()
+ ShadeMode.Split -> splitShadeActions()
ShadeMode.Dual -> dualShadeActions()
}
)
}
}
- private fun fullscreenShadeActions(
- transitionKey: TransitionKey? = null
- ): Map<UserAction, UserActionResult> {
+ private fun singleShadeActions(): Map<UserAction, UserActionResult> {
return mapOf(
- Swipe.Down to UserActionResult(Scenes.Shade, transitionKey),
- Swipe(direction = SwipeDirection.Down, pointerCount = 2, fromSource = Edge.Top) to
- UserActionResult(Scenes.Shade, transitionKey),
+ Swipe.Down to Scenes.Shade,
+ swipeDownFromTopWithTwoFingers() to Scenes.QuickSettings,
+ )
+ }
+
+ private fun splitShadeActions(): Map<UserAction, UserActionResult> {
+ return mapOf(
+ Swipe.Down to UserActionResult(Scenes.Shade, ToSplitShade),
+ swipeDownFromTopWithTwoFingers() to UserActionResult(Scenes.Shade, ToSplitShade),
)
}
@@ -64,6 +67,10 @@
)
}
+ private fun swipeDownFromTopWithTwoFingers(): UserAction {
+ return Swipe(direction = SwipeDirection.Down, pointerCount = 2, fromSource = Edge.Top)
+ }
+
@AssistedFactory
interface Factory {
fun create(): GoneUserActionsViewModel
diff --git a/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java b/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java
index f31a87f..4224338 100644
--- a/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java
+++ b/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java
@@ -60,6 +60,7 @@
public final class TelephonyUtils {
private static final String LOG_TAG = "TelephonyUtils";
+ public static final boolean FORCE_VERBOSE_STATE_LOGGING = false; /* stopship if true */
public static boolean IS_USER = "user".equals(android.os.Build.TYPE);
public static boolean IS_DEBUGGABLE = SystemProperties.getInt("ro.debuggable", 0) == 1;