diff options
14 files changed, 140 insertions, 45 deletions
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationControllerTest.java index 60f1d271c3af..d829c6afb787 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationControllerTest.java @@ -104,6 +104,7 @@ public class ExpandedAnimationControllerTest extends PhysicsAnimationLayoutTestC @Test public void testExpansionAndCollapse() throws Exception { expand(); + waitForAnimation(); testBubblesInCorrectExpandedPositions(); waitForMainThread(); diff --git a/packages/SystemUI/compose/core/src/com/android/compose/PlatformButtons.kt b/packages/SystemUI/compose/core/src/com/android/compose/PlatformButtons.kt index 20efea513b3a..df50eb8fa3e8 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/PlatformButtons.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/PlatformButtons.kt @@ -31,6 +31,7 @@ import androidx.compose.material3.IconButtonDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Shape import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp @@ -40,12 +41,15 @@ fun PlatformButton( modifier: Modifier = Modifier, enabled: Boolean = true, colors: ButtonColors = filledButtonColors(), + contentPadding: PaddingValues = ButtonPaddings, + shape: Shape = ButtonDefaults.shape, content: @Composable RowScope.() -> Unit, ) { androidx.compose.material3.Button( modifier = modifier.heightIn(min = 36.dp), colors = colors, - contentPadding = ButtonPaddings, + contentPadding = contentPadding, + shape = shape, onClick = onClick, enabled = enabled, ) { diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt index 0f1cb409439f..547461e5faf2 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt @@ -26,16 +26,19 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredHeight import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.systemGestureExclusion import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.geometry.Rect +import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.boundsInWindow import androidx.compose.ui.layout.onPlaced @@ -59,6 +62,7 @@ import com.android.systemui.qs.panels.ui.compose.EditMode import com.android.systemui.qs.panels.ui.compose.TileDetails import com.android.systemui.qs.panels.ui.compose.TileGrid import com.android.systemui.qs.panels.ui.compose.toolbar.Toolbar +import com.android.systemui.qs.ui.composable.QuickSettingsShade.systemGestureExclusionInShade import com.android.systemui.qs.ui.viewmodel.QuickSettingsContainerViewModel import com.android.systemui.qs.ui.viewmodel.QuickSettingsShadeOverlayActionsViewModel import com.android.systemui.qs.ui.viewmodel.QuickSettingsShadeOverlayContentViewModel @@ -254,9 +258,7 @@ fun ContentScope.QuickSettingsLayout( BrightnessSliderContainer( viewModel = viewModel.brightnessSliderViewModel, containerColor = OverlayShade.Colors.PanelBackground, - modifier = - Modifier.fillMaxWidth() - .height(QuickSettingsShade.Dimensions.BrightnessSliderHeight), + modifier = Modifier.systemGestureExclusionInShade().fillMaxWidth(), ) Box { @@ -280,6 +282,25 @@ object QuickSettingsShade { object Dimensions { val Padding = 16.dp val ToolbarHeight = 48.dp - val BrightnessSliderHeight = 64.dp + } + + /** + * Applies system gesture exclusion to a component adding [Dimensions.Padding] to left and + * right. + */ + @Composable + fun Modifier.systemGestureExclusionInShade(): Modifier { + val density = LocalDensity.current + return systemGestureExclusion { layoutCoordinates -> + val sidePadding = with(density) { Dimensions.Padding.toPx() } + Rect( + offset = Offset(x = -sidePadding, y = 0f), + size = + Size( + width = layoutCoordinates.size.width.toFloat() + 2 * sidePadding, + height = layoutCoordinates.size.height.toFloat(), + ), + ) + } } } diff --git a/packages/SystemUI/res/drawable/media_output_dialog_seekbar_background.xml b/packages/SystemUI/res/drawable/media_output_dialog_seekbar_background.xml index adeb81fcf820..592217bb0e8f 100644 --- a/packages/SystemUI/res/drawable/media_output_dialog_seekbar_background.xml +++ b/packages/SystemUI/res/drawable/media_output_dialog_seekbar_background.xml @@ -23,16 +23,24 @@ /> <solid android:color="@android:color/transparent" /> <size - android:height="64dp"/> + android:height="@dimen/media_output_dialog_item_height"/> + </shape> + </item> + <item android:id="@+id/contrast_dot" android:right="8dp" android:gravity="center_vertical|end"> + <shape android:shape="oval"> + <solid android:color="@color/media_dialog_seekbar_progress" /> + <size + android:width="4dp" + android:height="4dp" /> </shape> </item> <item android:id="@android:id/progress"> <clip> <shape> <corners - android:radius="16dp"/> + android:radius="@dimen/media_output_dialog_background_radius"/> <size - android:height="64dp"/> + android:height="@dimen/media_output_dialog_item_height"/> <solid android:color="@color/material_dynamic_primary80" /> </shape> </clip> diff --git a/packages/SystemUI/res/layout/media_output_list_item_advanced.xml b/packages/SystemUI/res/layout/media_output_list_item_advanced.xml index 6b868b3c7379..ec80cf0d2f54 100644 --- a/packages/SystemUI/res/layout/media_output_list_item_advanced.xml +++ b/packages/SystemUI/res/layout/media_output_list_item_advanced.xml @@ -151,6 +151,8 @@ <ImageButton android:id="@+id/end_area_image_button" android:background="@android:color/transparent" + android:padding="20dp" + android:scaleType="fitCenter" android:layout_width="match_parent" android:layout_height="match_parent" android:contentDescription="@null" diff --git a/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt b/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt index b13f6df3f4f5..79748a255ed0 100644 --- a/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt +++ b/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt @@ -70,6 +70,7 @@ import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.app.tracing.coroutines.launchTraced as launch +import com.android.compose.modifiers.padding import com.android.compose.ui.graphics.drawInOverlay import com.android.systemui.Flags import com.android.systemui.biometrics.Utils.toBitmap @@ -348,7 +349,13 @@ fun BrightnessSliderContainer( DisposableEffect(Unit) { onDispose { viewModel.setIsDragging(false) } } - Box(modifier = modifier.fillMaxWidth().sysuiResTag("brightness_slider")) { + Box( + modifier = + modifier + .padding(vertical = { SliderBackgroundFrameSize.height.roundToPx() }) + .fillMaxWidth() + .sysuiResTag("brightness_slider") + ) { BrightnessSlider( gammaValue = gamma, valueRange = viewModel.minBrightness.value..viewModel.maxBrightness.value, diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapterLegacy.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapterLegacy.java index f8e57ef489aa..300a3578bb8f 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapterLegacy.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapterLegacy.java @@ -186,8 +186,7 @@ public class MediaOutputAdapterLegacy extends MediaOutputAdapterBase { mVolumeValueText.setTextColor(mController.getColorItemContent()); mIconAreaLayout.setBackground(null); updateIconAreaClickListener(null); - mSeekBar.setProgressTintList( - ColorStateList.valueOf(mController.getColorSeekbarProgress())); + updateSeekBarProgressColor(); updateContainerContentA11yImportance(true /* isImportant */); renderItem(mediaItem, position); } @@ -332,6 +331,16 @@ public class MediaOutputAdapterLegacy extends MediaOutputAdapterBase { } } + private void updateSeekBarProgressColor() { + mSeekBar.setProgressTintList( + ColorStateList.valueOf(mController.getColorSeekbarProgress())); + final Drawable contrastDotDrawable = + ((LayerDrawable) mSeekBar.getProgressDrawable()).findDrawableByLayerId( + R.id.contrast_dot); + contrastDotDrawable.setTintList( + ColorStateList.valueOf(mController.getColorItemContent())); + } + void updateSeekbarProgressBackground() { final ClipDrawable clipDrawable = (ClipDrawable) ((LayerDrawable) mSeekBar.getProgressDrawable()) diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt index 44c8dc38ff8c..5e7e0c97a147 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt @@ -42,7 +42,6 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredHeightIn @@ -128,6 +127,7 @@ import com.android.systemui.qs.panels.ui.compose.QuickQuickSettings import com.android.systemui.qs.panels.ui.compose.TileGrid import com.android.systemui.qs.shared.ui.ElementKeys import com.android.systemui.qs.ui.composable.QuickSettingsShade +import com.android.systemui.qs.ui.composable.QuickSettingsShade.systemGestureExclusionInShade import com.android.systemui.qs.ui.composable.QuickSettingsTheme import com.android.systemui.res.R import com.android.systemui.util.LifecycleFragment @@ -716,10 +716,7 @@ constructor( BrightnessSliderContainer( viewModel = containerViewModel.brightnessSliderViewModel, modifier = - Modifier.fillMaxWidth() - .height( - QuickSettingsShade.Dimensions.BrightnessSliderHeight - ), + Modifier.systemGestureExclusionInShade().fillMaxWidth(), ) } val TileGrid = diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/scroll/LongScreenshotActivity.java b/packages/SystemUI/src/com/android/systemui/screenshot/scroll/LongScreenshotActivity.java index 48e08a0496c1..ecea30f1b1c3 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/scroll/LongScreenshotActivity.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/scroll/LongScreenshotActivity.java @@ -16,6 +16,8 @@ package com.android.systemui.screenshot.scroll; +import static com.android.systemui.shared.Flags.usePreferredImageEditor; + import android.app.Activity; import android.app.ActivityOptions; import android.content.ComponentName; @@ -355,26 +357,47 @@ public class LongScreenshotActivity extends Activity { mScreenshotUserHandle, false, /* activityOptions */ null, /* transitionCoordinator */ null); } else { - String editorPackage = getString(R.string.config_screenshotEditor); - Intent intent = new Intent(Intent.ACTION_EDIT); - intent.setDataAndType(uri, "image/png"); - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION - | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); - Bundle options = null; - - // Skip shared element transition for implicit edit intents - if (!TextUtils.isEmpty(editorPackage)) { - intent.setComponent(ComponentName.unflattenFromString(editorPackage)); - mTransitionView.setImageBitmap(mOutputBitmap); - mTransitionView.setVisibility(View.VISIBLE); - mTransitionView.setTransitionName( - ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME); - options = ActivityOptions.makeSceneTransitionAnimation(this, mTransitionView, - ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME).toBundle(); - // TODO: listen for transition completing instead of finishing onStop - mTransitionStarted = true; + if (usePreferredImageEditor()) { + Intent intent = mActionIntentCreator.createEdit(uri); + Bundle options = null; + + if (intent.getComponent() != null) { + // Modify intent for shared transition if we're opening a specific editor. + intent.removeFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.removeFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); + mTransitionView.setImageBitmap(mOutputBitmap); + mTransitionView.setVisibility(View.VISIBLE); + mTransitionView.setTransitionName( + ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME); + options = ActivityOptions.makeSceneTransitionAnimation(this, mTransitionView, + ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME).toBundle(); + // TODO: listen for transition completing instead of finishing onStop + mTransitionStarted = true; + } + + startActivity(intent, options); + } else { + String editorPackage = getString(R.string.config_screenshotEditor); + Intent intent = new Intent(Intent.ACTION_EDIT); + intent.setDataAndType(uri, "image/png"); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION + | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + Bundle options = null; + + // Skip shared element transition for implicit edit intents + if (!TextUtils.isEmpty(editorPackage)) { + intent.setComponent(ComponentName.unflattenFromString(editorPackage)); + mTransitionView.setImageBitmap(mOutputBitmap); + mTransitionView.setVisibility(View.VISIBLE); + mTransitionView.setTransitionName( + ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME); + options = ActivityOptions.makeSceneTransitionAnimation(this, mTransitionView, + ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME).toBundle(); + // TODO: listen for transition completing instead of finishing onStop + mTransitionStarted = true; + } + startActivity(intent, options); } - startActivity(intent, options); } } diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/ComposeDialogComposableProvider.kt b/packages/SystemUI/src/com/android/systemui/settings/brightness/ComposeDialogComposableProvider.kt index dde2ebc4a237..9e20055de856 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/brightness/ComposeDialogComposableProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/ComposeDialogComposableProvider.kt @@ -17,7 +17,6 @@ package com.android.systemui.settings.brightness import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView @@ -26,7 +25,6 @@ import com.android.compose.theme.PlatformTheme import com.android.systemui.brightness.ui.compose.BrightnessSliderContainer import com.android.systemui.brightness.ui.viewmodel.BrightnessSliderViewModel import com.android.systemui.lifecycle.rememberViewModel -import com.android.systemui.qs.ui.composable.QuickSettingsShade object ComposeDialogComposableProvider { @@ -46,10 +44,7 @@ private fun BrightnessSliderForDialog( rememberViewModel(traceName = "BrightnessDialog.viewModel") { brightnessSliderViewModelFactory.create(false) } - BrightnessSliderContainer( - viewModel = viewModel, - Modifier.fillMaxWidth().height(QuickSettingsShade.Dimensions.BrightnessSliderHeight), - ) + BrightnessSliderContainer(viewModel = viewModel, Modifier.fillMaxWidth()) } class ComposableProvider( diff --git a/services/core/java/com/android/server/clipboard/OWNERS b/services/core/java/com/android/server/clipboard/OWNERS index 0d5dbf9acac3..4ca4b80ab2f0 100644 --- a/services/core/java/com/android/server/clipboard/OWNERS +++ b/services/core/java/com/android/server/clipboard/OWNERS @@ -1,3 +1,3 @@ -per-file EmulatorClipboardMonitor.java = bohu@google.com,lfy@google.com,rkir@google.com +per-file EmulatorClipboardMonitor.java = bohu@google.com,rkir@google.com olilan@google.com diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/OWNERS b/services/core/java/com/android/server/locksettings/recoverablekeystore/OWNERS index ebf7e6bed064..e54061670346 100644 --- a/services/core/java/com/android/server/locksettings/recoverablekeystore/OWNERS +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/OWNERS @@ -1,3 +1,2 @@ aseemk@google.com -bozhu@google.com dementyev@google.com diff --git a/services/core/jni/stats/OWNERS b/services/core/jni/stats/OWNERS index 8d87925fbe45..03086b3e44fc 100644 --- a/services/core/jni/stats/OWNERS +++ b/services/core/jni/stats/OWNERS @@ -1,6 +1,5 @@ jeffreyhuang@google.com muhammadq@google.com -sharaieko@google.com singhtejinder@google.com tsaichristine@google.com yaochen@google.com diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java index 014f0a2229c1..42e457c97fd4 100644 --- a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java +++ b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java @@ -31,6 +31,7 @@ import android.content.ContentResolver; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.res.Resources; import android.credentials.ClearCredentialStateRequest; import android.credentials.CreateCredentialException; import android.credentials.CreateCredentialRequest; @@ -50,6 +51,7 @@ import android.credentials.ISetEnabledProvidersCallback; import android.credentials.PrepareGetCredentialResponseInternal; import android.credentials.RegisterCredentialDescriptionRequest; import android.credentials.UnregisterCredentialDescriptionRequest; +import android.credentials.flags.Flags; import android.os.Binder; import android.os.CancellationSignal; import android.os.IBinder; @@ -79,6 +81,7 @@ import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -535,6 +538,33 @@ public final class CredentialManagerService final int userId = UserHandle.getCallingUserId(); final int callingUid = Binder.getCallingUid(); + if (Flags.safeguardCandidateCredentialsApiCaller()) { + try { + String credentialManagerAutofillCompName = mContext.getResources().getString( + R.string.config_defaultCredentialManagerAutofillService); + ComponentName componentName = ComponentName.unflattenFromString( + credentialManagerAutofillCompName); + if (componentName == null) { + throw new SecurityException( + "Credential Autofill service does not exist on this device."); + } + PackageManager pm = mContext.createContextAsUser( + UserHandle.getUserHandleForUid(callingUid), 0).getPackageManager(); + String callingProcessPackage = pm.getNameForUid(callingUid); + if (callingProcessPackage == null) { + throw new SecurityException( + "Couldn't determine the identity of the caller."); + } + if (!Objects.equals(componentName.getPackageName(), callingProcessPackage)) { + throw new SecurityException(callingProcessPackage + + " is not the device's credential autofill package."); + } + } catch (Resources.NotFoundException e) { + throw new SecurityException( + "Credential Autofill service does not exist on this device."); + } + } + // New request session, scoped for this request only. final GetCandidateRequestSession session = |