diff options
174 files changed, 3534 insertions, 4417 deletions
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 27f5545d8f03..e0364cbe1d69 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -13401,11 +13401,10 @@ public class DevicePolicyManager { /** * Called by a device admin or holder of the permission * {@link android.Manifest.permission#MANAGE_DEVICE_POLICY_SUPPORT_MESSAGE} to set the short - * support message. This will be displayed to the user - * in settings screens where funtionality has been disabled by the admin. The message should be - * limited to a short statement such as "This setting is disabled by your administrator. Contact - * someone@example.com for support." If the message is longer than 200 characters it may be - * truncated. + * support message. This will be displayed to the user in settings screens where functionality + * has been disabled by the admin. The message should be limited to a short statement such as + * "This setting is disabled by your administrator. Contact someone@example.com for support." + * If the message is longer than 200 characters it may be truncated. * <p> * If the short support message needs to be localized, it is the responsibility of the * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast @@ -13460,7 +13459,8 @@ public class DevicePolicyManager { /** * Called by a device admin to set the long support message. This will be displayed to the user - * in the device administators settings screen. + * in the device administrators settings screen. If the message is longer than 20000 characters + * it may be truncated. * <p> * If the long support message needs to be localized, it is the responsibility of the * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 3487b013fa0b..79e7574647b3 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -11496,6 +11496,8 @@ public final class Settings { public static final int DEVICE_STATE_ROTATION_KEY_HALF_FOLDED = 1; /** @hide */ public static final int DEVICE_STATE_ROTATION_KEY_UNFOLDED = 2; + /** @hide */ + public static final int DEVICE_STATE_ROTATION_KEY_REAR_DISPLAY = 3; /** * The different postures that can be used as keys with @@ -11507,6 +11509,7 @@ public final class Settings { DEVICE_STATE_ROTATION_KEY_FOLDED, DEVICE_STATE_ROTATION_KEY_HALF_FOLDED, DEVICE_STATE_ROTATION_KEY_UNFOLDED, + DEVICE_STATE_ROTATION_KEY_REAR_DISPLAY, }) @Retention(RetentionPolicy.SOURCE) public @interface DeviceStateRotationLockKey { diff --git a/core/java/android/service/voice/VoiceInteractionService.java b/core/java/android/service/voice/VoiceInteractionService.java index 79a4f54bac0a..6061a0f93312 100644 --- a/core/java/android/service/voice/VoiceInteractionService.java +++ b/core/java/android/service/voice/VoiceInteractionService.java @@ -913,8 +913,6 @@ public class VoiceInteractionService extends Service { * sandboxed process. * @param callback The callback to notify of detection events. * @return An instanece of {@link VisualQueryDetector}. - * @throws UnsupportedOperationException if only single detector is supported. Multiple detector - * is only available for apps targeting {@link Build.VERSION_CODES#TIRAMISU} and above. * @throws IllegalStateException when there is an existing {@link VisualQueryDetector}, or when * there is a non-trusted hotword detector running. * @@ -935,21 +933,16 @@ public class VoiceInteractionService extends Service { throw new IllegalStateException("Not available until onReady() is called"); } synchronized (mLock) { - if (!CompatChanges.isChangeEnabled(MULTIPLE_ACTIVE_HOTWORD_DETECTORS)) { - throw new UnsupportedOperationException("VisualQueryDetector is only available if " - + "multiple detectors are allowed"); - } else { - if (mActiveVisualQueryDetector != null) { + if (mActiveVisualQueryDetector != null) { + throw new IllegalStateException( + "There is already an active VisualQueryDetector. " + + "It must be destroyed to create a new one."); + } + for (HotwordDetector detector : mActiveDetectors) { + if (!detector.isUsingSandboxedDetectionService()) { throw new IllegalStateException( - "There is already an active VisualQueryDetector. " - + "It must be destroyed to create a new one."); - } - for (HotwordDetector detector : mActiveDetectors) { - if (!detector.isUsingSandboxedDetectionService()) { - throw new IllegalStateException( - "It disallows to create trusted and non-trusted detectors " - + "at the same time."); - } + "It disallows to create trusted and non-trusted detectors " + + "at the same time."); } } diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java index f2373fbfa858..d8fa533dbef7 100644 --- a/core/java/android/view/DisplayInfo.java +++ b/core/java/android/view/DisplayInfo.java @@ -360,6 +360,14 @@ public final class DisplayInfo implements Parcelable { public SparseArray<SurfaceControl.RefreshRateRange> thermalRefreshRateThrottling = new SparseArray<>(); + /** + * The ID of the brightness throttling data that should be used. This can change e.g. in + * concurrent displays mode in which a stricter brightness throttling policy might need to be + * used. + */ + @Nullable + public String thermalBrightnessThrottlingDataId; + public static final @android.annotation.NonNull Creator<DisplayInfo> CREATOR = new Creator<DisplayInfo>() { @Override public DisplayInfo createFromParcel(Parcel source) { @@ -437,7 +445,9 @@ public final class DisplayInfo implements Parcelable { && Objects.equals(displayShape, other.displayShape) && Objects.equals(layoutLimitedRefreshRate, other.layoutLimitedRefreshRate) && BrightnessSynchronizer.floatEquals(hdrSdrRatio, other.hdrSdrRatio) - && thermalRefreshRateThrottling.contentEquals(other.thermalRefreshRateThrottling); + && thermalRefreshRateThrottling.contentEquals(other.thermalRefreshRateThrottling) + && Objects.equals( + thermalBrightnessThrottlingDataId, other.thermalBrightnessThrottlingDataId); } @Override @@ -495,6 +505,7 @@ public final class DisplayInfo implements Parcelable { layoutLimitedRefreshRate = other.layoutLimitedRefreshRate; hdrSdrRatio = other.hdrSdrRatio; thermalRefreshRateThrottling = other.thermalRefreshRateThrottling; + thermalBrightnessThrottlingDataId = other.thermalBrightnessThrottlingDataId; } public void readFromParcel(Parcel source) { @@ -559,6 +570,7 @@ public final class DisplayInfo implements Parcelable { hdrSdrRatio = source.readFloat(); thermalRefreshRateThrottling = source.readSparseArray(null, SurfaceControl.RefreshRateRange.class); + thermalBrightnessThrottlingDataId = source.readString8(); } @Override @@ -620,6 +632,7 @@ public final class DisplayInfo implements Parcelable { dest.writeTypedObject(layoutLimitedRefreshRate, flags); dest.writeFloat(hdrSdrRatio); dest.writeSparseArray(thermalRefreshRateThrottling); + dest.writeString8(thermalBrightnessThrottlingDataId); } @Override @@ -889,6 +902,8 @@ public final class DisplayInfo implements Parcelable { } sb.append(", thermalRefreshRateThrottling "); sb.append(thermalRefreshRateThrottling); + sb.append(", thermalBrightnessThrottlingDataId "); + sb.append(thermalBrightnessThrottlingDataId); sb.append("}"); return sb.toString(); } diff --git a/core/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java b/core/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java index 86c2893c9fab..853fe2f114f7 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java @@ -76,7 +76,7 @@ public class SystemUiSystemPropertiesFlags { /** Gating the removal of sorting-notifications-by-interruptiveness. */ public static final Flag NO_SORT_BY_INTERRUPTIVENESS = - releasedFlag("persist.sysui.notification.no_sort_by_interruptiveness"); + devFlag("persist.sysui.notification.no_sort_by_interruptiveness"); /** Gating the logging of DND state change events. */ public static final Flag LOG_DND_STATE_EVENTS = @@ -115,7 +115,7 @@ public class SystemUiSystemPropertiesFlags { } /** - * Creates a flag that is disabled by default in debuggable builds. + * Creates a flag that is enabled by default in debuggable builds. * It can be enabled by setting this flag's SystemProperty to 1. * * This flag is ALWAYS disabled in release builds. diff --git a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/AidlTestUtils.java b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/AidlTestUtils.java index cce1b2bc3ece..6c701920bd51 100644 --- a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/AidlTestUtils.java +++ b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/AidlTestUtils.java @@ -80,7 +80,7 @@ final class AidlTestUtils { /* vendorIds= */ null); } - static android.hardware.broadcastradio.ProgramSelector makeHalFmSelector(int freq) { + static android.hardware.broadcastradio.ProgramSelector makeHalFmSelector(long freq) { ProgramIdentifier halId = makeHalIdentifier(IdentifierType.AMFM_FREQUENCY_KHZ, freq); return makeHalSelector(halId, /* secondaryIds= */ new ProgramIdentifier[0]); } diff --git a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsResultTest.java b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsResultTest.java index df3ddfd6bb71..b54c156c820e 100644 --- a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsResultTest.java +++ b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsResultTest.java @@ -52,6 +52,7 @@ public final class ConversionUtilsResultTest { {Result.INVALID_STATE, RadioTuner.TUNER_RESULT_INVALID_STATE}, {Result.NOT_SUPPORTED, RadioTuner.TUNER_RESULT_NOT_SUPPORTED}, {Result.TIMEOUT, RadioTuner.TUNER_RESULT_TIMEOUT}, + {Result.CANCELED, RadioTuner.TUNER_RESULT_CANCELED}, {Result.UNKNOWN_ERROR, RadioTuner.TUNER_RESULT_UNKNOWN_ERROR} }); } diff --git a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsTest.java b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsTest.java index aea01783ee68..2ef923d1339a 100644 --- a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsTest.java +++ b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsTest.java @@ -27,11 +27,13 @@ import android.hardware.broadcastradio.ProgramIdentifier; import android.hardware.broadcastradio.ProgramInfo; import android.hardware.broadcastradio.ProgramListChunk; import android.hardware.broadcastradio.Properties; +import android.hardware.broadcastradio.Result; import android.hardware.broadcastradio.VendorKeyValue; import android.hardware.radio.Announcement; import android.hardware.radio.ProgramList; import android.hardware.radio.ProgramSelector; import android.hardware.radio.RadioManager; +import android.os.ServiceSpecificException; import com.android.dx.mockito.inline.extended.StaticMockitoSessionBuilder; import com.android.server.broadcastradio.ExtendedRadioMockitoTestCase; @@ -153,6 +155,16 @@ public final class ConversionUtilsTest extends ExtendedRadioMockitoTestCase { } @Test + public void throwOnError_withCancelException() { + ServiceSpecificException halException = new ServiceSpecificException(Result.CANCELED); + + RuntimeException thrown = ConversionUtils.throwOnError(halException, "tune"); + + expect.withMessage("Exception thrown for canceling error").that(thrown) + .hasMessageThat().contains("tune: CANCELED"); + } + + @Test public void propertiesFromHalProperties_idsMatch() { expect.withMessage("Properties id") .that(MODULE_PROPERTIES.getId()).isEqualTo(TEST_ID); diff --git a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/TunerSessionTest.java b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/TunerSessionTest.java index f85748c93c57..84aa86472e81 100644 --- a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/TunerSessionTest.java +++ b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/TunerSessionTest.java @@ -1168,13 +1168,29 @@ public final class TunerSessionTest extends ExtendedRadioMockitoTestCase { doReturn(USER_ID_2).when(() -> RadioServiceUserController.getCurrentUser()); mHalTunerCallback.onCurrentProgramInfoChanged(AidlTestUtils.makeHalProgramInfo( - AidlTestUtils.makeHalFmSelector(/* freq= */ 97300), SIGNAL_QUALITY)); + AidlTestUtils.makeHalFmSelector(AM_FM_FREQUENCY_LIST[1]), SIGNAL_QUALITY)); verify(mAidlTunerCallbackMocks[0], CALLBACK_TIMEOUT.times(0)) .onCurrentProgramInfoChanged(any()); } @Test + public void onTuneFailed_forTunerCallback() throws Exception { + int numSessions = 3; + openAidlClients(numSessions); + android.hardware.broadcastradio.ProgramSelector halSel = AidlTestUtils.makeHalFmSelector( + AM_FM_FREQUENCY_LIST[1]); + ProgramSelector sel = AidlTestUtils.makeFmSelector(AM_FM_FREQUENCY_LIST[1]); + + mHalTunerCallback.onTuneFailed(Result.CANCELED, halSel); + + for (int index = 0; index < numSessions; index++) { + verify(mAidlTunerCallbackMocks[index], CALLBACK_TIMEOUT) + .onTuneFailed(RadioTuner.TUNER_RESULT_CANCELED, sel); + } + } + + @Test public void onAntennaStateChange_forTunerCallback() throws Exception { int numSessions = 3; openAidlClients(numSessions); diff --git a/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java b/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java index a3eda8dfe8e0..f45db23ace76 100644 --- a/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java +++ b/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java @@ -39,7 +39,6 @@ import android.view.WindowManager.LayoutParams; import android.widget.TextView; import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.FlakyTest; import androidx.test.platform.app.InstrumentationRegistry; import org.junit.Before; @@ -55,7 +54,6 @@ import org.mockito.Spy; * atest FrameworksCoreTests:ImeInsetsSourceConsumerTest */ @Presubmit -@FlakyTest(detail = "Promote once confirmed non-flaky") @RunWith(AndroidJUnit4.class) public class ImeInsetsSourceConsumerTest { diff --git a/libs/WindowManager/Shell/res/layout/letterbox_restart_dialog_layout.xml b/libs/WindowManager/Shell/res/layout/letterbox_restart_dialog_layout.xml index 5aff4159e135..7f1aac3551b6 100644 --- a/libs/WindowManager/Shell/res/layout/letterbox_restart_dialog_layout.xml +++ b/libs/WindowManager/Shell/res/layout/letterbox_restart_dialog_layout.xml @@ -73,11 +73,13 @@ android:textAlignment="center"/> <LinearLayout + android:id="@+id/letterbox_restart_dialog_checkbox_container" android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingVertical="14dp" android:orientation="horizontal" android:layout_gravity="center_vertical" - android:layout_marginVertical="32dp"> + android:layout_marginVertical="18dp"> <CheckBox android:id="@+id/letterbox_restart_dialog_checkbox" diff --git a/libs/WindowManager/Shell/res/values/config.xml b/libs/WindowManager/Shell/res/values/config.xml index 76eb0945d990..a3916b71592b 100644 --- a/libs/WindowManager/Shell/res/values/config.xml +++ b/libs/WindowManager/Shell/res/values/config.xml @@ -125,4 +125,7 @@ <!-- Whether the additional education about reachability is enabled --> <bool name="config_letterboxIsReachabilityEducationEnabled">false</bool> + + <!-- Whether DragAndDrop capability is enabled --> + <bool name="config_enableShellDragDrop">true</bool> </resources> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java index 21f02b10035b..3eb9fa2eef6b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java @@ -260,7 +260,7 @@ public class BubbleController implements ConfigurationChangeListener, /** One handed mode controller to register transition listener. */ private Optional<OneHandedController> mOneHandedOptional; /** Drag and drop controller to register listener for onDragStarted. */ - private DragAndDropController mDragAndDropController; + private Optional<DragAndDropController> mDragAndDropController; /** Used to send bubble events to launcher. */ private Bubbles.BubbleStateListener mBubbleStateListener; @@ -286,7 +286,7 @@ public class BubbleController implements ConfigurationChangeListener, BubblePositioner positioner, DisplayController displayController, Optional<OneHandedController> oneHandedOptional, - DragAndDropController dragAndDropController, + Optional<DragAndDropController> dragAndDropController, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler, @ShellBackgroundThread ShellExecutor bgExecutor, @@ -469,7 +469,7 @@ public class BubbleController implements ConfigurationChangeListener, }); mOneHandedOptional.ifPresent(this::registerOneHandedState); - mDragAndDropController.addListener(this::collapseStack); + mDragAndDropController.ifPresent(controller -> controller.addListener(this::collapseStack)); // Clear out any persisted bubbles on disk that no longer have a valid user. List<UserInfo> users = mUserManager.getAliveUsers(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java index 9eba5ecd36f1..e7dede757578 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java @@ -738,10 +738,6 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange getRefBounds2(mTempRect); t.setPosition(leash2, mTempRect.left, mTempRect.top) .setWindowCrop(leash2, mTempRect.width(), mTempRect.height()); - // Make right or bottom side surface always higher than left or top side to avoid weird - // animation when dismiss split. e.g. App surface fling above on decor surface. - t.setLayer(leash1, 1); - t.setLayer(leash2, 2); if (mImePositionProcessor.adjustSurfaceLayoutForIme( t, dividerLeash, leash1, leash2, dimLayer1, dimLayer2)) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/RestartDialogLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/RestartDialogLayout.java index c53e6389331a..05fd5f1172e1 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/RestartDialogLayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/RestartDialogLayout.java @@ -95,6 +95,9 @@ public class RestartDialogLayout extends ConstraintLayout implements DialogConta @Override protected void onFinishInflate() { super.onFinishInflate(); + final View checkboxContainer = findViewById( + R.id.letterbox_restart_dialog_checkbox_container); + final CheckBox checkbox = findViewById(R.id.letterbox_restart_dialog_checkbox); mDialogContainer = findViewById(R.id.letterbox_restart_dialog_container); mDialogTitle = findViewById(R.id.letterbox_restart_dialog_title); mBackgroundDim = getBackground().mutate(); @@ -103,5 +106,6 @@ public class RestartDialogLayout extends ConstraintLayout implements DialogConta // We add a no-op on-click listener to the dialog container so that clicks on it won't // propagate to the listener of the layout (which represents the background dim). mDialogContainer.setOnClickListener(view -> {}); + checkboxContainer.setOnClickListener(view -> checkbox.performClick()); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvWMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvWMShellModule.java index e9957fd4f4f1..12d51f54a09c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvWMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvWMShellModule.java @@ -41,11 +41,11 @@ import com.android.wm.shell.sysui.ShellController; import com.android.wm.shell.sysui.ShellInit; import com.android.wm.shell.transition.Transitions; -import java.util.Optional; - import dagger.Module; import dagger.Provides; +import java.util.Optional; + /** * Provides dependencies from {@link com.android.wm.shell}, these dependencies are only * accessible from components within the WM subcomponent (can be explicitly exposed to the @@ -81,7 +81,7 @@ public class TvWMShellModule { DisplayController displayController, DisplayImeController displayImeController, DisplayInsetsController displayInsetsController, - DragAndDropController dragAndDropController, + Optional<DragAndDropController> dragAndDropController, Transitions transitions, TransactionPool transactionPool, IconProvider iconProvider, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java index 9808c591592f..36d941bda663 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java @@ -186,15 +186,15 @@ public abstract class WMShellBaseModule { @WMSingleton @Provides - static DragAndDropController provideDragAndDropController(Context context, + static Optional<DragAndDropController> provideDragAndDropController(Context context, ShellInit shellInit, ShellController shellController, DisplayController displayController, UiEventLogger uiEventLogger, IconProvider iconProvider, @ShellMainThread ShellExecutor mainExecutor) { - return new DragAndDropController(context, shellInit, shellController, displayController, - uiEventLogger, iconProvider, mainExecutor); + return Optional.ofNullable(DragAndDropController.create(context, shellInit, shellController, + displayController, uiEventLogger, iconProvider, mainExecutor)); } @WMSingleton @@ -796,7 +796,7 @@ public abstract class WMShellBaseModule { DisplayController displayController, DisplayImeController displayImeController, DisplayInsetsController displayInsetsController, - DragAndDropController dragAndDropController, + Optional<DragAndDropController> dragAndDropControllerOptional, ShellTaskOrganizer shellTaskOrganizer, Optional<BubbleController> bubblesOptional, Optional<SplitScreenController> splitScreenOptional, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index 2f0f56cfdfb0..f3130d358ec1 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -171,7 +171,7 @@ public abstract class WMShellModule { BubblePositioner positioner, DisplayController displayController, @DynamicOverride Optional<OneHandedController> oneHandedOptional, - DragAndDropController dragAndDropController, + Optional<DragAndDropController> dragAndDropController, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler, @ShellBackgroundThread ShellExecutor bgExecutor, @@ -320,7 +320,7 @@ public abstract class WMShellModule { DisplayController displayController, DisplayImeController displayImeController, DisplayInsetsController displayInsetsController, - DragAndDropController dragAndDropController, + Optional<DragAndDropController> dragAndDropController, Transitions transitions, TransactionPool transactionPool, IconProvider iconProvider, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java index 4cfaae6e51c7..091de3a86461 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java @@ -94,7 +94,24 @@ public class DragAndDropController implements DisplayController.OnDisplaysChange void onDragStarted(); } - public DragAndDropController(Context context, + /** + * Creates {@link DragAndDropController}. Returns {@code null} if the feature is disabled. + */ + public static DragAndDropController create(Context context, + ShellInit shellInit, + ShellController shellController, + DisplayController displayController, + UiEventLogger uiEventLogger, + IconProvider iconProvider, + ShellExecutor mainExecutor) { + if (!context.getResources().getBoolean(R.bool.config_enableShellDragDrop)) { + return null; + } + return new DragAndDropController(context, shellInit, shellController, displayController, + uiEventLogger, iconProvider, mainExecutor); + } + + DragAndDropController(Context context, ShellInit shellInit, ShellController shellController, DisplayController displayController, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java index eb4d2a16c522..bffc51c6b22f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java @@ -549,6 +549,14 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler { // are in mOpening. for (int i = 0; i < closingTasks.size(); ++i) { final TransitionInfo.Change change = closingTasks.get(i); + final int pausingIdx = TaskState.indexOf(mPausingTasks, change); + if (pausingIdx >= 0) { + mPausingTasks.remove(pausingIdx); + didMergeThings = true; + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION, + " closing pausing taskId=%d", change.getTaskInfo().taskId); + continue; + } int openingIdx = TaskState.indexOf(mOpeningTasks, change); if (openingIdx < 0) { Slog.w(TAG, "Closing a task that wasn't opening, this may be split or" @@ -601,6 +609,11 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler { didMergeThings = true; mState = STATE_NEW_TASK; } + if (mPausingTasks.isEmpty()) { + // The pausing tasks may be removed by the incoming closing tasks. + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION, + "[%d] RecentsController.merge: empty pausing tasks", mInstanceId); + } if (!hasTaskChange) { // Activity only transition, so consume the merge as it doesn't affect the rest of // recents. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java index 643245943916..af52350f5b48 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java @@ -165,7 +165,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, private final DisplayController mDisplayController; private final DisplayImeController mDisplayImeController; private final DisplayInsetsController mDisplayInsetsController; - private final DragAndDropController mDragAndDropController; + private final Optional<DragAndDropController> mDragAndDropController; private final Transitions mTransitions; private final TransactionPool mTransactionPool; private final IconProvider mIconProvider; @@ -191,7 +191,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, DisplayController displayController, DisplayImeController displayImeController, DisplayInsetsController displayInsetsController, - DragAndDropController dragAndDropController, + Optional<DragAndDropController> dragAndDropController, Transitions transitions, TransactionPool transactionPool, IconProvider iconProvider, @@ -253,7 +253,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, mDisplayController = displayController; mDisplayImeController = displayImeController; mDisplayInsetsController = displayInsetsController; - mDragAndDropController = dragAndDropController; + mDragAndDropController = Optional.of(dragAndDropController); mTransitions = transitions; mTransactionPool = transactionPool; mIconProvider = iconProvider; @@ -289,7 +289,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, // TODO: Multi-display mStageCoordinator = createStageCoordinator(); } - mDragAndDropController.setSplitScreenController(this); + mDragAndDropController.ifPresent(controller -> controller.setSplitScreenController(this)); } protected StageCoordinator createStageCoordinator() { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java index 51b8000f14bb..a2af93fc42c6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java @@ -30,8 +30,6 @@ import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON import static com.android.wm.shell.splitscreen.SplitScreenController.exitReasonToString; import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_DISMISS; import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_DISMISS_SNAP; -import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE; -import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_SCREEN_PAIR_OPEN; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -165,7 +163,7 @@ class SplitScreenTransitions { t.setLayer(leash, Integer.MAX_VALUE); t.show(leash); } - boolean isOpening = isOpeningTransition(info); + boolean isOpening = TransitionUtil.isOpeningType(info.getType()); if (isOpening && (mode == TRANSIT_OPEN || mode == TRANSIT_TO_FRONT)) { // fade in startExampleAnimation(leash, true /* show */); @@ -295,14 +293,16 @@ class SplitScreenTransitions { @Nullable RemoteTransition remoteTransition, Transitions.TransitionHandler handler, @Nullable TransitionConsumedCallback consumedCallback, - @Nullable TransitionFinishedCallback finishedCallback) { + @Nullable TransitionFinishedCallback finishedCallback, + int extraTransitType) { if (mPendingEnter != null) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " splitTransition " + " skip to start enter split transition since it already exist. "); return null; } final IBinder transition = mTransitions.startTransition(transitType, wct, handler); - setEnterTransition(transition, remoteTransition, consumedCallback, finishedCallback); + setEnterTransition(transition, remoteTransition, consumedCallback, finishedCallback, + extraTransitType); return transition; } @@ -310,9 +310,10 @@ class SplitScreenTransitions { void setEnterTransition(@NonNull IBinder transition, @Nullable RemoteTransition remoteTransition, @Nullable TransitionConsumedCallback consumedCallback, - @Nullable TransitionFinishedCallback finishedCallback) { + @Nullable TransitionFinishedCallback finishedCallback, + int extraTransitType) { mPendingEnter = new TransitSession( - transition, consumedCallback, finishedCallback, remoteTransition); + transition, consumedCallback, finishedCallback, remoteTransition, extraTransitType); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " splitTransition " + " deduced Enter split screen"); @@ -513,12 +514,6 @@ class SplitScreenTransitions { mTransitions.getAnimExecutor().execute(va::start); } - private boolean isOpeningTransition(TransitionInfo info) { - return TransitionUtil.isOpeningType(info.getType()) - || info.getType() == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE - || info.getType() == TRANSIT_SPLIT_SCREEN_PAIR_OPEN; - } - /** Calls when the transition got consumed. */ interface TransitionConsumedCallback { void onConsumed(boolean aborted); @@ -539,16 +534,19 @@ class SplitScreenTransitions { /** Whether the transition was canceled. */ boolean mCanceled; + /** A note for extra transit type, to help indicate custom transition. */ + final int mExtraTransitType; + TransitSession(IBinder transition, @Nullable TransitionConsumedCallback consumedCallback, @Nullable TransitionFinishedCallback finishedCallback) { - this(transition, consumedCallback, finishedCallback, null /* remoteTransition */); + this(transition, consumedCallback, finishedCallback, null /* remoteTransition */, 0); } TransitSession(IBinder transition, @Nullable TransitionConsumedCallback consumedCallback, @Nullable TransitionFinishedCallback finishedCallback, - @Nullable RemoteTransition remoteTransition) { + @Nullable RemoteTransition remoteTransition, int extraTransitType) { mTransition = transition; mConsumedCallback = consumedCallback; mFinishedCallback = finishedCallback; @@ -560,6 +558,7 @@ class SplitScreenTransitions { mTransitions.getMainExecutor(), remoteTransition); mRemoteHandler.setTransition(transition); } + mExtraTransitType = extraTransitType; } /** Sets transition consumed callback. */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 4c903f500651..0ef26fcff284 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -446,26 +446,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps, final IRemoteAnimationFinishedCallback finishedCallback) { - boolean openingToSide = false; - if (apps != null) { - for (int i = 0; i < apps.length; ++i) { - if (apps[i].mode == MODE_OPENING - && mSideStage.containsTask(apps[i].taskId)) { - openingToSide = true; - break; - } - } - } else if (mSideStage.getChildCount() != 0) { - // There are chances the entering app transition got canceled by performing - // rotation transition. Checks if there is any child task existed in split - // screen before fallback to cancel entering flow. - openingToSide = true; - } - - if (isEnteringSplit && !openingToSide) { + if (isEnteringSplit && mSideStage.getChildCount() == 0) { mMainExecutor.execute(() -> exitSplitScreen( - mSideStage.getChildCount() == 0 ? mMainStage : mSideStage, - EXIT_REASON_UNKNOWN)); + null /* childrenToTop */, EXIT_REASON_UNKNOWN)); + mSplitUnsupportedToast.show(); } if (finishedCallback != null) { @@ -526,17 +510,17 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, wct.sendPendingIntent(intent, fillInIntent, options); // If split screen is not activated, we're expecting to open a pair of apps to split. - final int transitType = mMainStage.isActive() + final int extraTransitType = mMainStage.isActive() ? TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE : TRANSIT_SPLIT_SCREEN_PAIR_OPEN; prepareEnterSplitScreen(wct, null /* taskInfo */, position); - mSplitTransitions.startEnterTransition(transitType, wct, null, this, + mSplitTransitions.startEnterTransition(TRANSIT_TO_FRONT, wct, null, this, null /* consumedCallback */, (finishWct, finishT) -> { if (!evictWct.isEmpty()) { finishWct.merge(evictWct, true); } - } /* finishedCallback */); + } /* finishedCallback */, extraTransitType); } /** Launches an activity into split by legacy transition. */ @@ -550,26 +534,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps, IRemoteAnimationFinishedCallback finishedCallback, SurfaceControl.Transaction t) { - boolean openingToSide = false; - if (apps != null) { - for (int i = 0; i < apps.length; ++i) { - if (apps[i].mode == MODE_OPENING - && mSideStage.containsTask(apps[i].taskId)) { - openingToSide = true; - break; - } - } - } else if (mSideStage.getChildCount() != 0) { - // There are chances the entering app transition got canceled by performing - // rotation transition. Checks if there is any child task existed in split - // screen before fallback to cancel entering flow. - openingToSide = true; - } - - if (isEnteringSplit && !openingToSide && apps != null) { + if (isEnteringSplit && mSideStage.getChildCount() == 0) { mMainExecutor.execute(() -> exitSplitScreen( - mSideStage.getChildCount() == 0 ? mMainStage : mSideStage, - EXIT_REASON_UNKNOWN)); + null /* childrenToTop */, EXIT_REASON_UNKNOWN)); + mSplitUnsupportedToast.show(); } if (apps != null) { @@ -709,7 +677,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, wct.startTask(mainTaskId, mainOptions); mSplitTransitions.startEnterTransition( - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, wct, remoteTransition, this, null, null); + TRANSIT_TO_FRONT, wct, remoteTransition, this, null, null, + TRANSIT_SPLIT_SCREEN_PAIR_OPEN); setEnterInstanceId(instanceId); } @@ -760,7 +729,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } mSplitTransitions.startEnterTransition( - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, wct, remoteTransition, this, null, null); + TRANSIT_TO_FRONT, wct, remoteTransition, this, null, null, + TRANSIT_SPLIT_SCREEN_PAIR_OPEN); setEnterInstanceId(instanceId); } @@ -1088,7 +1058,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private void onRemoteAnimationFinishedOrCancelled(WindowContainerTransaction evictWct) { mIsDividerRemoteAnimating = false; mShouldUpdateRecents = true; - mSplitRequest = null; + clearRequestIfPresented(); // If any stage has no child after animation finished, it means that split will display // nothing, such status will happen if task and intent is same app but not support // multi-instance, we should exit split and expand that app as full screen. @@ -1108,7 +1078,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private void onRemoteAnimationFinished(RemoteAnimationTarget[] apps) { mIsDividerRemoteAnimating = false; mShouldUpdateRecents = true; - mSplitRequest = null; + clearRequestIfPresented(); // If any stage has no child after finished animation, that side of the split will display // nothing. This might happen if starting the same app on the both sides while not // supporting multi-instance. Exit the split screen and expand that app to full screen. @@ -1381,6 +1351,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, }); mShouldUpdateRecents = false; mIsDividerRemoteAnimating = false; + mSplitRequest = null; mSplitLayout.getInvisibleBounds(mTempRect1); if (childrenToTop == null || childrenToTop.getTopVisibleChildTaskId() == INVALID_TASK_ID) { @@ -1473,6 +1444,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } + private void clearRequestIfPresented() { + if (mSideStageListener.mVisible && mSideStageListener.mHasChildren + && mMainStageListener.mVisible && mSideStageListener.mHasChildren) { + mSplitRequest = null; + } + } + /** * Returns whether the split pair in the recent tasks list should be broken. */ @@ -1851,6 +1829,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, true /* setReparentLeafTaskIfRelaunch */); setRootForceTranslucent(true, wct); } else { + clearRequestIfPresented(); wct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token, false /* setReparentLeafTaskIfRelaunch */); setRootForceTranslucent(false, wct); @@ -2010,7 +1989,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } if (mMainStageListener.mHasChildren && mSideStageListener.mHasChildren) { mShouldUpdateRecents = true; - mSplitRequest = null; + clearRequestIfPresented(); updateRecentTasksSplitPair(); if (!mLogger.hasStartedSession()) { @@ -2334,7 +2313,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, out = new WindowContainerTransaction(); prepareEnterSplitScreen(out); mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(), - null /* consumedCallback */, null /* finishedCallback */); + null /* consumedCallback */, null /* finishedCallback */, + 0 /* extraTransitType */); } } return out; @@ -2573,7 +2553,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } - if (info.getType() == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE) { + if (mSplitTransitions.mPendingEnter.mExtraTransitType + == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE) { if (mainChild == null && sideChild == null) { Log.w(TAG, "Launched a task in split, but didn't receive any task in transition."); mSplitTransitions.mPendingEnter.cancel(null /* finishedCb */); @@ -2716,6 +2697,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } }); mShouldUpdateRecents = false; + mSplitRequest = null; // Update local states. setSplitsVisible(false); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java index ead0bcd15c73..a841b7f96d3c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java @@ -220,20 +220,12 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { mCallbacks.onNoLongerSupportMultiWindow(); return; } - if (taskInfo.topActivity == null && mChildrenTaskInfo.contains(taskInfo.taskId) - && mChildrenTaskInfo.get(taskInfo.taskId).topActivity != null) { - // If top activity become null, it means the task is about to vanish, we use this - // signal to remove it from children list earlier for smooth dismiss transition. - mChildrenTaskInfo.remove(taskInfo.taskId); - mChildrenLeashes.remove(taskInfo.taskId); - } else { - mChildrenTaskInfo.put(taskInfo.taskId, taskInfo); - } + mChildrenTaskInfo.put(taskInfo.taskId, taskInfo); mCallbacks.onChildTaskStatusChanged(taskInfo.taskId, true /* present */, taskInfo.isVisible); - if (!ENABLE_SHELL_TRANSITIONS && mChildrenLeashes.contains(taskInfo.taskId)) { - updateChildTaskSurface(taskInfo, mChildrenLeashes.get(taskInfo.taskId), - false /* firstAppeared */); + if (!ENABLE_SHELL_TRANSITIONS) { + updateChildTaskSurface( + taskInfo, mChildrenLeashes.get(taskInfo.taskId), false /* firstAppeared */); } } else { throw new IllegalArgumentException(this + "\n Unknown task: " + taskInfo @@ -267,6 +259,9 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { return; } sendStatusChanged(); + } else { + throw new IllegalArgumentException(this + "\n Unknown task: " + taskInfo + + "\n mRootTaskInfo: " + mRootTaskInfo); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvSplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvSplitScreenController.java index 46d2a5a11671..27d520d81c41 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvSplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvSplitScreenController.java @@ -72,7 +72,7 @@ public class TvSplitScreenController extends SplitScreenController { DisplayController displayController, DisplayImeController displayImeController, DisplayInsetsController displayInsetsController, - DragAndDropController dragAndDropController, + Optional<DragAndDropController> dragAndDropController, Transitions transitions, TransactionPool transactionPool, IconProvider iconProvider, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java index 362d91ac5b5e..b1c3791ad15a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java @@ -74,14 +74,6 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin new WindowDecoration.RelayoutResult<>(); private final Point mPositionInParent = new Point(); - private final PointF mHandleMenuAppInfoPillPosition = new PointF(); - private final PointF mHandleMenuWindowingPillPosition = new PointF(); - private final PointF mHandleMenuMoreActionsPillPosition = new PointF(); - - // Collection of additional windows that comprise the handle menu. - private AdditionalWindow mHandleMenuAppInfoPill; - private AdditionalWindow mHandleMenuWindowingPill; - private AdditionalWindow mHandleMenuMoreActionsPill; private HandleMenu mHandleMenu; private ResizeVeil mResizeVeil; @@ -91,16 +83,6 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin private TaskCornersListener mCornersListener; - private int mMenuWidth; - private int mMarginMenuTop; - private int mMarginMenuStart; - private int mMarginMenuSpacing; - private int mAppInfoPillHeight; - private int mWindowingPillHeight; - private int mMoreActionsPillHeight; - private int mShadowRadius; - private int mMenuCornerRadius; - DesktopModeWindowDecoration( Context context, DisplayController displayController, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java index a9f311f9e9eb..92cbf7f068b4 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java @@ -180,8 +180,9 @@ public class SplitTransitionTests extends ShellTestCase { TestRemoteTransition testRemote = new TestRemoteTransition(); IBinder transition = mSplitScreenTransitions.startEnterTransition( - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), - new RemoteTransition(testRemote, "Test"), mStageCoordinator, null, null); + TRANSIT_OPEN, new WindowContainerTransaction(), + new RemoteTransition(testRemote, "Test"), mStageCoordinator, null, null, + TRANSIT_SPLIT_SCREEN_PAIR_OPEN); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mSideStage.onTaskAppeared(mSideChild, createMockSurface()); boolean accepted = mStageCoordinator.startAnimation(transition, info, @@ -397,7 +398,7 @@ public class SplitTransitionTests extends ShellTestCase { } private TransitionInfo createEnterPairInfo() { - return new TransitionInfoBuilder(TRANSIT_SPLIT_SCREEN_PAIR_OPEN, 0) + return new TransitionInfoBuilder(TRANSIT_OPEN, 0) .addChange(TRANSIT_OPEN, mMainChild) .addChange(TRANSIT_OPEN, mSideChild) .build(); @@ -406,9 +407,9 @@ public class SplitTransitionTests extends ShellTestCase { private void enterSplit() { TransitionInfo enterInfo = createEnterPairInfo(); IBinder enterTransit = mSplitScreenTransitions.startEnterTransition( - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), + TRANSIT_OPEN, new WindowContainerTransaction(), new RemoteTransition(new TestRemoteTransition(), "Test"), - mStageCoordinator, null, null); + mStageCoordinator, null, null, TRANSIT_SPLIT_SCREEN_PAIR_OPEN); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mSideStage.onTaskAppeared(mSideChild, createMockSurface()); mStageCoordinator.startAnimation(enterTransit, enterInfo, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java index 784ad9b006b6..1a1bebd28aef 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java @@ -126,6 +126,12 @@ public final class StageTaskListenerTests extends ShellTestCase { verify(mCallbacks).onStatusChanged(eq(mRootTask.isVisible), eq(true)); } + @Test(expected = IllegalArgumentException.class) + public void testUnknownTaskVanished() { + final ActivityManager.RunningTaskInfo task = new TestRunningTaskInfoBuilder().build(); + mStageTaskListener.onTaskVanished(task); + } + @Test public void testTaskVanished() { // With shell transitions, the transition manages status changes, so skip this test. diff --git a/packages/SettingsLib/DeviceStateRotationLock/src/com.android.settingslib.devicestate/PosturesHelper.kt b/packages/SettingsLib/DeviceStateRotationLock/src/com.android.settingslib.devicestate/PosturesHelper.kt index 9c70be9c1f66..6a13eb8c3907 100644 --- a/packages/SettingsLib/DeviceStateRotationLock/src/com.android.settingslib.devicestate/PosturesHelper.kt +++ b/packages/SettingsLib/DeviceStateRotationLock/src/com.android.settingslib.devicestate/PosturesHelper.kt @@ -19,6 +19,7 @@ package com.android.settingslib.devicestate import android.content.Context import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_FOLDED import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_HALF_FOLDED +import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_REAR_DISPLAY import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_UNFOLDED import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_UNKNOWN import android.provider.Settings.Secure.DeviceStateRotationLockKey @@ -33,6 +34,8 @@ class PosturesHelper(context: Context) { context.resources.getIntArray(R.array.config_halfFoldedDeviceStates) private val unfoldedDeviceStates = context.resources.getIntArray(R.array.config_openDeviceStates) + private val rearDisplayDeviceStates = + context.resources.getIntArray(R.array.config_rearDisplayDeviceStates) @DeviceStateRotationLockKey fun deviceStateToPosture(deviceState: Int): Int { @@ -40,6 +43,7 @@ class PosturesHelper(context: Context) { in foldedDeviceStates -> DEVICE_STATE_ROTATION_KEY_FOLDED in halfFoldedDeviceStates -> DEVICE_STATE_ROTATION_KEY_HALF_FOLDED in unfoldedDeviceStates -> DEVICE_STATE_ROTATION_KEY_UNFOLDED + in rearDisplayDeviceStates -> DEVICE_STATE_ROTATION_KEY_REAR_DISPLAY else -> DEVICE_STATE_ROTATION_KEY_UNKNOWN } } @@ -49,6 +53,7 @@ class PosturesHelper(context: Context) { DEVICE_STATE_ROTATION_KEY_FOLDED -> foldedDeviceStates.firstOrNull() DEVICE_STATE_ROTATION_KEY_HALF_FOLDED -> halfFoldedDeviceStates.firstOrNull() DEVICE_STATE_ROTATION_KEY_UNFOLDED -> unfoldedDeviceStates.firstOrNull() + DEVICE_STATE_ROTATION_KEY_REAR_DISPLAY -> rearDisplayDeviceStates.firstOrNull() else -> null } } diff --git a/packages/SettingsLib/MainSwitchPreference/res/drawable/settingslib_ic_info.xml b/packages/SettingsLib/MainSwitchPreference/res/drawable/settingslib_ic_info.xml deleted file mode 100644 index c8037c85c850..000000000000 --- a/packages/SettingsLib/MainSwitchPreference/res/drawable/settingslib_ic_info.xml +++ /dev/null @@ -1,26 +0,0 @@ -<!-- - Copyright (C) 2021 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. ---> -<!-- copy from frameworks/base/core/res/res/drawable/ic_info.xml--> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/> -</vector>
\ No newline at end of file diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml index ca84db854bdd..b1c26e852cdc 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml @@ -46,16 +46,6 @@ android:textAppearance="?android:attr/textAppearanceListItem" style="@style/MainSwitchText.Settingslib" /> - <ImageView - android:id="@+id/restricted_icon" - android:layout_width="@dimen/settingslib_restricted_icon_size" - android:layout_height="@dimen/settingslib_restricted_icon_size" - android:tint="?android:attr/colorAccent" - android:layout_gravity="center_vertical" - android:layout_marginEnd="@dimen/settingslib_restricted_icon_margin_end" - android:src="@drawable/settingslib_ic_info" - android:visibility="gone" /> - <Switch android:id="@android:id/switch_widget" android:layout_width="wrap_content" diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout-v33/settingslib_main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout-v33/settingslib_main_switch_bar.xml index 2c2ad92a7830..ab0cf3138d9c 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/layout-v33/settingslib_main_switch_bar.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/layout-v33/settingslib_main_switch_bar.xml @@ -49,16 +49,6 @@ android:lineBreakWordStyle="phrase" style="@style/MainSwitchText.Settingslib" /> - <ImageView - android:id="@+id/restricted_icon" - android:layout_width="@dimen/settingslib_restricted_icon_size" - android:layout_height="@dimen/settingslib_restricted_icon_size" - android:tint="@color/settingslib_accent_primary_variant" - android:layout_gravity="center_vertical" - android:layout_marginEnd="@dimen/settingslib_restricted_icon_margin_end" - android:src="@drawable/settingslib_ic_info" - android:visibility="gone" /> - <Switch android:id="@android:id/switch_widget" android:layout_width="wrap_content" diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_bar.xml index b39d09f38b62..bf34db93298b 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_bar.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_bar.xml @@ -38,17 +38,6 @@ android:layout_marginStart="@dimen/settingslib_switchbar_subsettings_margin_start" android:textAlignment="viewStart"/> - <ImageView - android:id="@+id/restricted_icon" - android:layout_width="@dimen/settingslib_restricted_icon_size" - android:layout_height="@dimen/settingslib_restricted_icon_size" - android:tint="?android:attr/colorAccent" - android:theme="@android:style/Theme.Material" - android:layout_gravity="center_vertical" - android:layout_marginEnd="@dimen/settingslib_restricted_icon_margin_end" - android:src="@drawable/settingslib_ic_info" - android:visibility="gone"/> - <Switch android:id="@android:id/switch_widget" android:layout_width="wrap_content" diff --git a/packages/SettingsLib/MainSwitchPreference/res/values-v31/styles.xml b/packages/SettingsLib/MainSwitchPreference/res/values-v31/styles.xml index a50fc7cc0028..ad888e538ffe 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/values-v31/styles.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/values-v31/styles.xml @@ -17,9 +17,8 @@ <resources> - <style name="MainSwitchText.Settingslib" parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> + <style name="MainSwitchText.Settingslib" parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title.Inverse"> <item name="android:textSize">20sp</item> <item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item> - <item name="android:textColor">@android:color/black</item> </style> </resources> diff --git a/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml b/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml index 88b2c8728495..0d9ffff9c9e2 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml @@ -17,16 +17,9 @@ <resources> - <!-- Restricted icon size in switch bar --> - <dimen name="settingslib_restricted_icon_size">@android:dimen/config_restrictedIconSize</dimen> - - <!-- Restricted icon in switch bar --> - <dimen name="settingslib_restricted_icon_margin_end">16dp</dimen> - <!-- Size of title margin --> <dimen name="settingslib_switch_title_margin">24dp</dimen> - <!-- SwitchBar sub settings margin start / end --> + <!-- SwitchBar sub settings margin start --> <dimen name="settingslib_switchbar_subsettings_margin_start">56dp</dimen> - <dimen name="settingslib_switchbar_subsettings_margin_end">16dp</dimen> </resources> diff --git a/packages/SettingsLib/tests/integ/Android.bp b/packages/SettingsLib/tests/integ/Android.bp index d463170fae8c..ff3eeec4171f 100644 --- a/packages/SettingsLib/tests/integ/Android.bp +++ b/packages/SettingsLib/tests/integ/Android.bp @@ -30,7 +30,10 @@ android_test { certificate: "platform", - srcs: ["src/**/*.java"], + srcs: [ + "src/**/*.java", + "src/**/*.kt", + ], libs: [ "android.test.runner", diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/devicestate/PosturesHelperTest.kt b/packages/SettingsLib/tests/integ/src/com/android/settingslib/devicestate/PosturesHelperTest.kt new file mode 100644 index 000000000000..d91c2fa66ca8 --- /dev/null +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/devicestate/PosturesHelperTest.kt @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.devicestate + +import android.content.Context +import android.content.res.Resources +import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_FOLDED +import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_HALF_FOLDED +import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_REAR_DISPLAY +import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_UNFOLDED +import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_UNKNOWN +import androidx.test.filters.SmallTest +import androidx.test.runner.AndroidJUnit4 +import com.android.internal.R +import com.google.common.truth.Expect +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.`when` as whenever +import org.mockito.MockitoAnnotations + +private const val DEVICE_STATE_UNKNOWN = 0 +private const val DEVICE_STATE_CLOSED = 1 +private const val DEVICE_STATE_HALF_FOLDED = 2 +private const val DEVICE_STATE_OPEN = 3 +private const val DEVICE_STATE_REAR_DISPLAY = 4 + +@SmallTest +@RunWith(AndroidJUnit4::class) +class PosturesHelperTest { + + @get:Rule val expect: Expect = Expect.create() + + @Mock private lateinit var context: Context + + @Mock private lateinit var resources: Resources + + private lateinit var posturesHelper: PosturesHelper + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + + whenever(context.resources).thenReturn(resources) + whenever(resources.getIntArray(R.array.config_foldedDeviceStates)) + .thenReturn(intArrayOf(DEVICE_STATE_CLOSED)) + whenever(resources.getIntArray(R.array.config_halfFoldedDeviceStates)) + .thenReturn(intArrayOf(DEVICE_STATE_HALF_FOLDED)) + whenever(resources.getIntArray(R.array.config_openDeviceStates)) + .thenReturn(intArrayOf(DEVICE_STATE_OPEN)) + whenever(resources.getIntArray(R.array.config_rearDisplayDeviceStates)) + .thenReturn(intArrayOf(DEVICE_STATE_REAR_DISPLAY)) + + posturesHelper = PosturesHelper(context) + } + + @Test + fun deviceStateToPosture_mapsCorrectly() { + expect + .that(posturesHelper.deviceStateToPosture(DEVICE_STATE_CLOSED)) + .isEqualTo(DEVICE_STATE_ROTATION_KEY_FOLDED) + expect + .that(posturesHelper.deviceStateToPosture(DEVICE_STATE_HALF_FOLDED)) + .isEqualTo(DEVICE_STATE_ROTATION_KEY_HALF_FOLDED) + expect + .that(posturesHelper.deviceStateToPosture(DEVICE_STATE_OPEN)) + .isEqualTo(DEVICE_STATE_ROTATION_KEY_UNFOLDED) + expect + .that(posturesHelper.deviceStateToPosture(DEVICE_STATE_REAR_DISPLAY)) + .isEqualTo(DEVICE_STATE_ROTATION_KEY_REAR_DISPLAY) + expect + .that(posturesHelper.deviceStateToPosture(DEVICE_STATE_UNKNOWN)) + .isEqualTo(DEVICE_STATE_ROTATION_KEY_UNKNOWN) + } + + @Test + fun postureToDeviceState_mapsCorrectly() { + expect + .that(posturesHelper.postureToDeviceState(DEVICE_STATE_ROTATION_KEY_FOLDED)) + .isEqualTo(DEVICE_STATE_CLOSED) + expect + .that(posturesHelper.postureToDeviceState(DEVICE_STATE_ROTATION_KEY_HALF_FOLDED)) + .isEqualTo(DEVICE_STATE_HALF_FOLDED) + expect + .that(posturesHelper.postureToDeviceState(DEVICE_STATE_ROTATION_KEY_UNFOLDED)) + .isEqualTo(DEVICE_STATE_OPEN) + expect + .that(posturesHelper.postureToDeviceState(DEVICE_STATE_ROTATION_KEY_REAR_DISPLAY)) + .isEqualTo(DEVICE_STATE_REAR_DISPLAY) + expect.that(posturesHelper.postureToDeviceState(DEVICE_STATE_ROTATION_KEY_UNKNOWN)).isNull() + } +} diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java b/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java index e6b2c2f9c7ed..e839d9bc3c52 100644 --- a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java +++ b/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 The Android Open Source Project + * Copyright (C) 2022 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. @@ -71,12 +71,11 @@ public final class DynamicColor { * The base constructor for DynamicColor. * * <p>Functional arguments allow overriding without risks that come with subclasses. _Strongly_ - * prefer using one of the static convenience constructors. This class is arguably too flexible - * to + * prefer using one of the static convenience constructors. This class is arguably too + * flexible to * ensure it can support any scenario. * - * <p>For example, the default behavior of adjust tone at max contrast to be at a 7.0 ratio - * with + * <p>For example, the default behavior of adjust tone at max contrast to be at a 7.0 ratio with * its background is principled and matches a11y guidance. That does not mean it's the desired * approach for _every_ design system, and every color pairing, always, in every case. * @@ -89,23 +88,23 @@ public final class DynamicColor { * lower and raise contrast are * made. * @param toneMinContrast given DynamicScheme, return tone in HCT/L* in L*a*b* this color - * should - * be at minimum contrast. See toneMinContrastDefault for the default - * behavior, and strongly + * should + * be at minimum contrast. See toneMinContrastDefault for the + * default behavior, and strongly * consider using it unless you have strong opinions on a11y. The * static constructors use it. * @param toneMaxContrast given DynamicScheme, return tone in HCT/L* in L*a*b* this color - * should - * be at maximum contrast. See toneMaxContrastDefault for the default - * behavior, and strongly + * should + * be at maximum contrast. See toneMaxContrastDefault for the + * default behavior, and strongly * consider using it unless you have strong opinions on a11y. The * static constructors use it. * @param toneDeltaConstraint given DynamicScheme, return a ToneDeltaConstraint instance that * describes a requirement that this DynamicColor must always have * some difference in tone/L* * from another DynamicColor.<br> - * Unlikely to be useful unless a design system has some distortions - * where colors that don't + * Unlikely to be useful unless a design system has some + * distortions where colors that don't * have a background/foreground relationship must have _some_ * difference in tone, yet, not * enough difference to create meaningful contrast. @@ -164,8 +163,8 @@ public final class DynamicColor { * <p>If the design system uses the same hex code on multiple backgrounds, define that in * multiple * DynamicColors so that the background is accurate for each one. If you define a DynamicColor - * with one background, and actually use it on another, DynamicColor can't guarantee contrast. - * For + * with one background, and actually use it on another, DynamicColor can't guarantee contrast + * . For * example, if you use a color on both black and white, increasing the contrast on one * necessarily * decreases contrast of the other. @@ -195,8 +194,8 @@ public final class DynamicColor { * for contrast, given a background, colors can adjust to * increase/decrease contrast. * @param toneDeltaConstraint Function that provides a ToneDeltaConstraint given DynamicScheme. - * Useful for ensuring lightness difference between colors that don't - * _require_ contrast or + * Useful for ensuring lightness difference between colors that + * don't _require_ contrast or * have a formal background/foreground relationship. */ public static DynamicColor fromArgb( @@ -212,17 +211,17 @@ public final class DynamicColor { * Create a DynamicColor. * * @param palette Function that provides a TonalPalette given DynamicScheme. A TonalPalette is - * defined by a hue and chroma, so this replaces the need to specify hue/chroma. - * By providing + * defined by a hue and chroma, so this replaces the need to specify + * hue/chroma. By providing * a tonal palette, when contrast adjustments are made, intended chroma can be * preserved. For * example, at T/L* 90, there is a significant limit to the amount of chroma. * There is no - * colorful red, a red that light is pink. By preserving the _intended_ chroma if - * lightness + * colorful red, a red that light is pink. By preserving the _intended_ chroma + * if lightness * lowers for contrast adjustments, the intended chroma is restored. - * @param tone Function that provides a tone given DynamicScheme. (useful for dark vs. light - * mode) + * @param tone Function that provides a tone given DynamicScheme. (useful for dark vs. + * light mode) */ public static DynamicColor fromPalette( Function<DynamicScheme, TonalPalette> palette, Function<DynamicScheme, Double> tone) { @@ -232,16 +231,16 @@ public final class DynamicColor { /** * Create a DynamicColor. * - * @param palette Function that provides a TonalPalette given DynamicScheme. A TonalPalette - * is + * @param palette Function that provides a TonalPalette given DynamicScheme. A + * TonalPalette is * defined by a hue and chroma, so this replaces the need to specify * hue/chroma. By providing - * a tonal palette, when contrast adjustments are made, intended chroma can be - * preserved. For - * example, at T/L* 90, there is a significant limit to the amount of chroma. - * There is no - * colorful red, a red that light is pink. By preserving the _intended_ chroma - * if lightness + * a tonal palette, when contrast adjustments are made, intended chroma can + * be preserved. For + * example, at T/L* 90, there is a significant limit to the amount of + * chroma. There is no + * colorful red, a red that light is pink. By preserving the _intended_ + * chroma if lightness * lowers for contrast adjustments, the intended chroma is restored. * @param tone Function that provides a tone given DynamicScheme. (useful for dark vs. * light mode) @@ -261,12 +260,12 @@ public final class DynamicColor { * * @param palette Function that provides a TonalPalette given DynamicScheme. A * TonalPalette is - * defined by a hue and chroma, so this replaces the need to specify - * hue/chroma. By providing + * defined by a hue and chroma, so this replaces the need to + * specify hue/chroma. By providing * a tonal palette, when contrast adjustments are made, intended * chroma can be preserved. For - * example, at T/L* 90, there is a significant limit to the amount of - * chroma. There is no + * example, at T/L* 90, there is a significant limit to the amount + * of chroma. There is no * colorful red, a red that light is pink. By preserving the * _intended_ chroma if lightness * lowers for contrast adjustments, the intended chroma is restored. @@ -277,8 +276,8 @@ public final class DynamicColor { * for contrast, given a background, colors can adjust to * increase/decrease contrast. * @param toneDeltaConstraint Function that provides a ToneDeltaConstraint given DynamicScheme. - * Useful for ensuring lightness difference between colors that don't - * _require_ contrast or + * Useful for ensuring lightness difference between colors that + * don't _require_ contrast or * have a formal background/foreground relationship. */ public static DynamicColor fromPalette( @@ -297,96 +296,6 @@ public final class DynamicColor { toneDeltaConstraint); } - /** Returns the ARGB (i.e. hex code) representation of the resolved color given scheme. */ - public int getArgb(DynamicScheme scheme) { - final int argb = getHct(scheme).toInt(); - if (opacity == null) { - return argb; - } - final double percentage = opacity.apply(scheme); - final int alpha = MathUtils.clampInt(0, 255, (int) Math.round(percentage * 255)); - return (argb & 0x00ffffff) | (alpha << 24); - } - - /** Returns the HCT representation of the resolved color given scheme. */ - public Hct getHct(DynamicScheme scheme) { - final Hct cachedAnswer = hctCache.get(scheme); - if (cachedAnswer != null) { - return cachedAnswer; - } - // This is crucial for aesthetics: we aren't simply the taking the standard color - // and changing its tone for contrast. Rather, we find the tone for contrast, then - // use the specified chroma from the palette to construct a new color. - // - // For example, this enables colors with standard tone of T90, which has limited chroma, to - // "recover" intended chroma as contrast increases. - final Hct answer = Hct.from(hue.apply(scheme), chroma.apply(scheme), getTone(scheme)); - // NOMUTANTS--trivial test with onerous dependency injection requirement. - if (hctCache.size() > 4) { - hctCache.clear(); - } - // NOMUTANTS--trivial test with onerous dependency injection requirement. - hctCache.put(scheme, answer); - return answer; - } - - /** Returns the tone in HCT, ranging from 0 to 100, of the resolved color given scheme. */ - public double getTone(DynamicScheme scheme) { - double answer = tone.apply(scheme); - - final boolean decreasingContrast = scheme.contrastLevel < 0.0; - if (scheme.contrastLevel != 0.0) { - final double startTone = tone.apply(scheme); - final double endTone = - decreasingContrast ? toneMinContrast.apply(scheme) : toneMaxContrast.apply( - scheme); - final double delta = (endTone - startTone) * Math.abs(scheme.contrastLevel); - answer = delta + startTone; - } - - final DynamicColor bgDynamicColor = background == null ? null : background.apply(scheme); - double minRatio = Contrast.RATIO_MIN; - double maxRatio = Contrast.RATIO_MAX; - if (bgDynamicColor != null) { - final boolean bgHasBg = - bgDynamicColor.background != null && bgDynamicColor.background.apply(scheme) - != null; - final double standardRatio = - Contrast.ratioOfTones(tone.apply(scheme), bgDynamicColor.tone.apply(scheme)); - if (decreasingContrast) { - final double minContrastRatio = - Contrast.ratioOfTones( - toneMinContrast.apply(scheme), - bgDynamicColor.toneMinContrast.apply(scheme)); - minRatio = bgHasBg ? minContrastRatio : 1.0; - maxRatio = standardRatio; - } else { - final double maxContrastRatio = - Contrast.ratioOfTones( - toneMaxContrast.apply(scheme), - bgDynamicColor.toneMaxContrast.apply(scheme)); - minRatio = bgHasBg ? min(maxContrastRatio, standardRatio) : 1.0; - maxRatio = bgHasBg ? max(maxContrastRatio, standardRatio) : 21.0; - } - } - - final double finalMinRatio = minRatio; - final double finalMaxRatio = maxRatio; - final double finalAnswer = answer; - answer = - calculateDynamicTone( - scheme, - this.tone, - (dynamicColor) -> dynamicColor.getTone(scheme), - (a, b) -> finalAnswer, - (s) -> bgDynamicColor, - toneDeltaConstraint, - (s) -> finalMinRatio, - (s) -> finalMaxRatio); - - return answer; - } - /** * The default algorithm for calculating the tone of a color at minimum contrast.<br> * If the original contrast ratio was >= 7.0, reach contrast 4.5.<br> @@ -475,8 +384,8 @@ public final class DynamicColor { * <p>It enforces important properties:<br> * #1. Desired contrast ratio is reached.<br> * As contrast increases from standard to max, the tones involved should always be at least the - * standard ratio. For example, if a button is T90, and button text is T0, and the button is T0 - * at + * standard ratio. For example, if a button is T90, and button text is T0, and the button is + * T0 at * max contrast, the button text cannot simply linearly interpolate from T0 to T100, or at some * point they'll both be at the same tone. * @@ -489,8 +398,7 @@ public final class DynamicColor { * * <p>#3. Ensure tone delta with another color.<br> * In design systems, there may be colors that don't have a pure background/foreground - * relationship, but, do require different tones for visual differentiation. - * ToneDeltaConstraint + * relationship, but, do require different tones for visual differentiation. ToneDeltaConstraint * models this requirement, and DynamicColor enforces it. */ public static double calculateDynamicTone( @@ -596,13 +504,16 @@ public final class DynamicColor { final boolean preferLighter = tonePrefersLightForeground(bgTone); if (preferLighter) { - // "Negligible difference" handles an edge case where the initial contrast ratio is high + // "Neglible difference" handles an edge case where the initial contrast ratio is high // (ex. 13.0), and the ratio passed to the function is that high ratio, and both the - // lighter and darker ratio fails to pass that ratio. + // lighter + // and darker ratio fails to pass that ratio. // // This was observed with Tonal Spot's On Primary Container turning black momentarily - // between high and max contrast in light mode. PC's standard tone was T90, OPC's was - // T10, it was light mode, and the contrast level was 0.6568521221032331. + // between + // high and max contrast in light mode. PC's standard tone was T90, OPC's was T10, it + // was + // light mode, and the contrast level was 0.6568521221032331. final boolean negligibleDifference = Math.abs(lighterRatio - darkerRatio) < 0.1 && lighterRatio < ratio && darkerRatio < ratio; @@ -634,13 +545,109 @@ public final class DynamicColor { * <p>T60 used as to create the smallest discontinuity possible when skipping down to T49 in * order * to ensure light foregrounds. + * + * <p>Since `tertiaryContainer` in dark monochrome scheme requires a tone of 60, it should + * not be + * adjusted. Therefore, 60 is excluded here. */ public static boolean tonePrefersLightForeground(double tone) { - return Math.round(tone) <= 60; + return Math.round(tone) < 60; } - /** Tones less than ~T50 always permit white at 4.5 contrast. */ + /** + * Tones less than ~T50 always permit white at 4.5 contrast. + */ public static boolean toneAllowsLightForeground(double tone) { return Math.round(tone) <= 49; } + + public int getArgb(DynamicScheme scheme) { + final int argb = getHct(scheme).toInt(); + if (opacity == null) { + return argb; + } + final double percentage = opacity.apply(scheme); + final int alpha = MathUtils.clampInt(0, 255, (int) Math.round(percentage * 255)); + return (argb & 0x00ffffff) | (alpha << 24); + } + + public Hct getHct(DynamicScheme scheme) { + final Hct cachedAnswer = hctCache.get(scheme); + if (cachedAnswer != null) { + return cachedAnswer; + } + // This is crucial for aesthetics: we aren't simply the taking the standard color + // and changing its tone for contrast. Rather, we find the tone for contrast, then + // use the specified chroma from the palette to construct a new color. + // + // For example, this enables colors with standard tone of T90, which has limited chroma, to + // "recover" intended chroma as contrast increases. + final Hct answer = Hct.from(hue.apply(scheme), chroma.apply(scheme), getTone(scheme)); + // NOMUTANTS--trivial test with onerous dependency injection requirement. + if (hctCache.size() > 4) { + hctCache.clear(); + } + // NOMUTANTS--trivial test with onerous dependency injection requirement. + hctCache.put(scheme, answer); + return answer; + } + + /** + * Returns the tone in HCT, ranging from 0 to 100, of the resolved color given scheme. + */ + public double getTone(DynamicScheme scheme) { + double answer = tone.apply(scheme); + + final boolean decreasingContrast = scheme.contrastLevel < 0.0; + if (scheme.contrastLevel != 0.0) { + final double startTone = tone.apply(scheme); + final double endTone = + decreasingContrast ? toneMinContrast.apply(scheme) : toneMaxContrast.apply( + scheme); + final double delta = (endTone - startTone) * Math.abs(scheme.contrastLevel); + answer = delta + startTone; + } + + final DynamicColor bgDynamicColor = background == null ? null : background.apply(scheme); + double minRatio = Contrast.RATIO_MIN; + double maxRatio = Contrast.RATIO_MAX; + if (bgDynamicColor != null) { + final boolean bgHasBg = + bgDynamicColor.background != null && bgDynamicColor.background.apply(scheme) + != null; + final double standardRatio = + Contrast.ratioOfTones(tone.apply(scheme), bgDynamicColor.tone.apply(scheme)); + if (decreasingContrast) { + final double minContrastRatio = + Contrast.ratioOfTones( + toneMinContrast.apply(scheme), + bgDynamicColor.toneMinContrast.apply(scheme)); + minRatio = bgHasBg ? minContrastRatio : 1.0; + maxRatio = standardRatio; + } else { + final double maxContrastRatio = + Contrast.ratioOfTones( + toneMaxContrast.apply(scheme), + bgDynamicColor.toneMaxContrast.apply(scheme)); + minRatio = bgHasBg ? min(maxContrastRatio, standardRatio) : 1.0; + maxRatio = bgHasBg ? max(maxContrastRatio, standardRatio) : 21.0; + } + } + + final double finalMinRatio = minRatio; + final double finalMaxRatio = maxRatio; + final double finalAnswer = answer; + answer = + calculateDynamicTone( + scheme, + this.tone, + (dynamicColor) -> dynamicColor.getTone(scheme), + (a, b) -> finalAnswer, + (s) -> bgDynamicColor, + toneDeltaConstraint, + (s) -> finalMinRatio, + (s) -> finalMaxRatio); + + return answer; + } } diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/MaterialDynamicColors.java b/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/MaterialDynamicColors.java index 5212e8ef1187..21218a2dc8e2 100644 --- a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/MaterialDynamicColors.java +++ b/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/MaterialDynamicColors.java @@ -22,7 +22,7 @@ import com.android.systemui.monet.hct.ViewingConditions; import com.android.systemui.monet.scheme.DynamicScheme; import com.android.systemui.monet.scheme.Variant; -/** Named colors, otherwise known as tokens, or roles, in the Material Design system. */ +/** Named colors, otherwise known as tokens, or roles, in the Material Design system.*/ // Prevent lint for Function.apply not being available on Android before API level 14 (4.0.1). // "AndroidJdkLibsChecker" for Function, "NewApi" for Function.apply(). // A java_library Bazel rule with an Android constraint cannot skip these warnings without this @@ -33,341 +33,54 @@ public final class MaterialDynamicColors { private static final double CONTAINER_ACCENT_TONE_DELTA = 15.0; - private MaterialDynamicColors() { + public MaterialDynamicColors() { } - public static DynamicColor highestSurface(DynamicScheme s) { - return s.isDark ? surfaceBright : surfaceDim; - } - - public static final DynamicColor background = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 98.0); - - public static final DynamicColor onBackground = - DynamicColor.fromPalette( - (s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 10.0, (s) -> background); - - public static final DynamicColor surface = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 98.0); - - public static final DynamicColor surfaceInverse = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 30.0); - - public static final DynamicColor surfaceBright = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 24.0 : 98.0); - - public static final DynamicColor surfaceDim = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 87.0); - - public static final DynamicColor surfaceSub2 = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 4.0 : 100.0); - - public static final DynamicColor surfaceSub1 = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 96.0); - - public static final DynamicColor surfaceContainer = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 12.0 : 94.0); - - public static final DynamicColor surfaceAdd1 = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 17.0 : 92.0); - - public static final DynamicColor surfaceAdd2 = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 22.0 : 90.0); - - public static final DynamicColor onSurface = - DynamicColor.fromPalette( - (s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 10.0, - (s) -> highestSurface(s)); - - public static final DynamicColor onSurfaceInverse = - DynamicColor.fromPalette( - (s) -> s.neutralPalette, (s) -> s.isDark ? 20.0 : 95.0, (s) -> surfaceInverse); - - public static final DynamicColor surfaceVariant = - DynamicColor.fromPalette((s) -> s.neutralVariantPalette, (s) -> s.isDark ? 30.0 : 90.0); - - public static final DynamicColor onSurfaceVariant = - DynamicColor.fromPalette( - (s) -> s.neutralVariantPalette, (s) -> s.isDark ? 80.0 : 30.0, - (s) -> surfaceVariant); - - public static final DynamicColor outline = - DynamicColor.fromPalette( - (s) -> s.neutralVariantPalette, (s) -> 50.0, (s) -> highestSurface(s)); - - public static final DynamicColor outlineVariant = - DynamicColor.fromPalette( - (s) -> s.neutralVariantPalette, (s) -> s.isDark ? 30.0 : 80.0, - (s) -> highestSurface(s)); - - public static final DynamicColor primaryContainer = - DynamicColor.fromPalette( - (s) -> s.primaryPalette, - (s) -> { - if (!isFidelity(s)) { - return s.isDark ? 30.0 : 90.0; - } - return performAlbers(s.sourceColorHct, s); - }, - (s) -> highestSurface(s)); - - public static final DynamicColor onPrimaryContainer = - DynamicColor.fromPalette( - (s) -> s.primaryPalette, - (s) -> { - if (!isFidelity(s)) { - return s.isDark ? 90.0 : 10.0; - } - return DynamicColor.contrastingTone(primaryContainer.tone.apply(s), 4.5); - }, - (s) -> primaryContainer, - null); - - public static final DynamicColor primary = - DynamicColor.fromPalette( - (s) -> s.primaryPalette, - (s) -> s.isDark ? 80.0 : 40.0, - (s) -> highestSurface(s), - (s) -> - new ToneDeltaConstraint( - CONTAINER_ACCENT_TONE_DELTA, - primaryContainer, - s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER)); - - public static final DynamicColor primaryInverse = - DynamicColor.fromPalette( - (s) -> s.primaryPalette, (s) -> s.isDark ? 40.0 : 80.0, (s) -> surfaceInverse); - - public static final DynamicColor onPrimary = - DynamicColor.fromPalette( - (s) -> s.primaryPalette, (s) -> s.isDark ? 20.0 : 100.0, (s) -> primary); - - public static final DynamicColor secondaryContainer = - DynamicColor.fromPalette( - (s) -> s.secondaryPalette, - (s) -> { - final double initialTone = s.isDark ? 30.0 : 90.0; - if (!isFidelity(s)) { - return initialTone; - } - double answer = - findDesiredChromaByTone( - s.secondaryPalette.getHue(), - s.secondaryPalette.getChroma(), - initialTone, - !s.isDark); - answer = performAlbers(s.secondaryPalette.getHct(answer), s); - return answer; - }, - (s) -> highestSurface(s)); - - public static final DynamicColor onSecondaryContainer = - DynamicColor.fromPalette( - (s) -> s.secondaryPalette, - (s) -> { - if (!isFidelity(s)) { - return s.isDark ? 90.0 : 10.0; - } - return DynamicColor.contrastingTone(secondaryContainer.tone.apply(s), 4.5); - }, - (s) -> secondaryContainer); - - public static final DynamicColor secondary = - DynamicColor.fromPalette( - (s) -> s.secondaryPalette, - (s) -> s.isDark ? 80.0 : 40.0, - (s) -> highestSurface(s), - (s) -> - new ToneDeltaConstraint( - CONTAINER_ACCENT_TONE_DELTA, - secondaryContainer, - s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER)); - - public static final DynamicColor onSecondary = - DynamicColor.fromPalette( - (s) -> s.secondaryPalette, (s) -> s.isDark ? 20.0 : 100.0, (s) -> secondary); - - public static final DynamicColor tertiaryContainer = - DynamicColor.fromPalette( - (s) -> s.tertiaryPalette, - (s) -> { - if (!isFidelity(s)) { - return s.isDark ? 30.0 : 90.0; - } - final double albersTone = - performAlbers(s.tertiaryPalette.getHct(s.sourceColorHct.getTone()), - s); - final Hct proposedHct = s.tertiaryPalette.getHct(albersTone); - return DislikeAnalyzer.fixIfDisliked(proposedHct).getTone(); - }, - (s) -> highestSurface(s)); - - public static final DynamicColor onTertiaryContainer = - DynamicColor.fromPalette( - (s) -> s.tertiaryPalette, - (s) -> { - if (!isFidelity(s)) { - return s.isDark ? 90.0 : 10.0; - } - return DynamicColor.contrastingTone(tertiaryContainer.tone.apply(s), 4.5); - }, - (s) -> tertiaryContainer); - - public static final DynamicColor tertiary = - DynamicColor.fromPalette( - (s) -> s.tertiaryPalette, - (s) -> s.isDark ? 80.0 : 40.0, - (s) -> highestSurface(s), - (s) -> - new ToneDeltaConstraint( - CONTAINER_ACCENT_TONE_DELTA, - tertiaryContainer, - s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER)); - - public static final DynamicColor onTertiary = - DynamicColor.fromPalette( - (s) -> s.tertiaryPalette, (s) -> s.isDark ? 20.0 : 100.0, (s) -> tertiary); - - public static final DynamicColor errorContainer = - DynamicColor.fromPalette( - (s) -> s.errorPalette, (s) -> s.isDark ? 30.0 : 90.0, (s) -> highestSurface(s)); - - public static final DynamicColor onErrorContainer = - DynamicColor.fromPalette( - (s) -> s.errorPalette, (s) -> s.isDark ? 90.0 : 10.0, (s) -> errorContainer); - - public static final DynamicColor error = - DynamicColor.fromPalette( - (s) -> s.errorPalette, - (s) -> s.isDark ? 80.0 : 40.0, - (s) -> highestSurface(s), - (s) -> - new ToneDeltaConstraint( - CONTAINER_ACCENT_TONE_DELTA, - errorContainer, - s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER)); - - public static final DynamicColor onError = - DynamicColor.fromPalette((s) -> s.errorPalette, (s) -> s.isDark ? 20.0 : 100.0, - (s) -> error); - - public static final DynamicColor primaryFixed = - DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> 90.0, - (s) -> highestSurface(s)); - - public static final DynamicColor primaryFixedDarker = - DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> 80.0, - (s) -> highestSurface(s)); - - public static final DynamicColor onPrimaryFixed = - DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> 10.0, - (s) -> primaryFixedDarker); - - public static final DynamicColor onPrimaryFixedVariant = - DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> 30.0, - (s) -> primaryFixedDarker); - - public static final DynamicColor secondaryFixed = - DynamicColor.fromPalette((s) -> s.secondaryPalette, (s) -> 90.0, - (s) -> highestSurface(s)); - - public static final DynamicColor secondaryFixedDarker = - DynamicColor.fromPalette((s) -> s.secondaryPalette, (s) -> 80.0, - (s) -> highestSurface(s)); - - public static final DynamicColor onSecondaryFixed = - DynamicColor.fromPalette((s) -> s.secondaryPalette, (s) -> 10.0, - (s) -> secondaryFixedDarker); - - public static final DynamicColor onSecondaryFixedVariant = - DynamicColor.fromPalette((s) -> s.secondaryPalette, (s) -> 30.0, - (s) -> secondaryFixedDarker); - - public static final DynamicColor tertiaryFixed = - DynamicColor.fromPalette((s) -> s.tertiaryPalette, (s) -> 90.0, - (s) -> highestSurface(s)); - - public static final DynamicColor tertiaryFixedDarker = - DynamicColor.fromPalette((s) -> s.tertiaryPalette, (s) -> 80.0, - (s) -> highestSurface(s)); - - public static final DynamicColor onTertiaryFixed = - DynamicColor.fromPalette((s) -> s.tertiaryPalette, (s) -> 10.0, - (s) -> tertiaryFixedDarker); - - public static final DynamicColor onTertiaryFixedVariant = - DynamicColor.fromPalette((s) -> s.tertiaryPalette, (s) -> 30.0, - (s) -> tertiaryFixedDarker); - /** * These colors were present in Android framework before Android U, and used by MDC controls. * They * should be avoided, if possible. It's unclear if they're used on multiple backgrounds, and if - * they are, they can't be adjusted for contrast.* For now, they will be set with no - * background, + * they are, they can't be adjusted for contrast.* For now, they will be set with no background, * and those won't adjust for contrast, avoiding issues. * - * <p>* For example, if the same color is on a white background _and_ black background, there's - * no + * <p>* For example, if the same color is on a white background _and_ black background, + * there's no * way to increase contrast with either without losing contrast with the other. */ // colorControlActivated documented as colorAccent in M3 & GM3. // colorAccent documented as colorSecondary in M3 and colorPrimary in GM3. // Android used Material's Container as Primary/Secondary/Tertiary at launch. // Therefore, this is a duplicated version of Primary Container. - public static final DynamicColor controlActivated = - DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> s.isDark ? 30.0 : 90.0, null); - - // colorControlNormal documented as textColorSecondary in M3 & GM3. - // In Material, textColorSecondary points to onSurfaceVariant in the non-disabled state, - // which is Neutral Variant T30/80 in light/dark. - public static final DynamicColor controlNormal = - DynamicColor.fromPalette((s) -> s.neutralVariantPalette, (s) -> s.isDark ? 80.0 : 30.0); - - // colorControlHighlight documented, in both M3 & GM3: - // Light mode: #1f000000 dark mode: #33ffffff. - // These are black and white with some alpha. - // 1F hex = 31 decimal; 31 / 255 = 12% alpha. - // 33 hex = 51 decimal; 51 / 255 = 20% alpha. - // DynamicColors do not support alpha currently, and _may_ not need it for this use case, - // depending on how MDC resolved alpha for the other cases. - // Returning black in dark mode, white in light mode. - public static final DynamicColor controlHighlight = - new DynamicColor( - s -> 0.0, - s -> 0.0, - s -> s.isDark ? 100.0 : 0.0, - s -> s.isDark ? 0.20 : 0.12, - null, - scheme -> - DynamicColor.toneMinContrastDefault( - (s) -> s.isDark ? 100.0 : 0.0, null, scheme, null), - scheme -> - DynamicColor.toneMaxContrastDefault( - (s) -> s.isDark ? 100.0 : 0.0, null, scheme, null), - null); + public static DynamicColor controlActivated() { + return DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> s.isDark ? 30.0 : 90.0, null); + } - // textColorPrimaryInverse documented, in both M3 & GM3, documented as N10/N90. - public static final DynamicColor textPrimaryInverse = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); + // Compatibility Keys Colors for Android + public static DynamicColor primaryPaletteKeyColor() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, (s) -> s.primaryPalette.getKeyColor().getTone()); + } - // textColorSecondaryInverse and textColorTertiaryInverse both documented, in both M3 & GM3, as - // NV30/NV80 - public static final DynamicColor textSecondaryAndTertiaryInverse = - DynamicColor.fromPalette((s) -> s.neutralVariantPalette, (s) -> s.isDark ? 30.0 : 80.0); + public static DynamicColor secondaryPaletteKeyColor() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, (s) -> s.secondaryPalette.getKeyColor().getTone()); + } - // textColorPrimaryInverseDisableOnly documented, in both M3 & GM3, as N10/N90 - public static final DynamicColor textPrimaryInverseDisableOnly = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); + public static DynamicColor tertiaryPaletteKeyColor() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, (s) -> s.tertiaryPalette.getKeyColor().getTone()); + } - // textColorSecondaryInverse and textColorTertiaryInverse in disabled state both documented, - // in both M3 & GM3, as N10/N90 - public static final DynamicColor textSecondaryAndTertiaryInverseDisabled = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); + public static DynamicColor neutralPaletteKeyColor() { + return DynamicColor.fromPalette( + (s) -> s.neutralPalette, (s) -> s.neutralPalette.getKeyColor().getTone()); + } - // textColorHintInverse documented, in both M3 & GM3, as N10/N90 - public static final DynamicColor textHintInverse = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); + public static DynamicColor neutralVariantPaletteKeyColor() { + return DynamicColor.fromPalette( + (s) -> s.neutralVariantPalette, + (s) -> s.neutralVariantPalette.getKeyColor().getTone()); + } private static ViewingConditions viewingConditionsForAlbers(DynamicScheme scheme) { return ViewingConditions.defaultWithBackgroundLstar(scheme.isDark ? 30.0 : 80.0); @@ -377,6 +90,10 @@ public final class MaterialDynamicColors { return scheme.variant == Variant.FIDELITY || scheme.variant == Variant.CONTENT; } + private static boolean isMonochrome(DynamicScheme scheme) { + return scheme.variant == Variant.MONOCHROME; + } + static double findDesiredChromaByTone( double hue, double chroma, double tone, boolean byDecreasingTone) { double answer = tone; @@ -416,34 +133,456 @@ public final class MaterialDynamicColors { } } - // Compatibility mappings for Android - public static final DynamicColor surfaceContainerLow = surfaceSub1; - public static final DynamicColor surfaceContainerLowest = surfaceSub2; - public static final DynamicColor surfaceContainerHigh = surfaceAdd1; - public static final DynamicColor surfaceContainerHighest = surfaceAdd2; - public static final DynamicColor primaryFixedDim = primaryFixedDarker; - public static final DynamicColor secondaryFixedDim = secondaryFixedDarker; - public static final DynamicColor tertiaryFixedDim = tertiaryFixedDarker; + public static DynamicColor highestSurface(DynamicScheme s) { + return s.isDark ? surfaceBright() : surfaceDim(); + } - // Compatibility Keys Colors for Android - public static final DynamicColor primaryPaletteKeyColor = - DynamicColor.fromPalette( - (s) -> s.primaryPalette, (s) -> s.primaryPalette.getKeyColor().getTone()); - - public static final DynamicColor secondaryPaletteKeyColor = - DynamicColor.fromPalette( - (s) -> s.secondaryPalette, (s) -> s.secondaryPalette.getKeyColor().getTone()); - - public static final DynamicColor tertiaryPaletteKeyColor = - DynamicColor.fromPalette( - (s) -> s.tertiaryPalette, (s) -> s.tertiaryPalette.getKeyColor().getTone()); - - public static final DynamicColor neutralPaletteKeyColor = - DynamicColor.fromPalette( - (s) -> s.neutralPalette, (s) -> s.neutralPalette.getKeyColor().getTone()); - - public static final DynamicColor neutralVariantPaletteKeyColor = - DynamicColor.fromPalette( - (s) -> s.neutralVariantPalette, - (s) -> s.neutralVariantPalette.getKeyColor().getTone()); + public static DynamicColor background() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 98.0); + } + + public static DynamicColor onBackground() { + return DynamicColor.fromPalette( + (s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 10.0, (s) -> background()); + } + + public static DynamicColor surface() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 98.0); + } + + public static DynamicColor inverseSurface() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 20.0); + } + + public static DynamicColor surfaceBright() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 24.0 : 98.0); + } + + public static DynamicColor surfaceDim() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 87.0); + } + + public static DynamicColor surfaceContainerLowest() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 4.0 : 100.0); + } + + public static DynamicColor surfaceContainerLow() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 96.0); + } + + public static DynamicColor surfaceContainer() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 12.0 : 94.0); + } + + public static DynamicColor surfaceContainerHigh() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 17.0 : 92.0); + } + + public static DynamicColor surfaceContainerHighest() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 22.0 : 90.0); + } + + public static DynamicColor onSurface() { + return DynamicColor.fromPalette( + (s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 10.0, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor inverseOnSurface() { + return DynamicColor.fromPalette( + (s) -> s.neutralPalette, (s) -> s.isDark ? 20.0 : 95.0, (s) -> inverseSurface()); + } + + public static DynamicColor surfaceVariant() { + return DynamicColor.fromPalette((s) -> s.neutralVariantPalette, + (s) -> s.isDark ? 30.0 : 90.0); + } + + public static DynamicColor onSurfaceVariant() { + return DynamicColor.fromPalette( + (s) -> s.neutralVariantPalette, (s) -> s.isDark ? 80.0 : 30.0, + (s) -> surfaceVariant()); + } + + public static DynamicColor outline() { + return DynamicColor.fromPalette( + (s) -> s.neutralVariantPalette, (s) -> 50.0, MaterialDynamicColors::highestSurface); + } + + public static DynamicColor outlineVariant() { + return DynamicColor.fromPalette( + (s) -> s.neutralVariantPalette, (s) -> s.isDark ? 30.0 : 80.0, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor primaryContainer() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, + (s) -> { + if (isFidelity(s)) { + return performAlbers(s.sourceColorHct, s); + } + if (isMonochrome(s)) { + return s.isDark ? 85.0 : 25.0; + } + return s.isDark ? 30.0 : 90.0; + }, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor onPrimaryContainer() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, + (s) -> { + if (isFidelity(s)) { + return DynamicColor.contrastingTone(primaryContainer().tone.apply(s), 4.5); + } + if (isMonochrome(s)) { + return s.isDark ? 0.0 : 100.0; + } + return s.isDark ? 90.0 : 10.0; + }, + (s) -> primaryContainer(), + null); + } + + public static DynamicColor primary() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 100.0 : 0.0; + } + return s.isDark ? 80.0 : 40.0; + }, + MaterialDynamicColors::highestSurface, + (s) -> + new ToneDeltaConstraint( + CONTAINER_ACCENT_TONE_DELTA, + primaryContainer(), + s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER)); + } + + public static DynamicColor inversePrimary() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, (s) -> s.isDark ? 40.0 : 80.0, (s) -> inverseSurface()); + } + + public static DynamicColor onPrimary() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 10.0 : 90.0; + } + return s.isDark ? 20.0 : 100.0; + }, + (s) -> primary()); + } + + public static DynamicColor secondaryContainer() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 30.0 : 85.0; + } + final double initialTone = s.isDark ? 30.0 : 90.0; + if (!isFidelity(s)) { + return initialTone; + } + double answer = + findDesiredChromaByTone( + s.secondaryPalette.getHue(), + s.secondaryPalette.getChroma(), + initialTone, + !s.isDark); + answer = performAlbers(s.secondaryPalette.getHct(answer), s); + return answer; + }, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor onSecondaryContainer() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, + (s) -> { + if (!isFidelity(s)) { + return s.isDark ? 90.0 : 10.0; + } + return DynamicColor.contrastingTone(secondaryContainer().tone.apply(s), 4.5); + }, + (s) -> secondaryContainer()); + } + + public static DynamicColor secondary() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, + (s) -> s.isDark ? 80.0 : 40.0, + MaterialDynamicColors::highestSurface, + (s) -> + new ToneDeltaConstraint( + CONTAINER_ACCENT_TONE_DELTA, + secondaryContainer(), + s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER)); + } + + public static DynamicColor onSecondary() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 10.0 : 100.0; + } + return s.isDark ? 20.0 : 100.0; + }, + (s) -> secondary()); + } + + public static DynamicColor tertiaryContainer() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 60.0 : 49.0; + } + if (!isFidelity(s)) { + return s.isDark ? 30.0 : 90.0; + } + final double albersTone = + performAlbers(s.tertiaryPalette.getHct(s.sourceColorHct.getTone()), s); + final Hct proposedHct = s.tertiaryPalette.getHct(albersTone); + return DislikeAnalyzer.fixIfDisliked(proposedHct).getTone(); + }, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor onTertiaryContainer() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 0.0 : 100.0; + } + if (!isFidelity(s)) { + return s.isDark ? 90.0 : 10.0; + } + return DynamicColor.contrastingTone(tertiaryContainer().tone.apply(s), 4.5); + }, + (s) -> tertiaryContainer()); + } + + public static DynamicColor tertiary() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 90.0 : 25.0; + } + return s.isDark ? 80.0 : 40.0; + }, + MaterialDynamicColors::highestSurface, + (s) -> + new ToneDeltaConstraint( + CONTAINER_ACCENT_TONE_DELTA, + tertiaryContainer(), + s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER)); + } + + public static DynamicColor onTertiary() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 10.0 : 90.0; + } + return s.isDark ? 20.0 : 100.0; + }, + (s) -> tertiary()); + } + + public static DynamicColor errorContainer() { + return DynamicColor.fromPalette( + (s) -> s.errorPalette, (s) -> s.isDark ? 30.0 : 90.0, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor onErrorContainer() { + return DynamicColor.fromPalette( + (s) -> s.errorPalette, (s) -> s.isDark ? 90.0 : 10.0, (s) -> errorContainer()); + } + + public static DynamicColor error() { + return DynamicColor.fromPalette( + (s) -> s.errorPalette, + (s) -> s.isDark ? 80.0 : 40.0, + MaterialDynamicColors::highestSurface, + (s) -> + new ToneDeltaConstraint( + CONTAINER_ACCENT_TONE_DELTA, + errorContainer(), + s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER)); + } + + public static DynamicColor onError() { + return DynamicColor.fromPalette( + (s) -> s.errorPalette, (s) -> s.isDark ? 20.0 : 100.0, (s) -> error()); + } + + public static DynamicColor primaryFixed() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 100.0 : 10.0; + } + return 90.0; + }, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor primaryFixedDim() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 90.0 : 20.0; + } + return 80.0; + }, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor onPrimaryFixed() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 10.0 : 90.0; + } + return 10.0; + }, + (s) -> primaryFixedDim()); + } + + public static DynamicColor onPrimaryFixedVariant() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 30.0 : 70.0; + } + return 30.0; + }, + (s) -> primaryFixedDim()); + } + + public static DynamicColor secondaryFixed() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, (s) -> isMonochrome(s) ? 80.0 : 90.0, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor secondaryFixedDim() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, (s) -> isMonochrome(s) ? 70.0 : 80.0, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor onSecondaryFixed() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, (s) -> 10.0, (s) -> secondaryFixedDim()); + } + + public static DynamicColor onSecondaryFixedVariant() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, + (s) -> isMonochrome(s) ? 25.0 : 30.0, + (s) -> secondaryFixedDim()); + } + + public static DynamicColor tertiaryFixed() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, (s) -> isMonochrome(s) ? 40.0 : 90.0, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor tertiaryFixedDim() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, (s) -> isMonochrome(s) ? 30.0 : 80.0, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor onTertiaryFixed() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, (s) -> isMonochrome(s) ? 90.0 : 10.0, + (s) -> tertiaryFixedDim()); + } + + public static DynamicColor onTertiaryFixedVariant() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, (s) -> isMonochrome(s) ? 70.0 : 30.0, + (s) -> tertiaryFixedDim()); + } + + // colorControlNormal documented as textColorSecondary in M3 & GM3. + // In Material, textColorSecondary points to onSurfaceVariant in the non-disabled state, + // which is Neutral Variant T30/80 in light/dark. + public static DynamicColor controlNormal() { + return DynamicColor.fromPalette((s) -> s.neutralVariantPalette, + (s) -> s.isDark ? 80.0 : 30.0); + } + + // colorControlHighlight documented, in both M3 & GM3: + // Light mode: #1f000000 dark mode: #33ffffff. + // These are black and white with some alpha. + // 1F hex = 31 decimal; 31 / 255 = 12% alpha. + // 33 hex = 51 decimal; 51 / 255 = 20% alpha. + // DynamicColors do not support alpha currently, and _may_ not need it for this use case, + // depending on how MDC resolved alpha for the other cases. + // Returning black in dark mode, white in light mode. + public static DynamicColor controlHighlight() { + return new DynamicColor( + s -> 0.0, + s -> 0.0, + s -> s.isDark ? 100.0 : 0.0, + s -> s.isDark ? 0.20 : 0.12, + null, + scheme -> + + DynamicColor.toneMinContrastDefault((s) -> s.isDark ? 100.0 : 0.0, null, + scheme, null), + scheme -> + DynamicColor.toneMaxContrastDefault((s) -> s.isDark ? 100.0 : 0.0, null, + scheme, null), + null); + } + + // textColorPrimaryInverse documented, in both M3 & GM3, documented as N10/N90. + public static DynamicColor textPrimaryInverse() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); + } + + // textColorSecondaryInverse and textColorTertiaryInverse both documented, in both M3 & GM3, as + // NV30/NV80 + public static DynamicColor textSecondaryAndTertiaryInverse() { + return DynamicColor.fromPalette((s) -> s.neutralVariantPalette, + (s) -> s.isDark ? 30.0 : 80.0); + } + + // textColorPrimaryInverseDisableOnly documented, in both M3 & GM3, as N10/N90 + public static DynamicColor textPrimaryInverseDisableOnly() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); + } + + // textColorSecondaryInverse and textColorTertiaryInverse in disabled state both documented, + // in both M3 & GM3, as N10/N90 + public static DynamicColor textSecondaryAndTertiaryInverseDisabled() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); + } + + // textColorHintInverse documented, in both M3 & GM3, as N10/N90 + public static DynamicColor textHintInverse() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); + } } diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeTonalSpot.java b/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeTonalSpot.java index 8480684043dc..cc6b492dadc9 100644 --- a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeTonalSpot.java +++ b/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeTonalSpot.java @@ -32,7 +32,7 @@ public class SchemeTonalSpot extends DynamicScheme { TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 16.0), TonalPalette.fromHueAndChroma( MathUtils.sanitizeDegreesDouble(sourceColorHct.getHue() + 60.0), 24.0), - TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 4.0), + TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 6.0), TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 8.0)); } } diff --git a/packages/SystemUI/res/layout/auth_credential_password_view.xml b/packages/SystemUI/res/layout/auth_credential_password_view.xml index 021ebe6e7bff..33f1b10b123b 100644 --- a/packages/SystemUI/res/layout/auth_credential_password_view.xml +++ b/packages/SystemUI/res/layout/auth_credential_password_view.xml @@ -23,40 +23,47 @@ android:orientation="vertical" android:theme="?app:attr/lockPinPasswordStyle"> - <RelativeLayout + <ScrollView android:id="@+id/auth_credential_header" - style="?headerStyle" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="wrap_content"> - <ImageView - android:id="@+id/icon" - style="?headerIconStyle" - android:layout_alignParentLeft="true" - android:layout_alignParentTop="true" - android:contentDescription="@null"/> - - <TextView - android:id="@+id/title" - style="?titleTextAppearance" - android:layout_below="@id/icon" + <RelativeLayout + style="?headerStyle" android:layout_width="match_parent" - android:layout_height="wrap_content"/> + android:layout_height="wrap_content"> - <TextView - android:id="@+id/subtitle" - style="?subTitleTextAppearance" - android:layout_below="@id/title" - android:layout_width="match_parent" - android:layout_height="wrap_content"/> + <ImageView + android:id="@+id/icon" + style="?headerIconStyle" + android:layout_alignParentLeft="true" + android:layout_alignParentTop="true" + android:contentDescription="@null" /> - <TextView - android:id="@+id/description" - style="?descriptionTextAppearance" - android:layout_below="@id/subtitle" - android:layout_width="match_parent" - android:layout_height="wrap_content"/> - </RelativeLayout> + <TextView + android:id="@+id/title" + style="?titleTextAppearance" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/icon" /> + + <TextView + android:id="@+id/subtitle" + style="?subTitleTextAppearance" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/title" /> + + <TextView + android:id="@+id/description" + style="?descriptionTextAppearance" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/subtitle" /> + + </RelativeLayout> + + </ScrollView> <LinearLayout android:id="@+id/auth_credential_input" diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/condition/Monitor.java b/packages/SystemUI/shared/src/com/android/systemui/shared/condition/Monitor.java index 209d5e80e2d2..43df08df9f45 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/condition/Monitor.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/condition/Monitor.java @@ -32,8 +32,10 @@ import java.util.concurrent.Executor; import javax.inject.Inject; /** - * {@link Monitor} takes in a set of conditions, monitors whether all of them have - * been fulfilled, and informs any registered listeners. + * {@link Monitor} allows {@link Subscription}s to a set of conditions and monitors whether all of + * them have been fulfilled. + * <p> + * This class should be used as a singleton, to prevent duplicate monitoring of the same conditions. */ public class Monitor { private final String mTag = getClass().getSimpleName(); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt b/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt index 67d2f308d326..f0b9f670f1e0 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt @@ -17,6 +17,8 @@ package com.android.systemui.biometrics.dagger import com.android.settingslib.udfps.UdfpsUtils +import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepository +import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepositoryImpl import com.android.systemui.biometrics.data.repository.PromptRepository import com.android.systemui.biometrics.data.repository.PromptRepositoryImpl import com.android.systemui.biometrics.domain.interactor.CredentialInteractor @@ -41,6 +43,11 @@ interface BiometricsModule { @Binds @SysUISingleton + fun fingerprintRepository(impl: FingerprintPropertyRepositoryImpl): + FingerprintPropertyRepository + + @Binds + @SysUISingleton fun providesCredentialInteractor(impl: CredentialInteractorImpl): CredentialInteractor @Binds diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/FingerprintPropertyRepository.kt b/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/FingerprintPropertyRepository.kt new file mode 100644 index 000000000000..33fb36c15c2d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/FingerprintPropertyRepository.kt @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.biometrics.data.repository + +import android.hardware.biometrics.SensorLocationInternal +import android.hardware.fingerprint.FingerprintManager +import android.hardware.fingerprint.FingerprintSensorPropertiesInternal +import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback +import com.android.systemui.biometrics.shared.model.FingerprintSensorType +import com.android.systemui.biometrics.shared.model.SensorStrength +import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging +import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.shareIn + +/** + * A repository for the global state of FingerprintProperty. + * + * There is never more than one instance of the FingerprintProperty at any given time. + */ +interface FingerprintPropertyRepository { + + /** + * If the repository is initialized or not. Other properties are defaults until this is true. + */ + val isInitialized: Flow<Boolean> + + /** The id of fingerprint sensor. */ + val sensorId: StateFlow<Int> + + /** The security strength of sensor (convenience, weak, strong). */ + val strength: StateFlow<SensorStrength> + + /** The types of fingerprint sensor (rear, ultrasonic, optical, etc.). */ + val sensorType: StateFlow<FingerprintSensorType> + + /** The primary sensor location relative to the default display. */ + val sensorLocation: StateFlow<SensorLocationInternal> + + // TODO(b/251476085): don't implement until we need it, but expose alternative locations as + // a map of display id -> location or similar. + /** The sensor location relative to each physical display. */ + // val sensorLocations<Map<String, SensorLocationInternal>> +} + +@SysUISingleton +class FingerprintPropertyRepositoryImpl +@Inject +constructor( + @Application private val applicationScope: CoroutineScope, + private val fingerprintManager: FingerprintManager +) : FingerprintPropertyRepository { + + override val isInitialized: Flow<Boolean> = + conflatedCallbackFlow { + val callback = + object : IFingerprintAuthenticatorsRegisteredCallback.Stub() { + override fun onAllAuthenticatorsRegistered( + sensors: List<FingerprintSensorPropertiesInternal> + ) { + if (sensors.isNotEmpty()) { + setProperties(sensors[0]) + trySendWithFailureLogging(true, TAG, "initialize properties") + } + } + } + fingerprintManager.addAuthenticatorsRegisteredCallback(callback) + trySendWithFailureLogging(false, TAG, "initial value defaulting to false") + awaitClose {} + } + .shareIn(scope = applicationScope, started = SharingStarted.Eagerly, replay = 1) + + private val _sensorId: MutableStateFlow<Int> = MutableStateFlow(-1) + override val sensorId: StateFlow<Int> = _sensorId.asStateFlow() + + private val _strength: MutableStateFlow<SensorStrength> = + MutableStateFlow(SensorStrength.CONVENIENCE) + override val strength = _strength.asStateFlow() + + private val _sensorType: MutableStateFlow<FingerprintSensorType> = + MutableStateFlow(FingerprintSensorType.UNKNOWN) + override val sensorType = _sensorType.asStateFlow() + + private val _sensorLocation: MutableStateFlow<SensorLocationInternal> = + MutableStateFlow(SensorLocationInternal.DEFAULT) + override val sensorLocation = _sensorLocation.asStateFlow() + + private fun setProperties(prop: FingerprintSensorPropertiesInternal) { + _sensorId.value = prop.sensorId + _strength.value = sensorStrengthIntToObject(prop.sensorStrength) + _sensorType.value = sensorTypeIntToObject(prop.sensorType) + _sensorLocation.value = prop.location + } + + companion object { + private const val TAG = "FingerprintPropertyRepositoryImpl" + } +} + +private fun sensorStrengthIntToObject(value: Int): SensorStrength { + return when (value) { + 0 -> SensorStrength.CONVENIENCE + 1 -> SensorStrength.WEAK + 2 -> SensorStrength.STRONG + else -> throw IllegalArgumentException("Invalid SensorStrength value: $value") + } +} + +private fun sensorTypeIntToObject(value: Int): FingerprintSensorType { + return when (value) { + 0 -> FingerprintSensorType.UNKNOWN + 1 -> FingerprintSensorType.REAR + 2 -> FingerprintSensorType.UDFPS_ULTRASONIC + 3 -> FingerprintSensorType.UDFPS_OPTICAL + 4 -> FingerprintSensorType.POWER_BUTTON + 5 -> FingerprintSensorType.HOME_BUTTON + else -> throw IllegalArgumentException("Invalid SensorType value: $value") + } +} diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/FingerprintSensorType.kt b/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/FingerprintSensorType.kt new file mode 100644 index 000000000000..df5cefdb876d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/FingerprintSensorType.kt @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.biometrics.shared.model + +import android.hardware.fingerprint.FingerprintSensorProperties + +/** Fingerprint sensor types. Represents [FingerprintSensorProperties.SensorType]. */ +enum class FingerprintSensorType { + UNKNOWN, + REAR, + UDFPS_ULTRASONIC, + UDFPS_OPTICAL, + POWER_BUTTON, + HOME_BUTTON, +} diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/SensorStrength.kt b/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/SensorStrength.kt new file mode 100644 index 000000000000..2982d0be3764 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/SensorStrength.kt @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.biometrics.shared.model + +import android.hardware.biometrics.SensorProperties + +/** Fingerprint sensor security strength. Represents [SensorProperties.Strength]. */ +enum class SensorStrength { + CONVENIENCE, + WEAK, + STRONG, +} diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt index bcc0575651e4..ede62acb3255 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt @@ -65,7 +65,7 @@ class CredentialPasswordView(context: Context, attrs: AttributeSet?) : super.onLayout(changed, left, top, right, bottom) val inputLeftBound: Int - val inputTopBound: Int + var inputTopBound: Int var headerRightBound = right var headerTopBounds = top val subTitleBottom: Int = if (subtitleView.isGone) titleView.bottom else subtitleView.bottom @@ -75,14 +75,23 @@ class CredentialPasswordView(context: Context, attrs: AttributeSet?) : inputLeftBound = (right - left) / 2 headerRightBound = inputLeftBound headerTopBounds -= iconView.bottom.coerceAtMost(bottomInset) + + if (descriptionView.bottom > bottomInset) { + credentialHeader.layout(left, headerTopBounds, headerRightBound, bottom) + } } else { inputTopBound = descBottom + (bottom - descBottom - credentialInput.height) / 2 inputLeftBound = (right - left - credentialInput.width) / 2 - } - if (descriptionView.bottom > bottomInset) { - credentialHeader.layout(left, headerTopBounds, headerRightBound, bottom) + if (bottom - inputTopBound < credentialInput.height) { + inputTopBound = bottom - credentialInput.height + } + + if (descriptionView.bottom > inputTopBound) { + credentialHeader.layout(left, headerTopBounds, headerRightBound, inputTopBound) + } } + credentialInput.layout(inputLeftBound, inputTopBound, right, bottom) } diff --git a/packages/SystemUI/src/com/android/systemui/complication/ComplicationTypesUpdater.java b/packages/SystemUI/src/com/android/systemui/complication/ComplicationTypesUpdater.java index 016891df4b3b..a334c1ed2338 100644 --- a/packages/SystemUI/src/com/android/systemui/complication/ComplicationTypesUpdater.java +++ b/packages/SystemUI/src/com/android/systemui/complication/ComplicationTypesUpdater.java @@ -16,8 +16,6 @@ package com.android.systemui.complication; -import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR; - import android.database.ContentObserver; import android.os.UserHandle; import android.provider.Settings; @@ -25,6 +23,7 @@ import android.provider.Settings; import com.android.settingslib.dream.DreamBackend; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.shared.condition.Monitor; import com.android.systemui.util.condition.ConditionalCoreStartable; @@ -33,7 +32,6 @@ import com.android.systemui.util.settings.SecureSettings; import java.util.concurrent.Executor; import javax.inject.Inject; -import javax.inject.Named; /** * {@link ComplicationTypesUpdater} observes the state of available complication types set by the @@ -53,7 +51,7 @@ public class ComplicationTypesUpdater extends ConditionalCoreStartable { @Main Executor executor, SecureSettings secureSettings, DreamOverlayStateController dreamOverlayStateController, - @Named(DREAM_PRETEXT_MONITOR) Monitor monitor) { + @SystemUser Monitor monitor) { super(monitor); mDreamBackend = dreamBackend; mExecutor = executor; diff --git a/packages/SystemUI/src/com/android/systemui/complication/DreamClockTimeComplication.java b/packages/SystemUI/src/com/android/systemui/complication/DreamClockTimeComplication.java index 5020480f8d60..9c3448b91b39 100644 --- a/packages/SystemUI/src/com/android/systemui/complication/DreamClockTimeComplication.java +++ b/packages/SystemUI/src/com/android/systemui/complication/DreamClockTimeComplication.java @@ -18,11 +18,11 @@ package com.android.systemui.complication; import static com.android.systemui.complication.dagger.DreamClockTimeComplicationModule.DREAM_CLOCK_TIME_COMPLICATION_VIEW; import static com.android.systemui.complication.dagger.RegisteredComplicationsModule.DREAM_CLOCK_TIME_COMPLICATION_LAYOUT_PARAMS; -import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR; import android.view.View; import com.android.systemui.CoreStartable; +import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.shared.condition.Monitor; import com.android.systemui.util.condition.ConditionalCoreStartable; @@ -74,7 +74,7 @@ public class DreamClockTimeComplication implements Complication { public Registrant( DreamOverlayStateController dreamOverlayStateController, DreamClockTimeComplication dreamClockTimeComplication, - @Named(DREAM_PRETEXT_MONITOR) Monitor monitor) { + @SystemUser Monitor monitor) { super(monitor); mDreamOverlayStateController = dreamOverlayStateController; mComplication = dreamClockTimeComplication; diff --git a/packages/SystemUI/src/com/android/systemui/complication/DreamHomeControlsComplication.java b/packages/SystemUI/src/com/android/systemui/complication/DreamHomeControlsComplication.java index 8f192de8c4a5..f973aeef0e6b 100644 --- a/packages/SystemUI/src/com/android/systemui/complication/DreamHomeControlsComplication.java +++ b/packages/SystemUI/src/com/android/systemui/complication/DreamHomeControlsComplication.java @@ -21,7 +21,6 @@ import static com.android.systemui.complication.dagger.RegisteredComplicationsMo import static com.android.systemui.controls.dagger.ControlsComponent.Visibility.AVAILABLE; import static com.android.systemui.controls.dagger.ControlsComponent.Visibility.AVAILABLE_AFTER_UNLOCK; import static com.android.systemui.controls.dagger.ControlsComponent.Visibility.UNAVAILABLE; -import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR; import android.content.Context; import android.content.Intent; @@ -40,6 +39,7 @@ import com.android.systemui.controls.dagger.ControlsComponent; import com.android.systemui.controls.management.ControlsListingController; import com.android.systemui.controls.ui.ControlsActivity; import com.android.systemui.controls.ui.ControlsUiController; +import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.shared.condition.Monitor; @@ -108,7 +108,7 @@ public class DreamHomeControlsComplication implements Complication { public Registrant(DreamHomeControlsComplication complication, DreamOverlayStateController dreamOverlayStateController, ControlsComponent controlsComponent, - @Named(DREAM_PRETEXT_MONITOR) Monitor monitor) { + @SystemUser Monitor monitor) { super(monitor); mComplication = complication; mControlsComponent = controlsComponent; diff --git a/packages/SystemUI/src/com/android/systemui/complication/SmartSpaceComplication.java b/packages/SystemUI/src/com/android/systemui/complication/SmartSpaceComplication.java index 2f5ef6da6912..b98794ef8026 100644 --- a/packages/SystemUI/src/com/android/systemui/complication/SmartSpaceComplication.java +++ b/packages/SystemUI/src/com/android/systemui/complication/SmartSpaceComplication.java @@ -17,7 +17,6 @@ package com.android.systemui.complication; import static com.android.systemui.complication.dagger.RegisteredComplicationsModule.DREAM_SMARTSPACE_LAYOUT_PARAMS; -import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR; import android.content.Context; import android.os.Parcelable; @@ -26,6 +25,7 @@ import android.view.ViewGroup; import android.widget.FrameLayout; import com.android.systemui.CoreStartable; +import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.dreams.smartspace.DreamSmartspaceController; import com.android.systemui.flags.FeatureFlags; @@ -88,7 +88,7 @@ public class SmartSpaceComplication implements Complication { DreamOverlayStateController dreamOverlayStateController, SmartSpaceComplication smartSpaceComplication, DreamSmartspaceController smartSpaceController, - @Named(DREAM_PRETEXT_MONITOR) Monitor monitor, + @SystemUser Monitor monitor, FeatureFlags featureFlags) { super(monitor); mDreamOverlayStateController = dreamOverlayStateController; diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index dff2c0e91f1f..8e6e0dd37a90 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -42,6 +42,7 @@ import com.android.systemui.clipboardoverlay.dagger.ClipboardOverlayModule; import com.android.systemui.complication.dagger.ComplicationComponent; import com.android.systemui.controls.dagger.ControlsModule; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.demomode.dagger.DemoModeModule; import com.android.systemui.doze.dagger.DozeComponent; import com.android.systemui.dreams.dagger.DreamModule; @@ -60,6 +61,7 @@ import com.android.systemui.people.PeopleModule; import com.android.systemui.plugins.BcSmartspaceConfigPlugin; import com.android.systemui.plugins.BcSmartspaceDataPlugin; import com.android.systemui.privacy.PrivacyModule; +import com.android.systemui.process.condition.SystemProcessCondition; import com.android.systemui.qrcodescanner.dagger.QRCodeScannerModule; import com.android.systemui.qs.FgsManagerController; import com.android.systemui.qs.FgsManagerControllerImpl; @@ -74,6 +76,7 @@ import com.android.systemui.shade.ShadeController; import com.android.systemui.shade.ShadeModule; import com.android.systemui.shade.transition.LargeScreenShadeInterpolator; import com.android.systemui.shade.transition.LargeScreenShadeInterpolatorImpl; +import com.android.systemui.shared.condition.Monitor; import com.android.systemui.smartspace.dagger.SmartspaceModule; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationLockscreenUserManager; @@ -126,6 +129,7 @@ import dagger.BindsOptionalOf; import dagger.Module; import dagger.Provides; +import java.util.Collections; import java.util.Optional; import java.util.concurrent.Executor; @@ -232,6 +236,17 @@ public abstract class SystemUIModule { return state; } + /** + * Provides the monitor for SystemUI that requires the process running as the system user. + */ + @SysUISingleton + @Provides + @SystemUser + static Monitor provideSystemUserMonitor(@Main Executor executor, + SystemProcessCondition systemProcessCondition) { + return new Monitor(executor, Collections.singleton(systemProcessCondition)); + } + @BindsOptionalOf abstract CommandQueue optionalCommandQueue(); diff --git a/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/SystemUser.kt b/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/SystemUser.kt new file mode 100644 index 000000000000..6878a52b672d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/SystemUser.kt @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.dagger.qualifiers + +import javax.inject.Qualifier + +@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class SystemUser diff --git a/packages/SystemUI/src/com/android/systemui/dreams/AssistantAttentionMonitor.java b/packages/SystemUI/src/com/android/systemui/dreams/AssistantAttentionMonitor.java index 49d7f7810740..822cfb89e706 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/AssistantAttentionMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/AssistantAttentionMonitor.java @@ -19,6 +19,7 @@ package com.android.systemui.dreams; import android.util.Log; import com.android.systemui.CoreStartable; +import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.dreams.callbacks.AssistantAttentionCallback; import com.android.systemui.dreams.conditions.AssistantAttentionCondition; import com.android.systemui.shared.condition.Monitor; @@ -38,7 +39,7 @@ public class AssistantAttentionMonitor implements CoreStartable { @Inject public AssistantAttentionMonitor( - Monitor monitor, + @SystemUser Monitor monitor, AssistantAttentionCondition assistantAttentionCondition, AssistantAttentionCallback callback) { mConditionMonitor = monitor; diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamMonitor.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamMonitor.java index 7f567aa334a6..e9ebd3b9c91d 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamMonitor.java @@ -16,11 +16,10 @@ package com.android.systemui.dreams; -import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR; - import android.util.Log; import com.android.systemui.CoreStartable; +import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.dreams.callbacks.DreamStatusBarStateCallback; import com.android.systemui.dreams.conditions.DreamCondition; import com.android.systemui.flags.RestartDozeListener; @@ -28,7 +27,6 @@ import com.android.systemui.shared.condition.Monitor; import com.android.systemui.util.condition.ConditionalCoreStartable; import javax.inject.Inject; -import javax.inject.Named; /** * A {@link CoreStartable} to retain a monitor for tracking dreaming. @@ -42,13 +40,11 @@ public class DreamMonitor extends ConditionalCoreStartable { private final DreamStatusBarStateCallback mCallback; private RestartDozeListener mRestartDozeListener; - @Inject - public DreamMonitor(Monitor monitor, DreamCondition dreamCondition, - @Named(DREAM_PRETEXT_MONITOR) Monitor pretextMonitor, + public DreamMonitor(@SystemUser Monitor monitor, DreamCondition dreamCondition, DreamStatusBarStateCallback callback, RestartDozeListener restartDozeListener) { - super(pretextMonitor); + super(monitor); mConditionMonitor = monitor; mDreamCondition = dreamCondition; mCallback = callback; diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.java index a2dcdf52ad3c..80e68cfbff21 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.java @@ -17,7 +17,6 @@ package com.android.systemui.dreams; import static com.android.systemui.dreams.dagger.DreamModule.DREAM_OVERLAY_SERVICE_COMPONENT; -import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -35,6 +34,7 @@ import android.service.dreams.IDreamManager; import android.util.Log; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.shared.condition.Monitor; import com.android.systemui.util.condition.ConditionalCoreStartable; @@ -105,7 +105,7 @@ public class DreamOverlayRegistrant extends ConditionalCoreStartable { @Inject public DreamOverlayRegistrant(Context context, @Main Resources resources, @Named(DREAM_OVERLAY_SERVICE_COMPONENT) ComponentName dreamOverlayServiceComponent, - @Named(DREAM_PRETEXT_MONITOR) Monitor monitor) { + @SystemUser Monitor monitor) { super(monitor); mContext = context; mResources = resources; diff --git a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java index 1271645dac4e..c61b47758ab7 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java @@ -31,22 +31,14 @@ import com.android.systemui.dreams.DreamOverlayNotificationCountProvider; import com.android.systemui.dreams.DreamOverlayService; import com.android.systemui.dreams.complication.dagger.ComplicationComponent; import com.android.systemui.dreams.touch.scrim.dagger.ScrimModule; -import com.android.systemui.process.condition.SystemProcessCondition; -import com.android.systemui.shared.condition.Condition; -import com.android.systemui.shared.condition.Monitor; -import dagger.Binds; import dagger.Module; import dagger.Provides; -import dagger.multibindings.IntoSet; import java.util.Optional; -import java.util.Set; -import java.util.concurrent.Executor; import javax.inject.Named; - /** * Dagger Module providing Dream-related functionality. */ @@ -65,11 +57,8 @@ public interface DreamModule { String DREAM_OVERLAY_ENABLED = "dream_overlay_enabled"; String DREAM_SUPPORTED = "dream_supported"; - String DREAM_PRETEXT_CONDITIONS = "dream_pretext_conditions"; - String DREAM_PRETEXT_MONITOR = "dream_prtext_monitor"; String DREAM_OVERLAY_WINDOW_TITLE = "dream_overlay_window_title"; - /** * Provides the dream component */ @@ -129,21 +118,6 @@ public interface DreamModule { } /** */ - @Binds - @IntoSet - @Named(DREAM_PRETEXT_CONDITIONS) - Condition bindSystemProcessCondition(SystemProcessCondition condition); - - /** */ - @Provides - @Named(DREAM_PRETEXT_MONITOR) - static Monitor providesDockerPretextMonitor( - @Main Executor executor, - @Named(DREAM_PRETEXT_CONDITIONS) Set<Condition> pretextConditions) { - return new Monitor(executor, pretextConditions); - } - - /** */ @Provides @Named(DREAM_OVERLAY_WINDOW_TITLE) static String providesDreamOverlayWindowTitle(@Main Resources resources) { diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index 300fe69e0f93..75eab8274814 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -622,10 +622,12 @@ object Flags { val APP_PANELS_REMOVE_APPS_ALLOWED = unreleasedFlag(2003, "app_panels_remove_apps_allowed", teamfood = true) - // 2200 - udfps + // 2200 - biometrics (udfps, sfps, BiometricPrompt, etc.) // TODO(b/259264861): Tracking Bug @JvmField val UDFPS_NEW_TOUCH_DETECTION = releasedFlag(2200, "udfps_new_touch_detection") @JvmField val UDFPS_ELLIPSE_DETECTION = releasedFlag(2201, "udfps_ellipse_detection") + // TODO(b/278622168): Tracking Bug + @JvmField val BIOMETRIC_BP_STRONG = unreleasedFlag(2202, "biometric_bp_strong") // 2300 - stylus @JvmField val TRACK_STYLUS_EVER_USED = releasedFlag(2300, "track_stylus_ever_used") diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt index 96e97565d585..91bb7898494f 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt @@ -60,15 +60,21 @@ private const val MIN_DURATION_CANCELLED_ANIMATION = 200L private const val MIN_DURATION_COMMITTED_ANIMATION = 80L private const val MIN_DURATION_COMMITTED_AFTER_FLING_ANIMATION = 120L private const val MIN_DURATION_INACTIVE_BEFORE_FLUNG_ANIMATION = 50L -private const val MIN_DURATION_INACTIVE_BEFORE_ACTIVE_ANIMATION = 80L +private const val MIN_DURATION_INACTIVE_BEFORE_ACTIVE_ANIMATION = 160F +private const val MIN_DURATION_ENTRY_BEFORE_ACTIVE_ANIMATION = 10F +internal const val MAX_DURATION_ENTRY_BEFORE_ACTIVE_ANIMATION = 100F private const val MIN_DURATION_FLING_ANIMATION = 160L private const val MIN_DURATION_ENTRY_TO_ACTIVE_CONSIDERED_AS_FLING = 100L private const val MIN_DURATION_INACTIVE_TO_ACTIVE_CONSIDERED_AS_FLING = 400L private const val POP_ON_FLING_DELAY = 60L -private const val POP_ON_FLING_SCALE = 2f -private const val POP_ON_COMMITTED_SCALE = 3f +private const val POP_ON_FLING_VELOCITY = 2f +private const val POP_ON_COMMITTED_VELOCITY = 3f +private const val POP_ON_ACTIVE_MAX_VELOCITY = 2.5f +private const val POP_ON_ACTIVE_MIN_VELOCITY = 4.5f +private const val POP_ON_INACTIVE_MAX_VELOCITY = -1.05f +private const val POP_ON_INACTIVE_MIN_VELOCITY = -1.5f internal val VIBRATE_ACTIVATED_EFFECT = VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK) @@ -156,13 +162,22 @@ class BackPanelController internal constructor( private var gestureEntryTime = 0L private var gestureInactiveTime = 0L - private var gesturePastActiveThresholdWhileInactiveTime = 0L private val elapsedTimeSinceInactive get() = SystemClock.uptimeMillis() - gestureInactiveTime private val elapsedTimeSinceEntry get() = SystemClock.uptimeMillis() - gestureEntryTime + + private var pastThresholdWhileEntryOrInactiveTime = 0L + private var entryToActiveDelay = 0F + private val entryToActiveDelayCalculation = { + convertVelocityToAnimationFactor( + valueOnFastVelocity = MIN_DURATION_ENTRY_BEFORE_ACTIVE_ANIMATION, + valueOnSlowVelocity = MAX_DURATION_ENTRY_BEFORE_ACTIVE_ANIMATION, + ) + } + // Whether the current gesture has moved a sufficiently large amount, // so that we can unambiguously start showing the ENTRY animation private var hasPassedDragSlop = false @@ -306,7 +321,9 @@ class BackPanelController internal constructor( MotionEvent.ACTION_UP -> { when (currentState) { GestureState.ENTRY -> { - if (isFlungAwayFromEdge(endX = event.x)) { + if (isFlungAwayFromEdge(endX = event.x) || + previousXTranslation > params.staticTriggerThreshold + ) { updateArrowState(GestureState.ACTIVE) updateArrowState(GestureState.FLUNG) } else { @@ -394,12 +411,29 @@ class BackPanelController internal constructor( } private fun updateArrowStateOnMove(yTranslation: Float, xTranslation: Float) { - val isWithinYActivationThreshold = xTranslation * 2 >= yTranslation - + val isPastStaticThreshold = xTranslation > params.staticTriggerThreshold when (currentState) { GestureState.ENTRY -> { - if (xTranslation > params.staticTriggerThreshold) { + if (isPastThresholdToActive( + isPastThreshold = isPastStaticThreshold, + dynamicDelay = entryToActiveDelayCalculation + ) + ) { + updateArrowState(GestureState.ACTIVE) + } + } + GestureState.INACTIVE -> { + val isPastDynamicReactivationThreshold = + totalTouchDeltaInactive >= params.reactivationTriggerThreshold + + if (isPastThresholdToActive( + isPastThreshold = isPastStaticThreshold && + isPastDynamicReactivationThreshold && + isWithinYActivationThreshold, + delay = MIN_DURATION_INACTIVE_BEFORE_ACTIVE_ANIMATION + ) + ) { updateArrowState(GestureState.ACTIVE) } } @@ -408,43 +442,12 @@ class BackPanelController internal constructor( totalTouchDeltaActive <= params.deactivationTriggerThreshold val isMinDurationElapsed = elapsedTimeSinceEntry > MIN_DURATION_ACTIVE_BEFORE_INACTIVE_ANIMATION - - if (isMinDurationElapsed && (!isWithinYActivationThreshold || - isPastDynamicDeactivationThreshold) - ) { + val isPastAllThresholds = + !isWithinYActivationThreshold || isPastDynamicDeactivationThreshold + if (isPastAllThresholds && isMinDurationElapsed) { updateArrowState(GestureState.INACTIVE) } } - GestureState.INACTIVE -> { - val isPastStaticThreshold = - xTranslation > params.staticTriggerThreshold - val isPastDynamicReactivationThreshold = - totalTouchDeltaInactive >= params.reactivationTriggerThreshold - val isPastAllThresholds = isPastStaticThreshold && - isPastDynamicReactivationThreshold && - isWithinYActivationThreshold - val isPastAllThresholdsForFirstTime = isPastAllThresholds && - gesturePastActiveThresholdWhileInactiveTime == 0L - - gesturePastActiveThresholdWhileInactiveTime = when { - isPastAllThresholdsForFirstTime -> SystemClock.uptimeMillis() - isPastAllThresholds -> gesturePastActiveThresholdWhileInactiveTime - else -> 0L - } - - val elapsedTimePastAllThresholds = - SystemClock.uptimeMillis() - gesturePastActiveThresholdWhileInactiveTime - - val isPastMinimumInactiveToActiveDuration = - elapsedTimePastAllThresholds > MIN_DURATION_INACTIVE_BEFORE_ACTIVE_ANIMATION - - if (isPastAllThresholds && isPastMinimumInactiveToActiveDuration) { - // The minimum duration adds the 'edge stickiness' - // factor before pulling it off edge - updateArrowState(GestureState.ACTIVE) - } - } - else -> {} } } @@ -672,6 +675,28 @@ class BackPanelController internal constructor( return flingDistance > minFlingDistance && isPastFlingVelocityThreshold } + private fun isPastThresholdToActive( + isPastThreshold: Boolean, + delay: Float? = null, + dynamicDelay: () -> Float = { delay ?: 0F } + ): Boolean { + val resetValue = 0L + val isPastThresholdForFirstTime = pastThresholdWhileEntryOrInactiveTime == resetValue + + if (!isPastThreshold) { + pastThresholdWhileEntryOrInactiveTime = resetValue + return false + } + + if (isPastThresholdForFirstTime) { + pastThresholdWhileEntryOrInactiveTime = SystemClock.uptimeMillis() + entryToActiveDelay = dynamicDelay() + } + val timePastThreshold = SystemClock.uptimeMillis() - pastThresholdWhileEntryOrInactiveTime + + return timePastThreshold > entryToActiveDelay + } + private fun playWithBackgroundWidthAnimation( onEnd: DelayedOnAnimationEndListener, delay: Long = 0L @@ -886,33 +911,16 @@ class BackPanelController internal constructor( } GestureState.ACTIVE -> { previousXTranslationOnActiveOffset = previousXTranslation - updateRestingArrowDimens() - vibratorHelper.cancel() mainHandler.postDelayed(10L) { vibratorHelper.vibrate(VIBRATE_ACTIVATED_EFFECT) } - - val minimumPop = 2f - val maximumPop = 4.5f - - when (previousState) { - GestureState.ENTRY -> { - val startingVelocity = convertVelocityToSpringStartingVelocity( - valueOnFastVelocity = minimumPop, - valueOnSlowVelocity = maximumPop, - fastVelocityBound = 1f, - slowVelocityBound = 0.5f, - ) - mView.popOffEdge(startingVelocity) - } - GestureState.INACTIVE -> { - mView.popOffEdge(maximumPop) - } - - else -> {} - } + val startingVelocity = convertVelocityToAnimationFactor( + valueOnFastVelocity = POP_ON_ACTIVE_MAX_VELOCITY, + valueOnSlowVelocity = POP_ON_ACTIVE_MIN_VELOCITY, + ) + mView.popOffEdge(startingVelocity) } GestureState.INACTIVE -> { @@ -925,9 +933,9 @@ class BackPanelController internal constructor( // so that gesture progress in this state is consistent regardless of entry totalTouchDeltaInactive = params.deactivationTriggerThreshold - val startingVelocity = convertVelocityToSpringStartingVelocity( - valueOnFastVelocity = -1.05f, - valueOnSlowVelocity = -1.50f + val startingVelocity = convertVelocityToAnimationFactor( + valueOnFastVelocity = POP_ON_INACTIVE_MAX_VELOCITY, + valueOnSlowVelocity = POP_ON_INACTIVE_MIN_VELOCITY ) mView.popOffEdge(startingVelocity) @@ -935,7 +943,9 @@ class BackPanelController internal constructor( updateRestingArrowDimens() } GestureState.FLUNG -> { - mainHandler.postDelayed(POP_ON_FLING_DELAY) { mView.popScale(POP_ON_FLING_SCALE) } + mainHandler.postDelayed(POP_ON_FLING_DELAY) { + mView.popScale(POP_ON_FLING_VELOCITY) + } updateRestingArrowDimens() mainHandler.postDelayed(onEndSetCommittedStateListener.runnable, MIN_DURATION_FLING_ANIMATION) @@ -951,7 +961,7 @@ class BackPanelController internal constructor( mainHandler.postDelayed(onEndSetGoneStateListener.runnable, MIN_DURATION_COMMITTED_AFTER_FLING_ANIMATION) } else { - mView.popScale(POP_ON_COMMITTED_SCALE) + mView.popScale(POP_ON_COMMITTED_VELOCITY) mainHandler.postDelayed(onAlphaEndSetGoneStateListener.runnable, MIN_DURATION_COMMITTED_ANIMATION) } @@ -968,11 +978,11 @@ class BackPanelController internal constructor( } } - private fun convertVelocityToSpringStartingVelocity( + private fun convertVelocityToAnimationFactor( valueOnFastVelocity: Float, valueOnSlowVelocity: Float, - fastVelocityBound: Float = 3f, - slowVelocityBound: Float = 0f, + fastVelocityBound: Float = 1f, + slowVelocityBound: Float = 0.5f, ): Float { val factor = velocityTracker?.run { computeCurrentVelocity(PX_PER_MS) diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java index 41e3e6d83eea..9a1efc3d6456 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java @@ -15,6 +15,8 @@ */ package com.android.systemui.navigationbar.gestural; +import static android.view.InputDevice.SOURCE_MOUSE; +import static android.view.InputDevice.SOURCE_TOUCHPAD; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_EXCLUDE_FROM_SCREEN_MAGNIFICATION; import static com.android.systemui.classifier.Classifier.BACK_GESTURE; @@ -937,10 +939,12 @@ public class EdgeBackGestureHandler implements PluginListener<NavigationEdgeBack mMLResults = 0; mLogGesture = false; mInRejectedExclusion = false; - boolean isWithinInsets = isWithinInsets((int) ev.getX(), (int) ev.getY()); // Trackpad back gestures don't have zones, so we don't need to check if the down event - // is within insets. + // is within insets. Also we don't allow back for button press from the trackpad, and + // yet we do with a mouse. + boolean isWithinInsets = isWithinInsets((int) ev.getX(), (int) ev.getY()); mAllowGesture = !mDisabledForQuickstep && mIsBackGestureAllowed + && !isButtonPressFromTrackpad(ev) && (isTrackpadMultiFingerSwipe || isWithinInsets) && !mGestureBlockingActivityRunning && !QuickStepContract.isBackGestureDisabled(mSysUiFlags) @@ -1047,6 +1051,11 @@ public class EdgeBackGestureHandler implements PluginListener<NavigationEdgeBack mProtoTracer.scheduleFrameUpdate(); } + private boolean isButtonPressFromTrackpad(MotionEvent ev) { + int sources = InputManager.getInstance().getInputDevice(ev.getDeviceId()).getSources(); + return (sources & (SOURCE_MOUSE | SOURCE_TOUCHPAD)) == sources && ev.getButtonState() != 0; + } + private void dispatchToBackAnimation(MotionEvent event) { if (mBackAnimation != null) { mVelocityTracker.addMovement(event); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt index 876c74a9f3e3..182ece7cd328 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt @@ -153,7 +153,7 @@ data class EdgePanelParams(private var resources: Resources) { horizontalTranslation = getDimen(R.dimen.navigation_edge_entry_margin), scale = getDimenFloat(R.dimen.navigation_edge_entry_scale), scalePivotX = getDimen(R.dimen.navigation_edge_pre_threshold_background_width), - horizontalTranslationSpring = createSpring(500f, 0.76f), + horizontalTranslationSpring = createSpring(800f, 0.76f), verticalTranslationSpring = createSpring(30000f, 1f), scaleSpring = createSpring(120f, 0.8f), arrowDimens = ArrowDimens( @@ -205,8 +205,8 @@ data class EdgePanelParams(private var resources: Resources) { activeIndicator = BackIndicatorDimens( horizontalTranslation = getDimen(R.dimen.navigation_edge_active_margin), scale = getDimenFloat(R.dimen.navigation_edge_active_scale), - horizontalTranslationSpring = createSpring(1000f, 0.7f), - scaleSpring = createSpring(450f, 0.39f), + horizontalTranslationSpring = createSpring(1000f, 0.8f), + scaleSpring = createSpring(325f, 0.55f), scalePivotX = getDimen(R.dimen.navigation_edge_active_background_width), arrowDimens = ArrowDimens( length = getDimen(R.dimen.navigation_edge_active_arrow_length), @@ -253,7 +253,7 @@ data class EdgePanelParams(private var resources: Resources) { getDimen(R.dimen.navigation_edge_pre_threshold_edge_corners), farCornerRadius = getDimen(R.dimen.navigation_edge_pre_threshold_far_corners), - widthSpring = createSpring(400f, 0.65f), + widthSpring = createSpring(650f, 1f), heightSpring = createSpring(1500f, 0.45f), farCornerRadiusSpring = createSpring(300f, 1f), edgeCornerRadiusSpring = createSpring(250f, 0.5f), diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LegacyNotificationShelfControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/LegacyNotificationShelfControllerImpl.java index 505f45d021b8..dcd9dc3e7fa3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LegacyNotificationShelfControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LegacyNotificationShelfControllerImpl.java @@ -52,7 +52,6 @@ public class LegacyNotificationShelfControllerImpl implements NotificationShelfC mActivatableNotificationViewController = activatableNotificationViewController; mKeyguardBypassController = keyguardBypassController; mStatusBarStateController = statusBarStateController; - mView.useRoundnessSourceTypes(true); mView.setSensitiveRevealAnimEndabled(featureFlags.isEnabled(Flags.SENSITIVE_REVEAL_ANIM)); mOnAttachStateChangeListener = new View.OnAttachStateChangeListener() { @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 7eb63da38028..49c7950fd923 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -44,7 +44,6 @@ import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; import com.android.systemui.shade.transition.LargeScreenShadeInterpolator; -import com.android.systemui.statusbar.notification.LegacySourceType; import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.notification.SourceType; import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; @@ -128,13 +127,6 @@ public class NotificationShelf extends ActivatableNotificationView implements St setClipToPadding(false); mShelfIcons.setIsStaticLayout(false); requestRoundness(/* top = */ 1f, /* bottom = */ 1f, BASE_VALUE, /* animate = */ false); - - if (!mUseRoundnessSourceTypes) { - // Setting this to first in section to get the clipping to the top roundness correct. - // This value determines the way we are clipping to the top roundness of the overall - // shade - setFirstInSection(true); - } updateResources(); } @@ -569,17 +561,8 @@ public class NotificationShelf extends ActivatableNotificationView implements St * mAmbientState.getExpansionFraction(); final float cornerAnimationTop = shelfStart - cornerAnimationDistance; - final SourceType sourceType; - if (mUseRoundnessSourceTypes) { - sourceType = SHELF_SCROLL; - } else { - sourceType = LegacySourceType.OnScroll; - } - final float topValue; - if (!mUseRoundnessSourceTypes && anv.isFirstInSection()) { - topValue = 1f; - } else if (viewStart >= cornerAnimationTop) { + if (viewStart >= cornerAnimationTop) { // Round top corners within animation bounds topValue = MathUtils.saturate( (viewStart - cornerAnimationTop) / cornerAnimationDistance); @@ -588,12 +571,10 @@ public class NotificationShelf extends ActivatableNotificationView implements St // Reset top and bottom corners outside of animation bounds. topValue = 0f; } - anv.requestTopRoundness(topValue, sourceType, /* animate = */ false); + anv.requestTopRoundness(topValue, SHELF_SCROLL, /* animate = */ false); final float bottomValue; - if (!mUseRoundnessSourceTypes && anv.isLastInSection()) { - bottomValue = 1f; - } else if (viewEnd >= cornerAnimationTop) { + if (viewEnd >= cornerAnimationTop) { // Round bottom corners within animation bounds bottomValue = MathUtils.saturate( (viewEnd - cornerAnimationTop) / cornerAnimationDistance); @@ -602,7 +583,7 @@ public class NotificationShelf extends ActivatableNotificationView implements St // Reset top and bottom corners outside of animation bounds. bottomValue = 0f; } - anv.requestBottomRoundness(bottomValue, sourceType, /* animate = */ false); + anv.requestBottomRoundness(bottomValue, SHELF_SCROLL, /* animate = */ false); } private boolean isViewAffectedBySwipe(ExpandableView expandableView) { @@ -1100,15 +1081,6 @@ public class NotificationShelf extends ActivatableNotificationView implements St child.requestRoundnessReset(SHELF_SCROLL); } - /** - * This method resets the OnScroll roundness of a view to 0f - * <p> - * Note: This should be the only class that handles roundness {@code SourceType.OnScroll} - */ - public static void resetLegacyOnScrollRoundness(ExpandableView expandableView) { - expandableView.requestRoundnessReset(LegacySourceType.OnScroll); - } - @Override public void dump(PrintWriter pwOriginal, String[] args) { IndentingPrintWriter pw = DumpUtilsKt.asIndenting(pwOriginal); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt index 976924a2159d..821a17279cb3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt @@ -87,13 +87,8 @@ constructor( bypassController.isPulseExpanding = value if (changed) { if (value) { - val topEntry = headsUpManager.topEntry - topEntry?.let { - roundnessManager.setTrackingHeadsUp(it.row) - } lockscreenShadeTransitionController.onPulseExpansionStarted() } else { - roundnessManager.setTrackingHeadsUp(null) if (!leavingLockscreen) { bypassController.maybePerformPendingUnlock() pulseExpandAbortListener?.run() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/Roundable.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/Roundable.kt index 76ff97ddb61b..212f2c215989 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/Roundable.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/Roundable.kt @@ -448,10 +448,3 @@ interface SourceType { } } } - -@Deprecated("Use SourceType.from() instead", ReplaceWith("SourceType.from()")) -enum class LegacySourceType : SourceType { - DefaultValue, - OnDismissAnimation, - OnScroll, -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java index 766ad88f8a55..66d4c3a97773 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java @@ -110,7 +110,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView protected Point mTargetPoint; private boolean mDismissed; private boolean mRefocusOnDismiss; - protected boolean mUseRoundnessSourceTypes; public ActivatableNotificationView(Context context, AttributeSet attrs) { super(context, attrs); @@ -709,18 +708,10 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView mTouchHandler = touchHandler; } - /** - * Enable the support for rounded corner based on the SourceType - * @param enabled true if is supported - */ - public void useRoundnessSourceTypes(boolean enabled) { - mUseRoundnessSourceTypes = enabled; - } - @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - if (mUseRoundnessSourceTypes && !mOnDetachResetRoundness.isEmpty()) { + if (!mOnDetachResetRoundness.isEmpty()) { for (SourceType sourceType : mOnDetachResetRoundness) { requestRoundnessReset(sourceType); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index e468a59d4eb1..597813344d6e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -87,7 +87,6 @@ import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.notification.AboveShelfChangedListener; import com.android.systemui.statusbar.notification.FeedbackIcon; import com.android.systemui.statusbar.notification.LaunchAnimationParameters; -import com.android.systemui.statusbar.notification.LegacySourceType; import com.android.systemui.statusbar.notification.NotificationFadeAware; import com.android.systemui.statusbar.notification.NotificationLaunchAnimatorController; import com.android.systemui.statusbar.notification.NotificationUtils; @@ -866,9 +865,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } onAttachedChildrenCountChanged(); row.setIsChildInGroup(false, null); - if (!mUseRoundnessSourceTypes) { - row.requestBottomRoundness(0.0f, LegacySourceType.DefaultValue, /* animate = */ false); - } } /** @@ -884,10 +880,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView if (child.keepInParentForDismissAnimation()) { mChildrenContainer.removeNotification(child); child.setIsChildInGroup(false, null); - if (!mUseRoundnessSourceTypes) { - LegacySourceType sourceType = LegacySourceType.DefaultValue; - child.requestBottomRoundness(0f, sourceType, /* animate = */ false); - } child.setKeepInParentForDismissAnimation(false); logKeepInParentChildDetached(child); childCountChanged = true; @@ -942,9 +934,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mNotificationParent.updateBackgroundForGroupState(); } updateBackgroundClipping(); - if (mUseRoundnessSourceTypes) { - updateBaseRoundness(); - } + updateBaseRoundness(); } @Override @@ -1054,15 +1044,13 @@ public class ExpandableNotificationRow extends ActivatableNotificationView if (isAboveShelf() != wasAboveShelf) { mAboveShelfChangedListener.onAboveShelfStateChanged(!wasAboveShelf); } - if (mUseRoundnessSourceTypes) { - if (pinned) { - // Should be animated if someone explicitly set it to 0 and the row is shown. - boolean animated = mAnimatePinnedRoundness && isShown(); - requestRoundness(/* top = */ 1f, /* bottom = */ 1f, PINNED, animated); - } else { - requestRoundnessReset(PINNED); - mAnimatePinnedRoundness = true; - } + if (pinned) { + // Should be animated if someone explicitly set it to 0 and the row is shown. + boolean animated = mAnimatePinnedRoundness && isShown(); + requestRoundness(/* top = */ 1f, /* bottom = */ 1f, PINNED, animated); + } else { + requestRoundnessReset(PINNED); + mAnimatePinnedRoundness = true; } } @@ -1879,7 +1867,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mChildrenContainer.setIsLowPriority(mIsLowPriority); mChildrenContainer.setContainingNotification(ExpandableNotificationRow.this); mChildrenContainer.onNotificationUpdated(); - mChildrenContainer.useRoundnessSourceTypes(mUseRoundnessSourceTypes); mTranslateableViews.add(mChildrenContainer); }); @@ -2308,24 +2295,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mBackgroundNormal.setExpandAnimationSize(params.getWidth(), actualHeight); } - @Override - public float getTopRoundness() { - if (!mUseRoundnessSourceTypes && mExpandAnimationRunning) { - return mTopRoundnessDuringLaunchAnimation; - } - - return super.getTopRoundness(); - } - - @Override - public float getBottomRoundness() { - if (!mUseRoundnessSourceTypes && mExpandAnimationRunning) { - return mBottomRoundnessDuringLaunchAnimation; - } - - return super.getBottomRoundness(); - } - public void setExpandAnimationRunning(boolean expandAnimationRunning) { if (expandAnimationRunning) { setAboveShelf(true); @@ -3481,18 +3450,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView private void applyChildrenRoundness() { if (mIsSummaryWithChildren) { - if (mUseRoundnessSourceTypes) { - mChildrenContainer.requestRoundness( - /* top = */ getTopRoundness(), - /* bottom = */ getBottomRoundness(), - /* sourceType = */ FROM_PARENT, - /* animate = */ false); - } else { - mChildrenContainer.requestBottomRoundness( - getBottomRoundness(), - LegacySourceType.DefaultValue, - /* animate = */ false); - } + mChildrenContainer.requestRoundness( + /* top = */ getTopRoundness(), + /* bottom = */ getBottomRoundness(), + /* sourceType = */ FROM_PARENT, + /* animate = */ false); } } @@ -3709,24 +3671,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } } - /** - * Enable the support for rounded corner based on the SourceType - * @param enabled true if is supported - */ - @Override - public void useRoundnessSourceTypes(boolean enabled) { - super.useRoundnessSourceTypes(enabled); - if (mChildrenContainer != null) { - mChildrenContainer.useRoundnessSourceTypes(mUseRoundnessSourceTypes); - } - } - @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - if (mUseRoundnessSourceTypes) { - updateBaseRoundness(); - } + updateBaseRoundness(); } /** Set whether this notification may show a snooze action. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java index 19c612ed21ff..1acc9f90b58f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java @@ -261,7 +261,6 @@ public class ExpandableNotificationRowController implements NotifViewController mStatusBarStateController.removeCallback(mStatusBarStateListener); } }); - mView.useRoundnessSourceTypes(true); } private final StatusBarStateController.StateListener mStatusBarStateListener = diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java index 9a777ea6230b..2c59c2e8a06f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java @@ -72,7 +72,6 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper imple private View mFeedbackIcon; private boolean mIsLowPriority; private boolean mTransformLowPriorityTitle; - private boolean mUseRoundnessSourceTypes; private RoundnessChangedListener mRoundnessChangedListener; protected NotificationHeaderViewWrapper(Context ctx, View view, ExpandableNotificationRow row) { @@ -122,7 +121,7 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper imple @Override public void applyRoundnessAndInvalidate() { - if (mUseRoundnessSourceTypes && mRoundnessChangedListener != null) { + if (mRoundnessChangedListener != null) { // We cannot apply the rounded corner to this View, so our parents (in drawChild()) will // clip our canvas. So we should invalidate our parent. mRoundnessChangedListener.applyRoundnessAndInvalidate(); @@ -377,15 +376,6 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper imple } /** - * Enable the support for rounded corner based on the SourceType - * - * @param enabled true if is supported - */ - public void useRoundnessSourceTypes(boolean enabled) { - mUseRoundnessSourceTypes = enabled; - } - - /** * Interface that handle the Roundness changes */ public interface RoundnessChangedListener { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/ui/viewbinder/NotificationShelfViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/ui/viewbinder/NotificationShelfViewBinder.kt index 81067157ca5b..12956ab9498a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/ui/viewbinder/NotificationShelfViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/ui/viewbinder/NotificationShelfViewBinder.kt @@ -81,7 +81,6 @@ object NotificationShelfViewBinder { ActivatableNotificationViewBinder.bind(viewModel, shelf, falsingManager) shelf.apply { setRefactorFlagEnabled(true) - useRoundnessSourceTypes(true) setSensitiveRevealAnimEndabled(featureFlags.isEnabled(Flags.SENSITIVE_REVEAL_ANIM)) // TODO(278765923): Replace with eventual NotificationIconContainerViewBinder#bind() notificationIconAreaController.setShelfIcons(shelfIcons) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java index 160a2309bfcc..d18757d3453f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java @@ -45,9 +45,7 @@ import com.android.internal.widget.NotificationExpandButton; import com.android.systemui.R; import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.statusbar.NotificationGroupingUtil; -import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.notification.FeedbackIcon; -import com.android.systemui.statusbar.notification.LegacySourceType; import com.android.systemui.statusbar.notification.NotificationFadeAware; import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.notification.Roundable; @@ -133,7 +131,6 @@ public class NotificationChildrenContainer extends ViewGroup private int mUntruncatedChildCount; private boolean mContainingNotificationIsFaded = false; private RoundableState mRoundableState; - private boolean mUseRoundnessSourceTypes; public NotificationChildrenContainer(Context context) { this(context, null); @@ -328,13 +325,6 @@ public class NotificationChildrenContainer extends ViewGroup row.setContentTransformationAmount(0, false /* isLastChild */); row.setNotificationFaded(mContainingNotificationIsFaded); - if (!mUseRoundnessSourceTypes) { - // This is a workaround, the NotificationShelf should be the owner of `OnScroll` - // roundness. - // Here we should reset the `OnScroll` roundness only on top-level rows. - NotificationShelf.resetLegacyOnScrollRoundness(row); - } - // It doesn't make sense to keep old animations around, lets cancel them! ExpandableViewState viewState = row.getViewState(); if (viewState != null) { @@ -342,9 +332,7 @@ public class NotificationChildrenContainer extends ViewGroup row.cancelAppearDrawing(); } - if (mUseRoundnessSourceTypes) { - applyRoundnessAndInvalidate(); - } + applyRoundnessAndInvalidate(); } private void ensureRemovedFromTransientContainer(View v) { @@ -379,10 +367,8 @@ public class NotificationChildrenContainer extends ViewGroup mGroupingUtil.restoreChildNotification(row); } - if (mUseRoundnessSourceTypes) { - row.requestRoundnessReset(FROM_PARENT, /* animate = */ false); - applyRoundnessAndInvalidate(); - } + row.requestRoundnessReset(FROM_PARENT, /* animate = */ false); + applyRoundnessAndInvalidate(); } /** @@ -409,10 +395,7 @@ public class NotificationChildrenContainer extends ViewGroup getContext(), mNotificationHeader, mContainingNotification); - mNotificationHeaderWrapper.useRoundnessSourceTypes(mUseRoundnessSourceTypes); - if (mUseRoundnessSourceTypes) { - mNotificationHeaderWrapper.setOnRoundnessChangedListener(this::invalidate); - } + mNotificationHeaderWrapper.setOnRoundnessChangedListener(this::invalidate); addView(mNotificationHeader, 0); invalidate(); } else { @@ -450,12 +433,7 @@ public class NotificationChildrenContainer extends ViewGroup getContext(), mNotificationHeaderLowPriority, mContainingNotification); - mNotificationHeaderWrapperLowPriority.useRoundnessSourceTypes( - mUseRoundnessSourceTypes - ); - if (mUseRoundnessSourceTypes) { - mNotificationHeaderWrapper.setOnRoundnessChangedListener(this::invalidate); - } + mNotificationHeaderWrapper.setOnRoundnessChangedListener(this::invalidate); addView(mNotificationHeaderLowPriority, 0); invalidate(); } else { @@ -891,7 +869,7 @@ public class NotificationChildrenContainer extends ViewGroup isCanvasChanged = true; canvas.save(); - if (mUseRoundnessSourceTypes && translation != 0f) { + if (translation != 0f) { clipPath.offset(translation, 0f); canvas.clipPath(clipPath); clipPath.offset(-translation, 0f); @@ -1444,40 +1422,30 @@ public class NotificationChildrenContainer extends ViewGroup @Override public void applyRoundnessAndInvalidate() { boolean last = true; - if (mUseRoundnessSourceTypes) { - if (mNotificationHeaderWrapper != null) { - mNotificationHeaderWrapper.requestTopRoundness( - /* value = */ getTopRoundness(), - /* sourceType = */ FROM_PARENT, - /* animate = */ false - ); - } - if (mNotificationHeaderWrapperLowPriority != null) { - mNotificationHeaderWrapperLowPriority.requestTopRoundness( - /* value = */ getTopRoundness(), - /* sourceType = */ FROM_PARENT, - /* animate = */ false - ); - } + if (mNotificationHeaderWrapper != null) { + mNotificationHeaderWrapper.requestTopRoundness( + /* value = */ getTopRoundness(), + /* sourceType = */ FROM_PARENT, + /* animate = */ false + ); + } + if (mNotificationHeaderWrapperLowPriority != null) { + mNotificationHeaderWrapperLowPriority.requestTopRoundness( + /* value = */ getTopRoundness(), + /* sourceType = */ FROM_PARENT, + /* animate = */ false + ); } for (int i = mAttachedChildren.size() - 1; i >= 0; i--) { ExpandableNotificationRow child = mAttachedChildren.get(i); if (child.getVisibility() == View.GONE) { continue; } - if (mUseRoundnessSourceTypes) { - child.requestRoundness( - /* top = */ 0f, - /* bottom = */ last ? getBottomRoundness() : 0f, - /* sourceType = */ FROM_PARENT, - /* animate = */ false); - } else { - child.requestRoundness( - /* top = */ 0f, - /* bottom = */ last ? getBottomRoundness() : 0f, - LegacySourceType.DefaultValue, - /* animate = */ isShown()); - } + child.requestRoundness( + /* top = */ 0f, + /* bottom = */ last ? getBottomRoundness() : 0f, + /* sourceType = */ FROM_PARENT, + /* animate = */ false); last = false; } Roundable.super.applyRoundnessAndInvalidate(); @@ -1537,15 +1505,6 @@ public class NotificationChildrenContainer extends ViewGroup return mNotificationHeaderWrapper; } - /** - * Enable the support for rounded corner based on the SourceType - * - * @param enabled true if is supported - */ - public void useRoundnessSourceTypes(boolean enabled) { - mUseRoundnessSourceTypes = enabled; - } - public String debugString() { return TAG + " { " + "visibility: " + getVisibility() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java index b6aec83ae600..fa1843e34305 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java @@ -16,22 +16,13 @@ package com.android.systemui.statusbar.notification.stack; -import android.content.res.Resources; -import android.util.MathUtils; - import androidx.annotation.NonNull; import com.android.systemui.Dumpable; -import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dump.DumpManager; -import com.android.systemui.statusbar.notification.LegacySourceType; -import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager; import com.android.systemui.statusbar.notification.Roundable; import com.android.systemui.statusbar.notification.SourceType; -import com.android.systemui.statusbar.notification.collection.NotificationEntry; -import com.android.systemui.statusbar.notification.logging.NotificationRoundnessLogger; -import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.ExpandableView; import java.io.PrintWriter; @@ -48,63 +39,27 @@ public class NotificationRoundnessManager implements Dumpable { private static final String TAG = "NotificationRoundnessManager"; private static final SourceType DISMISS_ANIMATION = SourceType.from("DismissAnimation"); - private final ExpandableView[] mFirstInSectionViews; - private final ExpandableView[] mLastInSectionViews; - private final ExpandableView[] mTmpFirstInSectionViews; - private final ExpandableView[] mTmpLastInSectionViews; - private final NotificationRoundnessLogger mNotifLogger; private final DumpManager mDumpManager; - private boolean mExpanded; private HashSet<ExpandableView> mAnimatedChildren; - private Runnable mRoundingChangedCallback; - private ExpandableNotificationRow mTrackedHeadsUp; - private float mAppearFraction; private boolean mRoundForPulsingViews; private boolean mIsClearAllInProgress; private ExpandableView mSwipedView = null; private Roundable mViewBeforeSwipedView = null; private Roundable mViewAfterSwipedView = null; - private boolean mUseRoundnessSourceTypes; @Inject - NotificationRoundnessManager( - NotificationSectionsFeatureManager sectionsFeatureManager, - NotificationRoundnessLogger notifLogger, - DumpManager dumpManager) { - int numberOfSections = sectionsFeatureManager.getNumberOfBuckets(); - mFirstInSectionViews = new ExpandableView[numberOfSections]; - mLastInSectionViews = new ExpandableView[numberOfSections]; - mTmpFirstInSectionViews = new ExpandableView[numberOfSections]; - mTmpLastInSectionViews = new ExpandableView[numberOfSections]; - mNotifLogger = notifLogger; + NotificationRoundnessManager(DumpManager dumpManager) { mDumpManager = dumpManager; - mUseRoundnessSourceTypes = true; - mDumpManager.registerDumpable(TAG, this); } @Override public void dump(@NonNull PrintWriter pw, @NonNull String[] args) { - pw.println("mFirstInSectionViews: length=" + mFirstInSectionViews.length); - pw.println(dumpViews(mFirstInSectionViews)); - pw.println("mLastInSectionViews: length=" + mLastInSectionViews.length); - pw.println(dumpViews(mFirstInSectionViews)); - if (mTrackedHeadsUp != null) { - pw.println("trackedHeadsUp=" + mTrackedHeadsUp.getEntry()); - } pw.println("roundForPulsingViews=" + mRoundForPulsingViews); pw.println("isClearAllInProgress=" + mIsClearAllInProgress); } - public void updateView(ExpandableView view, boolean animate) { - if (mUseRoundnessSourceTypes) return; - boolean changed = updateViewWithoutCallback(view, animate); - if (changed) { - mRoundingChangedCallback.run(); - } - } - public boolean isViewAffectedBySwipe(ExpandableView expandableView) { return expandableView != null && (expandableView == mSwipedView @@ -112,58 +67,6 @@ public class NotificationRoundnessManager implements Dumpable { || expandableView == mViewAfterSwipedView); } - boolean updateViewWithoutCallback( - ExpandableView view, - boolean animate) { - if (mUseRoundnessSourceTypes) return false; - if (view == null - || view == mViewBeforeSwipedView - || view == mViewAfterSwipedView) { - return false; - } - - final boolean isTopChanged = view.requestTopRoundness( - getRoundnessDefaultValue(view, true /* top */), - LegacySourceType.DefaultValue, - animate); - - final boolean isBottomChanged = view.requestBottomRoundness( - getRoundnessDefaultValue(view, /* top = */ false), - LegacySourceType.DefaultValue, - animate); - - final boolean isFirstInSection = isFirstInSection(view); - final boolean isLastInSection = isLastInSection(view); - - view.setFirstInSection(isFirstInSection); - view.setLastInSection(isLastInSection); - - mNotifLogger.onCornersUpdated(view, isFirstInSection, - isLastInSection, isTopChanged, isBottomChanged); - - return (isFirstInSection || isLastInSection) && (isTopChanged || isBottomChanged); - } - - private boolean isFirstInSection(ExpandableView view) { - if (mUseRoundnessSourceTypes) return false; - for (int i = 0; i < mFirstInSectionViews.length; i++) { - if (view == mFirstInSectionViews[i]) { - return true; - } - } - return false; - } - - private boolean isLastInSection(ExpandableView view) { - if (mUseRoundnessSourceTypes) return false; - for (int i = mLastInSectionViews.length - 1; i >= 0; i--) { - if (view == mLastInSectionViews[i]) { - return true; - } - } - return false; - } - void setViewsAffectedBySwipe( Roundable viewBefore, ExpandableView viewSwiped, @@ -177,34 +80,27 @@ public class NotificationRoundnessManager implements Dumpable { if (mSwipedView != null) oldViews.add(mSwipedView); if (mViewAfterSwipedView != null) oldViews.add(mViewAfterSwipedView); - final SourceType source; - if (mUseRoundnessSourceTypes) { - source = DISMISS_ANIMATION; - } else { - source = LegacySourceType.OnDismissAnimation; - } - mViewBeforeSwipedView = viewBefore; if (viewBefore != null) { oldViews.remove(viewBefore); - viewBefore.requestRoundness(/* top = */ 0f, /* bottom = */ 1f, source); + viewBefore.requestRoundness(/* top = */ 0f, /* bottom = */ 1f, DISMISS_ANIMATION); } mSwipedView = viewSwiped; if (viewSwiped != null) { oldViews.remove(viewSwiped); - viewSwiped.requestRoundness(/* top = */ 1f, /* bottom = */ 1f, source); + viewSwiped.requestRoundness(/* top = */ 1f, /* bottom = */ 1f, DISMISS_ANIMATION); } mViewAfterSwipedView = viewAfter; if (viewAfter != null) { oldViews.remove(viewAfter); - viewAfter.requestRoundness(/* top = */ 1f, /* bottom = */ 0f, source); + viewAfter.requestRoundness(/* top = */ 1f, /* bottom = */ 0f, DISMISS_ANIMATION); } // After setting the current Views, reset the views that are still present in the set. for (Roundable oldView : oldViews) { - oldView.requestRoundnessReset(source); + oldView.requestRoundnessReset(DISMISS_ANIMATION); } } @@ -226,143 +122,6 @@ public class NotificationRoundnessManager implements Dumpable { return mRoundForPulsingViews; } - private float getRoundnessDefaultValue(Roundable view, boolean top) { - if (mUseRoundnessSourceTypes) return 0f; - - if (view == null) { - return 0f; - } - if (view == mViewBeforeSwipedView - || view == mSwipedView - || view == mViewAfterSwipedView) { - return 1f; - } - if (view instanceof ExpandableNotificationRow - && ((ExpandableNotificationRow) view).canViewBeCleared() - && mIsClearAllInProgress) { - return 1.0f; - } - if (view instanceof ExpandableView) { - ExpandableView expandableView = (ExpandableView) view; - if ((expandableView.isPinned() - || (expandableView.isHeadsUpAnimatingAway()) && !mExpanded)) { - return 1.0f; - } - if (isFirstInSection(expandableView) && top) { - return 1.0f; - } - if (isLastInSection(expandableView) && !top) { - return 1.0f; - } - - if (view == mTrackedHeadsUp) { - // If we're pushing up on a headsup the appear fraction is < 0 and it needs to - // still be rounded. - return MathUtils.saturate(1.0f - mAppearFraction); - } - if (expandableView.showingPulsing() && mRoundForPulsingViews) { - return 1.0f; - } - if (expandableView.isChildInGroup()) { - return 0f; - } - final Resources resources = expandableView.getResources(); - return resources.getDimension(R.dimen.notification_corner_radius_small) - / resources.getDimension(R.dimen.notification_corner_radius); - } - return 0f; - } - - public void setExpanded(float expandedHeight, float appearFraction) { - if (mUseRoundnessSourceTypes) return; - mExpanded = expandedHeight != 0.0f; - mAppearFraction = appearFraction; - if (mTrackedHeadsUp != null) { - updateView(mTrackedHeadsUp, false /* animate */); - } - } - - public void updateRoundedChildren(NotificationSection[] sections) { - if (mUseRoundnessSourceTypes) return; - boolean anyChanged = false; - for (int i = 0; i < sections.length; i++) { - mTmpFirstInSectionViews[i] = mFirstInSectionViews[i]; - mTmpLastInSectionViews[i] = mLastInSectionViews[i]; - mFirstInSectionViews[i] = sections[i].getFirstVisibleChild(); - mLastInSectionViews[i] = sections[i].getLastVisibleChild(); - } - anyChanged |= handleRemovedOldViews(sections, mTmpFirstInSectionViews, true); - anyChanged |= handleRemovedOldViews(sections, mTmpLastInSectionViews, false); - anyChanged |= handleAddedNewViews(sections, mTmpFirstInSectionViews, true); - anyChanged |= handleAddedNewViews(sections, mTmpLastInSectionViews, false); - if (anyChanged) { - mRoundingChangedCallback.run(); - } - - mNotifLogger.onSectionCornersUpdated(sections, anyChanged); - } - - private boolean handleRemovedOldViews( - NotificationSection[] sections, - ExpandableView[] oldViews, - boolean first) { - if (mUseRoundnessSourceTypes) return false; - boolean anyChanged = false; - for (ExpandableView oldView : oldViews) { - if (oldView != null) { - boolean isStillPresent = false; - boolean adjacentSectionChanged = false; - for (NotificationSection section : sections) { - ExpandableView newView = - (first ? section.getFirstVisibleChild() - : section.getLastVisibleChild()); - if (newView == oldView) { - isStillPresent = true; - if (oldView.isFirstInSection() != isFirstInSection(oldView) - || oldView.isLastInSection() != isLastInSection(oldView)) { - adjacentSectionChanged = true; - } - break; - } - } - if (!isStillPresent || adjacentSectionChanged) { - anyChanged = true; - if (!oldView.isRemoved()) { - updateViewWithoutCallback(oldView, oldView.isShown()); - } - } - } - } - return anyChanged; - } - - private boolean handleAddedNewViews( - NotificationSection[] sections, - ExpandableView[] oldViews, - boolean first) { - if (mUseRoundnessSourceTypes) return false; - boolean anyChanged = false; - for (NotificationSection section : sections) { - ExpandableView newView = - (first ? section.getFirstVisibleChild() : section.getLastVisibleChild()); - if (newView != null) { - boolean wasAlreadyPresent = false; - for (ExpandableView oldView : oldViews) { - if (oldView == newView) { - wasAlreadyPresent = true; - break; - } - } - if (!wasAlreadyPresent) { - anyChanged = true; - updateViewWithoutCallback(newView, - newView.isShown() && !mAnimatedChildren.contains(newView)); - } - } - } - return anyChanged; - } - public void setAnimatedChildren(HashSet<ExpandableView> animatedChildren) { mAnimatedChildren = animatedChildren; } @@ -376,51 +135,7 @@ public class NotificationRoundnessManager implements Dumpable { return mAnimatedChildren.contains(view); } - public void setOnRoundingChangedCallback(Runnable roundingChangedCallback) { - mRoundingChangedCallback = roundingChangedCallback; - } - - public void setTrackingHeadsUp(ExpandableNotificationRow row) { - ExpandableNotificationRow previous = mTrackedHeadsUp; - mTrackedHeadsUp = row; - if (previous != null) { - updateView(previous, true /* animate */); - } - } - public void setShouldRoundPulsingViews(boolean shouldRoundPulsingViews) { mRoundForPulsingViews = shouldRoundPulsingViews; } - - private String dumpViews(ExpandableView[] views) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < views.length; i++) { - if (views[i] == null) continue; - - sb.append("\t") - .append("[").append(i).append("] ") - .append("isPinned=").append(views[i].isPinned()).append(" ") - .append("isFirstInSection=").append(views[i].isFirstInSection()).append(" ") - .append("isLastInSection=").append(views[i].isLastInSection()).append(" "); - - if (views[i] instanceof ExpandableNotificationRow) { - sb.append("entry="); - dumpEntry(((ExpandableNotificationRow) views[i]).getEntry(), sb); - } - - sb.append("\n"); - } - return sb.toString(); - } - - private void dumpEntry(NotificationEntry entry, StringBuilder sb) { - sb.append("NotificationEntry{key=").append(entry.getKey()).append(" "); - - if (entry.getSection() != null) { - sb.append(" section=") - .append(entry.getSection().getLabel()); - } - - sb.append("}"); - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt index 57b6dbce5398..fd064eeab2ab 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt @@ -52,8 +52,6 @@ class NotificationSectionsManager @Inject internal constructor( @SilentHeader private val silentHeaderController: SectionHeaderController ) : SectionProvider { - private val useRoundnessSourceTypes = true - private val configurationListener = object : ConfigurationController.ConfigurationListener { override fun onLocaleListChanged() { reinflateViews() @@ -193,35 +191,33 @@ class NotificationSectionsManager @Inject internal constructor( isSectionChanged || changed } - if (useRoundnessSourceTypes) { - val newFirstChildren = sections.mapNotNull { it.firstVisibleChild } - val newLastChildren = sections.mapNotNull { it.lastVisibleChild } + val newFirstChildren = sections.mapNotNull { it.firstVisibleChild } + val newLastChildren = sections.mapNotNull { it.lastVisibleChild } - // Update the roundness of Views that weren't already in the first/last position - newFirstChildren.forEach { firstChild -> - val wasFirstChild = oldFirstChildren.remove(firstChild) - if (!wasFirstChild) { - val notAnimatedChild = !notificationRoundnessManager.isAnimatedChild(firstChild) - val animated = firstChild.isShown && notAnimatedChild - firstChild.requestTopRoundness(1f, SECTION, animated) - } + // Update the roundness of Views that weren't already in the first/last position + newFirstChildren.forEach { firstChild -> + val wasFirstChild = oldFirstChildren.remove(firstChild) + if (!wasFirstChild) { + val notAnimatedChild = !notificationRoundnessManager.isAnimatedChild(firstChild) + val animated = firstChild.isShown && notAnimatedChild + firstChild.requestTopRoundness(1f, SECTION, animated) } - newLastChildren.forEach { lastChild -> - val wasLastChild = oldLastChildren.remove(lastChild) - if (!wasLastChild) { - val notAnimatedChild = !notificationRoundnessManager.isAnimatedChild(lastChild) - val animated = lastChild.isShown && notAnimatedChild - lastChild.requestBottomRoundness(1f, SECTION, animated) - } + } + newLastChildren.forEach { lastChild -> + val wasLastChild = oldLastChildren.remove(lastChild) + if (!wasLastChild) { + val notAnimatedChild = !notificationRoundnessManager.isAnimatedChild(lastChild) + val animated = lastChild.isShown && notAnimatedChild + lastChild.requestBottomRoundness(1f, SECTION, animated) } + } - // The Views left in the set are no longer in the first/last position - oldFirstChildren.forEach { noMoreFirstChild -> - noMoreFirstChild.requestTopRoundness(0f, SECTION) - } - oldLastChildren.forEach { noMoreLastChild -> - noMoreLastChild.requestBottomRoundness(0f, SECTION) - } + // The Views left in the set are no longer in the first/last position + oldFirstChildren.forEach { noMoreFirstChild -> + noMoreFirstChild.requestTopRoundness(0f, SECTION) + } + oldLastChildren.forEach { noMoreLastChild -> + noMoreLastChild.requestBottomRoundness(0f, SECTION) } if (DEBUG) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index abcb825c3e18..edff8770479a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -200,7 +200,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable private Set<Integer> mDebugTextUsedYPositions; private final boolean mDebugRemoveAnimation; private final boolean mSimplifiedAppearFraction; - private final boolean mUseRoundnessSourceTypes; private final boolean mSensitiveRevealAnimEndabled; private boolean mAnimatedInsets; @@ -625,7 +624,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable mDebugLines = featureFlags.isEnabled(Flags.NSSL_DEBUG_LINES); mDebugRemoveAnimation = featureFlags.isEnabled(Flags.NSSL_DEBUG_REMOVE_ANIMATION); mSimplifiedAppearFraction = featureFlags.isEnabled(Flags.SIMPLIFIED_APPEAR_FRACTION); - mUseRoundnessSourceTypes = true; mSensitiveRevealAnimEndabled = featureFlags.isEnabled(Flags.SENSITIVE_REVEAL_ANIM); setAnimatedInsetsEnabled(featureFlags.isEnabled(Flags.ANIMATED_NOTIFICATION_SHADE_INSETS)); mSectionsManager = Dependency.get(NotificationSectionsManager.class); @@ -3134,10 +3132,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable mAnimateNextSectionBoundsChange = false; } mAmbientState.setLastVisibleBackgroundChild(lastChild); - if (!mUseRoundnessSourceTypes) { - // TODO: Refactor SectionManager and put the RoundnessManager there. - mController.getNotificationRoundnessManager().updateRoundedChildren(mSections); - } mAnimateBottomOnLayout = false; invalidate(); } @@ -3584,9 +3578,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable @ShadeViewRefactor(RefactorComponent.LAYOUT_ALGORITHM) protected StackScrollAlgorithm createStackScrollAlgorithm(Context context) { - StackScrollAlgorithm stackScrollAlgorithm = new StackScrollAlgorithm(context, this); - stackScrollAlgorithm.useRoundnessSourceTypes(mUseRoundnessSourceTypes); - return stackScrollAlgorithm; + return new StackScrollAlgorithm(context, this); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java index d96a2cd4f760..7b046d6c9256 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java @@ -192,7 +192,6 @@ public class NotificationStackScrollLayoutController { private int mBarState; private HeadsUpAppearanceController mHeadsUpAppearanceController; private final FeatureFlags mFeatureFlags; - private final boolean mUseRoundnessSourceTypes; private final NotificationTargetsHelper mNotificationTargetsHelper; private final SecureSettings mSecureSettings; private final NotificationDismissibilityProvider mDismissibilityProvider; @@ -591,36 +590,12 @@ public class NotificationStackScrollLayoutController { } @Override - public void onHeadsUpPinned(NotificationEntry entry) { - if (!mUseRoundnessSourceTypes) { - mNotificationRoundnessManager.updateView( - entry.getRow(), - /* animate = */ false); - } - } - - @Override - public void onHeadsUpUnPinned(NotificationEntry entry) { - if (!mUseRoundnessSourceTypes) { - ExpandableNotificationRow row = entry.getRow(); - // update the roundedness posted, because we might be animating away the - // headsup soon, so no need to set the roundedness to 0 and then back to 1. - row.post(() -> mNotificationRoundnessManager.updateView(row, - true /* animate */)); - } - } - - @Override public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) { long numEntries = mHeadsUpManager.getAllEntries().count(); NotificationEntry topEntry = mHeadsUpManager.getTopEntry(); mView.setNumHeadsUp(numEntries); mView.setTopHeadsUpEntry(topEntry); generateHeadsUpAnimation(entry, isHeadsUp); - if (!mUseRoundnessSourceTypes) { - ExpandableNotificationRow row = entry.getRow(); - mNotificationRoundnessManager.updateView(row, true /* animate */); - } } }; @@ -720,7 +695,6 @@ public class NotificationStackScrollLayoutController { mShadeController = shadeController; mNotifIconAreaController = notifIconAreaController; mFeatureFlags = featureFlags; - mUseRoundnessSourceTypes = true; mNotificationTargetsHelper = notificationTargetsHelper; mSecureSettings = secureSettings; mDismissibilityProvider = dismissibilityProvider; @@ -788,11 +762,6 @@ public class NotificationStackScrollLayoutController { mLockscreenUserManager.addUserChangedListener(mLockscreenUserChangeListener); - if (!mUseRoundnessSourceTypes) { - mNotificationRoundnessManager.setOnRoundingChangedCallback(mView::invalidate); - mView.addOnExpandedHeightChangedListener(mNotificationRoundnessManager::setExpanded); - } - mVisibilityLocationProviderDelegator.setDelegate(this::isInVisibleLocation); mTunerService.addTunable( @@ -958,7 +927,6 @@ public class NotificationStackScrollLayoutController { public void setTrackingHeadsUp(ExpandableNotificationRow expandableNotificationRow) { mView.setTrackingHeadsUp(expandableNotificationRow); - mNotificationRoundnessManager.setTrackingHeadsUp(expandableNotificationRow); } public void wakeUpFromPulse() { @@ -1776,9 +1744,6 @@ public class NotificationStackScrollLayoutController { @Override public void bindRow(ExpandableNotificationRow row) { row.setHeadsUpAnimatingAwayListener(animatingAway -> { - if (!mUseRoundnessSourceTypes) { - mNotificationRoundnessManager.updateView(row, false); - } NotificationEntry entry = row.getEntry(); mHeadsUpAppearanceController.updateHeader(entry); mHeadsUpAppearanceController.updateHeadsUpAndPulsingRoundness(entry); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java index 2d0a6cf8e5a7..993c3801cecd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java @@ -68,7 +68,6 @@ class NotificationSwipeHelper extends SwipeHelper implements NotificationSwipeAc private boolean mIsExpanded; private boolean mPulsing; private final NotificationRoundnessManager mNotificationRoundnessManager; - private final boolean mUseRoundnessSourceTypes; NotificationSwipeHelper( Resources resources, @@ -80,7 +79,6 @@ class NotificationSwipeHelper extends SwipeHelper implements NotificationSwipeAc NotificationRoundnessManager notificationRoundnessManager) { super(callback, resources, viewConfiguration, falsingManager, featureFlags); mNotificationRoundnessManager = notificationRoundnessManager; - mUseRoundnessSourceTypes = true; mMenuListener = menuListener; mCallback = callback; mFalsingCheck = () -> resetExposedMenuView(true /* animate */, true /* force */); @@ -322,8 +320,7 @@ class NotificationSwipeHelper extends SwipeHelper implements NotificationSwipeAc protected void prepareDismissAnimation(View view, Animator anim) { super.prepareDismissAnimation(view, anim); - if (mUseRoundnessSourceTypes - && view instanceof ExpandableNotificationRow + if (view instanceof ExpandableNotificationRow && mNotificationRoundnessManager.isClearAllInProgress()) { ExpandableNotificationRow row = (ExpandableNotificationRow) view; anim.addListener(new AnimatorListenerAdapter() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationTargetsHelper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationTargetsHelper.kt index cd0c1b153816..02662f409a87 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationTargetsHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationTargetsHelper.kt @@ -4,7 +4,6 @@ import androidx.core.view.children import androidx.core.view.isVisible import com.android.systemui.dagger.SysUISingleton import com.android.systemui.flags.FeatureFlags -import com.android.systemui.flags.Flags import com.android.systemui.statusbar.notification.Roundable import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableView @@ -20,7 +19,6 @@ class NotificationTargetsHelper constructor( featureFlags: FeatureFlags, ) { - private val useRoundnessSourceTypes = true /** * This method looks for views that can be rounded (and implement [Roundable]) during a @@ -48,10 +46,6 @@ constructor( if (notificationParent != null && childrenContainer != null) { // We are inside a notification group - if (!useRoundnessSourceTypes) { - return RoundableTargets(null, null, null) - } - val visibleGroupChildren = childrenContainer.attachedChildren.filter { it.isVisible } val indexOfParentSwipedView = visibleGroupChildren.indexOf(viewSwiped) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index 306047388381..92d767a419f1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -34,7 +34,6 @@ import com.android.systemui.flags.Flags; import com.android.systemui.shade.transition.LargeScreenShadeInterpolator; import com.android.systemui.statusbar.EmptyShadeView; import com.android.systemui.statusbar.NotificationShelf; -import com.android.systemui.statusbar.notification.LegacySourceType; import com.android.systemui.statusbar.notification.SourceType; import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; @@ -75,7 +74,6 @@ public class StackScrollAlgorithm { private float mQuickQsOffsetHeight; private float mSmallCornerRadius; private float mLargeCornerRadius; - private boolean mUseRoundnessSourceTypes; public StackScrollAlgorithm( Context context, @@ -836,12 +834,8 @@ public class StackScrollAlgorithm { row.isLastInSection() ? 1f : (mSmallCornerRadius / mLargeCornerRadius); final float bottomValue = computeCornerRoundnessForPinnedHun(mHostView.getHeight(), ambientState.getStackY(), getMaxAllowedChildHeight(row), originalCornerRadius); - if (mUseRoundnessSourceTypes) { - row.requestBottomRoundness(bottomValue, STACK_SCROLL_ALGO); - row.addOnDetachResetRoundness(STACK_SCROLL_ALGO); - } else { - row.requestBottomRoundness(bottomValue, LegacySourceType.OnScroll); - } + row.requestBottomRoundness(bottomValue, STACK_SCROLL_ALGO); + row.addOnDetachResetRoundness(STACK_SCROLL_ALGO); } @VisibleForTesting @@ -979,14 +973,6 @@ public class StackScrollAlgorithm { this.mIsExpanded = isExpanded; } - /** - * Enable the support for rounded corner based on the SourceType - * @param enabled true if is supported - */ - public void useRoundnessSourceTypes(boolean enabled) { - mUseRoundnessSourceTypes = enabled; - } - public static class StackScrollAlgorithmState { /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java index 0c4821c003dd..f15dcc310837 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java @@ -76,7 +76,6 @@ public class HeadsUpAppearanceController extends ViewController<HeadsUpStatusBar private final DarkIconDispatcher mDarkIconDispatcher; private final ShadeViewController mShadeViewController; private final NotificationRoundnessManager mNotificationRoundnessManager; - private final boolean mUseRoundnessSourceTypes; private final Consumer<ExpandableNotificationRow> mSetTrackingHeadsUp = this::setTrackingHeadsUp; private final BiConsumer<Float, Float> mSetExpandedHeight = this::setAppearFraction; @@ -124,7 +123,6 @@ public class HeadsUpAppearanceController extends ViewController<HeadsUpStatusBar super(headsUpStatusBarView); mNotificationIconAreaController = notificationIconAreaController; mNotificationRoundnessManager = notificationRoundnessManager; - mUseRoundnessSourceTypes = true; mHeadsUpManager = headsUpManager; // We may be mid-HUN-expansion when this controller is re-created (for example, if the user @@ -405,21 +403,19 @@ public class HeadsUpAppearanceController extends ViewController<HeadsUpStatusBar * @param entry target notification */ public void updateHeadsUpAndPulsingRoundness(NotificationEntry entry) { - if (mUseRoundnessSourceTypes) { - ExpandableNotificationRow row = entry.getRow(); - boolean isTrackedChild = row == mTrackedChild; - if (row.isPinned() || row.isHeadsUpAnimatingAway() || isTrackedChild) { - float roundness = MathUtils.saturate(1f - mAppearFraction); - row.requestRoundness(roundness, roundness, HEADS_UP); + ExpandableNotificationRow row = entry.getRow(); + boolean isTrackedChild = row == mTrackedChild; + if (row.isPinned() || row.isHeadsUpAnimatingAway() || isTrackedChild) { + float roundness = MathUtils.saturate(1f - mAppearFraction); + row.requestRoundness(roundness, roundness, HEADS_UP); + } else { + row.requestRoundnessReset(HEADS_UP); + } + if (mNotificationRoundnessManager.shouldRoundNotificationPulsing()) { + if (row.showingPulsing()) { + row.requestRoundness(/* top = */ 1f, /* bottom = */ 1f, PULSING); } else { - row.requestRoundnessReset(HEADS_UP); - } - if (mNotificationRoundnessManager.shouldRoundNotificationPulsing()) { - if (row.showingPulsing()) { - row.requestRoundness(/* top = */ 1f, /* bottom = */ 1f, PULSING); - } else { - row.requestRoundnessReset(PULSING); - } + row.requestRoundnessReset(PULSING); } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceStateRotationLockSettingControllerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceStateRotationLockSettingControllerLogger.kt index aa502bc48149..f61f3b7a70f0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceStateRotationLockSettingControllerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceStateRotationLockSettingControllerLogger.kt @@ -34,6 +34,8 @@ constructor(@DeviceStateAutoRotationLog private val logBuffer: LogBuffer, contex private val halfFoldedStates = context.resources.getIntArray(R.array.config_halfFoldedDeviceStates) private val unfoldedStates = context.resources.getIntArray(R.array.config_openDeviceStates) + private val rearDisplayStates = + context.resources.getIntArray(R.array.config_rearDisplayDeviceStates) fun logListeningChange(listening: Boolean) { logBuffer.log(TAG, VERBOSE, { bool1 = listening }, { "setListening: $bool1" }) @@ -122,6 +124,7 @@ constructor(@DeviceStateAutoRotationLog private val logBuffer: LogBuffer, contex in foldedStates -> "Folded" in unfoldedStates -> "Unfolded" in halfFoldedStates -> "Half-Folded" + in rearDisplayStates -> "Rear display" -1 -> "Uninitialized" else -> "Unknown" } diff --git a/packages/SystemUI/src/com/android/systemui/theme/DynamicColors.kt b/packages/SystemUI/src/com/android/systemui/theme/DynamicColors.kt index 6026d2cb6858..f0fa779ba0cf 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/DynamicColors.kt +++ b/packages/SystemUI/src/com/android/systemui/theme/DynamicColors.kt @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.systemui.theme import android.util.Pair @@ -24,68 +25,73 @@ class DynamicColors { @JvmField val ALL_DYNAMIC_COLORS_MAPPED: List<Pair<String, DynamicColor>> = arrayListOf( - Pair.create("primary_container", MDC.primaryContainer), - Pair.create("on_primary_container", MDC.onPrimaryContainer), - Pair.create("primary", MDC.primary), - Pair.create("on_primary", MDC.onPrimary), - Pair.create("secondary_container", MDC.secondaryContainer), - Pair.create("on_secondary_container", MDC.onSecondaryContainer), - Pair.create("secondary", MDC.secondary), - Pair.create("on_secondary", MDC.onSecondary), - Pair.create("tertiary_container", MDC.tertiaryContainer), - Pair.create("on_tertiary_container", MDC.onTertiaryContainer), - Pair.create("tertiary", MDC.tertiary), - Pair.create("on_tertiary", MDC.onTertiary), - Pair.create("background", MDC.background), - Pair.create("on_background", MDC.onBackground), - Pair.create("surface", MDC.surface), - Pair.create("on_surface", MDC.onSurface), - Pair.create("surface_container_low", MDC.surfaceContainerLow), - Pair.create("surface_container_lowest", MDC.surfaceContainerLowest), - Pair.create("surface_container", MDC.surfaceContainer), - Pair.create("surface_container_high", MDC.surfaceContainerHigh), - Pair.create("surface_container_highest", MDC.surfaceContainerHighest), - Pair.create("surface_bright", MDC.surfaceBright), - Pair.create("surface_dim", MDC.surfaceDim), - Pair.create("surface_variant", MDC.surfaceVariant), - Pair.create("on_surface_variant", MDC.onSurfaceVariant), - Pair.create("outline", MDC.outline), - Pair.create("outline_variant", MDC.outlineVariant), - Pair.create("error", MDC.error), - Pair.create("on_error", MDC.onError), - Pair.create("error_container", MDC.errorContainer), - Pair.create("on_error_container", MDC.onErrorContainer), - Pair.create("primary_fixed", MDC.primaryFixed), - Pair.create("primary_fixed_dim", MDC.primaryFixedDim), - Pair.create("on_primary_fixed", MDC.onPrimaryFixed), - Pair.create("on_primary_fixed_variant", MDC.onPrimaryFixedVariant), - Pair.create("secondary_fixed", MDC.secondaryFixed), - Pair.create("secondary_fixed_dim", MDC.secondaryFixedDim), - Pair.create("on_secondary_fixed", MDC.onSecondaryFixed), - Pair.create("on_secondary_fixed_variant", MDC.onSecondaryFixedVariant), - Pair.create("tertiary_fixed", MDC.tertiaryFixed), - Pair.create("tertiary_fixed_dim", MDC.tertiaryFixedDim), - Pair.create("on_tertiary_fixed", MDC.onTertiaryFixed), - Pair.create("on_tertiary_fixed_variant", MDC.onTertiaryFixedVariant), - Pair.create("control_activated", MDC.controlActivated), - Pair.create("control_normal", MDC.controlNormal), - Pair.create("control_highlight", MDC.controlHighlight), - Pair.create("text_primary_inverse", MDC.textPrimaryInverse), + Pair.create("primary_container", MDC.primaryContainer()), + Pair.create("on_primary_container", MDC.onPrimaryContainer()), + Pair.create("primary", MDC.primary()), + Pair.create("on_primary", MDC.onPrimary()), + Pair.create("secondary_container", MDC.secondaryContainer()), + Pair.create("on_secondary_container", MDC.onSecondaryContainer()), + Pair.create("secondary", MDC.secondary()), + Pair.create("on_secondary", MDC.onSecondary()), + Pair.create("tertiary_container", MDC.tertiaryContainer()), + Pair.create("on_tertiary_container", MDC.onTertiaryContainer()), + Pair.create("tertiary", MDC.tertiary()), + Pair.create("on_tertiary", MDC.onTertiary()), + Pair.create("background", MDC.background()), + Pair.create("on_background", MDC.onBackground()), + Pair.create("surface", MDC.surface()), + Pair.create("on_surface", MDC.onSurface()), + Pair.create("surface_container_low", MDC.surfaceContainerLow()), + Pair.create("surface_container_lowest", MDC.surfaceContainerLowest()), + Pair.create("surface_container", MDC.surfaceContainer()), + Pair.create("surface_container_high", MDC.surfaceContainerHigh()), + Pair.create("surface_container_highest", MDC.surfaceContainerHighest()), + Pair.create("surface_bright", MDC.surfaceBright()), + Pair.create("surface_dim", MDC.surfaceDim()), + Pair.create("surface_variant", MDC.surfaceVariant()), + Pair.create("on_surface_variant", MDC.onSurfaceVariant()), + Pair.create("outline", MDC.outline()), + Pair.create("error", MDC.error()), + Pair.create("on_error", MDC.onError()), + Pair.create("error_container", MDC.errorContainer()), + Pair.create("on_error_container", MDC.onErrorContainer()), + Pair.create("primary_fixed", MDC.primaryFixed()), + Pair.create("primary_fixed_dim", MDC.primaryFixedDim()), + Pair.create("on_primary_fixed", MDC.onPrimaryFixed()), + Pair.create("on_primary_fixed_variant", MDC.onPrimaryFixedVariant()), + Pair.create("secondary_fixed", MDC.secondaryFixed()), + Pair.create("secondary_fixed_dim", MDC.secondaryFixedDim()), + Pair.create("on_secondary_fixed", MDC.onSecondaryFixed()), + Pair.create("on_secondary_fixed_variant", MDC.onSecondaryFixedVariant()), + Pair.create("tertiary_fixed", MDC.tertiaryFixed()), + Pair.create("tertiary_fixed_dim", MDC.tertiaryFixedDim()), + Pair.create("on_tertiary_fixed", MDC.onTertiaryFixed()), + Pair.create("on_tertiary_fixed_variant", MDC.onTertiaryFixedVariant()), + Pair.create("control_activated", MDC.controlActivated()), + Pair.create("control_normal", MDC.controlNormal()), + Pair.create("control_highlight", MDC.controlHighlight()), + Pair.create("text_primary_inverse", MDC.textPrimaryInverse()), Pair.create( "text_secondary_and_tertiary_inverse", - MDC.textSecondaryAndTertiaryInverse + MDC.textSecondaryAndTertiaryInverse() + ), + Pair.create( + "text_primary_inverse_disable_only", + MDC.textPrimaryInverseDisableOnly() ), - Pair.create("text_primary_inverse_disable_only", MDC.textPrimaryInverseDisableOnly), Pair.create( "text_secondary_and_tertiary_inverse_disabled", - MDC.textSecondaryAndTertiaryInverseDisabled + MDC.textSecondaryAndTertiaryInverseDisabled() ), - Pair.create("text_hint_inverse", MDC.textHintInverse), - Pair.create("palette_key_color_primary", MDC.primaryPaletteKeyColor), - Pair.create("palette_key_color_secondary", MDC.secondaryPaletteKeyColor), - Pair.create("palette_key_color_tertiary", MDC.tertiaryPaletteKeyColor), - Pair.create("palette_key_color_neutral", MDC.neutralPaletteKeyColor), - Pair.create("palette_key_color_neutral_variant", MDC.neutralVariantPaletteKeyColor) + Pair.create("text_hint_inverse", MDC.textHintInverse()), + Pair.create("palette_key_color_primary", MDC.primaryPaletteKeyColor()), + Pair.create("palette_key_color_secondary", MDC.secondaryPaletteKeyColor()), + Pair.create("palette_key_color_tertiary", MDC.tertiaryPaletteKeyColor()), + Pair.create("palette_key_color_neutral", MDC.neutralPaletteKeyColor()), + Pair.create( + "palette_key_color_neutral_variant", + MDC.neutralVariantPaletteKeyColor() + ) ) } } diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java index faae8df44ed9..43d15bcc22b3 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java +++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.systemui.theme; import static android.util.TypedValue.TYPE_INT_COLOR_ARGB8; @@ -659,9 +660,9 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { && res.getColor(android.R.color.system_neutral2_500, theme) == mColorScheme.getNeutral2().getS500() && res.getColor(android.R.color.system_primary_container_dark, theme) - == MaterialDynamicColors.primaryContainer.getArgb(mDynamicSchemeDark) + == MaterialDynamicColors.primaryContainer().getArgb(mDynamicSchemeDark) && res.getColor(android.R.color.system_primary_container_light, theme) - == MaterialDynamicColors.primaryContainer.getArgb(mDynamicSchemeLight))) { + == MaterialDynamicColors.primaryContainer().getArgb(mDynamicSchemeLight))) { return false; } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt index 6d4c467aca7d..a20875b5d9de 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt @@ -49,6 +49,7 @@ import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.Dispatchers import org.junit.After +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -62,6 +63,7 @@ import org.mockito.Mockito.verify import org.mockito.Mockito.`when` as whenever import org.mockito.junit.MockitoJUnit +@Ignore("b/279650412") @RunWith(AndroidJUnit4::class) @RunWithLooper(setAsMainLooper = true) @SmallTest diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/FingerprintRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/FingerprintRepositoryImplTest.kt new file mode 100644 index 000000000000..f3a100bd55e5 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/FingerprintRepositoryImplTest.kt @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.biometrics.data.repository + +import android.hardware.biometrics.ComponentInfoInternal +import android.hardware.biometrics.SensorLocationInternal +import android.hardware.biometrics.SensorProperties +import android.hardware.fingerprint.FingerprintManager +import android.hardware.fingerprint.FingerprintSensorProperties +import android.hardware.fingerprint.FingerprintSensorPropertiesInternal +import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.biometrics.shared.model.FingerprintSensorType +import com.android.systemui.biometrics.shared.model.SensorStrength +import com.android.systemui.coroutines.collectLastValue +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.mockito.ArgumentCaptor +import org.mockito.Captor +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.junit.MockitoJUnit + +@SmallTest +@RunWith(JUnit4::class) +class FingerprintRepositoryImplTest : SysuiTestCase() { + + @JvmField @Rule var mockitoRule = MockitoJUnit.rule() + private lateinit var testScope: TestScope + + @Mock private lateinit var fingerprintManager: FingerprintManager + private lateinit var repository: FingerprintPropertyRepositoryImpl + + @Captor + private lateinit var fingerprintAuthenticatorsCaptor: + ArgumentCaptor<IFingerprintAuthenticatorsRegisteredCallback.Stub> + + @Before + fun setup() { + val dispatcher = StandardTestDispatcher() + testScope = TestScope(dispatcher) + repository = + FingerprintPropertyRepositoryImpl(testScope.backgroundScope, fingerprintManager) + testScope.runCurrent() + + verify(fingerprintManager) + .addAuthenticatorsRegisteredCallback(fingerprintAuthenticatorsCaptor.capture()) + } + + @Test + fun initializeProperties() = + testScope.runTest { + val isInitialized = collectLastValue(repository.isInitialized) + + assertDefaultProperties() + assertThat(isInitialized()).isFalse() + + val fingerprintProps = + listOf( + FingerprintSensorPropertiesInternal( + 1 /* sensorId */, + SensorProperties.STRENGTH_STRONG, + 5 /* maxEnrollmentsPerUser */, + listOf<ComponentInfoInternal>( + ComponentInfoInternal( + "sensor" /* componentId */, + "vendor/model/revision" /* hardwareVersion */, + "1.01" /* firmwareVersion */, + "00000001" /* serialNumber */, + "" /* softwareVersion */ + ) + ), + FingerprintSensorProperties.TYPE_REAR, + false /* halControlsIllumination */, + true /* resetLockoutRequiresHardwareAuthToken */, + listOf<SensorLocationInternal>( + SensorLocationInternal( + "" /* displayId */, + 540 /* sensorLocationX */, + 1636 /* sensorLocationY */, + 130 /* sensorRadius */ + ) + ) + ) + ) + + fingerprintAuthenticatorsCaptor.value.onAllAuthenticatorsRegistered(fingerprintProps) + + assertThat(repository.sensorId.value).isEqualTo(1) + assertThat(repository.strength.value).isEqualTo(SensorStrength.STRONG) + assertThat(repository.sensorType.value).isEqualTo(FingerprintSensorType.REAR) + with(repository.sensorLocation.value) { + assertThat(displayId).isEqualTo("") + assertThat(sensorLocationX).isEqualTo(540) + assertThat(sensorLocationY).isEqualTo(1636) + assertThat(sensorRadius).isEqualTo(130) + } + assertThat(isInitialized()).isTrue() + } + + private fun assertDefaultProperties() { + assertThat(repository.sensorId.value).isEqualTo(-1) + assertThat(repository.strength.value).isEqualTo(SensorStrength.CONVENIENCE) + assertThat(repository.sensorType.value).isEqualTo(FingerprintSensorType.UNKNOWN) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java index fb5197eff73f..4ce32d2c1f00 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java @@ -17,18 +17,16 @@ package com.android.systemui.monet; import static com.android.systemui.monet.utils.ArgbSubject.assertThat; - import static org.junit.Assert.assertTrue; - import androidx.test.filters.SmallTest; -import com.android.systemui.SysuiTestCase; import com.android.systemui.monet.contrast.Contrast; import com.android.systemui.monet.dynamiccolor.DynamicColor; import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.dynamiccolor.ToneDeltaConstraint; import com.android.systemui.monet.dynamiccolor.TonePolarity; +import com.android.systemui.SysuiTestCase; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.DynamicScheme; import com.android.systemui.monet.scheme.SchemeContent; @@ -36,182 +34,174 @@ import com.android.systemui.monet.scheme.SchemeFidelity; import com.android.systemui.monet.scheme.SchemeMonochrome; import com.android.systemui.monet.scheme.SchemeTonalSpot; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) -public final class DynamicColorTest extends SysuiTestCase { - - @Test - public void fromArgbNoBackground_doesntChangeForContrast() { - final int blueArgb = 0xff0000ff; - final DynamicColor dynamicColor = DynamicColor.fromArgb(blueArgb); - - final SchemeTonalSpot standardContrast = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, - 0.0); - assertThat(dynamicColor.getArgb(standardContrast)).isSameColorAs(blueArgb); - - final SchemeTonalSpot minContrast = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, -1.0); - assertThat(dynamicColor.getArgb(minContrast)).isSameColorAs(blueArgb); - - final SchemeTonalSpot maxContrast = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, 1.0); - assertThat(dynamicColor.getArgb(maxContrast)).isSameColorAs(blueArgb); - } - - @Test - public void toneDeltaConstraintNoPreference_evaluatesCorrectly() { - final int blueArgb = 0xff0000ff; - final int redArgb = 0xffff0000; - final DynamicColor otherDynamicColor = DynamicColor.fromArgb(redArgb); - final DynamicColor dynamicColor = - DynamicColor.fromArgb( - blueArgb, - (s) -> 30.0, - null, - (s) -> new ToneDeltaConstraint(30, otherDynamicColor, - TonePolarity.NO_PREFERENCE)); - final SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, 0.0); - assertThat(dynamicColor.getArgb(scheme)).isSameColorAs(0xff0000ef); - } - - @Test - public void dynamicColor_withOpacity() { - final DynamicColor dynamicColor = - new DynamicColor( - s -> 0.0, - s -> 0.0, - s -> s.isDark ? 100.0 : 0.0, - s -> s.isDark ? 0.20 : 0.12, - null, - scheme -> - DynamicColor.toneMinContrastDefault( - (s) -> s.isDark ? 100.0 : 0.0, null, scheme, null), - scheme -> - DynamicColor.toneMaxContrastDefault( - (s) -> s.isDark ? 100.0 : 0.0, null, scheme, null), - null); - final SchemeTonalSpot lightScheme = new SchemeTonalSpot(Hct.fromInt(0xff4285f4), false, - 0.0); - assertThat(dynamicColor.getArgb(lightScheme)).isSameColorAs(0x1f000000); - - final SchemeTonalSpot darkScheme = new SchemeTonalSpot(Hct.fromInt(0xff4285f4), true, 0.0); - assertThat(dynamicColor.getArgb(darkScheme)).isSameColorAs(0x33ffffff); - } - - @Test - public void respectsContrast() { - final Hct[] seedColors = - new Hct[]{ - Hct.fromInt(0xFFFF0000), - Hct.fromInt(0xFFFFFF00), - Hct.fromInt(0xFF00FF00), - Hct.fromInt(0xFF0000FF) - }; - - final double[] contrastLevels = {-1.0, -0.5, 0.0, 0.5, 1.0}; - - for (Hct seedColor : seedColors) { - for (double contrastLevel : contrastLevels) { - for (boolean isDark : new boolean[]{false, true}) { - final DynamicScheme[] schemes = - new DynamicScheme[]{ - new SchemeContent(seedColor, isDark, contrastLevel), - new SchemeMonochrome(seedColor, isDark, contrastLevel), - new SchemeTonalSpot(seedColor, isDark, contrastLevel), - new SchemeFidelity(seedColor, isDark, contrastLevel) - }; - for (final DynamicScheme scheme : schemes) { - assertTrue( - pairSatisfiesContrast( - scheme, MaterialDynamicColors.onPrimary, - MaterialDynamicColors.primary)); - assertTrue( - pairSatisfiesContrast( - scheme, - MaterialDynamicColors.onPrimaryContainer, - MaterialDynamicColors.primaryContainer)); - assertTrue( - pairSatisfiesContrast( - scheme, MaterialDynamicColors.onSecondary, - MaterialDynamicColors.secondary)); - assertTrue( - pairSatisfiesContrast( - scheme, - MaterialDynamicColors.onSecondaryContainer, - MaterialDynamicColors.secondaryContainer)); - assertTrue( - pairSatisfiesContrast( - scheme, MaterialDynamicColors.onTertiary, - MaterialDynamicColors.tertiary)); - assertTrue( - pairSatisfiesContrast( - scheme, - MaterialDynamicColors.onTertiaryContainer, - MaterialDynamicColors.tertiaryContainer)); - assertTrue( - pairSatisfiesContrast( - scheme, MaterialDynamicColors.onError, - MaterialDynamicColors.error)); - assertTrue( - pairSatisfiesContrast( - scheme, - MaterialDynamicColors.onErrorContainer, - MaterialDynamicColors.errorContainer)); - assertTrue( - pairSatisfiesContrast( - scheme, MaterialDynamicColors.onBackground, - MaterialDynamicColors.background)); - assertTrue( - pairSatisfiesContrast( - scheme, - MaterialDynamicColors.onSurfaceVariant, - MaterialDynamicColors.surfaceVariant)); - assertTrue( - pairSatisfiesContrast( - scheme, - MaterialDynamicColors.onSurfaceInverse, - MaterialDynamicColors.surfaceInverse)); - } - } - } +public final class DynamicColorTest extends SysuiTestCase{ + + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + + @Test + public void fromArgbNoBackground_doesntChangeForContrast() { + final int blueArgb = 0xff0000ff; + final DynamicColor dynamicColor = DynamicColor.fromArgb(blueArgb); + + final SchemeTonalSpot standardContrast = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, 0.0); + assertThat(dynamicColor.getArgb(standardContrast)).isSameColorAs(blueArgb); + + final SchemeTonalSpot minContrast = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, -1.0); + assertThat(dynamicColor.getArgb(minContrast)).isSameColorAs(blueArgb); + + final SchemeTonalSpot maxContrast = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, 1.0); + assertThat(dynamicColor.getArgb(maxContrast)).isSameColorAs(blueArgb); + } + + @Test + public void toneDeltaConstraintNoPreference_evaluatesCorrectly() { + final int blueArgb = 0xff0000ff; + final int redArgb = 0xffff0000; + final DynamicColor otherDynamicColor = DynamicColor.fromArgb(redArgb); + final DynamicColor dynamicColor = + DynamicColor.fromArgb( + blueArgb, + (s) -> 30.0, + null, + (s) -> new ToneDeltaConstraint(30, otherDynamicColor, TonePolarity.NO_PREFERENCE)); + final SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, 0.0); + assertThat(dynamicColor.getArgb(scheme)).isSameColorAs(0xff0000ef); + } + + @Test + public void dynamicColor_withOpacity() { + final DynamicColor dynamicColor = + new DynamicColor( + s -> 0.0, + s -> 0.0, + s -> s.isDark ? 100.0 : 0.0, + s -> s.isDark ? 0.20 : 0.12, + null, + scheme -> + DynamicColor.toneMinContrastDefault( + (s) -> s.isDark ? 100.0 : 0.0, null, scheme, null), + scheme -> + DynamicColor.toneMaxContrastDefault( + (s) -> s.isDark ? 100.0 : 0.0, null, scheme, null), + null); + final SchemeTonalSpot lightScheme = new SchemeTonalSpot(Hct.fromInt(0xff4285f4), false, 0.0); + assertThat(dynamicColor.getArgb(lightScheme)).isSameColorAs(0x1f000000); + + final SchemeTonalSpot darkScheme = new SchemeTonalSpot(Hct.fromInt(0xff4285f4), true, 0.0); + assertThat(dynamicColor.getArgb(darkScheme)).isSameColorAs(0x33ffffff); + } + + @Test + public void respectsContrast() { + final Hct[] seedColors = + new Hct[] { + Hct.fromInt(0xFFFF0000), + Hct.fromInt(0xFFFFFF00), + Hct.fromInt(0xFF00FF00), + Hct.fromInt(0xFF0000FF) + }; + + final double[] contrastLevels = {-1.0, -0.5, 0.0, 0.5, 1.0}; + + for (Hct seedColor : seedColors) { + for (double contrastLevel : contrastLevels) { + for (boolean isDark : new boolean[] {false, true}) { + final DynamicScheme[] schemes = + new DynamicScheme[] { + new SchemeContent(seedColor, isDark, contrastLevel), + new SchemeMonochrome(seedColor, isDark, contrastLevel), + new SchemeTonalSpot(seedColor, isDark, contrastLevel), + new SchemeFidelity(seedColor, isDark, contrastLevel) + }; + for (final DynamicScheme scheme : schemes) { + assertTrue( + pairSatisfiesContrast(scheme, dynamicColors.onPrimary(), dynamicColors.primary())); + assertTrue( + pairSatisfiesContrast( + scheme, dynamicColors.onPrimaryContainer(), dynamicColors.primaryContainer())); + assertTrue( + pairSatisfiesContrast( + scheme, dynamicColors.onSecondary(), dynamicColors.secondary())); + assertTrue( + pairSatisfiesContrast( + scheme, + dynamicColors.onSecondaryContainer(), + dynamicColors.secondaryContainer())); + assertTrue( + pairSatisfiesContrast( + scheme, dynamicColors.onTertiary(), dynamicColors.tertiary())); + assertTrue( + pairSatisfiesContrast( + scheme, + dynamicColors.onTertiaryContainer(), + dynamicColors.tertiaryContainer())); + assertTrue( + pairSatisfiesContrast(scheme, dynamicColors.onError(), dynamicColors.error())); + assertTrue( + pairSatisfiesContrast( + scheme, dynamicColors.onErrorContainer(), dynamicColors.errorContainer())); + assertTrue( + pairSatisfiesContrast( + scheme, dynamicColors.onBackground(), dynamicColors.background())); + assertTrue( + pairSatisfiesContrast( + scheme, dynamicColors.onSurfaceVariant(), dynamicColors.surfaceVariant())); + assertTrue( + pairSatisfiesContrast( + scheme, dynamicColors.inverseOnSurface(), dynamicColors.inverseSurface())); + } } + } } - - @Test - public void valuesAreCorrect() { - // Checks that the values of certain dynamic colors match Dart results. - assertThat( - MaterialDynamicColors.onPrimaryContainer.getArgb( - new SchemeFidelity(Hct.fromInt(0xFFFF0000), false, 0.5))) - .isSameColorAs(0xFFFFE5E1); - assertThat( - MaterialDynamicColors.onSecondaryContainer.getArgb( - new SchemeContent(Hct.fromInt(0xFF0000FF), false, 0.5))) - .isSameColorAs(0xFFFFFCFF); - assertThat( - MaterialDynamicColors.onTertiaryContainer.getArgb( - new SchemeContent(Hct.fromInt(0xFFFFFF00), true, -0.5))) - .isSameColorAs(0xFF616600); - assertThat( - MaterialDynamicColors.surfaceInverse.getArgb( - new SchemeContent(Hct.fromInt(0xFF0000FF), false, 0.0))) - .isSameColorAs(0xFF464652); - assertThat( - MaterialDynamicColors.primaryInverse.getArgb( - new SchemeContent(Hct.fromInt(0xFFFF0000), false, -0.5))) - .isSameColorAs(0xFFFF8C7A); - assertThat( - MaterialDynamicColors.outlineVariant.getArgb( - new SchemeContent(Hct.fromInt(0xFFFFFF00), true, 0.0))) - .isSameColorAs(0xFF484831); - } - - private boolean pairSatisfiesContrast(DynamicScheme scheme, DynamicColor fg, DynamicColor bg) { - double fgTone = fg.getHct(scheme).getTone(); - double bgTone = bg.getHct(scheme).getTone(); - double minimumRequirement = scheme.contrastLevel >= 0.0 ? 4.5 : 3.0; - return Contrast.ratioOfTones(fgTone, bgTone) >= minimumRequirement; - } + } + + @Test + public void valuesAreCorrect() { + // Checks that the values of certain dynamic colors match Dart results. + assertThat( + dynamicColors + .onPrimaryContainer() + .getArgb(new SchemeFidelity(Hct.fromInt(0xFFFF0000), false, 0.5))) + .isSameColorAs(0xFFFFE5E1); + assertThat( + dynamicColors + .onSecondaryContainer() + .getArgb(new SchemeContent(Hct.fromInt(0xFF0000FF), false, 0.5))) + .isSameColorAs(0xFFFFFCFF); + assertThat( + dynamicColors + .onTertiaryContainer() + .getArgb(new SchemeContent(Hct.fromInt(0xFFFFFF00), true, -0.5))) + .isSameColorAs(0xFF616600); + assertThat( + dynamicColors + .inverseSurface() + .getArgb(new SchemeContent(Hct.fromInt(0xFF0000FF), false, 0.0))) + .isSameColorAs(0xFF2F2F3B); + assertThat( + dynamicColors + .inversePrimary() + .getArgb(new SchemeContent(Hct.fromInt(0xFFFF0000), false, -0.5))) + .isSameColorAs(0xFFFF907F); + assertThat( + dynamicColors + .outlineVariant() + .getArgb(new SchemeContent(Hct.fromInt(0xFFFFFF00), true, 0.0))) + .isSameColorAs(0xFF484831); + } + + private boolean pairSatisfiesContrast(DynamicScheme scheme, DynamicColor fg, DynamicColor bg) { + double fgTone = fg.getHct(scheme).getTone(); + double bgTone = bg.getHct(scheme).getTone(); + double minimumRequirement = scheme.contrastLevel >= 0.0 ? 4.5 : 3.0; + return Contrast.ratioOfTones(fgTone, bgTone) >= minimumRequirement; + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeContentTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeContentTest.java index 1ddfc4d4af5b..704aed81e9c4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeContentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeContentTest.java @@ -25,246 +25,229 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeContent; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeContentTest extends SysuiTestCase { + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff080CFF); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff656DD3); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff81009F); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff767684); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff757589); } @Test public void lightTheme_minContrast_primary() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xFF1218FF); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFF1218FF); } @Test public void lightTheme_standardContrast_primary() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xFF0001C3); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFF0001C3); } @Test public void lightTheme_maxContrast_primary() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xFF000181); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFF000181); } @Test public void lightTheme_minContrast_primaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF5660FF); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFF5660FF); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF2D36FF); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFF2D36FF); } @Test public void lightTheme_maxContrast_primaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF0000E3); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFF0000E3); } @Test public void lightTheme_minContrast_tertiaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, -1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFB042CC); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFFB042CC); } @Test public void lightTheme_standardContrast_tertiaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 0.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF9221AF); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFF9221AF); } @Test public void lightTheme_maxContrast_tertiaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF73008E); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFF73008E); } @Test public void lightTheme_minContrast_objectionableTertiaryContainerLightens() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF850096), false, -1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFD03A71); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFFD03A71); } @Test public void lightTheme_standardContrast_objectionableTertiaryContainerLightens() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF850096), false, 0.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFAC1B57); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFFAC1B57); } @Test public void lightTheme_maxContrast_objectionableTertiaryContainerDarkens() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF850096), false, 1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF870040); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFF870040); } @Test public void lightTheme_minContrast_onPrimaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFCBCDFF); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFFCBCDFF); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFCECFFF); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFFCECFFF); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFD6D6FF); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFFD6D6FF); } @Test public void lightTheme_minContrast_surface() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, -1); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xFFFBF8FF); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFFFBF8FF); } @Test public void lightTheme_standardContrast_surface() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xFFFBF8FF); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFFFBF8FF); } @Test public void lightTheme_maxContrast_surface() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xFFFBF8FF); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFFFBF8FF); } @Test public void darkTheme_minContrast_primary() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xFF5660FF); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFF5660FF); } @Test public void darkTheme_standardContrast_primary() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xFFBEC2FF); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFFBEC2FF); } @Test public void darkTheme_maxContrast_primary() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xFFF6F4FF); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFFF6F4FF); } @Test public void darkTheme_minContrast_primaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF0000E6); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFF0000E6); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF0000E6); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFF0000E6); } @Test public void darkTheme_maxContrast_primaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFC4C6FF); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFFC4C6FF); } @Test public void darkTheme_minContrast_onPrimaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF7A83FF); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFF7A83FF); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFA4AAFF); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFFA4AAFF); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF0001C6); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFF0001C6); } @Test public void darkTheme_minContrast_onTertiaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFCF60EA); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xFFCF60EA); } @Test public void darkTheme_standardContrast_onTertiaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFEB8CFF); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xFFEB8CFF); } @Test public void darkTheme_maxContrast_onTertiaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF63007B); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xFF63007B); } @Test public void darkTheme_minContrast_surface() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xFF12121D); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFF12121D); } @Test public void darkTheme_standardContrast_surface() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xFF12121D); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFF12121D); } @Test public void darkTheme_maxContrast_surface() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xFF12121D); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFF12121D); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeExpressiveTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeExpressiveTest.java index 31e8711c6d8c..32a589d0ea6e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeExpressiveTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeExpressiveTest.java @@ -25,183 +25,175 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeExpressive; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeExpressiveTest extends SysuiTestCase { + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff35855F); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff8C6D8C); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff806EA1); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff79757F); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff7A7585); } @Test public void lightTheme_minContrast_primary() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff32835D); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffad603c); } @Test public void lightTheme_standardContrast_primary() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff146C48); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff924b28); } @Test public void lightTheme_maxContrast_primary() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff002818); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff401400); } @Test public void lightTheme_minContrast_primaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffA2F4C6); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffffdbcc); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffA2F4C6); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffffdbcc); } @Test public void lightTheme_maxContrast_primaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff004D31); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff6f3010); } @Test public void lightTheme_minContrast_onPrimaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff1e724e); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff99512e); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff002112); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff351000); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff9aebbe); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffffd0bc); } @Test public void lightTheme_minContrast_surface() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffdf7ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_standardContrast_surface() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffdf7ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_maxContrast_surface() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffdf7ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void darkTheme_minContrast_primary() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff32835d); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffad603c); } @Test public void darkTheme_standardContrast_primary() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff87d7ab); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffffb595); } @Test public void darkTheme_maxContrast_primary() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xffd5ffe4); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfffff3ee); } @Test public void darkTheme_minContrast_primaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff005234); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff743413); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff005234); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff743413); } @Test public void darkTheme_maxContrast_primaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff8bdbaf); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffffbb9e); } @Test public void darkTheme_minContrast_onPrimaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff76c59b); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xfff99f75); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffa2f4c6); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffffdbcc); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff004229); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff622706); } @Test public void darkTheme_minContrast_surface() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff14121a); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a); } @Test public void darkTheme_standardContrast_surface() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff14121a); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a); } @Test public void darkTheme_maxContrast_surface() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff14121a); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFidelityTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFidelityTest.java index 511f83bb0140..6844a92185e0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFidelityTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFidelityTest.java @@ -25,245 +25,230 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeFidelity; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeFidelityTest extends SysuiTestCase { + + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff080CFF); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff656DD3); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff9D0002); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff767684); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff757589); } @Test public void lightTheme_minContrast_primary() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff1218ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff1218ff); } @Test public void lightTheme_standardContrast_primary() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff0001c3); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff0001c3); } @Test public void lightTheme_maxContrast_primary() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff000181); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff000181); } @Test public void lightTheme_minContrast_primaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff5660ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff5660ff); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff2d36ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff2d36ff); } @Test public void lightTheme_maxContrast_primaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff0000e3); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000e3); } @Test public void lightTheme_minContrast_tertiaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffd93628); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xffd93628); } @Test public void lightTheme_standardContrast_tertiaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffb31910); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xffb31910); } @Test public void lightTheme_maxContrast_tertiaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xff8c0002); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xff8c0002); } @Test public void lightTheme_minContrast_objectionableTertiaryContainerLightens() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff850096), false, -1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffbcac5a); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xffbcac5a); } @Test public void lightTheme_standardContrast_objectionableTertiaryContainerLightens() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff850096), false, 0.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffbcac5a); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xffbcac5a); } @Test public void lightTheme_maxContrast_objectionableTertiaryContainerDarkens() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff850096), false, 1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xff4d4300); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xff4d4300); } @Test public void lightTheme_minContrast_onPrimaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffcbcdff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffcbcdff); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffcecfff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffcecfff); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffd6d6ff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffd6d6ff); } @Test public void lightTheme_minContrast_surface() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_standardContrast_surface() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_maxContrast_surface() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void darkTheme_minContrast_primary() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff5660ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff5660ff); } @Test public void darkTheme_standardContrast_primary() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xffbec2ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffbec2ff); } @Test public void darkTheme_maxContrast_primary() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xfff6f4ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfff6f4ff); } @Test public void darkTheme_minContrast_primaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff0000e6); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000e6); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff0000e6); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000e6); } @Test public void darkTheme_maxContrast_primaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffc4c6ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffc4c6ff); } @Test public void darkTheme_minContrast_onPrimaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff7a83ff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff7a83ff); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffa4aaff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffa4aaff); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff0001c6); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff0001c6); } @Test public void darkTheme_minContrast_onTertiaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xfffe513e); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xfffe513e); } @Test public void darkTheme_standardContrast_onTertiaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffFF9181); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffFF9181); } @Test public void darkTheme_maxContrast_onTertiaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xff790001); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff790001); } @Test public void darkTheme_minContrast_surface() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12121d); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12121d); } @Test public void darkTheme_standardContrast_surface() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12121d); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12121d); } @Test public void darkTheme_maxContrast_surface() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12121d); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12121d); } + } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFruitSaladTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFruitSaladTest.java index 4cf14d5455d3..4bca2c4f08f4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFruitSaladTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFruitSaladTest.java @@ -25,226 +25,230 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeFruitSalad; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeFruitSaladTest extends SysuiTestCase { + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff0091C0); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff3A7E9E); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff6E72AC); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff777682); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff75758B); } @Test public void lightTheme_minContrast_primary() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff007ea7); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff007ea7); } @Test public void lightTheme_standardContrast_primary() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff006688); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff006688); } @Test public void lightTheme_maxContrast_primary() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff002635); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff002635); } @Test public void lightTheme_minContrast_primaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xffC2E8FF); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xffC2E8FF); } @Test public void lightTheme_maxContrast_primaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xff004862); } @Test public void lightTheme_minContrast_tertiaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs( 0xffE0E0FF); } @Test public void lightTheme_standardContrast_tertiaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs( 0xffE0E0FF); } @Test public void lightTheme_maxContrast_tertiaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs( 0xFF3A3E74); } @Test public void lightTheme_minContrast_onPrimaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xff006C90); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xff001E2B); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xffACE1FF); } @Test public void lightTheme_minContrast_surface() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_standardContrast_surface() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_maxContrast_surface() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void darkTheme_minContrast_primary() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff007EA7); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff007EA7); } @Test public void darkTheme_standardContrast_primary() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xFF76D1FF); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFF76D1FF); } @Test public void darkTheme_maxContrast_primary() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xFFECF7FF); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFFECF7FF); } @Test public void darkTheme_minContrast_primaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xFF004D67); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xFF004D67); } @Test public void darkTheme_maxContrast_primaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xFF83D5FF); } @Test public void darkTheme_minContrast_onPrimaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xff55C0F2); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xffC2E8FF); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xff003E54); } @Test public void darkTheme_minContrast_onTertiaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs( 0xffADB0EF); } @Test public void darkTheme_standardContrast_onTertiaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs( 0xffe0e0ff); } @Test public void darkTheme_maxContrast_onTertiaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs( 0xff30346A); } @Test public void darkTheme_minContrast_surface() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12131c); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131c); } @Test public void darkTheme_standardContrast_surface() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12131c); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131c); } @Test public void darkTheme_maxContrast_surface() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12131c); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131c); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeMonochromeTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeMonochromeTest.java index 3eca4dcf7baa..d5114222c2a0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeMonochromeTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeMonochromeTest.java @@ -16,6 +16,7 @@ package com.android.systemui.monet; +import static com.google.common.truth.Truth.assertThat; import static com.android.systemui.monet.utils.ArgbSubject.assertThat; import androidx.test.filters.SmallTest; @@ -25,204 +26,227 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeMonochrome; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeMonochromeTest extends SysuiTestCase { + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff070707); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff070707); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff070707); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff070707); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff070707); } @Test public void lightTheme_minContrast_primary() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff747474); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff3c3c3c); } @Test public void lightTheme_standardContrast_primary() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff5e5e5e); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff000000); } @Test public void lightTheme_maxContrast_primary() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff222222); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff000000); } @Test public void lightTheme_minContrast_primaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe2e2e2); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff5f5f5f); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe2e2e2); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff3b3b3b); } @Test public void lightTheme_maxContrast_primaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff434343); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff3a3a3a); } @Test public void lightTheme_minContrast_onPrimaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff646464); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffd9d9d9); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff1b1b1b); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffffffff); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffdadada); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffcdcdcd); } @Test public void lightTheme_minContrast_surface() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfff9f9f9); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9); } @Test public void lightTheme_standardContrast_surface() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfff9f9f9); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9); } @Test public void lightTheme_maxContrast_surface() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfff9f9f9); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9); } @Test public void darkTheme_minContrast_primary() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff747474); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffcccccc); } @Test public void darkTheme_standardContrast_primary() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xffc6c6c6); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffffffff); } @Test public void darkTheme_maxContrast_primary() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xfff5f5f5); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffffffff); } @Test public void darkTheme_minContrast_primaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff474747); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffa3a3a3); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff474747); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffd4d4d4); } @Test public void darkTheme_maxContrast_primaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffcbcbcb); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffd5d5d5); } @Test public void darkTheme_minContrast_onPrimaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffb5b5b5); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff393939); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe2e2e2); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff000000); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff393939); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff404040); } @Test public void darkTheme_minContrast_onTertiaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffb5b5b5); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffd1d1d1); } @Test public void darkTheme_standardContrast_onTertiaryContainer() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe2e2e2); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff000000); } @Test public void darkTheme_maxContrast_onTertiaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xff393939); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff393939); } @Test public void darkTheme_minContrast_surface() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131313); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313); } @Test public void darkTheme_standardContrast_surface() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131313); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313); } @Test public void darkTheme_maxContrast_surface() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131313); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313); + } + + @Test + public void darkTheme_monochromeSpec() { + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0); + assertThat(dynamicColors.primary().getHct(scheme).getTone()).isWithin(1).of(100); + assertThat(dynamicColors.onPrimary().getHct(scheme).getTone()).isWithin(1).of(10); + assertThat(dynamicColors.primaryContainer().getHct(scheme).getTone()).isWithin(1).of(85); + assertThat(dynamicColors.onPrimaryContainer().getHct(scheme).getTone()).isWithin(1).of(0); + assertThat(dynamicColors.secondary().getHct(scheme).getTone()).isWithin(1).of(80); + assertThat(dynamicColors.onSecondary().getHct(scheme).getTone()).isWithin(1).of(10); + assertThat(dynamicColors.secondaryContainer().getHct(scheme).getTone()).isWithin(1).of(30); + assertThat(dynamicColors.onSecondaryContainer().getHct(scheme).getTone()).isWithin(1).of(90); + assertThat(dynamicColors.tertiary().getHct(scheme).getTone()).isWithin(1).of(90); + assertThat(dynamicColors.onTertiary().getHct(scheme).getTone()).isWithin(1).of(10); + assertThat(dynamicColors.tertiaryContainer().getHct(scheme).getTone()).isWithin(1).of(60); + assertThat(dynamicColors.onTertiaryContainer().getHct(scheme).getTone()).isWithin(1).of(0); + } + + @Test + public void lightTheme_monochromeSpec() { + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0); + assertThat(dynamicColors.primary().getHct(scheme).getTone()).isWithin(1).of(0); + assertThat(dynamicColors.onPrimary().getHct(scheme).getTone()).isWithin(1).of(90); + assertThat(dynamicColors.primaryContainer().getHct(scheme).getTone()).isWithin(1).of(25); + assertThat(dynamicColors.onPrimaryContainer().getHct(scheme).getTone()).isWithin(1).of(100); + assertThat(dynamicColors.secondary().getHct(scheme).getTone()).isWithin(1).of(40); + assertThat(dynamicColors.onSecondary().getHct(scheme).getTone()).isWithin(1).of(100); + assertThat(dynamicColors.secondaryContainer().getHct(scheme).getTone()).isWithin(1).of(85); + assertThat(dynamicColors.onSecondaryContainer().getHct(scheme).getTone()).isWithin(1).of(10); + assertThat(dynamicColors.tertiary().getHct(scheme).getTone()).isWithin(1).of(25); + assertThat(dynamicColors.onTertiary().getHct(scheme).getTone()).isWithin(1).of(90); + assertThat(dynamicColors.tertiaryContainer().getHct(scheme).getTone()).isWithin(1).of(49); + assertThat(dynamicColors.onTertiaryContainer().getHct(scheme).getTone()).isWithin(1).of(100); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeNeutralTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeNeutralTest.java index 71e9f4da79cb..4f3fc7d50b61 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeNeutralTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeNeutralTest.java @@ -25,204 +25,193 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeNeutral; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeNeutralTest extends SysuiTestCase { + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff767685); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff777680); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff75758B); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff787678); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff787678); } @Test public void lightTheme_minContrast_primary() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff737383); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff737383); } @Test public void lightTheme_standardContrast_primary() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff5d5d6c); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff5d5d6c); } @Test public void lightTheme_maxContrast_primary() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff21212e); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff21212e); } @Test public void lightTheme_minContrast_primaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe2e1f3); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe2e1f3); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe2e1f3); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe2e1f3); } @Test public void lightTheme_maxContrast_primaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff414250); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff414250); } @Test public void lightTheme_minContrast_onPrimaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff636372); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff636372); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff1a1b27); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff1a1b27); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffd9d8ea); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffd9d8ea); } @Test public void lightTheme_minContrast_surface() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffcf8fa); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffcf8fa); } @Test public void lightTheme_standardContrast_surface() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffcf8fa); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffcf8fa); } @Test public void lightTheme_maxContrast_surface() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffcf8fa); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffcf8fa); } @Test public void darkTheme_minContrast_primary() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff737383); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff737383); } @Test public void darkTheme_standardContrast_primary() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xffc6c5d6); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffc6c5d6); } @Test public void darkTheme_maxContrast_primary() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xfff6f4ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfff6f4ff); } @Test public void darkTheme_minContrast_primaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff454654); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff454654); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff454654); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff454654); } @Test public void darkTheme_maxContrast_primaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffcac9da); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffcac9da); } @Test public void darkTheme_minContrast_onPrimaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffb5b3c4); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffb5b3c4); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe2e1f3); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffe2e1f3); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff373846); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff373846); } @Test public void darkTheme_minContrast_onTertiaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffb3b3cb); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffb3b3cb); } @Test public void darkTheme_standardContrast_onTertiaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe1e0f9); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffe1e0f9); } @Test public void darkTheme_maxContrast_onTertiaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xff37374b); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff37374b); } @Test public void darkTheme_minContrast_surface() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131315); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131315); } @Test public void darkTheme_standardContrast_surface() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131315); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131315); } @Test public void darkTheme_maxContrast_surface() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131315); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131315); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeRainbowTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeRainbowTest.java index cc6f044eb09c..ece3f9a16c48 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeRainbowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeRainbowTest.java @@ -25,225 +25,229 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeRainbow; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeRainbowTest extends SysuiTestCase { + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff696FC4); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff75758B); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff936B84); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff070707); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff070707); } @Test public void lightTheme_minContrast_primary() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff676DC1); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff676DC1); } @Test public void lightTheme_standardContrast_primary() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff5056A9); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff5056A9); } @Test public void lightTheme_maxContrast_primary() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff0F136A); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff0F136A); } @Test public void lightTheme_minContrast_primaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xffE0E0FF); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xffE0E0FF); } @Test public void lightTheme_maxContrast_primaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xff34398B); } @Test public void lightTheme_minContrast_tertiaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs( 0xffffd8ee); } @Test public void lightTheme_standardContrast_tertiaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs( 0xffffd8ee); } @Test public void lightTheme_maxContrast_tertiaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs( 0xff5A384E); } @Test public void lightTheme_minContrast_onPrimaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xff565CB0); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xff050865); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xffd6d6ff); } @Test public void lightTheme_minContrast_surface() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfff9f9f9); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9); } @Test public void lightTheme_standardContrast_surface() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfff9f9f9); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9); } @Test public void lightTheme_maxContrast_surface() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfff9f9f9); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9); } @Test public void darkTheme_minContrast_primary() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff676DC1); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff676DC1); } @Test public void darkTheme_standardContrast_primary() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xffbec2ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffbec2ff); } @Test public void darkTheme_maxContrast_primary() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xfff6f4ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfff6f4ff); } @Test public void darkTheme_minContrast_primaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xff383E8F); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xff383E8F); } @Test public void darkTheme_maxContrast_primaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xffc4c6ff); } @Test public void darkTheme_minContrast_onPrimaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xffa9afff); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xffe0e0ff); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xff292f81); } @Test public void darkTheme_minContrast_onTertiaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs( 0xffd5a8c3); } @Test public void darkTheme_standardContrast_onTertiaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs( 0xffffd8ee); } @Test public void darkTheme_maxContrast_onTertiaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs( 0xff4f2e44); } @Test public void darkTheme_minContrast_surface() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131313); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313); } @Test public void darkTheme_standardContrast_surface() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131313); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313); } @Test public void darkTheme_maxContrast_surface() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131313); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeTonalSpotTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeTonalSpotTest.java index e4880d9df858..01d199b02f26 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeTonalSpotTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeTonalSpotTest.java @@ -25,348 +25,338 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeTonalSpot; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeTonalSpotTest extends SysuiTestCase { + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff6E72AC); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff75758B); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff936B84); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff78767A); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff777680); } + @Test public void lightTheme_minContrast_primary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff6c70aa); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff6a6fb1); } @Test public void lightTheme_standardContrast_primary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff555992); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff545999); } @Test public void lightTheme_maxContrast_primary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff181c51); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff161a59); } @Test public void lightTheme_minContrast_primaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe0e0ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe0e0ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff); } @Test public void lightTheme_maxContrast_primaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff3a3e74); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff383c7c); } @Test public void lightTheme_minContrast_onPrimaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff5C5F98); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff5a5fa0); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff11144B); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff0e1253); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffd6d6ff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffd6d6ff); } @Test public void lightTheme_minContrast_surface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xffFCF8FD); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_standardContrast_surface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xffFCF8FD); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_maxContrast_surface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xffFCF8FD); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_minContrast_onSurface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onSurface.getArgb(scheme)).isSameColorAs(0xff605E62); + assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xff5f5e65); } @Test public void lightTheme_standardContrast_onSurface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onSurface.getArgb(scheme)).isSameColorAs(0xff1B1B1F); + assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xff1b1b21); } @Test public void lightTheme_maxContrast_onSurface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onSurface.getArgb(scheme)).isSameColorAs(0xff1B1A1E); + assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xff1a1a20); } @Test public void lightTheme_minContrast_onSecondary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onSecondary.getArgb(scheme)).isSameColorAs(0xffcfcfe7); + assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xffcfcfe7); } @Test public void lightTheme_standardContrast_onSecondary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onSecondary.getArgb(scheme)).isSameColorAs(0xffffffff); + assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xffffffff); } @Test public void lightTheme_maxContrast_onSecondary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onSecondary.getArgb(scheme)).isSameColorAs(0xffababc3); + assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xffababc3); } @Test public void lightTheme_minContrast_onTertiary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onTertiary.getArgb(scheme)).isSameColorAs(0xfff3c3df); + assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xfff3c3df); } @Test public void lightTheme_standardContrast_onTertiary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onTertiary.getArgb(scheme)).isSameColorAs(0xffffffff); + assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xffffffff); } @Test public void lightTheme_maxContrast_onTertiary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onTertiary.getArgb(scheme)).isSameColorAs(0xffcda0bb); + assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xffcda0bb); } @Test public void lightTheme_minContrast_onError() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onError.getArgb(scheme)).isSameColorAs(0xffffc2bb); + assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xffffc2bb); } @Test public void lightTheme_standardContrast_onError() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onError.getArgb(scheme)).isSameColorAs(0xffffffff); + assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xffffffff); } @Test public void lightTheme_maxContrast_onError() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onError.getArgb(scheme)).isSameColorAs(0xffff8d80); + assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xffff8d80); } @Test public void darkTheme_minContrast_primary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff6C70AA); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff6a6fb1); } @Test public void darkTheme_standardContrast_primary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xffbec2ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffbec2ff); } @Test public void darkTheme_maxContrast_primary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xfff6f4ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfff6f4ff); } @Test public void darkTheme_minContrast_primaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff3E4278); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff3c4180); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff3E4278); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff3c4180); } @Test public void darkTheme_maxContrast_primaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffc4c6ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffc4c6ff); } @Test public void darkTheme_minContrast_onPrimaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffadb0ef); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffabaff7); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe0e0ff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff30346A); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff2e3271); } @Test public void darkTheme_minContrast_onTertiaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffd5a8c3); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffd5a8c3); } @Test public void darkTheme_standardContrast_onTertiaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffffd8ee); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffffd8ee); } @Test public void darkTheme_maxContrast_onTertiaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xff4f2e44); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff4f2e44); } @Test public void darkTheme_minContrast_onSecondary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onSecondary.getArgb(scheme)).isSameColorAs(0xfffffbff); + assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xfffffbff); } @Test public void darkTheme_standardContrast_onSecondary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onSecondary.getArgb(scheme)).isSameColorAs(0xff2e2f42); + assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xff2e2f42); } @Test public void darkTheme_maxContrast_onSecondary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onSecondary.getArgb(scheme)).isSameColorAs(0xff505165); + assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xff505165); } @Test public void darkTheme_minContrast_onTertiary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiary.getArgb(scheme)).isSameColorAs(0xfffffbff); + assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xfffffbff); } @Test public void darkTheme_standardContrast_onTertiary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiary.getArgb(scheme)).isSameColorAs(0xff46263b); + assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xff46263b); } @Test public void darkTheme_maxContrast_onTertiary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiary.getArgb(scheme)).isSameColorAs(0xff6b485f); + assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xff6b485f); } @Test public void darkTheme_minContrast_onError() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onError.getArgb(scheme)).isSameColorAs(0xfffffbff); + assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xfffffbff); } @Test public void darkTheme_standardContrast_onError() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onError.getArgb(scheme)).isSameColorAs(0xff690005); + assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xff690005); } @Test public void darkTheme_maxContrast_onError() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onError.getArgb(scheme)).isSameColorAs(0xffa80710); + assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xffa80710); } @Test public void darkTheme_minContrast_surface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131316); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131318); } @Test public void darkTheme_standardContrast_surface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131316); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131318); } @Test public void darkTheme_maxContrast_surface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131316); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131318); } @Test public void darkTheme_minContrast_onSurface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onSurface.getArgb(scheme)).isSameColorAs(0xffa4a2a6); + assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xffa4a2a9); } @Test public void darkTheme_standardContrast_onSurface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onSurface.getArgb(scheme)).isSameColorAs(0xffe5e1e6); + assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xffe4e1e9); } @Test public void darkTheme_maxContrast_onSurface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onSurface.getArgb(scheme)).isSameColorAs(0xffe6e2e7); + assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xffe5e2ea); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeVibrantTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeVibrantTest.java index e5963a2f39fe..0fb53eb6066c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeVibrantTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeVibrantTest.java @@ -25,204 +25,193 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeVibrant; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeVibrantTest extends SysuiTestCase { + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff080CFF); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff7B7296); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff886C9D); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff777682); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff767685); } @Test public void lightTheme_minContrast_primary() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff5660ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff5660ff); } @Test public void lightTheme_standardContrast_primary() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff343dff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff343dff); } @Test public void lightTheme_maxContrast_primary() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff000181); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff000181); } @Test public void lightTheme_minContrast_primaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe0e0ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe0e0ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff); } @Test public void lightTheme_maxContrast_primaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff0000e3); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000e3); } @Test public void lightTheme_minContrast_onPrimaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff3e47ff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff3e47ff); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff00006e); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff00006e); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffd6d6ff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffd6d6ff); } @Test public void lightTheme_minContrast_surface() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_standardContrast_surface() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_maxContrast_surface() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void darkTheme_minContrast_primary() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff5660ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff5660ff); } @Test public void darkTheme_standardContrast_primary() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xffbec2ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffbec2ff); } @Test public void darkTheme_maxContrast_primary() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xfff6f4ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfff6f4ff); } @Test public void darkTheme_minContrast_primaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff0000ef); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000ef); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff0000ef); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000ef); } @Test public void darkTheme_maxContrast_primaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffc4c6ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffc4c6ff); } @Test public void darkTheme_minContrast_onPrimaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffa9afff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffa9afff); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe0e0ff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff0001c6); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff0001c6); } @Test public void darkTheme_minContrast_onTertiaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffc9a9df); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffc9a9df); } @Test public void darkTheme_standardContrast_onTertiaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xfff2daff); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xfff2daff); } @Test public void darkTheme_maxContrast_onTertiaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xff472e5b); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff472e5b); } @Test public void darkTheme_minContrast_surface() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12131C); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a); } @Test public void darkTheme_standardContrast_surface() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12131C); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a); } @Test public void darkTheme_maxContrast_surface() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12131C); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt index d9428f897f0d..611c5b987d84 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt @@ -104,6 +104,9 @@ class BackPanelControllerTest : SysuiTestCase() { continueTouch(START_X + touchSlop.toFloat() + 1) // Move again to cross the back trigger threshold continueTouch(START_X + touchSlop + triggerThreshold + 1) + // Wait threshold duration and hold touch past trigger threshold + Thread.sleep((MAX_DURATION_ENTRY_BEFORE_ACTIVE_ANIMATION + 1).toLong()) + continueTouch(START_X + touchSlop + triggerThreshold + 1) assertThat(mBackPanelController.currentState) .isEqualTo(BackPanelController.GestureState.ACTIVE) @@ -114,14 +117,22 @@ class BackPanelControllerTest : SysuiTestCase() { finishTouchActionUp(START_X + touchSlop + triggerThreshold + 1) assertThat(mBackPanelController.currentState) - .isEqualTo(BackPanelController.GestureState.FLUNG) + .isEqualTo(BackPanelController.GestureState.COMMITTED) verify(backCallback).triggerBack() } @Test fun handlesBackCancelled() { startTouch() + // Move once to cross the touch slop continueTouch(START_X + touchSlop.toFloat() + 1) + // Move again to cross the back trigger threshold + continueTouch( + START_X + touchSlop + triggerThreshold - + mBackPanelController.params.deactivationTriggerThreshold + ) + // Wait threshold duration and hold touch before trigger threshold + Thread.sleep((MAX_DURATION_ENTRY_BEFORE_ACTIVE_ANIMATION + 1).toLong()) continueTouch( START_X + touchSlop + triggerThreshold - mBackPanelController.params.deactivationTriggerThreshold diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java index 9186c35e2b47..4c83194783ab 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java @@ -617,24 +617,9 @@ public class ExpandableNotificationRowTest extends SysuiTestCase { } @Test - public void applyRoundnessAndInv_should_be_immediately_applied_on_childrenContainer_legacy() - throws Exception { - ExpandableNotificationRow group = mNotificationTestHelper.createGroup(); - group.useRoundnessSourceTypes(false); - Assert.assertEquals(0f, group.getBottomRoundness(), 0.001f); - Assert.assertEquals(0f, group.getChildrenContainer().getBottomRoundness(), 0.001f); - - group.requestBottomRoundness(1f, SourceType.from(""), false); - - Assert.assertEquals(1f, group.getBottomRoundness(), 0.001f); - Assert.assertEquals(1f, group.getChildrenContainer().getBottomRoundness(), 0.001f); - } - - @Test public void applyRoundnessAndInvalidate_should_be_immediately_applied_on_childrenContainer() throws Exception { ExpandableNotificationRow group = mNotificationTestHelper.createGroup(); - group.useRoundnessSourceTypes(true); Assert.assertEquals(0f, group.getBottomRoundness(), 0.001f); Assert.assertEquals(0f, group.getChildrenContainer().getBottomRoundness(), 0.001f); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java index e41929f7d578..be976a1c9eaf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java @@ -25,7 +25,6 @@ import android.view.View; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; -import com.android.systemui.statusbar.notification.LegacySourceType; import com.android.systemui.statusbar.notification.SourceType; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.NotificationTestHelper; @@ -158,55 +157,7 @@ public class NotificationChildrenContainerTest extends SysuiTestCase { } @Test - public void addNotification_shouldResetOnScrollRoundness() throws Exception { - ExpandableNotificationRow row = mNotificationTestHelper.createRowWithRoundness( - /* topRoundness = */ 1f, - /* bottomRoundness = */ 1f, - /* sourceType = */ LegacySourceType.OnScroll); - - mChildrenContainer.addNotification(row, 0); - - Assert.assertEquals(0f, row.getTopRoundness(), /* delta = */ 0f); - Assert.assertEquals(0f, row.getBottomRoundness(), /* delta = */ 0f); - } - - @Test - public void addNotification_shouldNotResetOtherRoundness() throws Exception { - ExpandableNotificationRow row1 = mNotificationTestHelper.createRowWithRoundness( - /* topRoundness = */ 1f, - /* bottomRoundness = */ 1f, - /* sourceType = */ LegacySourceType.DefaultValue); - ExpandableNotificationRow row2 = mNotificationTestHelper.createRowWithRoundness( - /* topRoundness = */ 1f, - /* bottomRoundness = */ 1f, - /* sourceType = */ LegacySourceType.OnDismissAnimation); - - mChildrenContainer.addNotification(row1, 0); - mChildrenContainer.addNotification(row2, 0); - - Assert.assertEquals(1f, row1.getTopRoundness(), /* delta = */ 0f); - Assert.assertEquals(1f, row1.getBottomRoundness(), /* delta = */ 0f); - Assert.assertEquals(1f, row2.getTopRoundness(), /* delta = */ 0f); - Assert.assertEquals(1f, row2.getBottomRoundness(), /* delta = */ 0f); - } - - @Test - public void applyRoundnessAndInvalidate_should_be_immediately_applied_on_last_child_legacy() { - mChildrenContainer.useRoundnessSourceTypes(false); - List<ExpandableNotificationRow> children = mChildrenContainer.getAttachedChildren(); - ExpandableNotificationRow notificationRow = children.get(children.size() - 1); - Assert.assertEquals(0f, mChildrenContainer.getBottomRoundness(), 0.001f); - Assert.assertEquals(0f, notificationRow.getBottomRoundness(), 0.001f); - - mChildrenContainer.requestBottomRoundness(1f, SourceType.from(""), false); - - Assert.assertEquals(1f, mChildrenContainer.getBottomRoundness(), 0.001f); - Assert.assertEquals(1f, notificationRow.getBottomRoundness(), 0.001f); - } - - @Test public void applyRoundnessAndInvalidate_should_be_immediately_applied_on_last_child() { - mChildrenContainer.useRoundnessSourceTypes(true); List<ExpandableNotificationRow> children = mChildrenContainer.getAttachedChildren(); ExpandableNotificationRow notificationRow = children.get(children.size() - 1); Assert.assertEquals(0f, mChildrenContainer.getBottomRoundness(), 0.001f); @@ -220,8 +171,6 @@ public class NotificationChildrenContainerTest extends SysuiTestCase { @Test public void applyRoundnessAndInvalidate_should_be_immediately_applied_on_header() { - mChildrenContainer.useRoundnessSourceTypes(true); - NotificationHeaderViewWrapper header = mChildrenContainer.getNotificationHeaderWrapper(); Assert.assertEquals(0f, header.getTopRoundness(), 0.001f); @@ -232,7 +181,6 @@ public class NotificationChildrenContainerTest extends SysuiTestCase { @Test public void applyRoundnessAndInvalidate_should_be_immediately_applied_on_headerLowPriority() { - mChildrenContainer.useRoundnessSourceTypes(true); mChildrenContainer.setIsLowPriority(true); NotificationHeaderViewWrapper header = mChildrenContainer.getNotificationHeaderWrapper(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt index b1d3daa27eae..05b70ebfbb3e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt @@ -12,7 +12,6 @@ import com.android.systemui.flags.Flags import com.android.systemui.shade.transition.LargeScreenShadeInterpolator import com.android.systemui.statusbar.NotificationShelf import com.android.systemui.statusbar.StatusBarIconView -import com.android.systemui.statusbar.notification.LegacySourceType import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableView import com.android.systemui.statusbar.notification.row.NotificationTestHelper @@ -359,39 +358,6 @@ class NotificationShelfTest : SysuiTestCase() { ) } - @Test - fun resetOnScrollRoundness_shouldSetOnScrollTo0() { - val row: ExpandableNotificationRow = notificationTestHelper.createRowWithRoundness( - /* topRoundness = */ 1f, - /* bottomRoundness = */ 1f, - /* sourceType = */ LegacySourceType.OnScroll) - - NotificationShelf.resetLegacyOnScrollRoundness(row) - - assertEquals(0f, row.topRoundness) - assertEquals(0f, row.bottomRoundness) - } - - @Test - fun resetOnScrollRoundness_shouldNotResetOtherRoundness() { - val row1: ExpandableNotificationRow = notificationTestHelper.createRowWithRoundness( - /* topRoundness = */ 1f, - /* bottomRoundness = */ 1f, - /* sourceType = */ LegacySourceType.DefaultValue) - val row2: ExpandableNotificationRow = notificationTestHelper.createRowWithRoundness( - /* topRoundness = */ 1f, - /* bottomRoundness = */ 1f, - /* sourceType = */ LegacySourceType.OnDismissAnimation) - - NotificationShelf.resetLegacyOnScrollRoundness(row1) - NotificationShelf.resetLegacyOnScrollRoundness(row2) - - assertEquals(1f, row1.topRoundness) - assertEquals(1f, row1.bottomRoundness) - assertEquals(1f, row2.topRoundness) - assertEquals(1f, row2.bottomRoundness) - } - private fun setFractionToShade(fraction: Float) { whenever(ambientState.fractionToShade).thenReturn(fraction) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java index 1510ee89dcd9..47a86b1fca5c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java @@ -380,7 +380,7 @@ public class BubblesTest extends SysuiTestCase { mPositioner, mock(DisplayController.class), mOneHandedOptional, - mock(DragAndDropController.class), + Optional.of(mock(DragAndDropController.class)), syncExecutor, mock(Handler.class), mTaskViewTransitions, diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java index c3bb7716d9a9..14c3f3c4ada5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java @@ -69,7 +69,7 @@ public class TestableBubbleController extends BubbleController { BubblePositioner positioner, DisplayController displayController, Optional<OneHandedController> oneHandedOptional, - DragAndDropController dragAndDropController, + Optional<DragAndDropController> dragAndDropController, ShellExecutor shellMainExecutor, Handler shellMainHandler, TaskViewTransitions taskViewTransitions, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeFingerprintPropertyRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeFingerprintPropertyRepository.kt new file mode 100644 index 000000000000..d9012a527726 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeFingerprintPropertyRepository.kt @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.biometrics.data.repository + +import android.hardware.biometrics.SensorLocationInternal +import com.android.systemui.biometrics.shared.model.FingerprintSensorType +import com.android.systemui.biometrics.shared.model.SensorStrength +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +class FakeFingerprintPropertyRepository : FingerprintPropertyRepository { + + private val _isInitialized: MutableStateFlow<Boolean> = MutableStateFlow(false) + override val isInitialized = _isInitialized.asStateFlow() + + private val _sensorId: MutableStateFlow<Int> = MutableStateFlow(-1) + override val sensorId: StateFlow<Int> = _sensorId.asStateFlow() + + private val _strength: MutableStateFlow<SensorStrength> = + MutableStateFlow(SensorStrength.CONVENIENCE) + override val strength = _strength.asStateFlow() + + private val _sensorType: MutableStateFlow<FingerprintSensorType> = + MutableStateFlow(FingerprintSensorType.UNKNOWN) + override val sensorType: StateFlow<FingerprintSensorType> = _sensorType.asStateFlow() + + private val _sensorLocation: MutableStateFlow<SensorLocationInternal> = + MutableStateFlow(SensorLocationInternal.DEFAULT) + override val sensorLocation = _sensorLocation.asStateFlow() + + fun setProperties( + sensorId: Int, + strength: SensorStrength, + sensorType: FingerprintSensorType, + sensorLocation: SensorLocationInternal + ) { + _sensorId.value = sensorId + _strength.value = strength + _sensorType.value = sensorType + _sensorLocation.value = sensorLocation + _isInitialized.value = true + } +} diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index e894f1c2879e..d36c959a1b25 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -490,7 +490,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mMainHandler, context, new PolicyWarningUIController.NotificationController(context)); mSecurityPolicy = new AccessibilitySecurityPolicy(policyWarningUIController, mContext, - this, LocalServices.getService(PackageManagerInternal.class)); + this); mA11yWindowManager = new AccessibilityWindowManager(mLock, mMainHandler, mWindowManagerService, this, mSecurityPolicy, this, mTraceManager); mA11yDisplayListener = new AccessibilityDisplayListener(mContext, mMainHandler); diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilitySecurityPolicy.java b/services/accessibility/java/com/android/server/accessibility/AccessibilitySecurityPolicy.java index 65c1873498a1..88656239e59b 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilitySecurityPolicy.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilitySecurityPolicy.java @@ -29,7 +29,6 @@ import android.appwidget.AppWidgetManagerInternal; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; -import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.UserInfo; @@ -100,7 +99,6 @@ public class AccessibilitySecurityPolicy { private final Context mContext; private final PackageManager mPackageManager; - private final PackageManagerInternal mPackageManagerInternal; private final UserManager mUserManager; private final AppOpsManager mAppOpsManager; private final AccessibilityUserManager mAccessibilityUserManager; @@ -118,12 +116,10 @@ public class AccessibilitySecurityPolicy { */ public AccessibilitySecurityPolicy(PolicyWarningUIController policyWarningUIController, @NonNull Context context, - @NonNull AccessibilityUserManager a11yUserManager, - @NonNull PackageManagerInternal packageManagerInternal) { + @NonNull AccessibilityUserManager a11yUserManager) { mContext = context; mAccessibilityUserManager = a11yUserManager; mPackageManager = mContext.getPackageManager(); - mPackageManagerInternal = packageManagerInternal; mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mPolicyWarningUIController = policyWarningUIController; @@ -517,7 +513,12 @@ public class AccessibilitySecurityPolicy { private boolean isValidPackageForUid(String packageName, int uid) { final long token = Binder.clearCallingIdentity(); try { - return mPackageManagerInternal.isSameApp(packageName, uid, UserHandle.getUserId(uid)); + // Since we treat calls from a profile as if made by its parent, using + // MATCH_ANY_USER to query the uid of the given package name. + return uid == mPackageManager.getPackageUidAsUser( + packageName, PackageManager.MATCH_ANY_USER, UserHandle.getUserId(uid)); + } catch (PackageManager.NameNotFoundException e) { + return false; } finally { Binder.restoreCallingIdentity(token); } diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index d8fbd08a0e70..a3a067481022 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -54,6 +54,7 @@ import android.app.ActivityManagerInternal; import android.app.AppOpsManager; import android.app.NotificationManager; import android.app.PendingIntent; +import android.bluetooth.BluetoothDevice; import android.companion.AssociationInfo; import android.companion.AssociationRequest; import android.companion.DeviceNotAssociatedException; @@ -228,7 +229,7 @@ public class CompanionDeviceManagerService extends SystemService { loadAssociationsFromDisk(); mAssociationStore.registerListener(mAssociationStoreChangeListener); - mDevicePresenceMonitor = new CompanionDevicePresenceMonitor( + mDevicePresenceMonitor = new CompanionDevicePresenceMonitor(mUserManager, mAssociationStore, mDevicePresenceCallback); mAssociationRequestsProcessor = new AssociationRequestsProcessor( @@ -314,6 +315,21 @@ public class CompanionDeviceManagerService extends SystemService { MINUTES.toMillis(10)); } + @Override + public void onUserUnlocked(@NonNull TargetUser user) { + // Notify and bind the app after the phone is unlocked. + final int userId = user.getUserIdentifier(); + final Set<BluetoothDevice> blueToothDevices = + mDevicePresenceMonitor.getPendingReportConnectedDevices().get(userId); + for (BluetoothDevice bluetoothDevice : blueToothDevices) { + for (AssociationInfo ai: + mAssociationStore.getAssociationsByAddress(bluetoothDevice.getAddress())) { + Slog.i(TAG, "onUserUnlocked, device id( " + ai.getId() + " ) is connected"); + mDevicePresenceMonitor.onBluetoothCompanionDeviceConnected(ai.getId()); + } + } + } + @NonNull AssociationInfo getAssociationWithCallerChecks( @UserIdInt int userId, @NonNull String packageName, @NonNull String macAddress) { diff --git a/services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceCall.java b/services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceCall.java index dd0bbf2790ee..ac981d45561b 100644 --- a/services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceCall.java +++ b/services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceCall.java @@ -16,12 +16,14 @@ package com.android.server.companion.datatransfer.contextsync; +import android.annotation.NonNull; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.os.Bundle; import android.telecom.Call; import android.telecom.CallAudioState; import android.telecom.VideoProfile; @@ -46,7 +48,7 @@ public class CrossDeviceCall { private static final AtomicLong sNextId = new AtomicLong(1); private final long mId; - private final Call mCall; + private Call mCall; @VisibleForTesting boolean mIsEnterprise; @VisibleForTesting boolean mIsOtt; private final String mCallingAppPackageName; @@ -58,17 +60,23 @@ public class CrossDeviceCall { private boolean mIsMuted; private final Set<Integer> mControls = new HashSet<>(); - public CrossDeviceCall(PackageManager packageManager, Call call, + public CrossDeviceCall(PackageManager packageManager, @NonNull Call call, CallAudioState callAudioState) { - mId = sNextId.getAndIncrement(); + this(packageManager, call.getDetails(), callAudioState); mCall = call; - mCallingAppPackageName = call != null - ? call.getDetails().getAccountHandle().getComponentName().getPackageName() : null; - mIsOtt = call != null - && (call.getDetails().getCallCapabilities() & Call.Details.PROPERTY_SELF_MANAGED) + final Bundle extras = new Bundle(); + extras.putLong(EXTRA_CALL_ID, mId); + call.putExtras(extras); + } + + CrossDeviceCall(PackageManager packageManager, Call.Details callDetails, + CallAudioState callAudioState) { + mId = sNextId.getAndIncrement(); + mCallingAppPackageName = + callDetails.getAccountHandle().getComponentName().getPackageName(); + mIsOtt = (callDetails.getCallCapabilities() & Call.Details.PROPERTY_SELF_MANAGED) == Call.Details.PROPERTY_SELF_MANAGED; - mIsEnterprise = call != null - && (call.getDetails().getCallProperties() & Call.Details.PROPERTY_ENTERPRISE_CALL) + mIsEnterprise = (callDetails.getCallProperties() & Call.Details.PROPERTY_ENTERPRISE_CALL) == Call.Details.PROPERTY_ENTERPRISE_CALL; try { final ApplicationInfo applicationInfo = packageManager @@ -81,9 +89,7 @@ public class CrossDeviceCall { Slog.e(TAG, "Could not get application info for package " + mCallingAppPackageName, e); } mIsMuted = callAudioState != null && callAudioState.isMuted(); - if (call != null) { - updateCallDetails(call.getDetails()); - } + updateCallDetails(callDetails); } private byte[] renderDrawableToByteArray(Drawable drawable) { @@ -108,10 +114,10 @@ public class CrossDeviceCall { final Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight()); drawable.draw(canvas); + return renderBitmapToByteArray(bitmap); } finally { bitmap.recycle(); } - return renderBitmapToByteArray(bitmap); } private byte[] renderBitmapToByteArray(Bitmap bitmap) { diff --git a/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java b/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java index f6b99b551ecb..82d0325cd749 100644 --- a/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java +++ b/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java @@ -27,17 +27,23 @@ import android.companion.AssociationInfo; import android.net.MacAddress; import android.os.Handler; import android.os.HandlerExecutor; +import android.os.UserHandle; +import android.os.UserManager; import android.util.Log; +import android.util.SparseArray; +import com.android.internal.annotations.GuardedBy; import com.android.server.companion.AssociationStore; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; @SuppressLint("LongLogTag") -class BluetoothCompanionDeviceConnectionListener +public class BluetoothCompanionDeviceConnectionListener extends BluetoothAdapter.BluetoothConnectionCallback implements AssociationStore.OnChangeListener { private static final String TAG = "CDM_BluetoothCompanionDeviceConnectionListener"; @@ -48,15 +54,23 @@ class BluetoothCompanionDeviceConnectionListener void onBluetoothCompanionDeviceDisconnected(int associationId); } + private final UserManager mUserManager; private final @NonNull AssociationStore mAssociationStore; private final @NonNull Callback mCallback; /** A set of ALL connected BT device (not only companion.) */ private final @NonNull Map<MacAddress, BluetoothDevice> mAllConnectedDevices = new HashMap<>(); - BluetoothCompanionDeviceConnectionListener(@NonNull AssociationStore associationStore, - @NonNull Callback callback) { + + @GuardedBy("mPendingReportConnectedDevices") + @NonNull + final SparseArray<Set<BluetoothDevice>> mPendingReportConnectedDevices = + new SparseArray<>(); + + BluetoothCompanionDeviceConnectionListener(UserManager userManager, + @NonNull AssociationStore associationStore, @NonNull Callback callback) { mAssociationStore = associationStore; mCallback = callback; + mUserManager = userManager; } public void init(@NonNull BluetoothAdapter btAdapter) { @@ -76,12 +90,32 @@ class BluetoothCompanionDeviceConnectionListener if (DEBUG) Log.i(TAG, "onDevice_Connected() " + btDeviceToString(device)); final MacAddress macAddress = MacAddress.fromString(device.getAddress()); + final int userId = UserHandle.myUserId(); + if (mAllConnectedDevices.put(macAddress, device) != null) { if (DEBUG) Log.w(TAG, "Device " + btDeviceToString(device) + " is already connected."); return; } + // Try to bind and notify the app after the phone is unlocked. + if (!mUserManager.isUserUnlockingOrUnlocked(UserHandle.myUserId())) { + if (DEBUG) { + Log.i(TAG, "Current user is not in unlocking or unlocked stage yet. Notify " + + "the application when the phone is unlocked"); + } + synchronized (mPendingReportConnectedDevices) { + Set<BluetoothDevice> bluetoothDevices = mPendingReportConnectedDevices.get(userId); + + if (bluetoothDevices == null) { + bluetoothDevices = new HashSet<>(); + mPendingReportConnectedDevices.put(userId, bluetoothDevices); + } + + bluetoothDevices.add(device); + } - onDeviceConnectivityChanged(device, true); + } else { + onDeviceConnectivityChanged(device, true); + } } /** @@ -98,6 +132,8 @@ class BluetoothCompanionDeviceConnectionListener } final MacAddress macAddress = MacAddress.fromString(device.getAddress()); + final int userId = UserHandle.myUserId(); + if (mAllConnectedDevices.remove(macAddress) == null) { if (DEBUG) { Log.w(TAG, "The device wasn't tracked as connected " + btDeviceToString(device)); @@ -105,6 +141,19 @@ class BluetoothCompanionDeviceConnectionListener return; } + // Do not need to report the connectivity since the user is not unlock the phone so + // that cdm is not bind with the app yet. + if (!mUserManager.isUserUnlockingOrUnlocked(userId)) { + synchronized (mPendingReportConnectedDevices) { + Set<BluetoothDevice> bluetoothDevices = mPendingReportConnectedDevices.get(userId); + if (bluetoothDevices != null) { + bluetoothDevices.remove(device); + } + } + + return; + } + onDeviceConnectivityChanged(device, false); } diff --git a/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java b/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java index 4010be922b2c..6c565004d948 100644 --- a/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java +++ b/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java @@ -23,13 +23,16 @@ import android.annotation.NonNull; import android.annotation.SuppressLint; import android.annotation.TestApi; import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; import android.companion.AssociationInfo; import android.content.Context; import android.os.Binder; import android.os.Handler; import android.os.Looper; import android.os.Message; +import android.os.UserManager; import android.util.Log; +import android.util.SparseArray; import com.android.server.companion.AssociationStore; @@ -86,13 +89,12 @@ public class CompanionDevicePresenceMonitor implements AssociationStore.OnChange private final SimulatedDevicePresenceSchedulerHelper mSchedulerHelper = new SimulatedDevicePresenceSchedulerHelper(); - public CompanionDevicePresenceMonitor(@NonNull AssociationStore associationStore, - @NonNull Callback callback) { + public CompanionDevicePresenceMonitor(UserManager userManager, + @NonNull AssociationStore associationStore, @NonNull Callback callback) { mAssociationStore = associationStore; mCallback = callback; - - mBtConnectionListener = new BluetoothCompanionDeviceConnectionListener(associationStore, - /* BluetoothCompanionDeviceConnectionListener.Callback */ this); + mBtConnectionListener = new BluetoothCompanionDeviceConnectionListener(userManager, + associationStore, /* BluetoothCompanionDeviceConnectionListener.Callback */ this); mBleScanner = new BleCompanionDeviceScanner(associationStore, /* BleCompanionDeviceScanner.Callback */ this); } @@ -298,6 +300,15 @@ public class CompanionDevicePresenceMonitor implements AssociationStore.OnChange // what's needed. } + /** + * Return a set of devices that pending to report connectivity + */ + public SparseArray<Set<BluetoothDevice>> getPendingReportConnectedDevices() { + synchronized (mBtConnectionListener.mPendingReportConnectedDevices) { + return mBtConnectionListener.mPendingReportConnectedDevices; + } + } + private static void enforceCallerShellOrRoot() { final int callingUid = Binder.getCallingUid(); if (callingUid == SHELL_UID || callingUid == ROOT_UID) return; diff --git a/services/core/java/com/android/server/am/AppProfiler.java b/services/core/java/com/android/server/am/AppProfiler.java index f29a2e1ee7da..c687184a5a71 100644 --- a/services/core/java/com/android/server/am/AppProfiler.java +++ b/services/core/java/com/android/server/am/AppProfiler.java @@ -1199,6 +1199,9 @@ public class AppProfiler { .sendToTarget(); } + mCachedAppsWatermarkData.updateCachedAppsHighWatermarkIfNecessaryLocked( + numCached + numEmpty, now); + if (mService.mConstants.USE_MODERN_TRIM) { // Modern trim is not sent based on lowmem state // Dispatch UI_HIDDEN to processes that need it @@ -1316,8 +1319,6 @@ public class AppProfiler { profile.setTrimMemoryLevel(0); }); } - mCachedAppsWatermarkData.updateCachedAppsHighWatermarkIfNecessaryLocked( - numCached + numEmpty, now); return allChanged; } diff --git a/services/core/java/com/android/server/biometrics/AuthSession.java b/services/core/java/com/android/server/biometrics/AuthSession.java index 5127d26e6e73..bf5e8ee27157 100644 --- a/services/core/java/com/android/server/biometrics/AuthSession.java +++ b/services/core/java/com/android/server/biometrics/AuthSession.java @@ -704,7 +704,8 @@ public final class AuthSession implements IBinder.DeathRecipient { } BiometricFrameworkStatsLogger.getInstance().authenticate( - mBiometricContext.updateContext(new OperationContextExt(), isCrypto()), + mBiometricContext.updateContext(new OperationContextExt(true /* isBP */), + isCrypto()), statsModality(), BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, @@ -734,7 +735,8 @@ public final class AuthSession implements IBinder.DeathRecipient { } // Auth canceled BiometricFrameworkStatsLogger.getInstance().error( - mBiometricContext.updateContext(new OperationContextExt(), isCrypto()), + mBiometricContext.updateContext(new OperationContextExt(true /* isBP */), + isCrypto()), statsModality(), BiometricsProtoEnums.ACTION_AUTHENTICATE, BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, diff --git a/services/core/java/com/android/server/biometrics/log/OperationContextExt.java b/services/core/java/com/android/server/biometrics/log/OperationContextExt.java index d1de80b4761d..4d821e9819b4 100644 --- a/services/core/java/com/android/server/biometrics/log/OperationContextExt.java +++ b/services/core/java/com/android/server/biometrics/log/OperationContextExt.java @@ -46,15 +46,17 @@ public class OperationContextExt { private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED; @Surface.Rotation private int mOrientation = Surface.ROTATION_0; private int mFoldState = IBiometricContextListener.FoldState.UNKNOWN; + private final boolean mIsBP; - /** Create a new empty context. */ - public OperationContextExt() { - this(new OperationContext()); + /** Create a context. */ + public OperationContextExt(boolean isBP) { + this(new OperationContext(), isBP); } /** Create a wrapped context. */ - public OperationContextExt(@NonNull OperationContext context) { + public OperationContextExt(@NonNull OperationContext context, boolean isBP) { mAidlContext = context; + mIsBP = isBP; } /** @@ -268,18 +270,20 @@ public class OperationContextExt { } private void setFirstSessionId(@NonNull BiometricContext biometricContext) { - mSessionInfo = biometricContext.getKeyguardEntrySessionInfo(); - if (mSessionInfo != null) { - mAidlContext.id = mSessionInfo.getId(); - mAidlContext.reason = OperationReason.KEYGUARD; - return; - } - - mSessionInfo = biometricContext.getBiometricPromptSessionInfo(); - if (mSessionInfo != null) { - mAidlContext.id = mSessionInfo.getId(); - mAidlContext.reason = OperationReason.BIOMETRIC_PROMPT; - return; + if (mIsBP) { + mSessionInfo = biometricContext.getBiometricPromptSessionInfo(); + if (mSessionInfo != null) { + mAidlContext.id = mSessionInfo.getId(); + mAidlContext.reason = OperationReason.BIOMETRIC_PROMPT; + return; + } + } else { + mSessionInfo = biometricContext.getKeyguardEntrySessionInfo(); + if (mSessionInfo != null) { + mAidlContext.id = mSessionInfo.getId(); + mAidlContext.reason = OperationReason.KEYGUARD; + return; + } } // no session diff --git a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java index 7b9fc36e8d61..05ca6e4554fb 100644 --- a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java @@ -133,10 +133,6 @@ public abstract class AuthenticationClient<T, O extends AuthenticateOptions> binderDiedInternal(clearListener); } - public boolean isBiometricPrompt() { - return getCookie() != 0; - } - public long getOperationId() { return mOperationId; } diff --git a/services/core/java/com/android/server/biometrics/sensors/HalClientMonitor.java b/services/core/java/com/android/server/biometrics/sensors/HalClientMonitor.java index d0a4807d937e..03658ce21fc2 100644 --- a/services/core/java/com/android/server/biometrics/sensors/HalClientMonitor.java +++ b/services/core/java/com/android/server/biometrics/sensors/HalClientMonitor.java @@ -37,7 +37,7 @@ public abstract class HalClientMonitor<T> extends BaseClientMonitor { protected final Supplier<T> mLazyDaemon; @NonNull - private final OperationContextExt mOperationContext = new OperationContextExt(); + private final OperationContextExt mOperationContext; /** * @param context system_server context @@ -58,6 +58,7 @@ public abstract class HalClientMonitor<T> extends BaseClientMonitor { super(context, token, listener, userId, owner, cookie, sensorId, biometricLogger, biometricContext); mLazyDaemon = lazyDaemon; + mOperationContext = new OperationContextExt(isBiometricPrompt()); } @Nullable @@ -85,6 +86,10 @@ public abstract class HalClientMonitor<T> extends BaseClientMonitor { unsubscribeBiometricContext(); } + public boolean isBiometricPrompt() { + return getCookie() != 0; + } + protected OperationContextExt getOperationContext() { return getBiometricContext().updateContext(mOperationContext, isCryptoOperation()); } diff --git a/services/core/java/com/android/server/broadcastradio/aidl/ConversionUtils.java b/services/core/java/com/android/server/broadcastradio/aidl/ConversionUtils.java index aab815c93e1a..adea13fcc13c 100644 --- a/services/core/java/com/android/server/broadcastradio/aidl/ConversionUtils.java +++ b/services/core/java/com/android/server/broadcastradio/aidl/ConversionUtils.java @@ -102,6 +102,8 @@ final class ConversionUtils { return new UnsupportedOperationException(action + ": NOT_SUPPORTED"); case Result.TIMEOUT: return new ParcelableException(new RuntimeException(action + ": TIMEOUT")); + case Result.CANCELED: + return new IllegalStateException(action + ": CANCELED"); default: return new ParcelableException(new RuntimeException( action + ": unknown error (" + result + ")")); @@ -123,6 +125,8 @@ final class ConversionUtils { return RadioTuner.TUNER_RESULT_NOT_SUPPORTED; case Result.TIMEOUT: return RadioTuner.TUNER_RESULT_TIMEOUT; + case Result.CANCELED: + return RadioTuner.TUNER_RESULT_CANCELED; case Result.UNKNOWN_ERROR: default: return RadioTuner.TUNER_RESULT_UNKNOWN_ERROR; diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java index 378363c870c7..774087c63f0f 100644 --- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java +++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java @@ -366,7 +366,12 @@ public class AutomaticBrightnessController { return getAutomaticScreenBrightness(null); } - float getAutomaticScreenBrightness(BrightnessEvent brightnessEvent) { + /** + * @return The current brightness recommendation calculated from the current conditions. + * @param brightnessEvent Event object to populate with details about why the specific + * brightness was chosen. + */ + public float getAutomaticScreenBrightness(BrightnessEvent brightnessEvent) { if (brightnessEvent != null) { brightnessEvent.setLux( mAmbientLuxValid ? mAmbientLux : PowerManager.BRIGHTNESS_INVALID_FLOAT); diff --git a/services/core/java/com/android/server/display/ColorFade.java b/services/core/java/com/android/server/display/ColorFade.java index a4bd6a699ceb..46cd496bdcd3 100644 --- a/services/core/java/com/android/server/display/ColorFade.java +++ b/services/core/java/com/android/server/display/ColorFade.java @@ -191,7 +191,7 @@ final class ColorFade { } if (!(createEglContext(isProtected) && createEglSurface(isProtected, isWideColor) - && setScreenshotTextureAndSetViewport(hardwareBuffer))) { + && setScreenshotTextureAndSetViewport(hardwareBuffer, displayInfo.rotation))) { dismiss(); return false; } @@ -500,7 +500,8 @@ final class ColorFade { } private boolean setScreenshotTextureAndSetViewport( - ScreenCapture.ScreenshotHardwareBuffer screenshotBuffer) { + ScreenCapture.ScreenshotHardwareBuffer screenshotBuffer, + @Surface.Rotation int rotation) { if (!attachEglContext()) { return false; } @@ -525,14 +526,22 @@ final class ColorFade { s.release(); st.release(); } + // if screen is rotated, map texture starting different corner + int indexDelta = (rotation == Surface.ROTATION_90) ? 2 + : (rotation == Surface.ROTATION_180) ? 4 + : (rotation == Surface.ROTATION_270) ? 6 : 0; // Set up texture coordinates for a quad. // We might need to change this if the texture ends up being // a different size from the display for some reason. - mTexCoordBuffer.put(0, 0f); mTexCoordBuffer.put(1, 0f); - mTexCoordBuffer.put(2, 0f); mTexCoordBuffer.put(3, 1f); - mTexCoordBuffer.put(4, 1f); mTexCoordBuffer.put(5, 1f); - mTexCoordBuffer.put(6, 1f); mTexCoordBuffer.put(7, 0f); + mTexCoordBuffer.put(indexDelta, 0f); + mTexCoordBuffer.put(indexDelta + 1, 0f); + mTexCoordBuffer.put((indexDelta + 2) % 8, 0f); + mTexCoordBuffer.put((indexDelta + 3) % 8, 1f); + mTexCoordBuffer.put((indexDelta + 4) % 8, 1f); + mTexCoordBuffer.put((indexDelta + 5) % 8, 1f); + mTexCoordBuffer.put((indexDelta + 6) % 8, 1f); + mTexCoordBuffer.put((indexDelta + 7) % 8, 0f); // Set up our viewport. GLES20.glViewport(0, 0, mDisplayWidth, mDisplayHeight); diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 26b6cb0ebe9b..5771a04b9607 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -2548,7 +2548,6 @@ public final class DisplayManagerService extends SystemService { final DisplayInfo displayInfo = logicalDisplay.getDisplayInfoLocked(); captureArgs = new ScreenCapture.DisplayCaptureArgs.Builder(token) .setSize(displayInfo.getNaturalWidth(), displayInfo.getNaturalHeight()) - .setUseIdentityTransform(true) .setCaptureSecureLayers(true) .setAllowProtected(true) .build(); diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 0d89ba88c1cf..0861cb59a944 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -83,6 +83,7 @@ import com.android.server.display.whitebalance.DisplayWhiteBalanceSettings; import com.android.server.policy.WindowManagerPolicy; import java.io.PrintWriter; +import java.util.Objects; /** * Controls the power state of the display. @@ -605,7 +606,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mLastBrightnessEvent = new BrightnessEvent(mDisplayId); mTempBrightnessEvent = new BrightnessEvent(mDisplayId); mThermalBrightnessThrottlingDataId = - logicalDisplay.getThermalBrightnessThrottlingDataIdLocked(); + logicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId; if (mDisplayId == Display.DEFAULT_DISPLAY) { mBatteryStats = BatteryStatsService.getService(); @@ -955,7 +956,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call && mLogicalDisplay.getPrimaryDisplayDeviceLocked() .getDisplayDeviceInfoLocked().type == Display.TYPE_INTERNAL; final String thermalBrightnessThrottlingDataId = - mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(); + mLogicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId; mHandler.postAtTime(() -> { boolean changed = false; if (mDisplayDevice != device) { @@ -972,8 +973,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // last command that was sent to change it's state. Let's assume it is unknown so // that we trigger a change immediately. mPowerState.resetScreenState(); - } else if ( - !mThermalBrightnessThrottlingDataId.equals(thermalBrightnessThrottlingDataId)) { + } else if (!Objects.equals(mThermalBrightnessThrottlingDataId, + thermalBrightnessThrottlingDataId)) { changed = true; mThermalBrightnessThrottlingDataId = thermalBrightnessThrottlingDataId; mBrightnessThrottler.loadThermalBrightnessThrottlingDataFromDisplayDeviceConfig( @@ -2189,7 +2190,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call () -> { sendUpdatePowerState(); postBrightnessChangeRunnable(); - }, mUniqueDisplayId, mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(), + }, mUniqueDisplayId, + mLogicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId, ddConfig.getThermalBrightnessThrottlingDataMapByThrottlingId()); } diff --git a/services/core/java/com/android/server/display/DisplayPowerController2.java b/services/core/java/com/android/server/display/DisplayPowerController2.java index 9e8c47f64926..3b3d5da8396c 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController2.java +++ b/services/core/java/com/android/server/display/DisplayPowerController2.java @@ -85,6 +85,7 @@ import com.android.server.display.whitebalance.DisplayWhiteBalanceSettings; import com.android.server.policy.WindowManagerPolicy; import java.io.PrintWriter; +import java.util.Objects; /** * Controls the power state of the display. @@ -488,7 +489,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mAutomaticBrightnessStrategy = new AutomaticBrightnessStrategy(context, mDisplayId); mTag = "DisplayPowerController2[" + mDisplayId + "]"; mThermalBrightnessThrottlingDataId = - logicalDisplay.getThermalBrightnessThrottlingDataIdLocked(); + logicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId; mDisplayDevice = mLogicalDisplay.getPrimaryDisplayDeviceLocked(); mUniqueDisplayId = logicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId(); @@ -760,7 +761,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal && mLogicalDisplay.getPrimaryDisplayDeviceLocked() .getDisplayDeviceInfoLocked().type == Display.TYPE_INTERNAL; final String thermalBrightnessThrottlingDataId = - mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(); + mLogicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId; mHandler.postAtTime(() -> { boolean changed = false; @@ -778,8 +779,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal // last command that was sent to change it's state. Let's assume it is unknown so // that we trigger a change immediately. mPowerState.resetScreenState(); - } else if ( - !mThermalBrightnessThrottlingDataId.equals(thermalBrightnessThrottlingDataId)) { + } else if (!Objects.equals(mThermalBrightnessThrottlingDataId, + thermalBrightnessThrottlingDataId)) { changed = true; mThermalBrightnessThrottlingDataId = thermalBrightnessThrottlingDataId; mBrightnessThrottler.loadThermalBrightnessThrottlingDataFromDisplayDeviceConfig( @@ -1301,7 +1302,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal int brightnessAdjustmentFlags = 0; if (Float.isNaN(brightnessState)) { if (mAutomaticBrightnessStrategy.isAutoBrightnessEnabled()) { - brightnessState = mAutomaticBrightnessStrategy.getAutomaticScreenBrightness(); + brightnessState = mAutomaticBrightnessStrategy.getAutomaticScreenBrightness( + mTempBrightnessEvent); if (BrightnessUtils.isValidBrightnessValue(brightnessState) || brightnessState == PowerManager.BRIGHTNESS_OFF_FLOAT) { rawBrightnessState = mAutomaticBrightnessController @@ -1820,7 +1822,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal () -> { sendUpdatePowerState(); postBrightnessChangeRunnable(); - }, mUniqueDisplayId, mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(), + }, mUniqueDisplayId, + mLogicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId, ddConfig.getThermalBrightnessThrottlingDataMapByThrottlingId()); } diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java index 0b6d1c851dc4..e5c50e61bf25 100644 --- a/services/core/java/com/android/server/display/LogicalDisplay.java +++ b/services/core/java/com/android/server/display/LogicalDisplay.java @@ -203,6 +203,7 @@ final class LogicalDisplay { mIsEnabled = true; mIsInTransition = false; mThermalBrightnessThrottlingDataId = DisplayDeviceConfig.DEFAULT_ID; + mBaseDisplayInfo.thermalBrightnessThrottlingDataId = mThermalBrightnessThrottlingDataId; } public void setDevicePositionLocked(int position) { @@ -514,6 +515,7 @@ final class LogicalDisplay { mBaseDisplayInfo.layoutLimitedRefreshRate = mLayoutLimitedRefreshRate; mBaseDisplayInfo.thermalRefreshRateThrottling = mThermalRefreshRateThrottling; + mBaseDisplayInfo.thermalBrightnessThrottlingDataId = mThermalBrightnessThrottlingDataId; mPrimaryDisplayDeviceInfo = deviceInfo; mInfo.set(null); @@ -886,19 +888,14 @@ final class LogicalDisplay { } /** - * @return The ID of the brightness throttling data that this display should use. - */ - public String getThermalBrightnessThrottlingDataIdLocked() { - return mThermalBrightnessThrottlingDataId; - } - - /** * @param brightnessThrottlingDataId The ID of the brightness throttling data that this * display should use. */ public void setThermalBrightnessThrottlingDataIdLocked(String brightnessThrottlingDataId) { - mThermalBrightnessThrottlingDataId = - brightnessThrottlingDataId; + if (!Objects.equals(brightnessThrottlingDataId, mThermalBrightnessThrottlingDataId)) { + mThermalBrightnessThrottlingDataId = brightnessThrottlingDataId; + mDirty = true; + } } /** diff --git a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java index f6cf866dfa2f..95cbf9835e0f 100644 --- a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java +++ b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java @@ -25,6 +25,7 @@ import android.view.Display; import com.android.internal.annotations.VisibleForTesting; import com.android.server.display.AutomaticBrightnessController; +import com.android.server.display.brightness.BrightnessEvent; import com.android.server.display.brightness.BrightnessReason; import com.android.server.display.brightness.BrightnessUtils; @@ -252,10 +253,12 @@ public class AutomaticBrightnessStrategy { /** * Evaluates the target automatic brightness of the associated display. + * @param brightnessEvent Event object to populate with details about why the specific + * brightness was chosen. */ - public float getAutomaticScreenBrightness() { + public float getAutomaticScreenBrightness(BrightnessEvent brightnessEvent) { float brightness = (mAutomaticBrightnessController != null) - ? mAutomaticBrightnessController.getAutomaticScreenBrightness() + ? mAutomaticBrightnessController.getAutomaticScreenBrightness(brightnessEvent) : PowerManager.BRIGHTNESS_INVALID_FLOAT; adjustAutomaticBrightnessStateIfValid(brightness); return brightness; diff --git a/services/core/java/com/android/server/infra/ServiceNameBaseResolver.java b/services/core/java/com/android/server/infra/ServiceNameBaseResolver.java index 76ea05e36141..66ce5c79663e 100644 --- a/services/core/java/com/android/server/infra/ServiceNameBaseResolver.java +++ b/services/core/java/com/android/server/infra/ServiceNameBaseResolver.java @@ -268,7 +268,7 @@ public abstract class ServiceNameBaseResolver implements ServiceNameResolver { } if (enabled) { Slog.i(TAG, "disabling default service for user " + userId); - mDefaultServicesDisabled.removeAt(userId); + mDefaultServicesDisabled.delete(userId); } else { Slog.i(TAG, "enabling default service for user " + userId); mDefaultServicesDisabled.put(userId, true); diff --git a/services/core/java/com/android/server/input/InputSettingsObserver.java b/services/core/java/com/android/server/input/InputSettingsObserver.java index 5b2166962d0d..153e9c174b85 100644 --- a/services/core/java/com/android/server/input/InputSettingsObserver.java +++ b/services/core/java/com/android/server/input/InputSettingsObserver.java @@ -52,25 +52,27 @@ class InputSettingsObserver extends ContentObserver { mHandler = handler; mNative = nativeIms; mObservers = Map.ofEntries( - Map.entry(Settings.System.getUriFor(Settings.System.POINTER_SPEED), - (reason) -> updateMousePointerSpeed()), - Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_POINTER_SPEED), - (reason) -> updateTouchpadPointerSpeed()), - Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_NATURAL_SCROLLING), - (reason) -> updateTouchpadNaturalScrollingEnabled()), - Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_TAP_TO_CLICK), - (reason) -> updateTouchpadTapToClickEnabled()), - Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_RIGHT_CLICK_ZONE), - (reason) -> updateTouchpadRightClickZoneEnabled()), - Map.entry(Settings.System.getUriFor(Settings.System.SHOW_TOUCHES), - (reason) -> updateShowTouches()), - Map.entry(Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON), - (reason) -> updateAccessibilityLargePointer()), - Map.entry(Settings.Secure.getUriFor(Settings.Secure.LONG_PRESS_TIMEOUT), - (reason) -> updateDeepPressStatus(reason)), - Map.entry( - Settings.Global.getUriFor(Settings.Global.MAXIMUM_OBSCURING_OPACITY_FOR_TOUCH), - (reason) -> updateMaximumObscuringOpacityForTouch())); + Map.entry(Settings.System.getUriFor(Settings.System.POINTER_SPEED), + (reason) -> updateMousePointerSpeed()), + Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_POINTER_SPEED), + (reason) -> updateTouchpadPointerSpeed()), + Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_NATURAL_SCROLLING), + (reason) -> updateTouchpadNaturalScrollingEnabled()), + Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_TAP_TO_CLICK), + (reason) -> updateTouchpadTapToClickEnabled()), + Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_RIGHT_CLICK_ZONE), + (reason) -> updateTouchpadRightClickZoneEnabled()), + Map.entry(Settings.System.getUriFor(Settings.System.SHOW_TOUCHES), + (reason) -> updateShowTouches()), + Map.entry( + Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON), + (reason) -> updateAccessibilityLargePointer()), + Map.entry(Settings.Secure.getUriFor(Settings.Secure.LONG_PRESS_TIMEOUT), + (reason) -> updateLongPressTimeout(reason)), + Map.entry( + Settings.Global.getUriFor( + Settings.Global.MAXIMUM_OBSCURING_OPACITY_FOR_TOUCH), + (reason) -> updateMaximumObscuringOpacityForTouch())); } /** @@ -151,8 +153,13 @@ class InputSettingsObserver extends ContentObserver { mNative.reloadPointerIcons(); } - private void updateDeepPressStatus(String reason) { - // Not using ViewConfiguration.getLongPressTimeout here because it may return a stale value + private void updateLongPressTimeout(String reason) { + // Some key gesture timeouts are based on the long press timeout, so update key gesture + // timeouts when the value changes. See ViewConfiguration#getKeyRepeatTimeout(). + mNative.notifyKeyGestureTimeoutsChanged(); + + // Update the deep press status. + // Not using ViewConfiguration.getLongPressTimeout here because it may return a stale value. final int timeout = Settings.Secure.getIntForUser(mContext.getContentResolver(), Settings.Secure.LONG_PRESS_TIMEOUT, ViewConfiguration.DEFAULT_LONG_PRESS_TIMEOUT, UserHandle.USER_CURRENT); diff --git a/services/core/java/com/android/server/input/NativeInputManagerService.java b/services/core/java/com/android/server/input/NativeInputManagerService.java index aeb2477f8890..363bc94b49bd 100644 --- a/services/core/java/com/android/server/input/NativeInputManagerService.java +++ b/services/core/java/com/android/server/input/NativeInputManagerService.java @@ -28,6 +28,7 @@ import android.view.InputChannel; import android.view.InputEvent; import android.view.PointerIcon; import android.view.VerifiedInputEvent; +import android.view.ViewConfiguration; import java.util.List; @@ -198,8 +199,6 @@ interface NativeInputManagerService { void changeKeyboardLayoutAssociation(); - void notifyPointerDisplayIdChanged(); - void setDisplayEligibilityForPointerCapture(int displayId, boolean enabled); void setMotionClassifierEnabled(boolean enabled); @@ -243,6 +242,15 @@ interface NativeInputManagerService { */ void sysfsNodeChanged(String sysfsNodePath); + /** + * Notify there is a change in any of the key gesture timeouts, such as the key + * repeat timeout or key repeat delay. + * + * @see ViewConfiguration#getKeyRepeatTimeout() + * @see ViewConfiguration#getKeyRepeatDelay() + */ + void notifyKeyGestureTimeoutsChanged(); + /** The native implementation of InputManagerService methods. */ class NativeImpl implements NativeInputManagerService { /** Pointer to native input manager service object, used by native code. */ @@ -452,9 +460,6 @@ interface NativeInputManagerService { public native void changeKeyboardLayoutAssociation(); @Override - public native void notifyPointerDisplayIdChanged(); - - @Override public native void setDisplayEligibilityForPointerCapture(int displayId, boolean enabled); @Override @@ -493,5 +498,8 @@ interface NativeInputManagerService { @Override public native void sysfsNodeChanged(String sysfsNodePath); + + @Override + public native void notifyKeyGestureTimeoutsChanged(); } } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 8433c47f8175..79eed644de78 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -1004,7 +1004,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { return; } - final boolean interactive = Display.isOnState(mDefaultDisplay.getState()); + final boolean interactive = mDefaultDisplayPolicy.isAwake(); Slog.d(TAG, "powerPress: eventTime=" + eventTime + " interactive=" + interactive + " count=" + count + " beganFromNonInteractive=" + beganFromNonInteractive @@ -2201,8 +2201,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Match current screen state. if (!mPowerManager.isInteractive()) { - startedGoingToSleep(PowerManager.GO_TO_SLEEP_REASON_TIMEOUT); - finishedGoingToSleep(PowerManager.GO_TO_SLEEP_REASON_TIMEOUT); + startedGoingToSleep(Display.DEFAULT_DISPLAY_GROUP, + PowerManager.GO_TO_SLEEP_REASON_TIMEOUT); + finishedGoingToSleep(Display.DEFAULT_DISPLAY_GROUP, + PowerManager.GO_TO_SLEEP_REASON_TIMEOUT); } mWindowManagerInternal.registerAppTransitionListener(new AppTransitionListener() { @@ -4095,7 +4097,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // This could prevent some wrong state in multi-displays environment, // the default display may turned off but interactive is true. - final boolean isDefaultDisplayOn = Display.isOnState(mDefaultDisplay.getState()); + final boolean isDefaultDisplayOn = mDefaultDisplayPolicy.isAwake(); final boolean interactiveAndOn = interactive && isDefaultDisplayOn; if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) { handleKeyGesture(event, interactiveAndOn); @@ -4795,17 +4797,40 @@ public class PhoneWindowManager implements WindowManagerPolicy { } }; + @Override + public void startedWakingUpGlobal(@WakeReason int reason) { + + } + + @Override + public void finishedWakingUpGlobal(@WakeReason int reason) { + + } + + @Override + public void startedGoingToSleepGlobal(@PowerManager.GoToSleepReason int reason) { + mDeviceGoingToSleep = true; + } + + @Override + public void finishedGoingToSleepGlobal(@PowerManager.GoToSleepReason int reason) { + mDeviceGoingToSleep = false; + } + // Called on the PowerManager's Notifier thread. @Override - public void startedGoingToSleep(@PowerManager.GoToSleepReason int pmSleepReason) { + public void startedGoingToSleep(int displayGroupId, + @PowerManager.GoToSleepReason int pmSleepReason) { if (DEBUG_WAKEUP) { - Slog.i(TAG, "Started going to sleep... (why=" + Slog.i(TAG, "Started going to sleep... (groupId=" + displayGroupId + " why=" + WindowManagerPolicyConstants.offReasonToString( WindowManagerPolicyConstants.translateSleepReasonToOffReason( pmSleepReason)) + ")"); } + if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) { + return; + } - mDeviceGoingToSleep = true; mRequestedOrSleepingDefaultDisplay = true; if (mKeyguardDelegate != null) { @@ -4815,17 +4840,20 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Called on the PowerManager's Notifier thread. @Override - public void finishedGoingToSleep(@PowerManager.GoToSleepReason int pmSleepReason) { + public void finishedGoingToSleep(int displayGroupId, + @PowerManager.GoToSleepReason int pmSleepReason) { + if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) { + return; + } EventLogTags.writeScreenToggled(0); if (DEBUG_WAKEUP) { - Slog.i(TAG, "Finished going to sleep... (why=" + Slog.i(TAG, "Finished going to sleep... (groupId=" + displayGroupId + " why=" + WindowManagerPolicyConstants.offReasonToString( WindowManagerPolicyConstants.translateSleepReasonToOffReason( pmSleepReason)) + ")"); } MetricsLogger.histogram(mContext, "screen_timeout", mLockScreenTimeout / 1000); - mDeviceGoingToSleep = false; mRequestedOrSleepingDefaultDisplay = false; mDefaultDisplayPolicy.setAwake(false); @@ -4850,26 +4878,18 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Called on the PowerManager's Notifier thread. @Override - public void onPowerGroupWakefulnessChanged(int groupId, int wakefulness, - @PowerManager.GoToSleepReason int pmSleepReason, int globalWakefulness) { - if (wakefulness != globalWakefulness - && wakefulness != PowerManagerInternal.WAKEFULNESS_AWAKE - && groupId == Display.DEFAULT_DISPLAY_GROUP - && mKeyguardDelegate != null) { - mKeyguardDelegate.doKeyguardTimeout(null); - } - } - - // Called on the PowerManager's Notifier thread. - @Override - public void startedWakingUp(@PowerManager.WakeReason int pmWakeReason) { - EventLogTags.writeScreenToggled(1); + public void startedWakingUp(int displayGroupId, @WakeReason int pmWakeReason) { if (DEBUG_WAKEUP) { - Slog.i(TAG, "Started waking up... (why=" + Slog.i(TAG, "Started waking up... (groupId=" + displayGroupId + " why=" + WindowManagerPolicyConstants.onReasonToString( - WindowManagerPolicyConstants.translateWakeReasonToOnReason( - pmWakeReason)) + ")"); + WindowManagerPolicyConstants.translateWakeReasonToOnReason( + pmWakeReason)) + ")"); + } + if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) { + return; } + EventLogTags.writeScreenToggled(1); + mDefaultDisplayPolicy.setAwake(true); @@ -4892,13 +4912,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Called on the PowerManager's Notifier thread. @Override - public void finishedWakingUp(@PowerManager.WakeReason int pmWakeReason) { + public void finishedWakingUp(int displayGroupId, @WakeReason int pmWakeReason) { if (DEBUG_WAKEUP) { - Slog.i(TAG, "Finished waking up... (why=" + Slog.i(TAG, "Finished waking up... (groupId=" + displayGroupId + " why=" + WindowManagerPolicyConstants.onReasonToString( WindowManagerPolicyConstants.translateWakeReasonToOnReason( pmWakeReason)) + ")"); } + if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) { + return; + } if (mKeyguardDelegate != null) { mKeyguardDelegate.onFinishedWakingUp(); @@ -5378,8 +5401,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } mSideFpsEventHandler.onFingerprintSensorReady(); - startedWakingUp(PowerManager.WAKE_REASON_UNKNOWN); - finishedWakingUp(PowerManager.WAKE_REASON_UNKNOWN); + startedWakingUp(Display.DEFAULT_DISPLAY_GROUP, PowerManager.WAKE_REASON_UNKNOWN); + finishedWakingUp(Display.DEFAULT_DISPLAY_GROUP, PowerManager.WAKE_REASON_UNKNOWN); int defaultDisplayState = mDisplayManager.getDisplay(DEFAULT_DISPLAY).getState(); boolean defaultDisplayOn = defaultDisplayState == Display.STATE_ON; diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index 7c3f1aad435b..887f9461bdce 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -67,10 +67,12 @@ import static java.lang.annotation.RetentionPolicy.SOURCE; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.companion.virtual.VirtualDevice; import android.content.ComponentName; import android.content.Context; import android.content.res.Configuration; import android.graphics.Rect; +import android.hardware.display.VirtualDisplay; import android.os.Bundle; import android.os.IBinder; import android.os.PowerManager; @@ -762,50 +764,84 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { void setAllowLockscreenWhenOn(int displayId, boolean allow); /** + * Called when the global wakefulness is becoming awake. + * + * @param reason One of PowerManager.WAKE_REASON_*, detailing the reason for the change. + */ + void startedWakingUpGlobal(@PowerManager.WakeReason int reason); + + /** + * Called when the global wakefulness has finished becoming awake. + * + * @param reason One of PowerManager.WAKE_REASON_*, detailing the reason for the change. + */ + void finishedWakingUpGlobal(@PowerManager.WakeReason int reason); + + /** + * Called when the global wakefulness has started going to sleep. + * + * @param reason One of PowerManager.WAKE_REASON_*, detailing the reason for the change. + */ + void startedGoingToSleepGlobal(@PowerManager.GoToSleepReason int reason); + + /** + * Called when the global wakefulness has finished going to sleep. + * + * @param reason One of PowerManager.WAKE_REASON_*, detailing the reason for the change. + */ + void finishedGoingToSleepGlobal(@PowerManager.GoToSleepReason int reason); + + /** * Called when the device has started waking up. * - * @param pmWakeReason One of PowerManager.WAKE_REASON_*, detailing the specific reason we're - * waking up, such as WAKE_REASON_POWER_BUTTON or WAKE_REASON_GESTURE. + * @param displayGroupId The id of the display group that has started waking up. This will often + * be {@link Display#DEFAULT_DISPLAY_GROUP}, but it is possible for other + * display groups to exist, for example when there is a + * {@link VirtualDevice} with one or more {@link VirtualDisplay}s. + * @param pmWakeReason One of PowerManager.WAKE_REASON_*, detailing the specific reason this + * display group is waking up, such as WAKE_REASON_POWER_BUTTON or + * WAKE_REASON_GESTURE. */ - void startedWakingUp(@PowerManager.WakeReason int pmWakeReason); + void startedWakingUp(int displayGroupId, @PowerManager.WakeReason int pmWakeReason); /** * Called when the device has finished waking up. * - * @param pmWakeReason One of PowerManager.WAKE_REASON_*, detailing the specific reason we're - * waking up, such as WAKE_REASON_POWER_BUTTON or WAKE_REASON_GESTURE. + * @param displayGroupId The id of the display group that has finished waking. This will often + * be {@link Display#DEFAULT_DISPLAY_GROUP}, but it is possible for other + * display groups to exist, for example when there is a + * {@link VirtualDevice} with one or more {@link VirtualDisplay}s. + * @param pmWakeReason One of PowerManager.WAKE_REASON_*, detailing the specific reason this + * display group is waking up, such as WAKE_REASON_POWER_BUTTON or + * WAKE_REASON_GESTURE. */ - void finishedWakingUp(@PowerManager.WakeReason int pmWakeReason); + void finishedWakingUp(int displayGroupId, @PowerManager.WakeReason int pmWakeReason); /** * Called when the device has started going to sleep. * + * @param displayGroupId The id of the display group that has started going to sleep. This + * will often be {@link Display#DEFAULT_DISPLAY_GROUP}, but it is + * possible for other display groups to exist, for example when there is a + * {@link VirtualDevice} with one or more {@link VirtualDisplay}s. * @param pmSleepReason One of PowerManager.GO_TO_SLEEP_REASON_*, detailing the specific reason - * we're going to sleep, such as GO_TO_SLEEP_REASON_POWER_BUTTON or GO_TO_SLEEP_REASON_TIMEOUT. + * this display group is going to sleep, such as + * GO_TO_SLEEP_REASON_POWER_BUTTON or GO_TO_SLEEP_REASON_TIMEOUT. */ - public void startedGoingToSleep(@PowerManager.GoToSleepReason int pmSleepReason); + void startedGoingToSleep(int displayGroupId, @PowerManager.GoToSleepReason int pmSleepReason); /** * Called when the device has finished going to sleep. * + * @param displayGroupId The id of the display group that has finished going to sleep. This + * will often be {@link Display#DEFAULT_DISPLAY_GROUP}, but it is + * possible for other display groups to exist, for example when there is a + * {@link VirtualDevice} with one or more {@link VirtualDisplay}s. * @param pmSleepReason One of PowerManager.GO_TO_SLEEP_REASON_*, detailing the specific reason - * we're going to sleep, such as GO_TO_SLEEP_REASON_POWER_BUTTON or GO_TO_SLEEP_REASON_TIMEOUT. + * we're going to sleep, such as GO_TO_SLEEP_REASON_POWER_BUTTON or + * GO_TO_SLEEP_REASON_TIMEOUT. */ - public void finishedGoingToSleep(@PowerManager.GoToSleepReason int pmSleepReason); - - /** - * Called when a particular PowerGroup has changed wakefulness. - * - * @param groupId The id of the PowerGroup. - * @param wakefulness One of PowerManagerInternal.WAKEFULNESS_* indicating the wake state for - * the group - * @param pmSleepReason One of PowerManager.GO_TO_SLEEP_REASON_*, detailing the reason this - * group is going to sleep. - * @param globalWakefulness The global wakefulness, which may or may not match that of this - * group. One of PowerManagerInternal.WAKEFULNESS_* - */ - void onPowerGroupWakefulnessChanged(int groupId, int wakefulness, - @PowerManager.GoToSleepReason int pmSleepReason, int globalWakefulness); + void finishedGoingToSleep(int displayGroupId, @PowerManager.GoToSleepReason int pmSleepReason); /** * Called when the display is about to turn on to show content. diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java index d0ed9bfbb285..9bc0ee224ce0 100644 --- a/services/core/java/com/android/server/power/Notifier.java +++ b/services/core/java/com/android/server/power/Notifier.java @@ -51,6 +51,7 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.util.EventLog; import android.util.Slog; +import android.util.SparseArray; import android.view.WindowManagerPolicyConstants; import com.android.internal.annotations.VisibleForTesting; @@ -87,7 +88,7 @@ import java.util.concurrent.atomic.AtomicBoolean; * tell the system when we go to sleep so that it can lock the keyguard if needed. * </p> */ -@VisibleForTesting +@VisibleForTesting(visibility = VisibleForTesting.Visibility.PROTECTED) public class Notifier { private static final String TAG = "PowerManagerNotifier"; @@ -150,14 +151,21 @@ public class Notifier { // begins charging wirelessly private final boolean mShowWirelessChargingAnimationConfig; - // The current interactive state. This is set as soon as an interactive state + // Encapsulates interactivity information about a particular display group. + private static class Interactivity { + public boolean isInteractive = true; + public int changeReason; + public long changeStartTime; // In SystemClock.uptimeMillis() + public boolean isChanging; + } + + private final SparseArray<Interactivity> mInteractivityByGroupId = new SparseArray<>(); + + // The current global interactive state. This is set as soon as an interactive state // transition begins so as to capture the reason that it happened. At some point // this state will propagate to the pending state then eventually to the // broadcasted state over the course of reporting the transition asynchronously. - private boolean mInteractive = true; - private int mInteractiveChangeReason; - private long mInteractiveChangeStartTime; // In SystemClock.uptimeMillis() - private boolean mInteractiveChanging; + private Interactivity mGlobalInteractivity = new Interactivity(); // The pending interactive state that we will eventually want to broadcast. // This is designed so that we can collapse redundant sequences of awake/sleep @@ -438,7 +446,8 @@ public class Notifier { * which case it will assume that the state did not fully converge before the * next transition began and will recover accordingly. */ - public void onWakefulnessChangeStarted(final int wakefulness, int reason, long eventTime) { + public void onGlobalWakefulnessChangeStarted(final int wakefulness, int reason, + long eventTime) { final boolean interactive = PowerManagerInternal.isInteractive(wakefulness); if (DEBUG) { Slog.d(TAG, "onWakefulnessChangeStarted: wakefulness=" + wakefulness @@ -456,10 +465,10 @@ public class Notifier { // Handle any early interactive state changes. // Finish pending incomplete ones from a previous cycle. - if (mInteractive != interactive) { + if (mGlobalInteractivity.isInteractive != interactive) { // Finish up late behaviors if needed. - if (mInteractiveChanging) { - handleLateInteractiveChange(); + if (mGlobalInteractivity.isChanging) { + handleLateGlobalInteractiveChange(); } // Start input as soon as we start waking up or going to sleep. @@ -475,11 +484,11 @@ public class Notifier { FrameworkStatsLog.INTERACTIVE_STATE_CHANGED__STATE__OFF); // Handle early behaviors. - mInteractive = interactive; - mInteractiveChangeReason = reason; - mInteractiveChangeStartTime = eventTime; - mInteractiveChanging = true; - handleEarlyInteractiveChange(); + mGlobalInteractivity.isInteractive = interactive; + mGlobalInteractivity.isChanging = true; + mGlobalInteractivity.changeReason = reason; + mGlobalInteractivity.changeStartTime = eventTime; + handleEarlyGlobalInteractiveChange(); } } @@ -490,10 +499,34 @@ public class Notifier { if (DEBUG) { Slog.d(TAG, "onWakefulnessChangeFinished"); } + for (int i = 0; i < mInteractivityByGroupId.size(); i++) { + int groupId = mInteractivityByGroupId.keyAt(i); + Interactivity interactivity = mInteractivityByGroupId.valueAt(i); + if (interactivity.isChanging) { + interactivity.isChanging = false; + handleLateInteractiveChange(groupId); + } + } + if (mGlobalInteractivity.isChanging) { + mGlobalInteractivity.isChanging = false; + handleLateGlobalInteractiveChange(); + } + } + - if (mInteractiveChanging) { - mInteractiveChanging = false; - handleLateInteractiveChange(); + private void handleEarlyInteractiveChange(int groupId) { + synchronized (mLock) { + Interactivity interactivity = mInteractivityByGroupId.get(groupId); + if (interactivity == null) { + Slog.e(TAG, "no Interactivity entry for groupId:" + groupId); + return; + } + final int changeReason = interactivity.changeReason; + if (interactivity.isInteractive) { + mHandler.post(() -> mPolicy.startedWakingUp(groupId, changeReason)); + } else { + mHandler.post(() -> mPolicy.startedGoingToSleep(groupId, changeReason)); + } } } @@ -501,13 +534,13 @@ public class Notifier { * Handle early interactive state changes such as getting applications or the lock * screen running and ready for the user to see (such as when turning on the screen). */ - private void handleEarlyInteractiveChange() { + private void handleEarlyGlobalInteractiveChange() { synchronized (mLock) { - if (mInteractive) { + if (mGlobalInteractivity.isInteractive) { // Waking up... mHandler.post(() -> { - mPolicy.startedWakingUp(mInteractiveChangeReason); mDisplayManagerInternal.onEarlyInteractivityChange(true /*isInteractive*/); + mPolicy.startedWakingUpGlobal(mGlobalInteractivity.changeReason); }); // Send interactive broadcast. @@ -516,37 +549,36 @@ public class Notifier { updatePendingBroadcastLocked(); } else { // Going to sleep... - // Tell the policy that we started going to sleep. mHandler.post(() -> { - mPolicy.startedGoingToSleep(mInteractiveChangeReason); mDisplayManagerInternal.onEarlyInteractivityChange(false /*isInteractive*/); + mPolicy.startedGoingToSleepGlobal(mGlobalInteractivity.changeReason); }); } } } /** - * Handle late interactive state changes once they are finished so that the system can - * finish pending transitions (such as turning the screen off) before causing - * applications to change state visibly. + * Handle late global interactive state changes. Also see + * {@link #handleLateInteractiveChange(int)}. */ - private void handleLateInteractiveChange() { + private void handleLateGlobalInteractiveChange() { synchronized (mLock) { final int interactiveChangeLatency = - (int) (SystemClock.uptimeMillis() - mInteractiveChangeStartTime); - if (mInteractive) { + (int) (SystemClock.uptimeMillis() - mGlobalInteractivity.changeStartTime); + if (mGlobalInteractivity.isInteractive) { // Finished waking up... mHandler.post(() -> { LogMaker log = new LogMaker(MetricsEvent.SCREEN); log.setType(MetricsEvent.TYPE_OPEN); log.setSubtype(WindowManagerPolicyConstants.translateWakeReasonToOnReason( - mInteractiveChangeReason)); + mGlobalInteractivity.changeReason)); log.setLatency(interactiveChangeLatency); - log.addTaggedData( - MetricsEvent.FIELD_SCREEN_WAKE_REASON, mInteractiveChangeReason); + log.addTaggedData(MetricsEvent.FIELD_SCREEN_WAKE_REASON, + mGlobalInteractivity.changeReason); MetricsLogger.action(log); EventLogTags.writePowerScreenState(1, 0, 0, 0, interactiveChangeLatency); - mPolicy.finishedWakingUp(mInteractiveChangeReason); + + mPolicy.finishedWakingUpGlobal(mGlobalInteractivity.changeReason); }); } else { // Finished going to sleep... @@ -563,18 +595,19 @@ public class Notifier { // Tell the policy we finished going to sleep. final int offReason = WindowManagerPolicyConstants.translateSleepReasonToOffReason( - mInteractiveChangeReason); + mGlobalInteractivity.changeReason); mHandler.post(() -> { LogMaker log = new LogMaker(MetricsEvent.SCREEN); log.setType(MetricsEvent.TYPE_CLOSE); log.setSubtype(offReason); log.setLatency(interactiveChangeLatency); - log.addTaggedData( - MetricsEvent.FIELD_SCREEN_SLEEP_REASON, mInteractiveChangeReason); + log.addTaggedData(MetricsEvent.FIELD_SCREEN_SLEEP_REASON, + mGlobalInteractivity.changeReason); MetricsLogger.action(log); EventLogTags.writePowerScreenState( 0, offReason, 0, 0, interactiveChangeLatency); - mPolicy.finishedGoingToSleep(mInteractiveChangeReason); + + mPolicy.finishedGoingToSleepGlobal(mGlobalInteractivity.changeReason); }); // Send non-interactive broadcast. @@ -586,12 +619,62 @@ public class Notifier { } /** + * Handle late interactive state changes once they are finished so that the system can + * finish pending transitions (such as turning the screen off) before causing + * applications to change state visibly. + */ + private void handleLateInteractiveChange(int groupId) { + synchronized (mLock) { + Interactivity interactivity = mInteractivityByGroupId.get(groupId); + if (interactivity == null) { + Slog.e(TAG, "no Interactivity entry for groupId:" + groupId); + return; + } + final int changeReason = interactivity.changeReason; + if (interactivity.isInteractive) { + mHandler.post(() -> mPolicy.finishedWakingUp(groupId, changeReason)); + } else { + mHandler.post(() -> mPolicy.finishedGoingToSleep(groupId, changeReason)); + } + } + } + + /** * Called when an individual PowerGroup changes wakefulness. */ - public void onPowerGroupWakefulnessChanged(int groupId, int groupWakefulness, int changeReason, - int globalWakefulness) { - mHandler.post(() -> mPolicy.onPowerGroupWakefulnessChanged(groupId, groupWakefulness, - changeReason, globalWakefulness)); + public void onGroupWakefulnessChangeStarted(int groupId, int wakefulness, int changeReason, + long eventTime) { + final boolean isInteractive = PowerManagerInternal.isInteractive(wakefulness); + + boolean isNewGroup = false; + Interactivity interactivity = mInteractivityByGroupId.get(groupId); + if (interactivity == null) { + isNewGroup = true; + interactivity = new Interactivity(); + mInteractivityByGroupId.put(groupId, interactivity); + } + if (isNewGroup || interactivity.isInteractive != isInteractive) { + // Finish up late behaviors if needed. + if (interactivity.isChanging) { + handleLateInteractiveChange(groupId); + } + + // Handle early behaviors. + interactivity.isInteractive = isInteractive; + interactivity.changeReason = changeReason; + interactivity.changeStartTime = eventTime; + interactivity.isChanging = true; + handleEarlyInteractiveChange(groupId); + } + } + + /** + * Called when a PowerGroup has been removed. + * + * @param groupId which group was removed + */ + public void onGroupRemoved(int groupId) { + mInteractivityByGroupId.remove(groupId); } /** diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index e392c24026a7..9ff98be6f5cd 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -686,6 +686,8 @@ public final class PowerManagerService extends SystemService @Override public void onWakefulnessChangedLocked(int groupId, int wakefulness, long eventTime, int reason, int uid, int opUid, String opPackageName, String details) { + mWakefulnessChanging = true; + mDirty |= DIRTY_WAKEFULNESS; if (wakefulness == WAKEFULNESS_AWAKE) { // Kick user activity to prevent newly awake group from timing out instantly. // The dream may end without user activity if the dream app crashes / is updated, @@ -696,9 +698,8 @@ public final class PowerManagerService extends SystemService PowerManager.USER_ACTIVITY_EVENT_OTHER, flags, uid); } mDirty |= DIRTY_DISPLAY_GROUP_WAKEFULNESS; + mNotifier.onGroupWakefulnessChangeStarted(groupId, wakefulness, reason, eventTime); updateGlobalWakefulnessLocked(eventTime, reason, uid, opUid, opPackageName, details); - mNotifier.onPowerGroupWakefulnessChanged(groupId, wakefulness, reason, - getGlobalWakefulnessLocked()); updatePowerStateLocked(); } } @@ -2152,7 +2153,7 @@ public final class PowerManagerService extends SystemService mDozeStartInProgress &= (newWakefulness == WAKEFULNESS_DOZING); if (mNotifier != null) { - mNotifier.onWakefulnessChangeStarted(newWakefulness, reason, eventTime); + mNotifier.onGlobalWakefulnessChangeStarted(newWakefulness, reason, eventTime); } mAttentionDetector.onWakefulnessChangeStarted(newWakefulness); @@ -2163,15 +2164,6 @@ public final class PowerManagerService extends SystemService if (sQuiescent) { mDirty |= DIRTY_QUIESCENT; } - PowerGroup defaultGroup = mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP); - if (defaultGroup.getWakefulnessLocked() == WAKEFULNESS_DOZING) { - // Workaround for b/187231320 where the AOD can get stuck in a "half on / - // half off" state when a non-default-group VirtualDisplay causes the global - // wakefulness to change to awake, even though the default display is - // dozing. We set sandman summoned to restart dreaming to get it unstuck. - // TODO(b/255688811) - fix this so that AOD never gets interrupted at all. - defaultGroup.setSandmanSummonedLocked(true); - } break; case WAKEFULNESS_ASLEEP: @@ -2248,6 +2240,8 @@ public final class PowerManagerService extends SystemService @GuardedBy("mLock") void onPowerGroupEventLocked(int event, PowerGroup powerGroup) { + mWakefulnessChanging = true; + mDirty |= DIRTY_WAKEFULNESS; final int groupId = powerGroup.getGroupId(); if (event == DisplayGroupPowerChangeListener.DISPLAY_GROUP_REMOVED) { mPowerGroups.delete(groupId); @@ -2260,6 +2254,11 @@ public final class PowerManagerService extends SystemService // Kick user activity to prevent newly added group from timing out instantly. userActivityNoUpdateLocked(powerGroup, mClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_OTHER, /* flags= */ 0, Process.SYSTEM_UID); + mNotifier.onGroupWakefulnessChangeStarted(groupId, + powerGroup.getWakefulnessLocked(), WAKE_REASON_DISPLAY_GROUP_ADDED, + mClock.uptimeMillis()); + } else if (event == DisplayGroupPowerChangeListener.DISPLAY_GROUP_REMOVED) { + mNotifier.onGroupRemoved(groupId); } if (oldWakefulness != newWakefulness) { diff --git a/services/core/java/com/android/server/tv/TvInputHal.java b/services/core/java/com/android/server/tv/TvInputHal.java index b6ab35169fc4..4bbca335b8e3 100644 --- a/services/core/java/com/android/server/tv/TvInputHal.java +++ b/services/core/java/com/android/server/tv/TvInputHal.java @@ -27,9 +27,6 @@ import android.util.SparseArray; import android.util.SparseIntArray; import android.view.Surface; -import java.util.LinkedList; -import java.util.Queue; - /** * Provides access to the low-level TV input hardware abstraction layer. */ @@ -64,6 +61,8 @@ final class TvInputHal implements Handler.Callback { private static native TvStreamConfig[] nativeGetStreamConfigs(long ptr, int deviceId, int generation); private static native void nativeClose(long ptr); + private static native int nativeSetTvMessageEnabled(long ptr, int deviceId, int streamId, + int type, boolean enabled); private final Object mLock = new Object(); private long mPtr = 0; @@ -100,6 +99,25 @@ final class TvInputHal implements Handler.Callback { } } + public int setTvMessageEnabled(int deviceId, TvStreamConfig streamConfig, int type, + boolean enabled) { + synchronized (mLock) { + if (mPtr == 0) { + return ERROR_NO_INIT; + } + int generation = mStreamConfigGenerations.get(deviceId, 0); + if (generation != streamConfig.getGeneration()) { + return ERROR_STALE_CONFIG; + } + if (nativeSetTvMessageEnabled(mPtr, deviceId, streamConfig.getStreamId(), type, + enabled) == 0) { + return SUCCESS; + } else { + return ERROR_UNKNOWN; + } + } + } + public int removeStream(int deviceId, TvStreamConfig streamConfig) { synchronized (mLock) { if (mPtr == 0) { diff --git a/services/core/java/com/android/server/tv/TvInputHardwareManager.java b/services/core/java/com/android/server/tv/TvInputHardwareManager.java index 98dfb009e4ef..077f8d527ab5 100755 --- a/services/core/java/com/android/server/tv/TvInputHardwareManager.java +++ b/services/core/java/com/android/server/tv/TvInputHardwareManager.java @@ -459,9 +459,11 @@ class TvInputHardwareManager implements TvInputHal.Callback { private int findDeviceIdForInputIdLocked(String inputId) { for (int i = 0; i < mConnections.size(); ++i) { - Connection connection = mConnections.get(i); - if (connection.getInfoLocked().getId().equals(inputId)) { - return i; + int key = mConnections.keyAt(i); + Connection connection = mConnections.get(key); + if (connection != null && connection.getInfoLocked() != null + && connection.getInfoLocked().getId().equals(inputId)) { + return key; } } return -1; @@ -489,6 +491,27 @@ class TvInputHardwareManager implements TvInputHal.Callback { return configsList; } + public boolean setTvMessageEnabled(String inputId, int type, + boolean enabled) { + synchronized (mLock) { + int deviceId = findDeviceIdForInputIdLocked(inputId); + if (deviceId < 0) { + Slog.e(TAG, "Invalid inputId : " + inputId); + return false; + } + + Connection connection = mConnections.get(deviceId); + boolean success = true; + for (TvStreamConfig config : connection.getConfigsLocked()) { + success = success + && mHal.setTvMessageEnabled(deviceId, config, type, enabled) + == TvInputHal.SUCCESS; + } + + return success; + } + } + /** * Take a snapshot of the given TV input into the provided Surface. */ @@ -764,6 +787,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { + " mHardwareInfo: " + mHardwareInfo + ", mInfo: " + mInfo + ", mCallback: " + mCallback + + ", mHardware: " + mHardware + ", mConfigs: " + Arrays.toString(mConfigs) + ", mCallingUid: " + mCallingUid + ", mResolvedUserId: " + mResolvedUserId diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index fd203bbfe3b5..88c9042c963e 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -2154,6 +2154,9 @@ public final class TvInputManagerService extends SystemService { try { synchronized (mLock) { try { + final String inputId = + getSessionStateLocked(sessionToken, callingUid, userId).inputId; + mTvInputHardwareManager.setTvMessageEnabled(inputId, type, enabled); getSessionLocked(sessionToken, callingUid, resolvedUserId) .setTvMessageEnabled(type, enabled); } catch (RemoteException | SessionNotFoundException e) { @@ -2711,7 +2714,10 @@ public final class TvInputManagerService extends SystemService { .audioAddress("0") .hdmiPortId(0) .build(); - mTvInputHardwareManager.onDeviceAvailable(info, null); + TvStreamConfig[] configs = { + new TvStreamConfig.Builder().streamId(19001) + .generation(1).maxHeight(600).maxWidth(800).type(1).build()}; + mTvInputHardwareManager.onDeviceAvailable(info, configs); } /** diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 510e6756b8ef..a5cdd0b43eb0 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -3594,8 +3594,11 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< && !mTransitionController.useShellTransitionsRotation()) { if (deltaRotation != Surface.ROTATION_0) { updateSurfaceRotation(t, deltaRotation, null /* positionLeash */); + t.setFixedTransformHint(mSurfaceControl, + getWindowConfiguration().getDisplayRotation()); } else if (deltaRotation != mLastDeltaRotation) { t.setMatrix(mSurfaceControl, 1, 0, 0, 1); + t.unsetFixedTransformHint(mSurfaceControl); } } mLastDeltaRotation = deltaRotation; diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 6f07b7719be0..032f08a92abb 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1980,19 +1980,16 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP /** * Like isOnScreen(), but we don't return true if the window is part - * of a transition but has not yet started animating. + * of a transition that has not yet been started. */ boolean isReadyForDisplay() { - if (!mHasSurface || mDestroying || !isVisibleByPolicy()) { - return false; - } - if (mToken.waitingToShow && getDisplayContent().mAppTransition.isTransitionSet() - && !isAnimating(TRANSITION | PARENTS, ANIMATION_TYPE_APP_TRANSITION)) { + if (mToken.waitingToShow && getDisplayContent().mAppTransition.isTransitionSet()) { return false; } final boolean parentAndClientVisible = !isParentWindowHidden() && mViewVisibility == View.VISIBLE && mToken.isVisible(); - return parentAndClientVisible || isAnimating(TRANSITION | PARENTS, ANIMATION_TYPE_ALL); + return mHasSurface && isVisibleByPolicy() && !mDestroying + && (parentAndClientVisible || isAnimating(TRANSITION | PARENTS)); } boolean isFullyTransparent() { diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java index da54b15fd0a4..4c5efef795d8 100644 --- a/services/core/java/com/android/server/wm/WindowToken.java +++ b/services/core/java/com/android/server/wm/WindowToken.java @@ -596,6 +596,7 @@ class WindowToken extends WindowContainer<WindowState> { .build(); t.setPosition(leash, mLastSurfacePosition.x, mLastSurfacePosition.y); t.reparent(getSurfaceControl(), leash); + t.setFixedTransformHint(leash, getWindowConfiguration().getDisplayRotation()); mFixedRotationTransformLeash = leash; updateSurfaceRotation(t, rotation, mFixedRotationTransformLeash); return mFixedRotationTransformLeash; diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index cf57b339cc22..369c97470245 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -2567,6 +2567,11 @@ static void nativeSetStylusPointerIconEnabled(JNIEnv* env, jobject nativeImplObj im->setStylusPointerIconEnabled(enabled); } +static void nativeNotifyKeyGestureTimeoutsChanged(JNIEnv* env, jobject nativeImplObj) { + NativeInputManager* im = getNativeInputManager(env, nativeImplObj); + im->getInputManager()->getDispatcher().requestRefreshConfiguration(); +} + // ---------------------------------------------------------------------------- static const JNINativeMethod gInputManagerMethods[] = { @@ -2663,6 +2668,7 @@ static const JNINativeMethod gInputManagerMethods[] = { (void*)nativeSetStylusButtonMotionEventsEnabled}, {"getMouseCursorPosition", "()[F", (void*)nativeGetMouseCursorPosition}, {"setStylusPointerIconEnabled", "(Z)V", (void*)nativeSetStylusPointerIconEnabled}, + {"notifyKeyGestureTimeoutsChanged", "()V", (void*)nativeNotifyKeyGestureTimeoutsChanged}, }; #define FIND_CLASS(var, className) \ diff --git a/services/core/jni/com_android_server_tv_TvInputHal.cpp b/services/core/jni/com_android_server_tv_TvInputHal.cpp index a8d2f4e9be5b..a8806b5ef643 100644 --- a/services/core/jni/com_android_server_tv_TvInputHal.cpp +++ b/services/core/jni/com_android_server_tv_TvInputHal.cpp @@ -84,23 +84,26 @@ static jobjectArray nativeGetStreamConfigs(JNIEnv* env, jclass clazz, return result; } +static int nativeSetTvMessageEnabled(JNIEnv* env, jclass clazz, jlong ptr, jint deviceId, + jint streamId, jint type, jboolean enabled) { + JTvInputHal* tvInputHal = (JTvInputHal*)ptr; + return tvInputHal->setTvMessageEnabled(deviceId, streamId, type, enabled); +} + static void nativeClose(JNIEnv* env, jclass clazz, jlong ptr) { JTvInputHal* tvInputHal = (JTvInputHal*)ptr; delete tvInputHal; } static const JNINativeMethod gTvInputHalMethods[] = { - /* name, signature, funcPtr */ - { "nativeOpen", "(Landroid/os/MessageQueue;)J", - (void*) nativeOpen }, - { "nativeAddOrUpdateStream", "(JIILandroid/view/Surface;)I", - (void*) nativeAddOrUpdateStream }, - { "nativeRemoveStream", "(JII)I", - (void*) nativeRemoveStream }, - { "nativeGetStreamConfigs", "(JII)[Landroid/media/tv/TvStreamConfig;", - (void*) nativeGetStreamConfigs }, - { "nativeClose", "(J)V", - (void*) nativeClose }, + /* name, signature, funcPtr */ + {"nativeOpen", "(Landroid/os/MessageQueue;)J", (void*)nativeOpen}, + {"nativeAddOrUpdateStream", "(JIILandroid/view/Surface;)I", (void*)nativeAddOrUpdateStream}, + {"nativeRemoveStream", "(JII)I", (void*)nativeRemoveStream}, + {"nativeGetStreamConfigs", "(JII)[Landroid/media/tv/TvStreamConfig;", + (void*)nativeGetStreamConfigs}, + {"nativeSetTvMessageEnabled", "(JIIIZ)I", (void*)nativeSetTvMessageEnabled}, + {"nativeClose", "(J)V", (void*)nativeClose}, }; #define FIND_CLASS(var, className) \ diff --git a/services/core/jni/tvinput/JTvInputHal.cpp b/services/core/jni/tvinput/JTvInputHal.cpp index 98e6b19ce410..6bb52174fcb2 100644 --- a/services/core/jni/tvinput/JTvInputHal.cpp +++ b/services/core/jni/tvinput/JTvInputHal.cpp @@ -144,6 +144,17 @@ int JTvInputHal::removeStream(int deviceId, int streamId) { return NO_ERROR; } +int JTvInputHal::setTvMessageEnabled(int deviceId, int streamId, int type, bool enabled) { + Mutex::Autolock autoLock(&mLock); + if (!mTvInput->setTvMessageEnabled(deviceId, streamId, + static_cast<AidlTvMessageEventType>(type), enabled) + .isOk()) { + ALOGE("Error in setTvMessageEnabled. device id:%d stream id:%d", deviceId, streamId); + return BAD_VALUE; + } + return NO_ERROR; +} + const std::vector<AidlTvStreamConfig> JTvInputHal::getStreamConfigs(int deviceId) { std::vector<AidlTvStreamConfig> list; ::ndk::ScopedAStatus status = mTvInput->getStreamConfigurations(deviceId, &list); @@ -384,4 +395,15 @@ JTvInputHal::ITvInputWrapper::ITvInputWrapper(std::shared_ptr<AidlITvInput>& aid } } +::ndk::ScopedAStatus JTvInputHal::ITvInputWrapper::setTvMessageEnabled(int32_t deviceId, + int32_t streamId, + TvMessageEventType in_type, + bool enabled) { + if (mIsHidl) { + return ::ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); + } else { + return mAidlTvInput->setTvMessageEnabled(deviceId, streamId, in_type, enabled); + } +} + } // namespace android diff --git a/services/core/jni/tvinput/JTvInputHal.h b/services/core/jni/tvinput/JTvInputHal.h index 984407a0c37c..e29da79d62dd 100644 --- a/services/core/jni/tvinput/JTvInputHal.h +++ b/services/core/jni/tvinput/JTvInputHal.h @@ -44,6 +44,8 @@ using ::aidl::android::hardware::tv::input::BnTvInputCallback; using ::aidl::android::hardware::tv::input::CableConnectionStatus; using ::aidl::android::hardware::tv::input::TvInputEventType; using ::aidl::android::hardware::tv::input::TvInputType; +using ::aidl::android::hardware::tv::input::TvMessageEvent; +using ::aidl::android::hardware::tv::input::TvMessageEventType; using AidlAudioDevice = ::aidl::android::media::audio::common::AudioDevice; using AidlAudioDeviceAddress = ::aidl::android::media::audio::common::AudioDeviceAddress; @@ -53,6 +55,7 @@ using AidlNativeHandle = ::aidl::android::hardware::common::NativeHandle; using AidlTvInputDeviceInfo = ::aidl::android::hardware::tv::input::TvInputDeviceInfo; using AidlTvInputEvent = ::aidl::android::hardware::tv::input::TvInputEvent; using AidlTvMessageEvent = ::aidl::android::hardware::tv::input::TvMessageEvent; +using AidlTvMessageEventType = ::aidl::android::hardware::tv::input::TvMessageEventType; using AidlTvStreamConfig = ::aidl::android::hardware::tv::input::TvStreamConfig; extern gTvInputHalClassInfoType gTvInputHalClassInfo; @@ -69,6 +72,7 @@ public: static JTvInputHal* createInstance(JNIEnv* env, jobject thiz, const sp<Looper>& looper); int addOrUpdateStream(int deviceId, int streamId, const sp<Surface>& surface); + int setTvMessageEnabled(int deviceId, int streamId, int type, bool enabled); int removeStream(int deviceId, int streamId); const std::vector<AidlTvStreamConfig> getStreamConfigs(int deviceId); @@ -150,6 +154,8 @@ private: ::ndk::ScopedAStatus openStream(int32_t in_deviceId, int32_t in_streamId, AidlNativeHandle* _aidl_return); ::ndk::ScopedAStatus closeStream(int32_t in_deviceId, int32_t in_streamId); + ::ndk::ScopedAStatus setTvMessageEnabled(int32_t deviceId, int32_t streamId, + TvMessageEventType in_type, bool enabled); private: ::ndk::ScopedAStatus hidlSetCallback(const std::shared_ptr<TvInputCallback>& in_callback); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index a35f34dcde86..231fee358a2f 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -39,7 +39,6 @@ import static android.Manifest.permission.MANAGE_DEVICE_POLICY_DEFAULT_SMS; import static android.Manifest.permission.MANAGE_DEVICE_POLICY_DISPLAY; import static android.Manifest.permission.MANAGE_DEVICE_POLICY_FACTORY_RESET; import static android.Manifest.permission.MANAGE_DEVICE_POLICY_FUN; -import static android.Manifest.permission.MANAGE_DEVICE_POLICY_INPUT_METHODS; import static android.Manifest.permission.MANAGE_DEVICE_POLICY_INSTALL_UNKNOWN_SOURCES; import static android.Manifest.permission.MANAGE_DEVICE_POLICY_KEYGUARD; import static android.Manifest.permission.MANAGE_DEVICE_POLICY_LOCALE; @@ -521,6 +520,7 @@ import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.text.DateFormat; import java.time.LocalDate; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -533,6 +533,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.Queue; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -568,7 +569,15 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { private static final int REQUEST_PROFILE_OFF_DEADLINE = 5572; + // Binary XML serializer doesn't support longer strings + private static final int MAX_POLICY_STRING_LENGTH = 65535; + // FrameworkParsingPackageUtils#MAX_FILE_NAME_SIZE, Android packages are used in dir names. + private static final int MAX_PACKAGE_NAME_LENGTH = 223; + private static final int MAX_PROFILE_NAME_LENGTH = 200; + private static final int MAX_LONG_SUPPORT_MESSAGE_LENGTH = 20000; + private static final int MAX_SHORT_SUPPORT_MESSAGE_LENGTH = 200; + private static final int MAX_ORG_NAME_LENGTH = 200; private static final long MS_PER_DAY = TimeUnit.DAYS.toMillis(1); @@ -6041,7 +6050,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { @Override public void lockNow(int flags, String callerPackageName, boolean parent) { CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(callerPackageName); } else { caller = getCallerIdentity(); @@ -6053,7 +6062,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { ActiveAdmin admin; // Make sure the caller has any active admin with the right policy or // the required permission. - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { admin = enforcePermissionAndGetEnforcingAdmin( /* admin= */ null, /* permission= */ MANAGE_DEVICE_POLICY_LOCK, @@ -8907,13 +8916,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); } else { caller = getCallerIdentity(who); } - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { // The effect of this policy is device-wide. enforcePermission(SET_TIME, caller.getPackageName(), UserHandle.USER_ALL); } else { @@ -8941,13 +8950,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return false; } CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); } else { caller = getCallerIdentity(who); } - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { enforceCanQuery(SET_TIME, caller.getPackageName(), UserHandle.USER_ALL); } else { Objects.requireNonNull(who, "ComponentName is null"); @@ -8976,7 +8985,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { caller = getCallerIdentity(who); } - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { // The effect of this policy is device-wide. EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( who, @@ -9016,13 +9025,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); } else { caller = getCallerIdentity(who); } - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { // The effect of this policy is device-wide. enforceCanQuery(SET_TIME_ZONE, caller.getPackageName(), UserHandle.USER_ALL); } else { @@ -9325,7 +9334,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); } else { caller = getCallerIdentity(who); @@ -9335,7 +9344,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final int userHandle = caller.getUserId(); int affectedUserId = parent ? getProfileParentId(userHandle) : userHandle; synchronized (getLockObject()) { - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { // SUPPORT USES_POLICY_DISABLE_KEYGUARD_FEATURES EnforcingAdmin admin = enforcePermissionAndGetEnforcingAdmin( who, MANAGE_DEVICE_POLICY_KEYGUARD, caller.getPackageName(), @@ -9414,7 +9423,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { synchronized (getLockObject()) { if (who != null) { - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { EnforcingAdmin admin = getEnforcingAdminForCaller( who, who.getPackageName()); Integer features = mDevicePolicyEngine.getLocalPolicySetByAdmin( @@ -9428,7 +9437,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { Integer features = mDevicePolicyEngine.getResolvedPolicy( PolicyDefinition.KEYGUARD_DISABLED_FEATURES, affectedUserId); @@ -11625,7 +11634,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final CallerIdentity caller = getCallerIdentity(who, callerPackage); checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_SET_APPLICATION_RESTRICTIONS); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( who, MANAGE_DEVICE_POLICY_APP_RESTRICTIONS, @@ -11730,7 +11739,15 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } Objects.requireNonNull(agent, "agent is null"); - int userHandle = UserHandle.getCallingUserId(); + + enforceMaxPackageNameLength(agent.getPackageName()); + final String agentAsString = agent.flattenToString(); + enforceMaxStringLength(agentAsString, "agent name"); + if (args != null) { + enforceMaxStringLength(args, "args"); + } + + int userHandle = mInjector.userHandleGetCallingUserId(); synchronized (getLockObject()) { ActiveAdmin ap; if (isPermissionCheckFlagEnabled()) { @@ -11747,7 +11764,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { checkCanExecuteOrThrowUnsafe( DevicePolicyManager.OPERATION_SET_TRUST_AGENT_CONFIGURATION); - ap.trustAgentInfos.put(agent.flattenToString(), new TrustAgentInfo(args)); + ap.trustAgentInfos.put(agentAsString, new TrustAgentInfo(args)); saveSettingsLocked(userHandle); } } @@ -12017,6 +12034,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { isDeviceOwner(caller) || isProfileOwner(caller)); if (packageList != null) { + for (String pkg : packageList) { + enforceMaxPackageNameLength(pkg); + } + int userId = caller.getUserId(); final List<AccessibilityServiceInfo> enabledServices; long id = mInjector.binderClearCallingIdentity(); @@ -12198,6 +12219,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } if (packageList != null) { + for (String pkg : packageList) { + enforceMaxPackageNameLength(pkg); + } + List<InputMethodInfo> enabledImes = mInjector.binderWithCleanCallingIdentity(() -> InputMethodManagerInternal.get().getEnabledInputMethodListAsUser(userId)); if (enabledImes != null) { @@ -13034,7 +13059,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { String packageName) { final CallerIdentity caller = getCallerIdentity(who, callerPackage); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { EnforcingAdmin enforcingAdmin = enforceCanQueryAndGetEnforcingAdmin( who, MANAGE_DEVICE_POLICY_APP_RESTRICTIONS, @@ -13104,7 +13129,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final CallerIdentity caller = getCallerIdentity(who, callerPackage); ActiveAdmin admin; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( who, MANAGE_DEVICE_POLICY_PACKAGE_STATE, @@ -13201,7 +13226,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { public boolean isPackageSuspended(ComponentName who, String callerPackage, String packageName) { final CallerIdentity caller = getCallerIdentity(who, callerPackage); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { enforcePermission( MANAGE_DEVICE_POLICY_PACKAGE_STATE, caller.getPackageName(), @@ -13807,7 +13832,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { boolean hidden, boolean parent) { CallerIdentity caller = getCallerIdentity(who, callerPackage); final int userId = parent ? getProfileParentId(caller.getUserId()) : caller.getUserId(); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { // TODO: We need to ensure the delegate with DELEGATION_PACKAGE_ACCESS can do this enforcePermission(MANAGE_DEVICE_POLICY_PACKAGE_STATE, caller.getPackageName(), userId); } else { @@ -13826,7 +13851,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { boolean result; synchronized (getLockObject()) { if (parent) { - if (!isPolicyEngineForFinanceFlagEnabled()) { + if (!isPermissionCheckFlagEnabled()) { Preconditions.checkCallAuthorization( isProfileOwnerOfOrganizationOwnedDevice( caller.getUserId()) && isManagedProfile(caller.getUserId())); @@ -13843,7 +13868,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { Slogf.v(LOG_TAG, "calling pm.setApplicationHiddenSettingAsUser(%s, %b, %d)", packageName, hidden, userId); } - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { EnforcingAdmin admin = getEnforcingAdminForCaller(who, callerPackage); mDevicePolicyEngine.setLocalPolicy( PolicyDefinition.APPLICATION_HIDDEN(packageName), @@ -13882,7 +13907,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { String packageName, boolean parent) { CallerIdentity caller = getCallerIdentity(who, callerPackage); int userId = parent ? getProfileParentId(caller.getUserId()) : caller.getUserId(); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { // TODO: Also support DELEGATION_PACKAGE_ACCESS enforcePermission(MANAGE_DEVICE_POLICY_PACKAGE_STATE, caller.getPackageName(), userId); } else { @@ -13894,7 +13919,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { synchronized (getLockObject()) { if (parent) { - if (!isPolicyEngineForFinanceFlagEnabled()) { + if (!isPermissionCheckFlagEnabled()) { Preconditions.checkCallAuthorization( isProfileOwnerOfOrganizationOwnedDevice(caller.getUserId()) && isManagedProfile(caller.getUserId())); @@ -14082,14 +14107,17 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return; } + + enforceMaxStringLength(accountType, "account type"); + CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); } else { caller = getCallerIdentity(who); } synchronized (getLockObject()) { - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { int affectedUser = getAffectedUser(parent); EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( who, @@ -14152,7 +14180,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { CallerIdentity caller; Preconditions.checkArgumentNonnegative(userId, "Invalid userId"); final ArraySet<String> resultSet = new ArraySet<>(); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { int affectedUser = parent ? getProfileParentId(userId) : userId; caller = getCallerIdentity(callerPackageName); if (!hasPermission(MANAGE_DEVICE_POLICY_ACCOUNT_MANAGEMENT, @@ -14772,6 +14800,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { public void setLockTaskPackages(ComponentName who, String callerPackageName, String[] packages) throws SecurityException { Objects.requireNonNull(packages, "packages is null"); + for (String pkg : packages) { + enforceMaxPackageNameLength(pkg); + } + CallerIdentity caller; if (isPolicyEngineForFinanceFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); @@ -15519,12 +15551,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { public boolean setStatusBarDisabled(ComponentName who, String callerPackageName, boolean disabled) { CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); } else { caller = getCallerIdentity(who); } - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { enforcePermission(MANAGE_DEVICE_POLICY_STATUS_BAR, caller.getPackageName(), UserHandle.USER_ALL); } else { @@ -15535,7 +15567,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { int userId = caller.getUserId(); synchronized (getLockObject()) { - if (!isPolicyEngineForFinanceFlagEnabled()) { + if (!isPermissionCheckFlagEnabled()) { Preconditions.checkCallAuthorization(isUserAffiliatedWithDeviceLocked(userId), "Admin " + who + " is neither the device owner or affiliated " + "user's profile owner."); @@ -15594,7 +15626,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { @Override public boolean isStatusBarDisabled(String callerPackage) { final CallerIdentity caller = getCallerIdentity(callerPackage); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { enforceCanQuery( MANAGE_DEVICE_POLICY_STATUS_BAR, caller.getPackageName(), caller.getUserId()); } else { @@ -15604,7 +15636,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { int userId = caller.getUserId(); synchronized (getLockObject()) { - if (!isPolicyEngineForFinanceFlagEnabled()) { + if (!isPermissionCheckFlagEnabled()) { Preconditions.checkCallAuthorization(isUserAffiliatedWithDeviceLocked(userId), "Admin " + callerPackage + " is neither the device owner or affiliated user's profile owner."); @@ -16764,7 +16796,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } EnforcingAdmin enforcingAdmin; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( admin, MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS, @@ -16935,7 +16967,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { public int getPermissionGrantState(ComponentName admin, String callerPackage, String packageName, String permission) throws RemoteException { final CallerIdentity caller = getCallerIdentity(admin, callerPackage); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { enforceCanQuery(MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS, caller.getPackageName(), caller.getUserId()); } else { @@ -17374,6 +17406,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { CallerIdentity caller; ActiveAdmin admin; + message = truncateIfLonger(message, MAX_SHORT_SUPPORT_MESSAGE_LENGTH); + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( @@ -17434,6 +17468,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return; } + + message = truncateIfLonger(message, MAX_LONG_SUPPORT_MESSAGE_LENGTH); + Objects.requireNonNull(who, "ComponentName is null"); final CallerIdentity caller = getCallerIdentity(who); synchronized (getLockObject()) { @@ -17598,6 +17635,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { Preconditions.checkCallAuthorization(isDeviceOwner(caller) || isProfileOwner(caller)); } + text = truncateIfLonger(text, MAX_ORG_NAME_LENGTH); + synchronized (getLockObject()) { if (!isPermissionCheckFlagEnabled()) { admin = getProfileOwnerOrDeviceOwnerLocked(caller.getUserId()); @@ -17878,9 +17917,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { throw new IllegalArgumentException("ids must not be null"); } for (String id : ids) { - if (TextUtils.isEmpty(id)) { - throw new IllegalArgumentException("ids must not contain empty string"); - } + Preconditions.checkArgument(!TextUtils.isEmpty(id), "ids must not have empty string"); + enforceMaxStringLength(id, "affiliation id"); } final Set<String> affiliationIds = new ArraySet<>(ids); @@ -19067,14 +19105,14 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { throw new IllegalArgumentException("token must be at least 32-byte long"); } CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(admin, callerPackageName); } else { caller = getCallerIdentity(admin); } final int userId = caller.getUserId(); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( admin, MANAGE_DEVICE_POLICY_RESET_PASSWORD, @@ -19130,7 +19168,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return false; } CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(admin, callerPackageName); } else { caller = getCallerIdentity(admin); @@ -19138,7 +19176,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final int userId = caller.getUserId(); boolean result = false; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( admin, MANAGE_DEVICE_POLICY_RESET_PASSWORD, @@ -19177,14 +19215,14 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return false; } CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(admin, callerPackageName); } else { caller = getCallerIdentity(admin); } int userId = caller.getUserId(); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( admin, MANAGE_DEVICE_POLICY_RESET_PASSWORD, @@ -19393,6 +19431,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { "Provided administrator and target are the same object."); Preconditions.checkArgument(!admin.getPackageName().equals(target.getPackageName()), "Provided administrator and target have the same package name."); + if (bundle != null) { + enforceMaxStringLength(bundle, "bundle"); + } final CallerIdentity caller = getCallerIdentity(admin); Preconditions.checkCallAuthorization( @@ -24137,6 +24178,53 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { }); } + /** + * Truncates char sequence to maximum length, nulls are ignored. + */ + private static CharSequence truncateIfLonger(CharSequence input, int maxLength) { + return input == null || input.length() <= maxLength + ? input + : input.subSequence(0, maxLength); + } + + /** + * Throw if string argument is too long to be serialized. + */ + private static void enforceMaxStringLength(String str, String argName) { + Preconditions.checkArgument( + str.length() <= MAX_POLICY_STRING_LENGTH, argName + " loo long"); + } + + private static void enforceMaxPackageNameLength(String pkg) { + Preconditions.checkArgument( + pkg.length() <= MAX_PACKAGE_NAME_LENGTH, "Package name too long"); + } + + /** + * Throw if persistable bundle contains any string that we can't serialize. + */ + private static void enforceMaxStringLength(PersistableBundle bundle, String argName) { + // Persistable bundles can have other persistable bundles as values, traverse with a queue. + Queue<PersistableBundle> queue = new ArrayDeque<>(); + queue.add(bundle); + while (!queue.isEmpty()) { + PersistableBundle current = queue.remove(); + for (String key : current.keySet()) { + enforceMaxStringLength(key, "key in " + argName); + Object value = current.get(key); + if (value instanceof String) { + enforceMaxStringLength((String) value, "string value in " + argName); + } else if (value instanceof String[]) { + for (String str : (String[]) value) { + enforceMaxStringLength(str, "string value in " + argName); + } + } else if (value instanceof PersistableBundle) { + queue.add((PersistableBundle) value); + } + } + } + } + private ActiveAdmin getActiveAdminForCaller(@Nullable ComponentName who, CallerIdentity caller) { synchronized (getLockObject()) { diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java index c4aa0bbc24b5..8dc0ac6515cd 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java @@ -64,6 +64,7 @@ import com.android.server.ExtendedMockitoRule; import com.android.server.LocalServices; import com.android.server.am.BatteryStatsService; import com.android.server.display.RampAnimator.DualRampAnimator; +import com.android.server.display.brightness.BrightnessEvent; import com.android.server.display.color.ColorDisplayService; import com.android.server.display.layout.Layout; import com.android.server.display.whitebalance.DisplayWhiteBalanceController; @@ -596,17 +597,17 @@ public final class DisplayPowerController2Test { // We should still set screen state for the default display DisplayPowerRequest dpr = new DisplayPowerRequest(); mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); - advanceTime(1); + advanceTime(1); // Run updatePowerState verify(mHolder.displayPowerState, times(2)).setScreenState(anyInt()); mHolder = createDisplayPowerController(42, UNIQUE_ID); mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); - advanceTime(1); + advanceTime(1); // Run updatePowerState verify(mHolder.displayPowerState, never()).setScreenState(anyInt()); mHolder.dpc.onBootCompleted(); - advanceTime(1); + advanceTime(1); // Run updatePowerState verify(mHolder.displayPowerState).setScreenState(anyInt()); } @@ -632,8 +633,8 @@ public final class DisplayPowerController2Test { .thenReturn(brightness); dpr.policy = DisplayPowerRequest.POLICY_BRIGHT; when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_ON); - when(mHolder.automaticBrightnessController.getAutomaticScreenBrightness()) - .thenReturn(PowerManager.BRIGHTNESS_INVALID_FLOAT); + when(mHolder.automaticBrightnessController.getAutomaticScreenBrightness( + any(BrightnessEvent.class))).thenReturn(PowerManager.BRIGHTNESS_INVALID_FLOAT); mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); advanceTime(1); // Run updatePowerState @@ -667,8 +668,8 @@ public final class DisplayPowerController2Test { .thenReturn(brightness); dpr.policy = DisplayPowerRequest.POLICY_BRIGHT; when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_ON); - when(mHolder.automaticBrightnessController.getAutomaticScreenBrightness()) - .thenReturn(PowerManager.BRIGHTNESS_INVALID_FLOAT); + when(mHolder.automaticBrightnessController.getAutomaticScreenBrightness( + any(BrightnessEvent.class))).thenReturn(PowerManager.BRIGHTNESS_INVALID_FLOAT); mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); advanceTime(1); // Run updatePowerState @@ -822,6 +823,21 @@ public final class DisplayPowerController2Test { ); } + @Test + public void testUpdateBrightnessThrottlingDataId() { + mHolder.display.getDisplayInfoLocked().thermalBrightnessThrottlingDataId = + "throttling-data-id"; + clearInvocations(mHolder.display.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig()); + + mHolder.dpc.onDisplayChanged(mHolder.hbmMetadata, Layout.NO_LEAD_DISPLAY); + DisplayPowerRequest dpr = new DisplayPowerRequest(); + mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); + advanceTime(1); // Run updatePowerState + + verify(mHolder.display.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig()) + .getThermalBrightnessThrottlingDataMapByThrottlingId(); + } + /** * Creates a mock and registers it to {@link LocalServices}. */ @@ -862,8 +878,6 @@ public final class DisplayPowerController2Test { when(logicalDisplayMock.getDisplayInfoLocked()).thenReturn(info); when(logicalDisplayMock.isEnabledLocked()).thenReturn(isEnabled); when(logicalDisplayMock.isInTransitionLocked()).thenReturn(false); - when(logicalDisplayMock.getThermalBrightnessThrottlingDataIdLocked()).thenReturn( - DisplayDeviceConfig.DEFAULT_ID); when(displayDeviceMock.getDisplayDeviceInfoLocked()).thenReturn(deviceInfo); when(displayDeviceMock.getUniqueId()).thenReturn(uniqueId); when(displayDeviceMock.getDisplayDeviceConfig()).thenReturn(displayDeviceConfigMock); diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java index 415adbbac91e..5c0810fdca44 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java @@ -829,6 +829,21 @@ public final class DisplayPowerControllerTest { ); } + @Test + public void testUpdateBrightnessThrottlingDataId() { + mHolder.display.getDisplayInfoLocked().thermalBrightnessThrottlingDataId = + "throttling-data-id"; + clearInvocations(mHolder.display.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig()); + + mHolder.dpc.onDisplayChanged(mHolder.hbmMetadata, Layout.NO_LEAD_DISPLAY); + DisplayPowerRequest dpr = new DisplayPowerRequest(); + mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); + advanceTime(1); // Run updatePowerState + + verify(mHolder.display.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig()) + .getThermalBrightnessThrottlingDataMapByThrottlingId(); + } + /** * Creates a mock and registers it to {@link LocalServices}. */ @@ -869,8 +884,6 @@ public final class DisplayPowerControllerTest { when(logicalDisplayMock.getDisplayInfoLocked()).thenReturn(info); when(logicalDisplayMock.isEnabledLocked()).thenReturn(isEnabled); when(logicalDisplayMock.isInTransitionLocked()).thenReturn(false); - when(logicalDisplayMock.getThermalBrightnessThrottlingDataIdLocked()).thenReturn( - DisplayDeviceConfig.DEFAULT_ID); when(displayDeviceMock.getDisplayDeviceInfoLocked()).thenReturn(deviceInfo); when(displayDeviceMock.getUniqueId()).thenReturn(uniqueId); when(displayDeviceMock.getDisplayDeviceConfig()).thenReturn(displayDeviceConfigMock); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java index 8f0d0144a40e..eb6670ee964c 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java @@ -146,7 +146,7 @@ public class AccessibilitySecurityPolicyTest { @Mock private PolicyWarningUIController mPolicyWarningUIController; @Mock - private PackageManagerInternal mMockPackageManagerInternal; + private PackageManagerInternal mPackageManagerInternal; @Before public void setUp() { @@ -158,8 +158,7 @@ public class AccessibilitySecurityPolicyTest { R.dimen.accessibility_focus_highlight_stroke_width, 1); mA11ySecurityPolicy = new AccessibilitySecurityPolicy( - mPolicyWarningUIController, mContext, mMockA11yUserManager, - mMockPackageManagerInternal); + mPolicyWarningUIController, mContext, mMockA11yUserManager); mA11ySecurityPolicy.setSendingNonA11yToolNotificationLocked(true); mA11ySecurityPolicy.setAccessibilityWindowManager(mMockA11yWindowManager); mA11ySecurityPolicy.setAppWidgetManager(mMockAppWidgetManager); @@ -238,8 +237,8 @@ public class AccessibilitySecurityPolicyTest { @Test public void resolveValidReportedPackage_uidAndPkgNameMatched_returnPkgName() throws PackageManager.NameNotFoundException { - when(mMockPackageManagerInternal.isSameApp(PACKAGE_NAME, APP_UID, TEST_USER_ID)) - .thenReturn(true); + when(mMockPackageManager.getPackageUidAsUser(PACKAGE_NAME, + PackageManager.MATCH_ANY_USER, TEST_USER_ID)).thenReturn(APP_UID); assertEquals(mA11ySecurityPolicy.resolveValidReportedPackageLocked( PACKAGE_NAME, APP_UID, TEST_USER_ID, APP_PID), @@ -258,8 +257,8 @@ public class AccessibilitySecurityPolicyTest { when(mMockAppWidgetManager.getHostedWidgetPackages(widgetHostUid)) .thenReturn(widgetPackages); - when(mMockPackageManagerInternal.isSameApp(hostPackageName, widgetHostUid, TEST_USER_ID)) - .thenReturn(true); + when(mMockPackageManager.getPackageUidAsUser(hostPackageName, TEST_USER_ID)) + .thenReturn(widgetHostUid); assertEquals(mA11ySecurityPolicy.resolveValidReportedPackageLocked( widgetPackageName, widgetHostUid, TEST_USER_ID, widgetHostPid), @@ -273,8 +272,8 @@ public class AccessibilitySecurityPolicyTest { final String[] uidPackages = {PACKAGE_NAME, PACKAGE_NAME2}; when(mMockPackageManager.getPackagesForUid(APP_UID)) .thenReturn(uidPackages); - when(mMockPackageManagerInternal.isSameApp(invalidPackageName, APP_UID, TEST_USER_ID)) - .thenReturn(false); + when(mMockPackageManager.getPackageUidAsUser(invalidPackageName, TEST_USER_ID)) + .thenThrow(PackageManager.NameNotFoundException.class); when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID)) .thenReturn(new ArraySet<>()); mContext.getTestablePermissions().setPermission( @@ -293,8 +292,8 @@ public class AccessibilitySecurityPolicyTest { final String[] uidPackages = {PACKAGE_NAME}; when(mMockPackageManager.getPackagesForUid(APP_UID)) .thenReturn(uidPackages); - when(mMockPackageManagerInternal.isSameApp(wantedPackageName, wantedUid, TEST_USER_ID)) - .thenReturn(true); + when(mMockPackageManager.getPackageUidAsUser(wantedPackageName, TEST_USER_ID)) + .thenReturn(wantedUid); when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID)) .thenReturn(new ArraySet<>()); mContext.getTestablePermissions().setPermission( @@ -313,8 +312,8 @@ public class AccessibilitySecurityPolicyTest { final String[] uidPackages = {PACKAGE_NAME}; when(mMockPackageManager.getPackagesForUid(APP_UID)) .thenReturn(uidPackages); - when(mMockPackageManagerInternal.isSameApp(wantedPackageName, wantedUid, TEST_USER_ID)) - .thenReturn(true); + when(mMockPackageManager.getPackageUidAsUser(wantedPackageName, TEST_USER_ID)) + .thenReturn(wantedUid); when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID)) .thenReturn(new ArraySet<>()); mContext.getTestablePermissions().setPermission( diff --git a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java index 07c6182569b2..fb3a5f64d808 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java @@ -80,7 +80,7 @@ public class BiometricContextProviderTest { @Mock private WindowManager mWindowManager; - private OperationContextExt mOpContext = new OperationContextExt(); + private OperationContextExt mOpContext = new OperationContextExt(true); private IBiometricContextListener mListener; private BiometricContextProvider mProvider; @@ -316,17 +316,33 @@ public class BiometricContextProviderTest { assertThat(aidlContext.isAod).isEqualTo(false); assertThat(aidlContext.isCrypto).isEqualTo(false); + context = mProvider.updateContext(mOpContext, false /* crypto */); + aidlContext = context.toAidlContext(); + assertThat(context).isSameInstanceAs(mOpContext); + assertThat(aidlContext.id).isEqualTo(0); + assertThat(aidlContext.reason).isEqualTo(OperationReason.UNKNOWN); + assertThat(aidlContext.isAod).isEqualTo(false); + assertThat(aidlContext.isCrypto).isEqualTo(false); + } + + @Test + public void testUpdateAllSessionTypes() throws RemoteException { + OperationContextExt context = mProvider.updateContext(mOpContext, false /* crypto */); + OperationContext aidlContext = context.toAidlContext(); + for (int type : List.of(StatusBarManager.SESSION_BIOMETRIC_PROMPT, StatusBarManager.SESSION_KEYGUARD)) { final int id = 40 + type; final boolean aod = (type & 1) == 0; + OperationContextExt opContext = + new OperationContextExt(type == StatusBarManager.SESSION_BIOMETRIC_PROMPT); mListener.onDisplayStateChanged(aod ? AuthenticateOptions.DISPLAY_STATE_AOD : AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN); mSessionListener.onSessionStarted(type, InstanceId.fakeInstanceId(id)); - context = mProvider.updateContext(mOpContext, false /* crypto */); + context = mProvider.updateContext(opContext, false /* crypto */); aidlContext = context.toAidlContext(); - assertThat(context).isSameInstanceAs(mOpContext); + assertThat(context).isSameInstanceAs(opContext); assertThat(aidlContext.id).isEqualTo(id); assertThat(aidlContext.reason).isEqualTo(reason(type)); assertThat(aidlContext.isAod).isEqualTo(aod); @@ -334,14 +350,6 @@ public class BiometricContextProviderTest { mSessionListener.onSessionEnded(type, InstanceId.fakeInstanceId(id)); } - - context = mProvider.updateContext(mOpContext, false /* crypto */); - aidlContext = context.toAidlContext(); - assertThat(context).isSameInstanceAs(mOpContext); - assertThat(aidlContext.id).isEqualTo(0); - assertThat(aidlContext.reason).isEqualTo(OperationReason.UNKNOWN); - assertThat(aidlContext.isAod).isEqualTo(false); - assertThat(aidlContext.isCrypto).isEqualTo(false); } private static byte reason(int type) { diff --git a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricFrameworkStatsLoggerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricFrameworkStatsLoggerTest.java index 5adf391a1c32..5cff48dc3c2a 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricFrameworkStatsLoggerTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricFrameworkStatsLoggerTest.java @@ -34,7 +34,7 @@ public class BiometricFrameworkStatsLoggerTest { @Test public void testConvertsWakeReason_whenEmpty() { - final OperationContextExt ctx = new OperationContextExt(); + final OperationContextExt ctx = new OperationContextExt(false); final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx); final int[] reasonDetails = BiometricFrameworkStatsLogger @@ -48,11 +48,11 @@ public class BiometricFrameworkStatsLoggerTest { public void testConvertsWakeReason_whenPowerReason() { final OperationContext context = new OperationContext(); context.wakeReason = WakeReason.WAKE_MOTION; - final OperationContextExt ctx = new OperationContextExt(context); + final OperationContextExt ctx = new OperationContextExt(context, false); final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx); final int[] reasonDetails = BiometricFrameworkStatsLogger - .toProtoWakeReasonDetails(new OperationContextExt(context)); + .toProtoWakeReasonDetails(new OperationContextExt(context, false)); assertThat(reason).isEqualTo(BiometricsProtoEnums.WAKE_REASON_WAKE_MOTION); assertThat(reasonDetails).isEmpty(); @@ -63,7 +63,7 @@ public class BiometricFrameworkStatsLoggerTest { final OperationContext context = new OperationContext(); context.authenticateReason = AuthenticateReason.faceAuthenticateReason( AuthenticateReason.Face.ASSISTANT_VISIBLE); - final OperationContextExt ctx = new OperationContextExt(context); + final OperationContextExt ctx = new OperationContextExt(context, false); final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx); final int[] reasonDetails = BiometricFrameworkStatsLogger @@ -79,7 +79,7 @@ public class BiometricFrameworkStatsLoggerTest { final OperationContext context = new OperationContext(); context.authenticateReason = AuthenticateReason.vendorAuthenticateReason( new AuthenticateReason.Vendor()); - final OperationContextExt ctx = new OperationContextExt(context); + final OperationContextExt ctx = new OperationContextExt(context, false); final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx); final int[] reasonDetails = BiometricFrameworkStatsLogger @@ -96,7 +96,7 @@ public class BiometricFrameworkStatsLoggerTest { context.wakeReason = WakeReason.WAKE_KEY; context.authenticateReason = AuthenticateReason.faceAuthenticateReason( AuthenticateReason.Face.PRIMARY_BOUNCER_SHOWN); - final OperationContextExt ctx = new OperationContextExt(context); + final OperationContextExt ctx = new OperationContextExt(context, false); final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx); final int[] reasonDetails = BiometricFrameworkStatsLogger @@ -113,7 +113,7 @@ public class BiometricFrameworkStatsLoggerTest { context.wakeReason = WakeReason.LID; context.authenticateReason = AuthenticateReason.vendorAuthenticateReason( new AuthenticateReason.Vendor()); - final OperationContextExt ctx = new OperationContextExt(context); + final OperationContextExt ctx = new OperationContextExt(context, false); final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx); final int[] reasonDetails = BiometricFrameworkStatsLogger diff --git a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricLoggerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricLoggerTest.java index 81dcf4838b07..612f717226a2 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricLoggerTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricLoggerTest.java @@ -74,7 +74,7 @@ public class BiometricLoggerTest { @Before public void setUp() { - mOpContext = new OperationContextExt(); + mOpContext = new OperationContextExt(false); mContext.addMockSystemService(SensorManager.class, mSensorManager); when(mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)).thenReturn( new Sensor(new InputSensorInfo("", "", 0, 0, Sensor.TYPE_LIGHT, 0, 0, 0, 0, 0, 0, diff --git a/services/tests/servicestests/src/com/android/server/biometrics/log/OperationContextExtTest.java b/services/tests/servicestests/src/com/android/server/biometrics/log/OperationContextExtTest.java index c652b74f5848..5cf59602a43b 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/log/OperationContextExtTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/log/OperationContextExtTest.java @@ -53,12 +53,12 @@ public class OperationContextExtTest { @Test public void hasAidlContext() { - OperationContextExt context = new OperationContextExt(); + OperationContextExt context = new OperationContextExt(false); assertThat(context.toAidlContext()).isNotNull(); final OperationContext aidlContext = newAidlContext(); - context = new OperationContextExt(aidlContext); + context = new OperationContextExt(aidlContext, false); assertThat(context.toAidlContext()).isSameInstanceAs(aidlContext); final int id = 5; @@ -79,7 +79,7 @@ public class OperationContextExtTest { @Test public void hasNoOrderWithoutSession() { - OperationContextExt context = new OperationContextExt(); + OperationContextExt context = new OperationContextExt(false); assertThat(context.getOrderAndIncrement()).isEqualTo(-1); assertThat(context.getOrderAndIncrement()).isEqualTo(-1); } @@ -96,7 +96,7 @@ public class OperationContextExtTest { ); for (Map.Entry<Integer, Integer> entry : map.entrySet()) { - final OperationContextExt context = new OperationContextExt(newAidlContext()); + final OperationContextExt context = new OperationContextExt(newAidlContext(), true); when(mBiometricContext.getDisplayState()).thenReturn(entry.getKey()); assertThat(context.update(mBiometricContext).getDisplayState()) .isEqualTo(entry.getValue()); @@ -136,7 +136,8 @@ public class OperationContextExtTest { when(mBiometricContext.isDisplayOn()).thenReturn(true); when(mBiometricContext.getDisplayState()).thenReturn(displayState); - final OperationContextExt context = new OperationContextExt(newAidlContext()); + final OperationContextExt context = new OperationContextExt(newAidlContext(), + sessionType == OperationReason.BIOMETRIC_PROMPT); assertThat(context.update(mBiometricContext)).isSameInstanceAs(context); diff --git a/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CrossDeviceCallTest.java b/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CrossDeviceCallTest.java index c7fb97fcd5a5..9d42a5bf05d2 100644 --- a/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CrossDeviceCallTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CrossDeviceCallTest.java @@ -18,9 +18,11 @@ package com.android.server.companion.datatransfer.contextsync; import static com.google.common.truth.Truth.assertWithMessage; +import android.content.ComponentName; import android.platform.test.annotations.Presubmit; import android.telecom.Call; import android.telecom.ParcelableCall; +import android.telecom.PhoneAccountHandle; import android.testing.AndroidTestingRunner; import androidx.test.InstrumentationRegistry; @@ -37,12 +39,14 @@ public class CrossDeviceCallTest { private static final String CALLER_DISPLAY_NAME = "name"; private static final String CONTACT_DISPLAY_NAME = "contact"; + private final Call.Details mUninitializedCallDetails = createCallDetails( + /* state= */ -1, /* capabilities= */ 0); @Test public void updateCallDetails_uninitialized() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); assertWithMessage("Wrong status").that(crossDeviceCall.getStatus()) .isEqualTo(android.companion.Telecom.Call.UNKNOWN_STATUS); assertWithMessage("Wrong controls").that(crossDeviceCall.getControls()).isEmpty(); @@ -51,8 +55,8 @@ public class CrossDeviceCallTest { @Test public void updateCallDetails_ringing() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.updateCallDetails(createCallDetails(Call.STATE_RINGING, Call.Details.CAPABILITY_HOLD | Call.Details.CAPABILITY_MUTE)); assertWithMessage("Wrong status").that(crossDeviceCall.getStatus()) @@ -66,8 +70,8 @@ public class CrossDeviceCallTest { @Test public void updateCallDetails_ongoing() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.updateCallDetails(createCallDetails(Call.STATE_ACTIVE, Call.Details.CAPABILITY_HOLD | Call.Details.CAPABILITY_MUTE)); assertWithMessage("Wrong status").that(crossDeviceCall.getStatus()) @@ -81,8 +85,8 @@ public class CrossDeviceCallTest { @Test public void updateCallDetails_holding() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.updateCallDetails(createCallDetails(Call.STATE_HOLDING, Call.Details.CAPABILITY_HOLD | Call.Details.CAPABILITY_MUTE)); assertWithMessage("Wrong status").that(crossDeviceCall.getStatus()) @@ -95,8 +99,8 @@ public class CrossDeviceCallTest { @Test public void updateCallDetails_cannotHold() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.updateCallDetails( createCallDetails(Call.STATE_ACTIVE, Call.Details.CAPABILITY_MUTE)); assertWithMessage("Wrong status").that(crossDeviceCall.getStatus()) @@ -109,8 +113,8 @@ public class CrossDeviceCallTest { @Test public void updateCallDetails_cannotMute() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.updateCallDetails( createCallDetails(Call.STATE_ACTIVE, Call.Details.CAPABILITY_HOLD)); assertWithMessage("Wrong status").that(crossDeviceCall.getStatus()) @@ -123,8 +127,8 @@ public class CrossDeviceCallTest { @Test public void updateCallDetails_transitionRingingToOngoing() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.updateCallDetails(createCallDetails(Call.STATE_RINGING, Call.Details.CAPABILITY_HOLD | Call.Details.CAPABILITY_MUTE)); assertWithMessage("Wrong status for ringing state").that(crossDeviceCall.getStatus()) @@ -146,8 +150,8 @@ public class CrossDeviceCallTest { @Test public void updateSilencedIfRinging_ringing_silenced() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.updateCallDetails(createCallDetails(Call.STATE_RINGING, Call.Details.CAPABILITY_HOLD | Call.Details.CAPABILITY_MUTE)); crossDeviceCall.updateSilencedIfRinging(); @@ -161,8 +165,8 @@ public class CrossDeviceCallTest { @Test public void updateSilencedIfRinging_notRinging_notSilenced() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.updateCallDetails(createCallDetails(Call.STATE_ACTIVE, Call.Details.CAPABILITY_HOLD | Call.Details.CAPABILITY_MUTE)); crossDeviceCall.updateSilencedIfRinging(); @@ -177,8 +181,8 @@ public class CrossDeviceCallTest { @Test public void getReadableCallerId_enterpriseCall_adminBlocked_ott() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.mIsEnterprise = true; crossDeviceCall.mIsOtt = true; crossDeviceCall.updateCallDetails( @@ -193,8 +197,8 @@ public class CrossDeviceCallTest { @Test public void getReadableCallerId_enterpriseCall_adminUnblocked_ott() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.mIsEnterprise = true; crossDeviceCall.mIsOtt = true; crossDeviceCall.updateCallDetails( @@ -209,8 +213,8 @@ public class CrossDeviceCallTest { @Test public void getReadableCallerId_enterpriseCall_adminBlocked_pstn() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.mIsEnterprise = true; crossDeviceCall.mIsOtt = false; crossDeviceCall.updateCallDetails( @@ -225,8 +229,8 @@ public class CrossDeviceCallTest { @Test public void getReadableCallerId_nonEnterpriseCall_adminBlocked_ott() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.mIsEnterprise = false; crossDeviceCall.mIsOtt = true; crossDeviceCall.updateCallDetails( @@ -241,8 +245,8 @@ public class CrossDeviceCallTest { @Test public void getReadableCallerId_nonEnterpriseCall_adminUnblocked_ott() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.mIsEnterprise = false; crossDeviceCall.mIsOtt = true; crossDeviceCall.updateCallDetails( @@ -257,8 +261,8 @@ public class CrossDeviceCallTest { @Test public void getReadableCallerId_nonEnterpriseCall_adminBlocked_pstn() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.mIsEnterprise = false; crossDeviceCall.mIsOtt = false; crossDeviceCall.updateCallDetails( @@ -273,8 +277,8 @@ public class CrossDeviceCallTest { @Test public void getReadableCallerId_nonEnterpriseCall_adminUnblocked_pstn() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.mIsEnterprise = false; crossDeviceCall.mIsOtt = false; crossDeviceCall.updateCallDetails( @@ -294,6 +298,8 @@ public class CrossDeviceCallTest { parcelableCallBuilder.setCapabilities(capabilities); parcelableCallBuilder.setState(state); parcelableCallBuilder.setConferenceableCallIds(Collections.emptyList()); + parcelableCallBuilder.setAccountHandle(new PhoneAccountHandle( + new ComponentName("com.google.test", "com.google.test.Activity"), "label")); return Call.Details.createFromParcelableCall(parcelableCallBuilder.createParcelableCall()); } } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index 34b88b03547b..1e342f580745 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -130,6 +130,7 @@ import android.os.Build; import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.os.IpcDataCache; +import android.os.PersistableBundle; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; @@ -1511,7 +1512,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { * Validates that when the device owner is removed, the reset password token is cleared */ @Test - @Ignore("b/277916462") public void testClearDeviceOwner_clearResetPasswordToken() throws Exception { mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS); mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS); @@ -2602,7 +2602,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testSetApplicationHiddenWithDO() throws Exception { mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; setupDeviceOwner(); @@ -2628,7 +2627,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testSetApplicationHiddenWithPOOfOrganizationOwnedDevice() throws Exception { final int MANAGED_PROFILE_USER_ID = CALLER_USER_HANDLE; final int MANAGED_PROFILE_ADMIN_UID = @@ -4375,7 +4373,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testSetAutoTimeZoneEnabledModifiesSetting() throws Exception { mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; setupDeviceOwner(); @@ -4387,7 +4384,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testSetAutoTimeZoneEnabledWithPOOnUser0() throws Exception { mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; setupProfileOwnerOnUser0(); @@ -4399,7 +4395,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testSetAutoTimeZoneEnabledFailWithPONotOnUser0() throws Exception { setupProfileOwner(); assertExpectException(SecurityException.class, null, @@ -4409,7 +4404,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testSetAutoTimeZoneEnabledWithPOOfOrganizationOwnedDevice() throws Exception { setupProfileOwner(); configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); @@ -5383,7 +5377,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testResetPasswordWithToken() throws Exception { mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; setupDeviceOwner(); @@ -5418,7 +5411,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void resetPasswordWithToken_NumericPin() throws Exception { mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; setupDeviceOwner(); @@ -5439,7 +5431,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void resetPasswordWithToken_EmptyPassword() throws Exception { mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; setupDeviceOwner(); @@ -7260,7 +7251,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testCanProfileOwnerResetPasswordWhenLocked() throws Exception { setDeviceEncryptionPerUser(); setupProfileOwner(); @@ -7324,7 +7314,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testSetAccountTypesWithManagementDisabledOnManagedProfile() throws Exception { setupProfileOwner(); @@ -7344,7 +7333,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testSetAccountTypesWithManagementDisabledOnOrgOwnedManagedProfile() throws Exception { mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); @@ -8539,6 +8527,46 @@ public class DevicePolicyManagerTest extends DpmTestBase { eq(FUSED_PROVIDER), any(), eq(getServices().executor), any()); } + /** + * Verifies that bundles with tons of moderately long strings are persisted correctly. + * + * Policy is serialized into binary XML and there is a limit on the max string length: 65535. + * This test ensures that as long as each string in the trust agent configuration is below this + * limit, the policy can be serialized and deserialized correctly, even when the total length + * of the configuration is above that limit. This should be the case because PersistableBundle + * contents are stored as XML subtrees rather than as strings. + */ + @Test + public void testSetTrustAgentConfiguration_largeBundlePersisted() { + setAsProfileOwner(admin1); + + ComponentName agent = new ComponentName("some.trust.agent", "some.trust.agent.Agent"); + PersistableBundle configIn = new PersistableBundle(); + String kilobyteString = new String(new char[1024]).replace('\0', 'A'); + for (int i = 0; i < 1024; i++) { + configIn.putString("key-" + i, kilobyteString); + } + + runAsCaller(mAdmin1Context, dpms, dpm -> { + dpm.setTrustAgentConfiguration(admin1, agent, configIn); + }); + + // Re-read policies to see if they were serialized/deserialized correctly. + initializeDpms(); + + List<PersistableBundle> configsOut = new ArrayList<>(); + runAsCaller(mAdmin1Context, dpms, dpm -> { + configsOut.addAll(dpm.getTrustAgentConfiguration(admin1, agent)); + }); + + assertThat(configsOut.size()).isEqualTo(1); + PersistableBundle configOut = configsOut.get(0); + assertThat(configOut.size()).isEqualTo(1024); + for (int i = 0; i < 1024; i++) { + assertThat(configOut.getString("key-" + i, null)).isEqualTo(kilobyteString); + } + } + private void setupVpnAuthorization(String userVpnPackage, int userVpnUid) { final AppOpsManager.PackageOps vpnOp = new AppOpsManager.PackageOps(userVpnPackage, userVpnUid, List.of(new AppOpsManager.OpEntry( diff --git a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java index 7536c7949bcb..1eec70da3d20 100644 --- a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java +++ b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java @@ -649,9 +649,9 @@ public class LogicalDisplayMapperTest { assertEquals(0, mLogicalDisplayMapper.getDisplayLocked(device2) .getLeadDisplayIdLocked()); assertEquals("concurrent", mLogicalDisplayMapper.getDisplayLocked(device1) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); assertEquals("concurrent", mLogicalDisplayMapper.getDisplayLocked(device2) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); mLogicalDisplayMapper.setDeviceStateLocked(1, false); advanceTime(1000); @@ -661,10 +661,10 @@ public class LogicalDisplayMapperTest { assertFalse(mLogicalDisplayMapper.getDisplayLocked(device2).isInTransitionLocked()); assertEquals(DisplayDeviceConfig.DEFAULT_ID, mLogicalDisplayMapper.getDisplayLocked(device1) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); assertEquals(DisplayDeviceConfig.DEFAULT_ID, mLogicalDisplayMapper.getDisplayLocked(device2) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); mLogicalDisplayMapper.setDeviceStateLocked(2, false); advanceTime(1000); @@ -674,10 +674,10 @@ public class LogicalDisplayMapperTest { assertFalse(mLogicalDisplayMapper.getDisplayLocked(device2).isInTransitionLocked()); assertEquals(DisplayDeviceConfig.DEFAULT_ID, mLogicalDisplayMapper.getDisplayLocked(device1) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); assertEquals(DisplayDeviceConfig.DEFAULT_ID, mLogicalDisplayMapper.getDisplayLocked(device2) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); } @Test diff --git a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java index 5ea30298890f..f6cf57161f59 100644 --- a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java +++ b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java @@ -205,4 +205,19 @@ public class LogicalDisplayTest { assertNotEquals(info3, info2); assertTrue(refreshRanges.contentEquals(info3.thermalRefreshRateThrottling)); } + + @Test + public void testSetThermalBrightnessThrottlingDataId() { + String brightnessThrottlingDataId = "throttling_data_id"; + DisplayInfo info1 = mLogicalDisplay.getDisplayInfoLocked(); + mLogicalDisplay.setThermalBrightnessThrottlingDataIdLocked(brightnessThrottlingDataId); + DisplayInfo info2 = mLogicalDisplay.getDisplayInfoLocked(); + // Display info should only be updated when updateLocked is called + assertEquals(info2, info1); + + mLogicalDisplay.updateLocked(mDeviceRepo); + DisplayInfo info3 = mLogicalDisplay.getDisplayInfoLocked(); + assertNotEquals(info3, info2); + assertEquals(brightnessThrottlingDataId, info3.thermalBrightnessThrottlingDataId); + } } diff --git a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java b/services/tests/servicestests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java index eb208d2e6c7f..d9cf15b35c2b 100644 --- a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java +++ b/services/tests/servicestests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java @@ -18,6 +18,7 @@ package com.android.server.display.brightness.strategy; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -40,6 +41,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.internal.util.test.FakeSettingsProvider; import com.android.internal.util.test.FakeSettingsProviderRule; import com.android.server.display.AutomaticBrightnessController; +import com.android.server.display.brightness.BrightnessEvent; import com.android.server.display.brightness.BrightnessReason; import org.junit.After; @@ -262,12 +264,13 @@ public class AutomaticBrightnessStrategyTest { float automaticScreenBrightness = 0.3f; AutomaticBrightnessController automaticBrightnessController = mock( AutomaticBrightnessController.class); - when(automaticBrightnessController.getAutomaticScreenBrightness()).thenReturn( - automaticScreenBrightness); + when(automaticBrightnessController.getAutomaticScreenBrightness(any(BrightnessEvent.class))) + .thenReturn(automaticScreenBrightness); mAutomaticBrightnessStrategy.setAutomaticBrightnessController( automaticBrightnessController); assertEquals(automaticScreenBrightness, - mAutomaticBrightnessStrategy.getAutomaticScreenBrightness(), 0.0f); + mAutomaticBrightnessStrategy.getAutomaticScreenBrightness( + new BrightnessEvent(DISPLAY_ID)), 0.0f); } @Test diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkManagementServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkManagementServiceTest.java index d9cd77d8cd7c..af144cf49a46 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkManagementServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkManagementServiceTest.java @@ -37,7 +37,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import android.annotation.NonNull; -import android.content.AttributionSource; import android.content.Context; import android.net.ConnectivityManager; import android.net.INetd; @@ -50,7 +49,7 @@ import android.os.IBinder; import android.os.PermissionEnforcer; import android.os.Process; import android.os.RemoteException; -import android.permission.PermissionCheckerManager; +import android.os.test.FakePermissionEnforcer; import android.platform.test.annotations.Presubmit; import android.test.suitebuilder.annotation.SmallTest; import android.util.ArrayMap; @@ -90,7 +89,6 @@ public class NetworkManagementServiceTest { private ArgumentCaptor<INetdUnsolicitedEventListener> mUnsolListenerCaptor; private final MockDependencies mDeps = new MockDependencies(); - private final MockPermissionEnforcer mPermissionEnforcer = new MockPermissionEnforcer(); private final class MockDependencies extends NetworkManagementService.Dependencies { @Override @@ -118,24 +116,6 @@ public class NetworkManagementServiceTest { } } - private static final class MockPermissionEnforcer extends PermissionEnforcer { - @Override - protected int checkPermission(@NonNull String permission, - @NonNull AttributionSource source) { - String[] granted = new String [] { - android.Manifest.permission.NETWORK_SETTINGS, - android.Manifest.permission.OBSERVE_NETWORK_POLICY, - android.Manifest.permission.SHUTDOWN - }; - for (String p : granted) { - if (p.equals(permission)) { - return PermissionCheckerManager.PERMISSION_GRANTED; - } - } - return PermissionCheckerManager.PERMISSION_HARD_DENIED; - } - } - @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); @@ -145,12 +125,15 @@ public class NetworkManagementServiceTest { eq(ConnectivityManager.class)); doReturn(mCm).when(mContext).getSystemService(eq(Context.CONNECTIVITY_SERVICE)); // The AIDL stub will use PermissionEnforcer to check permission from the caller. - // Mock the service. See MockPermissionEnforcer above. + // Mock the service and grant the expected permissions. + FakePermissionEnforcer permissionEnforcer = new FakePermissionEnforcer(); + permissionEnforcer.grant(android.Manifest.permission.NETWORK_SETTINGS); + permissionEnforcer.grant(android.Manifest.permission.OBSERVE_NETWORK_POLICY); + permissionEnforcer.grant(android.Manifest.permission.SHUTDOWN); doReturn(Context.PERMISSION_ENFORCER_SERVICE).when(mContext).getSystemServiceName( eq(PermissionEnforcer.class)); - doReturn(mPermissionEnforcer).when(mContext).getSystemService( + doReturn(permissionEnforcer).when(mContext).getSystemService( eq(Context.PERMISSION_ENFORCER_SERVICE)); - // Start the service and wait until it connects to our socket. mNMService = NetworkManagementService.create(mContext, mDeps); } diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java index 21a11bc0e49e..52bf244e99fb 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -40,6 +40,7 @@ import static org.mockito.ArgumentMatchers.isA; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.atMost; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -1611,7 +1612,8 @@ public class PowerManagerServiceTest { startSystem(); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); - verify(mNotifierMock, never()).onWakefulnessChangeStarted(anyInt(), anyInt(), anyLong()); + verify(mNotifierMock, never()).onGlobalWakefulnessChangeStarted(anyInt(), anyInt(), + anyLong()); } @Test @@ -1630,7 +1632,7 @@ public class PowerManagerServiceTest { startSystem(); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP); - verify(mNotifierMock).onWakefulnessChangeStarted(eq(WAKEFULNESS_ASLEEP), anyInt(), + verify(mNotifierMock).onGlobalWakefulnessChangeStarted(eq(WAKEFULNESS_ASLEEP), anyInt(), anyLong()); } @@ -2112,7 +2114,7 @@ public class PowerManagerServiceTest { } @Test - public void testMultiDisplay_defaultDozing_addNewDisplayDefaultGoesBackToDoze() { + public void testMultiDisplay_addNewDisplay_becomeGloballyAwakeButDefaultRemainsDozing() { final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1; final int nonDefaultDisplay = Display.DEFAULT_DISPLAY + 1; final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener = @@ -2142,6 +2144,7 @@ public class PowerManagerServiceTest { assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( WAKEFULNESS_DOZING); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_DOZING); + verify(mDreamManagerInternalMock).stopDream(anyBoolean(), anyString()); verify(mDreamManagerInternalMock).startDream(eq(true), anyString()); listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId); @@ -2152,7 +2155,10 @@ public class PowerManagerServiceTest { WAKEFULNESS_AWAKE); assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( WAKEFULNESS_DOZING); - verify(mDreamManagerInternalMock, times(2)).startDream(eq(true), anyString()); + + // Make sure there were no additional calls to stopDream or startDream + verify(mDreamManagerInternalMock, atMost(1)).stopDream(anyBoolean(), anyString()); + verify(mDreamManagerInternalMock, atMost(1)).startDream(eq(true), anyString()); } @Test @@ -2169,7 +2175,7 @@ public class PowerManagerServiceTest { } @Test - public void testMultiDisplay_onlyOneDisplaySleeps_onWakefulnessChangedEventFires() { + public void testMultiDisplay_onlyOneDisplaySleeps_onWakefulnessChangedEventsFire() { createService(); startSystem(); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); @@ -2177,12 +2183,14 @@ public class PowerManagerServiceTest { assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( WAKEFULNESS_ASLEEP); - verify(mNotifierMock).onPowerGroupWakefulnessChanged(eq(Display.DEFAULT_DISPLAY_GROUP), - eq(WAKEFULNESS_ASLEEP), anyInt(), eq(WAKEFULNESS_ASLEEP)); + verify(mNotifierMock).onGroupWakefulnessChangeStarted(eq(Display.DEFAULT_DISPLAY_GROUP), + eq(WAKEFULNESS_ASLEEP), eq(PowerManager.GO_TO_SLEEP_REASON_APPLICATION), anyLong()); + verify(mNotifierMock).onGlobalWakefulnessChangeStarted(eq(WAKEFULNESS_ASLEEP), + eq(PowerManager.GO_TO_SLEEP_REASON_APPLICATION), anyLong()); } @Test - public void testMultiDisplay_bothDisplaysSleep_onWakefulnessChangedEventFiresCorrectly() { + public void testMultiDisplay_bothDisplaysSleep_onWakefulnessChangedEventsFireCorrectly() { final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1; final int nonDefaultDisplay = Display.DEFAULT_DISPLAY + 1; final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener = @@ -2201,10 +2209,10 @@ public class PowerManagerServiceTest { assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId); - mService.setWakefulnessLocked(nonDefaultDisplayGroupId, WAKEFULNESS_ASLEEP, 0, 0, 0, 0, - null, null); - mService.setWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP, WAKEFULNESS_ASLEEP, 0, 0, 0, 0, - null, null); + mService.setWakefulnessLocked(nonDefaultDisplayGroupId, WAKEFULNESS_ASLEEP, 0, 0, + PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0, null, null); + mService.setWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP, WAKEFULNESS_ASLEEP, 0, 0, + PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0, null, null); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP); assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( @@ -2212,14 +2220,16 @@ public class PowerManagerServiceTest { assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( WAKEFULNESS_ASLEEP); - verify(mNotifierMock).onPowerGroupWakefulnessChanged(eq(nonDefaultDisplayGroupId), - eq(WAKEFULNESS_ASLEEP), anyInt(), eq(WAKEFULNESS_AWAKE)); - verify(mNotifierMock).onPowerGroupWakefulnessChanged(eq(Display.DEFAULT_DISPLAY_GROUP), - eq(WAKEFULNESS_ASLEEP), anyInt(), eq(WAKEFULNESS_ASLEEP)); + verify(mNotifierMock).onGroupWakefulnessChangeStarted(eq(nonDefaultDisplayGroupId), + eq(WAKEFULNESS_ASLEEP), eq(PowerManager.GO_TO_SLEEP_REASON_APPLICATION), anyLong()); + verify(mNotifierMock).onGroupWakefulnessChangeStarted(eq(Display.DEFAULT_DISPLAY_GROUP), + eq(WAKEFULNESS_ASLEEP), eq(PowerManager.GO_TO_SLEEP_REASON_APPLICATION), anyLong()); + verify(mNotifierMock).onGlobalWakefulnessChangeStarted(eq(WAKEFULNESS_ASLEEP), + eq(PowerManager.GO_TO_SLEEP_REASON_APPLICATION), anyLong()); } @Test - public void testMultiDisplay_separateWakeStates_onWakefulnessChangedEventFiresCorrectly() { + public void testMultiDisplay_separateWakeStates_onWakefulnessChangedEventsFireCorrectly() { final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1; final int nonDefaultDisplay = Display.DEFAULT_DISPLAY + 1; final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener = @@ -2255,10 +2265,53 @@ public class PowerManagerServiceTest { WAKEFULNESS_ASLEEP); assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( WAKEFULNESS_AWAKE); - verify(mNotifierMock).onPowerGroupWakefulnessChanged(eq(Display.DEFAULT_DISPLAY_GROUP), - eq(WAKEFULNESS_ASLEEP), anyInt(), eq(WAKEFULNESS_AWAKE)); - verify(mNotifierMock, never()).onPowerGroupWakefulnessChanged( - eq(nonDefaultDisplayGroupId), anyInt(), anyInt(), anyInt()); + verify(mNotifierMock).onGroupWakefulnessChangeStarted(eq(nonDefaultDisplayGroupId), + eq(WAKEFULNESS_AWAKE), eq(PowerManager.WAKE_REASON_DISPLAY_GROUP_ADDED), anyLong()); + verify(mNotifierMock).onGroupWakefulnessChangeStarted(eq(Display.DEFAULT_DISPLAY_GROUP), + eq(WAKEFULNESS_ASLEEP), eq(PowerManager.GO_TO_SLEEP_REASON_APPLICATION), anyLong()); + verify(mNotifierMock, never()).onGlobalWakefulnessChangeStarted(eq(WAKEFULNESS_ASLEEP), + anyInt(), anyLong()); + } + + @Test + public void testMultiDisplay_oneDisplayGroupChanges_globalDoesNotChange() { + final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1; + final int nonDefaultDisplay = Display.DEFAULT_DISPLAY + 1; + final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener = + new AtomicReference<>(); + doAnswer((Answer<Void>) invocation -> { + listener.set(invocation.getArgument(0)); + return null; + }).when(mDisplayManagerInternalMock).registerDisplayGroupListener(any()); + final DisplayInfo info = new DisplayInfo(); + info.displayGroupId = nonDefaultDisplayGroupId; + when(mDisplayManagerInternalMock.getDisplayInfo(nonDefaultDisplay)).thenReturn(info); + + createService(); + startSystem(); + + listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId); + + assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( + WAKEFULNESS_AWAKE); + assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( + WAKEFULNESS_AWAKE); + assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); + + long eventTime = mClock.now(); + mService.setWakefulnessLocked(nonDefaultDisplayGroupId, WAKEFULNESS_ASLEEP, eventTime, 0, + PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0, null, null); + + assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( + WAKEFULNESS_AWAKE); + assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( + WAKEFULNESS_ASLEEP); + assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); + verify(mNotifierMock, never()).onGlobalWakefulnessChangeStarted(anyInt(), anyInt(), + anyLong()); + verify(mNotifierMock, atMost(1)).onGroupWakefulnessChangeStarted( + eq(nonDefaultDisplayGroupId), eq(WAKEFULNESS_ASLEEP), + eq(PowerManager.GO_TO_SLEEP_REASON_APPLICATION), eq(eventTime)); } @Test diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java index 2665e197f91f..5636795520e9 100644 --- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java +++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java @@ -233,8 +233,8 @@ class TestPhoneWindowManager { doNothing().when(mPhoneWindowManager).updateSettings(); doNothing().when(mPhoneWindowManager).screenTurningOn(anyInt(), any()); doNothing().when(mPhoneWindowManager).screenTurnedOn(anyInt()); - doNothing().when(mPhoneWindowManager).startedWakingUp(anyInt()); - doNothing().when(mPhoneWindowManager).finishedWakingUp(anyInt()); + doNothing().when(mPhoneWindowManager).startedWakingUp(anyInt(), anyInt()); + doNothing().when(mPhoneWindowManager).finishedWakingUp(anyInt(), anyInt()); mPhoneWindowManager.init(new TestInjector(mContext, mWindowManagerFuncsImpl)); mPhoneWindowManager.systemReady(); diff --git a/services/tests/wmtests/src/com/android/server/wm/SurfaceControlTests.java b/services/tests/wmtests/src/com/android/server/wm/SurfaceControlTests.java index 342ab83de6f0..4f45d5c2bf98 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SurfaceControlTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SurfaceControlTests.java @@ -125,9 +125,10 @@ public class SurfaceControlTests { public void testSurfaceChangedOnRotation() { final Instrumentation instrumentation = getInstrumentation(); final Context context = instrumentation.getContext(); - final Activity activity = instrumentation.startActivitySync(new Intent().setComponent( + final Intent intent = new Intent().setComponent( new ComponentName(context, ActivityOptionsTest.MainActivity.class)) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); + final Activity activity = instrumentation.startActivitySync(intent); final SurfaceView sv = new SurfaceView(activity); final AtomicInteger surfaceChangedCount = new AtomicInteger(); instrumentation.runOnMainSync(() -> activity.setContentView(sv)); @@ -157,12 +158,27 @@ public class SurfaceControlTests { instrumentation.waitForIdleSync(); final int newRotation = activity.getResources().getConfiguration() .windowConfiguration.getRotation(); + if (rotation == newRotation) { + // The device might not support requested orientation. + activity.finishAndRemoveTask(); + return; + } final int count = surfaceChangedCount.get(); + activity.moveTaskToBack(true /* nonRoot */); + instrumentation.getUiAutomation().syncInputTransactions(); + context.startActivity(intent); + instrumentation.getUiAutomation().syncInputTransactions(); + final int countAfterToFront = count - surfaceChangedCount.get(); activity.finishAndRemoveTask(); + // The first count is triggered from creation, so the target number is 2. - if (rotation != newRotation && count > 2) { + if (count > 2) { fail("More than once surfaceChanged for rotation change: " + count); } + if (countAfterToFront > 1) { + fail("More than once surfaceChanged for app transition with rotation change: " + + countAfterToFront); + } } private SurfaceControl buildTestSurface() { diff --git a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java index 32033fb7403d..adf3f3976f38 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java @@ -114,24 +114,35 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { } @Override - public void startedWakingUp(@WakeReason int wakeReason) { + public void startedWakingUpGlobal(@WakeReason int reason) { } @Override - public void finishedWakingUp(@WakeReason int wakeReason) { + public void finishedWakingUpGlobal(@WakeReason int reason) { } @Override - public void startedGoingToSleep(@GoToSleepReason int sleepReason) { + public void startedGoingToSleepGlobal(@GoToSleepReason int reason) { } @Override - public void finishedGoingToSleep(@GoToSleepReason int sleepReason) { + public void finishedGoingToSleepGlobal(@GoToSleepReason int reason) { } @Override - public void onPowerGroupWakefulnessChanged(int groupId, int wakefulness, - @GoToSleepReason int pmSleepReason, int globalWakefulness) { + public void startedWakingUp(int displayGroupId, @WakeReason int wakeReason) { + } + + @Override + public void finishedWakingUp(int displayGroupId, @WakeReason int wakeReason) { + } + + @Override + public void startedGoingToSleep(int displayGroupId, @GoToSleepReason int sleepReason) { + } + + @Override + public void finishedGoingToSleep(int displayGroupId, @GoToSleepReason int sleepReason) { } @Override diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index f27c23b29d67..188894339f6a 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -5773,14 +5773,15 @@ public class CarrierConfigManager { * </ul> * @hide */ - public static final String KEY_SA_DISABLE_POLICY_INT = KEY_PREFIX + "sa_disable_policy_int"; + public static final String KEY_NR_SA_DISABLE_POLICY_INT = + KEY_PREFIX + "sa_disable_policy_int"; /** @hide */ @IntDef({ - SA_DISABLE_POLICY_NONE, - SA_DISABLE_POLICY_WFC_ESTABLISHED, - SA_DISABLE_POLICY_WFC_ESTABLISHED_WHEN_VONR_DISABLED, - SA_DISABLE_POLICY_VOWIFI_REGISTERED + NR_SA_DISABLE_POLICY_NONE, + NR_SA_DISABLE_POLICY_WFC_ESTABLISHED, + NR_SA_DISABLE_POLICY_WFC_ESTABLISHED_WHEN_VONR_DISABLED, + NR_SA_DISABLE_POLICY_VOWIFI_REGISTERED }) public @interface NrSaDisablePolicy {} @@ -5788,14 +5789,14 @@ public class CarrierConfigManager { * Do not disables NR SA mode. * @hide */ - public static final int SA_DISABLE_POLICY_NONE = 0; + public static final int NR_SA_DISABLE_POLICY_NONE = 0; /** * Disables NR SA mode when VoWiFi call is established in order to improve the delay or * voice mute when the handover from ePDG to NR is not supported in UE or network. * @hide */ - public static final int SA_DISABLE_POLICY_WFC_ESTABLISHED = 1; + public static final int NR_SA_DISABLE_POLICY_WFC_ESTABLISHED = 1; /** * Disables NR SA mode when VoWiFi call is established when VoNR is disabled in order to @@ -5803,14 +5804,14 @@ public class CarrierConfigManager { * in UE or network. * @hide */ - public static final int SA_DISABLE_POLICY_WFC_ESTABLISHED_WHEN_VONR_DISABLED = 2; + public static final int NR_SA_DISABLE_POLICY_WFC_ESTABLISHED_WHEN_VONR_DISABLED = 2; /** * Disables NR SA mode when IMS is registered over WiFi in order to improve the delay or * voice mute when the handover from ePDG to NR is not supported in UE or network. * @hide */ - public static final int SA_DISABLE_POLICY_VOWIFI_REGISTERED = 3; + public static final int NR_SA_DISABLE_POLICY_VOWIFI_REGISTERED = 3; private Ims() {} @@ -5883,7 +5884,7 @@ public class CarrierConfigManager { defaults.putInt(KEY_REGISTRATION_RETRY_BASE_TIMER_MILLIS_INT, 30000); defaults.putInt(KEY_REGISTRATION_RETRY_MAX_TIMER_MILLIS_INT, 1800000); defaults.putInt(KEY_REGISTRATION_SUBSCRIBE_EXPIRY_TIMER_SEC_INT, 600000); - defaults.putInt(KEY_SA_DISABLE_POLICY_INT, SA_DISABLE_POLICY_NONE); + defaults.putInt(KEY_NR_SA_DISABLE_POLICY_INT, NR_SA_DISABLE_POLICY_NONE); defaults.putIntArray( KEY_IPSEC_AUTHENTICATION_ALGORITHMS_INT_ARRAY, diff --git a/tests/TouchLatency/app/build.gradle b/tests/TouchLatency/app/build.gradle index 129baab5529d..07f6bcabb907 100644 --- a/tests/TouchLatency/app/build.gradle +++ b/tests/TouchLatency/app/build.gradle @@ -2,7 +2,6 @@ apply plugin: 'com.android.application' android { compileSdkVersion 33 - buildToolsVersion '28.0.3' defaultConfig { applicationId "com.prefabulated.touchlatency" diff --git a/tests/TouchLatency/app/src/main/AndroidManifest.xml b/tests/TouchLatency/app/src/main/AndroidManifest.xml index 25bb5d92f846..5743b2586416 100644 --- a/tests/TouchLatency/app/src/main/AndroidManifest.xml +++ b/tests/TouchLatency/app/src/main/AndroidManifest.xml @@ -30,12 +30,6 @@ <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> - - <activity android:name=".TouchLatencyActivityPresentation" - android:label="@string/app_name" - android:parentActivityName=".TouchLatencyActivity" - android:exported="true"> - </activity> </application> </manifest> diff --git a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java b/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java index 3a520bcdc526..7678633dfa5e 100644 --- a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java +++ b/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java @@ -16,8 +16,6 @@ package com.prefabulated.touchlatency; -import android.app.ActivityOptions; -import android.content.Intent; import android.hardware.display.DisplayManager; import android.os.Bundle; import android.os.Handler; @@ -105,7 +103,6 @@ public class TouchLatencyActivity extends AppCompatActivity { updateDisplayMode(menuItem, currentMode); } updateRefreshRateMenu(mMenu.findItem(R.id.frame_rate)); - updateMultiDisplayMenu(mMenu.findItem(R.id.multi_display)); } @Override @@ -186,20 +183,6 @@ public class TouchLatencyActivity extends AppCompatActivity { mCurrentModeIndex = modeIndex; } - private void changeMultipleDisplays() { - Intent intent = new Intent(this, TouchLatencyActivityPresentation.class); - intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK); - ActivityOptions options = ActivityOptions.makeBasic(); - for (int i = 1; i < mDisplayManager.getDisplays().length; ++i) { - // We assume the first display is already displaying the TouchLatencyActivity - int displayId = mDisplayManager.getDisplays()[i].getDisplayId(); - options.setLaunchDisplayId(displayId); - intent.putExtra(TouchLatencyActivityPresentation.DISPLAY_ID, displayId); - startActivity(intent, options.toBundle()); - } - } - - @Override public boolean onOptionsItemSelected(MenuItem item) { Trace.beginSection("TouchLatencyActivity onOptionsItemSelected"); @@ -218,10 +201,6 @@ public class TouchLatencyActivity extends AppCompatActivity { changeDisplayMode(item); break; } - case R.id.multi_display: { - changeMultipleDisplays(); - break; - } } Trace.endSection(); diff --git a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivityPresentation.java b/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivityPresentation.java deleted file mode 100644 index 2602e6b34395..000000000000 --- a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivityPresentation.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2022 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.prefabulated.touchlatency; - -import android.app.Activity; -import android.os.Bundle; -import android.os.Trace; -import android.view.Display; -import android.view.Display.Mode; -import android.view.Menu; -import android.view.MenuItem; -import android.view.Window; -import android.view.WindowManager; - -public class TouchLatencyActivityPresentation extends Activity { - public static final String DISPLAY_ID = "DISPLAY_ID"; - private Mode[] mDisplayModes; - private int mCurrentModeIndex; - private int mDisplayId; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - if (getIntent().hasExtra(DISPLAY_ID)) { - mDisplayId = (int) getIntent().getExtras().get(DISPLAY_ID); - } - Trace.beginSection( - "TouchLatencyActivityPresentation::DisplayId::" + mDisplayId + " onCreate"); - setContentView(R.layout.activity_touch_latency); - - mTouchView = findViewById(R.id.canvasView); - - WindowManager wm = getWindowManager(); - Display display = wm.getDefaultDisplay(); - mDisplayModes = display.getSupportedModes(); - Mode currentMode = getWindowManager().getDefaultDisplay().getMode(); - - for (int i = 0; i < mDisplayModes.length; i++) { - if (currentMode.getModeId() == mDisplayModes[i].getModeId()) { - mCurrentModeIndex = i; - break; - } - } - Trace.endSection(); - } - - @Override - protected void onResume() { - super.onResume(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - Trace.beginSection( - "TouchLatencyActivityPresentation::DisplayId:: " - + mDisplayId + " onCreateOptionsMenu"); - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.menu_touch_latency, menu); - if (mDisplayModes.length > 1) { - MenuItem menuItem = menu.findItem(R.id.display_mode); - Mode currentMode = getWindowManager().getDefaultDisplay().getMode(); - updateDisplayMode(menuItem, currentMode); - } - Trace.endSection(); - return true; - } - - private void updateDisplayMode(MenuItem menuItem, Mode displayMode) { - int fps = (int) displayMode.getRefreshRate(); - menuItem.setTitle(fps + "hz"); - menuItem.setVisible(true); - } - - public void changeDisplayMode(MenuItem item) { - Window w = getWindow(); - WindowManager.LayoutParams params = w.getAttributes(); - - int modeIndex = (mCurrentModeIndex + 1) % mDisplayModes.length; - params.preferredDisplayModeId = mDisplayModes[modeIndex].getModeId(); - w.setAttributes(params); - - updateDisplayMode(item, mDisplayModes[modeIndex]); - mCurrentModeIndex = modeIndex; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - Trace.beginSection( - "TouchLatencyActivityPresentation::DisplayId::" - + mDisplayId + " onOptionsItemSelected"); - // Handle action bar item clicks here. The action bar will - // automatically handle clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. - int id = item.getItemId(); - - //noinspection SimplifiableIfStatement - switch (id) { - case R.id.action_settings: { - mTouchView.changeMode(item); - break; - } - case R.id.display_mode: { - changeDisplayMode(item); - break; - } - } - - Trace.endSection(); - return super.onOptionsItemSelected(item); - } - - private TouchLatencyView mTouchView; -} diff --git a/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml b/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml index 7169021b6653..f637f71f7ef2 100644 --- a/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml +++ b/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml @@ -30,9 +30,4 @@ android:title="@string/display_mode" android:visible="false" app:showAsAction="always" /> - <item - android:id="@+id/multi_display" - android:title="@string/multi_display" - android:visible="false" - app:showAsAction="ifRoom" /> </menu> diff --git a/tests/TouchLatency/build.gradle b/tests/TouchLatency/build.gradle index 381e55e92c7d..f52935bae092 100644 --- a/tests/TouchLatency/build.gradle +++ b/tests/TouchLatency/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:4.2.2' + classpath 'com.android.tools.build:gradle:7.4.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/tests/TouchLatency/gradle/wrapper/gradle-wrapper.jar b/tests/TouchLatency/gradle/wrapper/gradle-wrapper.jar Binary files differindex 758de960ec79..7454180f2ae8 100644 --- a/tests/TouchLatency/gradle/wrapper/gradle-wrapper.jar +++ b/tests/TouchLatency/gradle/wrapper/gradle-wrapper.jar diff --git a/tests/TouchLatency/gradle/wrapper/gradle-wrapper.properties b/tests/TouchLatency/gradle/wrapper/gradle-wrapper.properties index 4d9ca1649142..8049c684f04f 100644 --- a/tests/TouchLatency/gradle/wrapper/gradle-wrapper.properties +++ b/tests/TouchLatency/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/tests/TouchLatency/gradlew b/tests/TouchLatency/gradlew index cccdd3d517fc..1b6c787337ff 100755 --- a/tests/TouchLatency/gradlew +++ b/tests/TouchLatency/gradlew @@ -1,78 +1,129 @@ -#!/usr/bin/env sh +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# 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 +# +# https://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. +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -81,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -89,84 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/tests/TouchLatency/gradlew.bat b/tests/TouchLatency/gradlew.bat index e95643d6a2ca..ac1b06f93825 100644 --- a/tests/TouchLatency/gradlew.bat +++ b/tests/TouchLatency/gradlew.bat @@ -1,3 +1,19 @@ +@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@@ -13,15 +29,18 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
+if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -35,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-if exist "%JAVA_EXE%" goto init
+if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -45,28 +64,14 @@ echo location of your Java installation. goto fail
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/NetworkProviderInfo.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/NetworkProviderInfo.java index c6e675ade262..e207b01a364d 100644 --- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/NetworkProviderInfo.java +++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/NetworkProviderInfo.java @@ -185,6 +185,7 @@ public final class NetworkProviderInfo implements Parcelable { */ @NonNull public Builder setExtras(@NonNull Bundle extras) { + Objects.requireNonNull(extras); mExtras = extras; return this; } diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/HotspotNetworkConnectionStatusTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/HotspotNetworkConnectionStatusTest.java deleted file mode 100644 index b18ab5060924..000000000000 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/HotspotNetworkConnectionStatusTest.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.wifi.sharedconnectivity.app; - -import static android.net.wifi.WifiInfo.SECURITY_TYPE_EAP; -import static android.net.wifi.WifiInfo.SECURITY_TYPE_WEP; -import static android.net.wifi.sharedconnectivity.app.HotspotNetwork.NETWORK_TYPE_CELLULAR; -import static android.net.wifi.sharedconnectivity.app.HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT; -import static android.net.wifi.sharedconnectivity.app.HotspotNetworkConnectionStatus.CONNECTION_STATUS_TETHERING_TIMEOUT; -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_TABLET; - -import static com.google.common.truth.Truth.assertThat; - -import android.os.Bundle; -import android.os.Parcel; - -import androidx.test.filters.SmallTest; - -import org.junit.Test; - -import java.util.Arrays; - -/** - * Unit tests for {@link HotspotNetworkConnectionStatus}. - */ -@SmallTest -public class HotspotNetworkConnectionStatusTest { - private static final long DEVICE_ID = 11L; - private static final NetworkProviderInfo NETWORK_PROVIDER_INFO = - new NetworkProviderInfo.Builder("TEST_NAME", "TEST_MODEL") - .setDeviceType(DEVICE_TYPE_TABLET).setConnectionStrength(2) - .setBatteryPercentage(50).build(); - private static final int NETWORK_TYPE = NETWORK_TYPE_CELLULAR; - private static final String NETWORK_NAME = "TEST_NETWORK"; - private static final String HOTSPOT_SSID = "TEST_SSID"; - private static final String HOTSPOT_BSSID = "TEST _BSSID"; - private static final int[] HOTSPOT_SECURITY_TYPES = {SECURITY_TYPE_WEP, SECURITY_TYPE_EAP}; - private static final long DEVICE_ID_1 = 111L; - private static final String BUNDLE_KEY = "INT-KEY"; - private static final int BUNDLE_VALUE = 1; - - /** - * Verifies parcel serialization/deserialization. - */ - @Test - public void testParcelOperation() { - HotspotNetworkConnectionStatus status = buildConnectionStatusBuilder().build(); - - Parcel parcelW = Parcel.obtain(); - status.writeToParcel(parcelW, 0); - byte[] bytes = parcelW.marshall(); - parcelW.recycle(); - - Parcel parcelR = Parcel.obtain(); - parcelR.unmarshall(bytes, 0, bytes.length); - parcelR.setDataPosition(0); - HotspotNetworkConnectionStatus fromParcel = - HotspotNetworkConnectionStatus.CREATOR.createFromParcel(parcelR); - - assertThat(fromParcel).isEqualTo(status); - assertThat(fromParcel.hashCode()).isEqualTo(status.hashCode()); - } - - /** - * Verifies the Equals operation - */ - @Test - public void testEqualsOperation() { - HotspotNetworkConnectionStatus status1 = buildConnectionStatusBuilder().build(); - HotspotNetworkConnectionStatus status2 = buildConnectionStatusBuilder().build(); - assertThat(status1).isEqualTo(status2); - - HotspotNetworkConnectionStatus.Builder builder = buildConnectionStatusBuilder() - .setStatus(CONNECTION_STATUS_TETHERING_TIMEOUT); - assertThat(builder.build()).isNotEqualTo(status1); - - builder = buildConnectionStatusBuilder() - .setHotspotNetwork(buildHotspotNetworkBuilder().setDeviceId(DEVICE_ID_1).build()); - assertThat(builder.build()).isNotEqualTo(status1); - } - - /** - * Verifies the get methods return the expected data. - */ - @Test - public void testGetMethods() { - HotspotNetworkConnectionStatus status = buildConnectionStatusBuilder().build(); - assertThat(status.getStatus()).isEqualTo(CONNECTION_STATUS_ENABLING_HOTSPOT); - assertThat(status.getHotspotNetwork()).isEqualTo(buildHotspotNetworkBuilder().build()); - assertThat(status.getExtras().getInt(BUNDLE_KEY)).isEqualTo(BUNDLE_VALUE); - } - - @Test - public void testHashCode() { - HotspotNetworkConnectionStatus status1 = buildConnectionStatusBuilder().build(); - HotspotNetworkConnectionStatus status2 = buildConnectionStatusBuilder().build(); - - assertThat(status1.hashCode()).isEqualTo(status2.hashCode()); - } - - private HotspotNetworkConnectionStatus.Builder buildConnectionStatusBuilder() { - return new HotspotNetworkConnectionStatus.Builder() - .setStatus(CONNECTION_STATUS_ENABLING_HOTSPOT) - .setHotspotNetwork(buildHotspotNetworkBuilder().build()) - .setExtras(buildBundle()); - } - - private Bundle buildBundle() { - Bundle bundle = new Bundle(); - bundle.putInt(BUNDLE_KEY, BUNDLE_VALUE); - return bundle; - } - - private HotspotNetwork.Builder buildHotspotNetworkBuilder() { - HotspotNetwork.Builder builder = new HotspotNetwork.Builder() - .setDeviceId(DEVICE_ID) - .setNetworkProviderInfo(NETWORK_PROVIDER_INFO) - .setHostNetworkType(NETWORK_TYPE) - .setNetworkName(NETWORK_NAME) - .setHotspotSsid(HOTSPOT_SSID) - .setHotspotBssid(HOTSPOT_BSSID); - Arrays.stream(HOTSPOT_SECURITY_TYPES).forEach(builder::addHotspotSecurityType); - return builder; - } -} diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/HotspotNetworkTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/HotspotNetworkTest.java deleted file mode 100644 index 0827ffaea482..000000000000 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/HotspotNetworkTest.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.wifi.sharedconnectivity.app; - -import static android.net.wifi.WifiInfo.SECURITY_TYPE_EAP; -import static android.net.wifi.WifiInfo.SECURITY_TYPE_PSK; -import static android.net.wifi.WifiInfo.SECURITY_TYPE_WEP; -import static android.net.wifi.sharedconnectivity.app.HotspotNetwork.NETWORK_TYPE_CELLULAR; -import static android.net.wifi.sharedconnectivity.app.HotspotNetwork.NETWORK_TYPE_WIFI; -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_PHONE; -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_TABLET; - -import static com.google.common.truth.Truth.assertThat; - -import static org.junit.Assert.assertThrows; - -import android.os.Bundle; -import android.os.Parcel; -import android.util.ArraySet; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.Arrays; - -/** - * Unit tests for {@link HotspotNetwork}. - */ -@SmallTest -@RunWith(AndroidJUnit4.class) -public class HotspotNetworkTest { - private static final long DEVICE_ID = 11L; - private static final NetworkProviderInfo NETWORK_PROVIDER_INFO = - new NetworkProviderInfo.Builder("TEST_NAME", "TEST_MODEL") - .setDeviceType(DEVICE_TYPE_TABLET).setConnectionStrength(2) - .setBatteryPercentage(50).build(); - private static final int NETWORK_TYPE = NETWORK_TYPE_CELLULAR; - private static final String NETWORK_NAME = "TEST_NETWORK"; - private static final String HOTSPOT_SSID = "TEST_SSID"; - private static final String HOTSPOT_BSSID = "TEST _BSSID"; - private static final int[] HOTSPOT_SECURITY_TYPES = {SECURITY_TYPE_WEP, SECURITY_TYPE_EAP}; - private static final String BUNDLE_KEY = "INT-KEY"; - private static final int BUNDLE_VALUE = 1; - - private static final long DEVICE_ID_1 = 111L; - private static final NetworkProviderInfo NETWORK_PROVIDER_INFO1 = - new NetworkProviderInfo.Builder("TEST_NAME", "TEST_MODEL") - .setDeviceType(DEVICE_TYPE_PHONE).setConnectionStrength(2) - .setBatteryPercentage(50).build(); - private static final int NETWORK_TYPE_1 = NETWORK_TYPE_WIFI; - private static final String NETWORK_NAME_1 = "TEST_NETWORK1"; - private static final String HOTSPOT_SSID_1 = "TEST_SSID1"; - private static final String HOTSPOT_BSSID_1 = "TEST _BSSID1"; - private static final int[] HOTSPOT_SECURITY_TYPES_1 = {SECURITY_TYPE_PSK, SECURITY_TYPE_EAP}; - - /** - * Verifies parcel serialization/deserialization. - */ - @Test - public void testParcelOperation() { - HotspotNetwork network = buildHotspotNetworkBuilder(true).build(); - - Parcel parcelW = Parcel.obtain(); - network.writeToParcel(parcelW, 0); - byte[] bytes = parcelW.marshall(); - parcelW.recycle(); - - Parcel parcelR = Parcel.obtain(); - parcelR.unmarshall(bytes, 0, bytes.length); - parcelR.setDataPosition(0); - HotspotNetwork fromParcel = HotspotNetwork.CREATOR.createFromParcel(parcelR); - - assertThat(fromParcel).isEqualTo(network); - assertThat(fromParcel.hashCode()).isEqualTo(network.hashCode()); - } - - /** - * Verifies the Equals operation - */ - @Test - public void testEqualsOperation() { - HotspotNetwork network1 = buildHotspotNetworkBuilder(true).build(); - HotspotNetwork network2 = buildHotspotNetworkBuilder(true).build(); - assertThat(network1).isEqualTo(network2); - - HotspotNetwork.Builder builder = buildHotspotNetworkBuilder(true).setDeviceId(DEVICE_ID_1); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildHotspotNetworkBuilder(true).setNetworkProviderInfo(NETWORK_PROVIDER_INFO1); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildHotspotNetworkBuilder(true).setHostNetworkType(NETWORK_TYPE_1); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildHotspotNetworkBuilder(true).setNetworkName(NETWORK_NAME_1); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildHotspotNetworkBuilder(true).setHotspotSsid(HOTSPOT_SSID_1); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildHotspotNetworkBuilder(true).setHotspotBssid(HOTSPOT_BSSID_1); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildHotspotNetworkBuilder(true); - HotspotNetwork.Builder builder1 = buildHotspotNetworkBuilder(true); - Arrays.stream(HOTSPOT_SECURITY_TYPES_1).forEach(builder1::addHotspotSecurityType); - - assertThat(builder1.build()).isNotEqualTo(builder.build()); - } - - /** - * Verifies the get methods return the expected data. - */ - @Test - public void testGetMethods() { - HotspotNetwork network = buildHotspotNetworkBuilder(true).build(); - ArraySet<Integer> securityTypes = new ArraySet<>(); - Arrays.stream(HOTSPOT_SECURITY_TYPES).forEach(securityTypes::add); - - assertThat(network.getDeviceId()).isEqualTo(DEVICE_ID); - assertThat(network.getNetworkProviderInfo()).isEqualTo(NETWORK_PROVIDER_INFO); - assertThat(network.getHostNetworkType()).isEqualTo(NETWORK_TYPE); - assertThat(network.getNetworkName()).isEqualTo(NETWORK_NAME); - assertThat(network.getHotspotSsid()).isEqualTo(HOTSPOT_SSID); - assertThat(network.getHotspotBssid()).isEqualTo(HOTSPOT_BSSID); - assertThat(network.getHotspotSecurityTypes()).containsExactlyElementsIn(securityTypes); - assertThat(network.getExtras().getInt(BUNDLE_KEY)).isEqualTo(BUNDLE_VALUE); - } - - @Test - public void testHashCode() { - HotspotNetwork network1 = buildHotspotNetworkBuilder(true).build(); - HotspotNetwork network2 = buildHotspotNetworkBuilder(true).build(); - - assertThat(network1.hashCode()).isEqualTo(network2.hashCode()); - } - - @Test - public void networkProviderInfoNotSet_shouldThrowException() { - Exception e = assertThrows(IllegalArgumentException.class, - () -> buildHotspotNetworkBuilder(false).build()); - assertThat(e.getMessage()).contains("NetworkProviderInfo"); - } - - private HotspotNetwork.Builder buildHotspotNetworkBuilder(boolean withNetworkProviderInfo) { - HotspotNetwork.Builder builder = new HotspotNetwork.Builder() - .setDeviceId(DEVICE_ID) - .setHostNetworkType(NETWORK_TYPE) - .setNetworkName(NETWORK_NAME) - .setHotspotSsid(HOTSPOT_SSID) - .setHotspotBssid(HOTSPOT_BSSID) - .setExtras(buildBundle()); - Arrays.stream(HOTSPOT_SECURITY_TYPES).forEach(builder::addHotspotSecurityType); - if (withNetworkProviderInfo) { - builder.setNetworkProviderInfo(NETWORK_PROVIDER_INFO); - } - return builder; - } - - private Bundle buildBundle() { - Bundle bundle = new Bundle(); - bundle.putInt(BUNDLE_KEY, BUNDLE_VALUE); - return bundle; - } -} diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatusTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatusTest.java deleted file mode 100644 index f98a0fcc7574..000000000000 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatusTest.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.wifi.sharedconnectivity.app; - -import static android.net.wifi.WifiInfo.SECURITY_TYPE_WEP; -import static android.net.wifi.sharedconnectivity.app.KnownNetwork.NETWORK_SOURCE_NEARBY_SELF; -import static android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.CONNECTION_STATUS_SAVED; -import static android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.CONNECTION_STATUS_SAVE_FAILED; -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_TABLET; - -import static com.google.common.truth.Truth.assertThat; - -import android.os.Bundle; -import android.os.Parcel; - -import androidx.test.filters.SmallTest; - -import org.junit.Test; - -import java.util.Arrays; - -/** - * Unit tests for {@link KnownNetworkConnectionStatus}. - */ -@SmallTest -public class KnownNetworkConnectionStatusTest { - private static final int NETWORK_SOURCE = NETWORK_SOURCE_NEARBY_SELF; - private static final String SSID = "TEST_SSID"; - private static final int[] SECURITY_TYPES = {SECURITY_TYPE_WEP}; - private static final NetworkProviderInfo NETWORK_PROVIDER_INFO = - new NetworkProviderInfo.Builder("TEST_NAME", "TEST_MODEL") - .setDeviceType(DEVICE_TYPE_TABLET).setConnectionStrength(2) - .setBatteryPercentage(50).build(); - private static final String SSID_1 = "TEST_SSID1"; - private static final String BUNDLE_KEY = "INT-KEY"; - private static final int BUNDLE_VALUE = 1; - - /** - * Verifies parcel serialization/deserialization. - */ - @Test - public void testParcelOperation() { - KnownNetworkConnectionStatus status = buildConnectionStatusBuilder().build(); - - Parcel parcelW = Parcel.obtain(); - status.writeToParcel(parcelW, 0); - byte[] bytes = parcelW.marshall(); - parcelW.recycle(); - - Parcel parcelR = Parcel.obtain(); - parcelR.unmarshall(bytes, 0, bytes.length); - parcelR.setDataPosition(0); - KnownNetworkConnectionStatus fromParcel = - KnownNetworkConnectionStatus.CREATOR.createFromParcel(parcelR); - - assertThat(fromParcel).isEqualTo(status); - assertThat(fromParcel.hashCode()).isEqualTo(status.hashCode()); - } - - /** - * Verifies the Equals operation - */ - @Test - public void testEqualsOperation() { - KnownNetworkConnectionStatus status1 = buildConnectionStatusBuilder().build(); - KnownNetworkConnectionStatus status2 = buildConnectionStatusBuilder().build(); - assertThat(status1).isEqualTo(status2); - - KnownNetworkConnectionStatus.Builder builder = buildConnectionStatusBuilder() - .setStatus(CONNECTION_STATUS_SAVE_FAILED); - assertThat(builder.build()).isNotEqualTo(status1); - - builder = buildConnectionStatusBuilder() - .setKnownNetwork(buildKnownNetworkBuilder().setSsid(SSID_1).build()); - assertThat(builder.build()).isNotEqualTo(status1); - } - - /** - * Verifies the get methods return the expected data. - */ - @Test - public void testGetMethods() { - KnownNetworkConnectionStatus status = buildConnectionStatusBuilder().build(); - assertThat(status.getStatus()).isEqualTo(CONNECTION_STATUS_SAVED); - assertThat(status.getKnownNetwork()).isEqualTo(buildKnownNetworkBuilder().build()); - assertThat(status.getExtras().getInt(BUNDLE_KEY)).isEqualTo(BUNDLE_VALUE); - } - - @Test - public void testHashCode() { - KnownNetworkConnectionStatus status1 = buildConnectionStatusBuilder().build(); - KnownNetworkConnectionStatus status2 = buildConnectionStatusBuilder().build(); - - assertThat(status1.hashCode()).isEqualTo(status2.hashCode()); - } - - private KnownNetworkConnectionStatus.Builder buildConnectionStatusBuilder() { - return new KnownNetworkConnectionStatus.Builder() - .setStatus(CONNECTION_STATUS_SAVED) - .setKnownNetwork(buildKnownNetworkBuilder().build()) - .setExtras(buildBundle()); - } - - private Bundle buildBundle() { - Bundle bundle = new Bundle(); - bundle.putInt(BUNDLE_KEY, BUNDLE_VALUE); - return bundle; - } - - private KnownNetwork.Builder buildKnownNetworkBuilder() { - KnownNetwork.Builder builder = new KnownNetwork.Builder().setNetworkSource(NETWORK_SOURCE) - .setSsid(SSID).setNetworkProviderInfo(NETWORK_PROVIDER_INFO); - Arrays.stream(SECURITY_TYPES).forEach(builder::addSecurityType); - return builder; - } - -} diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkTest.java deleted file mode 100644 index 81d7b44382e0..000000000000 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkTest.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.wifi.sharedconnectivity.app; - -import static android.net.wifi.WifiInfo.SECURITY_TYPE_PSK; -import static android.net.wifi.WifiInfo.SECURITY_TYPE_WEP; -import static android.net.wifi.sharedconnectivity.app.KnownNetwork.NETWORK_SOURCE_CLOUD_SELF; -import static android.net.wifi.sharedconnectivity.app.KnownNetwork.NETWORK_SOURCE_NEARBY_SELF; -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_PHONE; -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_TABLET; - -import static com.google.common.truth.Truth.assertThat; - -import android.os.Bundle; -import android.os.Parcel; -import android.util.ArraySet; - -import androidx.test.filters.SmallTest; - -import org.junit.Test; - -import java.util.Arrays; - -/** - * Unit tests for {@link KnownNetwork}. - */ -@SmallTest -public class KnownNetworkTest { - - private static final int NETWORK_SOURCE = NETWORK_SOURCE_NEARBY_SELF; - private static final String SSID = "TEST_SSID"; - private static final int[] SECURITY_TYPES = {SECURITY_TYPE_WEP}; - private static final NetworkProviderInfo NETWORK_PROVIDER_INFO = - new NetworkProviderInfo.Builder("TEST_NAME", "TEST_MODEL") - .setDeviceType(DEVICE_TYPE_TABLET).setConnectionStrength(2) - .setBatteryPercentage(50).build(); - private static final String BUNDLE_KEY = "INT-KEY"; - private static final int BUNDLE_VALUE = 1; - - private static final int NETWORK_SOURCE_1 = NETWORK_SOURCE_CLOUD_SELF; - private static final String SSID_1 = "TEST_SSID1"; - private static final int[] SECURITY_TYPES_1 = {SECURITY_TYPE_PSK}; - private static final NetworkProviderInfo NETWORK_PROVIDER_INFO1 = - new NetworkProviderInfo.Builder("TEST_NAME_1", "TEST_MODEL_1") - .setDeviceType(DEVICE_TYPE_PHONE).setConnectionStrength(3) - .setBatteryPercentage(33).build(); - - /** - * Verifies parcel serialization/deserialization. - */ - @Test - public void testParcelOperation() { - KnownNetwork network = buildKnownNetworkBuilder().build(); - - Parcel parcelW = Parcel.obtain(); - network.writeToParcel(parcelW, 0); - byte[] bytes = parcelW.marshall(); - parcelW.recycle(); - - Parcel parcelR = Parcel.obtain(); - parcelR.unmarshall(bytes, 0, bytes.length); - parcelR.setDataPosition(0); - KnownNetwork fromParcel = KnownNetwork.CREATOR.createFromParcel(parcelR); - - assertThat(fromParcel).isEqualTo(network); - assertThat(fromParcel.hashCode()).isEqualTo(network.hashCode()); - } - - /** - * Verifies the Equals operation - */ - @Test - public void testEqualsOperation() { - KnownNetwork network1 = buildKnownNetworkBuilder().build(); - KnownNetwork network2 = buildKnownNetworkBuilder().build(); - assertThat(network1).isEqualTo(network2); - - KnownNetwork.Builder builder = buildKnownNetworkBuilder() - .setNetworkSource(NETWORK_SOURCE_1); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildKnownNetworkBuilder().setSsid(SSID_1); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildKnownNetworkBuilder(); - Arrays.stream(SECURITY_TYPES_1).forEach(builder::addSecurityType); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildKnownNetworkBuilder().setNetworkProviderInfo(NETWORK_PROVIDER_INFO1); - assertThat(builder.build()).isNotEqualTo(network1); - } - - /** - * Verifies the get methods return the expected data. - */ - @Test - public void testGetMethods() { - KnownNetwork network = buildKnownNetworkBuilder().build(); - ArraySet<Integer> securityTypes = new ArraySet<>(); - Arrays.stream(SECURITY_TYPES).forEach(securityTypes::add); - - assertThat(network.getNetworkSource()).isEqualTo(NETWORK_SOURCE); - assertThat(network.getSsid()).isEqualTo(SSID); - assertThat(network.getSecurityTypes()).containsExactlyElementsIn(securityTypes); - assertThat(network.getNetworkProviderInfo()).isEqualTo(NETWORK_PROVIDER_INFO); - assertThat(network.getExtras().getInt(BUNDLE_KEY)).isEqualTo(BUNDLE_VALUE); - } - - @Test - public void testHashCode() { - KnownNetwork network1 = buildKnownNetworkBuilder().build(); - KnownNetwork network2 = buildKnownNetworkBuilder().build(); - - assertThat(network1.hashCode()).isEqualTo(network2.hashCode()); - } - - private KnownNetwork.Builder buildKnownNetworkBuilder() { - KnownNetwork.Builder builder = new KnownNetwork.Builder().setNetworkSource(NETWORK_SOURCE) - .setSsid(SSID).setNetworkProviderInfo(NETWORK_PROVIDER_INFO) - .setExtras(buildBundle()); - Arrays.stream(SECURITY_TYPES).forEach(builder::addSecurityType); - return builder; - } - - private Bundle buildBundle() { - Bundle bundle = new Bundle(); - bundle.putInt(BUNDLE_KEY, BUNDLE_VALUE); - return bundle; - } -} diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/NetworkProviderInfoTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/NetworkProviderInfoTest.java deleted file mode 100644 index 4aa9ca684ad0..000000000000 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/NetworkProviderInfoTest.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.wifi.sharedconnectivity.app; - -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_LAPTOP; -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_PHONE; - -import static com.google.common.truth.Truth.assertThat; - -import android.os.Bundle; -import android.os.Parcel; - -import androidx.test.filters.SmallTest; - -import org.junit.Test; - -/** - * Unit tests for {@link NetworkProviderInfo}. - */ -@SmallTest -public class NetworkProviderInfoTest { - - private static final int DEVICE_TYPE = DEVICE_TYPE_PHONE; - private static final String DEVICE_NAME = "TEST_NAME"; - private static final String DEVICE_MODEL = "TEST_MODEL"; - private static final int BATTERY_PERCENTAGE = 50; - private static final int CONNECTION_STRENGTH = 2; - private static final String BUNDLE_KEY = "INT-KEY"; - private static final int BUNDLE_VALUE = 1; - - private static final int DEVICE_TYPE_1 = DEVICE_TYPE_LAPTOP; - private static final String DEVICE_NAME_1 = "TEST_NAME1"; - private static final String DEVICE_MODEL_1 = "TEST_MODEL1"; - private static final int BATTERY_PERCENTAGE_1 = 30; - private static final int CONNECTION_STRENGTH_1 = 1; - - /** - * Verifies parcel serialization/deserialization. - */ - @Test - public void testParcelOperation() { - NetworkProviderInfo info = buildNetworkProviderInfoBuilder().build(); - - Parcel parcelW = Parcel.obtain(); - info.writeToParcel(parcelW, 0); - byte[] bytes = parcelW.marshall(); - parcelW.recycle(); - - Parcel parcelR = Parcel.obtain(); - parcelR.unmarshall(bytes, 0, bytes.length); - parcelR.setDataPosition(0); - NetworkProviderInfo fromParcel = NetworkProviderInfo.CREATOR.createFromParcel(parcelR); - - assertThat(fromParcel).isEqualTo(info); - assertThat(fromParcel.hashCode()).isEqualTo(info.hashCode()); - } - - /** - * Verifies the Equals operation - */ - @Test - public void testEqualsOperation() { - NetworkProviderInfo info1 = buildNetworkProviderInfoBuilder().build(); - NetworkProviderInfo info2 = buildNetworkProviderInfoBuilder().build(); - assertThat(info1).isEqualTo(info2); - - NetworkProviderInfo.Builder builder = buildNetworkProviderInfoBuilder().setDeviceType( - DEVICE_TYPE_1); - assertThat(builder.build()).isNotEqualTo(info1); - - builder = buildNetworkProviderInfoBuilder().setDeviceName(DEVICE_NAME_1); - assertThat(builder.build()).isNotEqualTo(info1); - - builder = buildNetworkProviderInfoBuilder().setModelName(DEVICE_MODEL_1); - assertThat(builder.build()).isNotEqualTo(info1); - - builder = buildNetworkProviderInfoBuilder() - .setBatteryPercentage(BATTERY_PERCENTAGE_1); - assertThat(builder.build()).isNotEqualTo(info1); - - builder = buildNetworkProviderInfoBuilder() - .setConnectionStrength(CONNECTION_STRENGTH_1); - assertThat(builder.build()).isNotEqualTo(info1); - } - - /** - * Verifies the get methods return the expected data. - */ - @Test - public void testGetMethods() { - NetworkProviderInfo info = buildNetworkProviderInfoBuilder().build(); - assertThat(info.getDeviceType()).isEqualTo(DEVICE_TYPE); - assertThat(info.getDeviceName()).isEqualTo(DEVICE_NAME); - assertThat(info.getModelName()).isEqualTo(DEVICE_MODEL); - assertThat(info.getBatteryPercentage()).isEqualTo(BATTERY_PERCENTAGE); - assertThat(info.getConnectionStrength()).isEqualTo(CONNECTION_STRENGTH); - assertThat(info.getExtras().getInt(BUNDLE_KEY)).isEqualTo(BUNDLE_VALUE); - } - - @Test - public void testHashCode() { - NetworkProviderInfo info1 = buildNetworkProviderInfoBuilder().build(); - NetworkProviderInfo info2 = buildNetworkProviderInfoBuilder().build(); - - assertThat(info1.hashCode()).isEqualTo(info2.hashCode()); - } - - private NetworkProviderInfo.Builder buildNetworkProviderInfoBuilder() { - return new NetworkProviderInfo.Builder(DEVICE_NAME, DEVICE_MODEL).setDeviceType(DEVICE_TYPE) - .setBatteryPercentage(BATTERY_PERCENTAGE) - .setConnectionStrength(CONNECTION_STRENGTH) - .setExtras(buildBundle()); - } - - private Bundle buildBundle() { - Bundle bundle = new Bundle(); - bundle.putInt(BUNDLE_KEY, BUNDLE_VALUE); - return bundle; - } -} diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManagerTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManagerTest.java deleted file mode 100644 index a03a6c2fc673..000000000000 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManagerTest.java +++ /dev/null @@ -1,566 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.wifi.sharedconnectivity.app; - -import static android.net.wifi.WifiInfo.SECURITY_TYPE_EAP; -import static android.net.wifi.WifiInfo.SECURITY_TYPE_WEP; -import static android.net.wifi.sharedconnectivity.app.HotspotNetwork.NETWORK_TYPE_CELLULAR; -import static android.net.wifi.sharedconnectivity.app.KnownNetwork.NETWORK_SOURCE_NEARBY_SELF; -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_TABLET; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.content.res.Resources; -import android.net.wifi.sharedconnectivity.service.ISharedConnectivityService; -import android.os.Bundle; -import android.os.RemoteException; - -import androidx.test.filters.SmallTest; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.Executor; - -/** - * Unit tests for {@link SharedConnectivityManager}. - */ -@SmallTest -public class SharedConnectivityManagerTest { - private static final long DEVICE_ID = 11L; - private static final NetworkProviderInfo NETWORK_PROVIDER_INFO = - new NetworkProviderInfo.Builder("TEST_NAME", "TEST_MODEL") - .setDeviceType(DEVICE_TYPE_TABLET).setConnectionStrength(2) - .setBatteryPercentage(50).build(); - private static final int NETWORK_TYPE = NETWORK_TYPE_CELLULAR; - private static final String NETWORK_NAME = "TEST_NETWORK"; - private static final String HOTSPOT_SSID = "TEST_SSID"; - private static final int[] HOTSPOT_SECURITY_TYPES = {SECURITY_TYPE_WEP, SECURITY_TYPE_EAP}; - - private static final int NETWORK_SOURCE = NETWORK_SOURCE_NEARBY_SELF; - private static final String SSID = "TEST_SSID"; - private static final int[] SECURITY_TYPES = {SECURITY_TYPE_WEP}; - - private static final String SERVICE_PACKAGE_NAME = "TEST_PACKAGE"; - private static final String SERVICE_INTENT_ACTION = "TEST_INTENT_ACTION"; - - - @Mock - Context mContext; - @Mock - ISharedConnectivityService mService; - @Mock - Executor mExecutor; - @Mock - SharedConnectivityClientCallback mClientCallback, mClientCallback2; - @Mock - Resources mResources; - @Mock - ISharedConnectivityService.Stub mIBinder; - - private static final ComponentName COMPONENT_NAME = - new ComponentName("dummypkg", "dummycls"); - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - setResources(mContext); - } - - @Test - public void resourcesNotDefined_createShouldReturnNull() { - when(mResources.getString(anyInt())).thenThrow(new Resources.NotFoundException()); - - assertThat(SharedConnectivityManager.create(mContext)).isNull(); - } - - @Test - public void resourceStringsAreEmpty_createShouldReturnNull() { - when(mResources.getString(anyInt())).thenReturn(""); - - assertThat(SharedConnectivityManager.create(mContext)).isNull(); - } - - @Test - public void bindingToServiceOnFirstCallbackRegistration() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.registerCallback(mExecutor, mClientCallback); - - verify(mContext).bindService(any(Intent.class), any(ServiceConnection.class), anyInt()); - } - - @Test - public void bindIsCalledOnceOnMultipleCallbackRegistrations() throws Exception { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - - manager.registerCallback(mExecutor, mClientCallback); - verify(mContext, times(1)).bindService(any(Intent.class), any(ServiceConnection.class), - anyInt()); - - manager.registerCallback(mExecutor, mClientCallback2); - verify(mContext, times(1)).bindService(any(Intent.class), any(ServiceConnection.class), - anyInt()); - } - - @Test - public void unbindIsCalledOnLastCallbackUnregistrations() throws Exception { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - - manager.registerCallback(mExecutor, mClientCallback); - manager.registerCallback(mExecutor, mClientCallback2); - manager.unregisterCallback(mClientCallback); - verify(mContext, never()).unbindService( - any(ServiceConnection.class)); - - manager.unregisterCallback(mClientCallback2); - verify(mContext, times(1)).unbindService( - any(ServiceConnection.class)); - } - - @Test - public void registerCallback_serviceNotConnected_canUnregisterAndReregister() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - - manager.registerCallback(mExecutor, mClientCallback); - manager.unregisterCallback(mClientCallback); - manager.registerCallback(mExecutor, mClientCallback); - - verify(mClientCallback, never()).onRegisterCallbackFailed(any(Exception.class)); - } - - @Test - public void registerCallback_serviceConnected() throws Exception { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - manager.registerCallback(mExecutor, mClientCallback); - - verify(mService).registerCallback(any()); - verify(mClientCallback, never()).onRegisterCallbackFailed(any(Exception.class)); - } - - @Test - public void registerCallback_doubleRegistration_shouldFail() throws Exception { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - manager.registerCallback(mExecutor, mClientCallback); - manager.registerCallback(mExecutor, mClientCallback); - - verify(mClientCallback).onRegisterCallbackFailed(any(IllegalStateException.class)); - } - - @Test - public void registerCallback_remoteException_shouldFail() throws Exception { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).registerCallback(any()); - - manager.registerCallback(mExecutor, mClientCallback); - - verify(mClientCallback).onRegisterCallbackFailed(any(RemoteException.class)); - } - - @Test - public void unregisterCallback_withoutRegisteringFirst_serviceNotConnected_shouldFail() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.unregisterCallback(mClientCallback)).isFalse(); - } - - @Test - public void unregisterCallback_withoutRegisteringFirst_serviceConnected_shouldFail() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - assertThat(manager.unregisterCallback(mClientCallback)).isFalse(); - } - - @Test - public void unregisterCallback() throws Exception { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - manager.registerCallback(mExecutor, mClientCallback); - - assertThat(manager.unregisterCallback(mClientCallback)).isTrue(); - verify(mService).unregisterCallback(any()); - } - - @Test - public void unregisterCallback_doubleUnregistration_serviceConnected_shouldFail() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - manager.registerCallback(mExecutor, mClientCallback); - manager.unregisterCallback(mClientCallback); - - assertThat(manager.unregisterCallback(mClientCallback)).isFalse(); - } - - @Test - public void unregisterCallback_doubleUnregistration_serviceNotConnected_shouldFail() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - manager.registerCallback(mExecutor, mClientCallback); - manager.unregisterCallback(mClientCallback); - - assertThat(manager.unregisterCallback(mClientCallback)).isFalse(); - } - - @Test - public void unregisterCallback_remoteException_shouldFail() throws Exception { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - doThrow(new RemoteException()).when(mService).unregisterCallback(any()); - - assertThat(manager.unregisterCallback(mClientCallback)).isFalse(); - } - - @Test - public void onServiceConnected() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - - manager.registerCallback(mExecutor, mClientCallback); - manager.getServiceConnection().onServiceConnected(COMPONENT_NAME, mIBinder); - - verify(mClientCallback).onServiceConnected(); - } - - @Test - public void onServiceDisconnected() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - - manager.registerCallback(mExecutor, mClientCallback); - manager.getServiceConnection().onServiceConnected(COMPONENT_NAME, mIBinder); - manager.getServiceConnection().onServiceDisconnected(COMPONENT_NAME); - - verify(mClientCallback).onServiceDisconnected(); - } - - - @Test - public void connectHotspotNetwork_serviceNotConnected_shouldFail() { - HotspotNetwork network = buildHotspotNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.connectHotspotNetwork(network)).isFalse(); - } - - @Test - public void connectHotspotNetwork() throws RemoteException { - HotspotNetwork network = buildHotspotNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - manager.connectHotspotNetwork(network); - - verify(mService).connectHotspotNetwork(network); - } - - @Test - public void connectHotspotNetwork_remoteException_shouldFail() throws RemoteException { - HotspotNetwork network = buildHotspotNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).connectHotspotNetwork(network); - - assertThat(manager.connectHotspotNetwork(network)).isFalse(); - } - - @Test - public void disconnectHotspotNetwork_serviceNotConnected_shouldFail() { - HotspotNetwork network = buildHotspotNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.disconnectHotspotNetwork(network)).isFalse(); - } - - @Test - public void disconnectHotspotNetwork() throws RemoteException { - HotspotNetwork network = buildHotspotNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - manager.disconnectHotspotNetwork(network); - - verify(mService).disconnectHotspotNetwork(network); - } - - @Test - public void disconnectHotspotNetwork_remoteException_shouldFail() throws RemoteException { - HotspotNetwork network = buildHotspotNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).disconnectHotspotNetwork(any()); - - assertThat(manager.disconnectHotspotNetwork(network)).isFalse(); - } - - @Test - public void connectKnownNetwork_serviceNotConnected_shouldFail() throws RemoteException { - KnownNetwork network = buildKnownNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.connectKnownNetwork(network)).isFalse(); - } - - @Test - public void connectKnownNetwork() throws RemoteException { - KnownNetwork network = buildKnownNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - manager.connectKnownNetwork(network); - - verify(mService).connectKnownNetwork(network); - } - - @Test - public void connectKnownNetwork_remoteException_shouldFail() throws RemoteException { - KnownNetwork network = buildKnownNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).connectKnownNetwork(network); - - assertThat(manager.connectKnownNetwork(network)).isFalse(); - } - - @Test - public void forgetKnownNetwork_serviceNotConnected_shouldFail() { - KnownNetwork network = buildKnownNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.forgetKnownNetwork(network)).isFalse(); - } - - @Test - public void forgetKnownNetwork_serviceConnected() throws RemoteException { - KnownNetwork network = buildKnownNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - manager.forgetKnownNetwork(network); - - verify(mService).forgetKnownNetwork(network); - } - - @Test - public void forgetKnownNetwork_remoteException_shouldFail() throws RemoteException { - KnownNetwork network = buildKnownNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).forgetKnownNetwork(network); - - assertThat(manager.forgetKnownNetwork(network)).isFalse(); - } - - @Test - public void getHotspotNetworks_serviceNotConnected_shouldReturnNull() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.getHotspotNetworks()).isNull(); - } - - @Test - public void getHotspotNetworks_remoteException_shouldReturnNull() throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).getHotspotNetworks(); - - assertThat(manager.getHotspotNetworks()).isNull(); - } - - @Test - public void getHotspotNetworks_shouldReturnNetworksList() throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - List<HotspotNetwork> networks = List.of(buildHotspotNetwork()); - manager.setService(mService); - when(mService.getHotspotNetworks()).thenReturn(networks); - - assertThat(manager.getHotspotNetworks()).containsExactly(buildHotspotNetwork()); - } - - @Test - public void getKnownNetworks_serviceNotConnected_shouldReturnNull() - throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.getKnownNetworks()).isNull(); - } - - @Test - public void getKnownNetworks_remoteException_shouldReturnNull() throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).getKnownNetworks(); - - assertThat(manager.getKnownNetworks()).isNull(); - } - - @Test - public void getKnownNetworks_shouldReturnNetworksList() throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - List<KnownNetwork> networks = List.of(buildKnownNetwork()); - manager.setService(mService); - when(mService.getKnownNetworks()).thenReturn(networks); - - assertThat(manager.getKnownNetworks()).containsExactly(buildKnownNetwork()); - } - - @Test - public void getSettingsState_serviceNotConnected_shouldReturnNull() throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.getSettingsState()).isNull(); - } - - @Test - public void getSettingsState_remoteException_shouldReturnNull() throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).getSettingsState(); - - assertThat(manager.getSettingsState()).isNull(); - } - - @Test - public void getSettingsState_serviceConnected_shouldReturnState() throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - SharedConnectivitySettingsState state = - new SharedConnectivitySettingsState.Builder().setInstantTetherEnabled(true) - .setExtras(new Bundle()).build(); - manager.setService(mService); - when(mService.getSettingsState()).thenReturn(state); - - assertThat(manager.getSettingsState()).isEqualTo(state); - } - - @Test - public void getHotspotNetworkConnectionStatus_serviceNotConnected_shouldReturnNull() - throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.getHotspotNetworkConnectionStatus()).isNull(); - } - - @Test - public void getHotspotNetworkConnectionStatus_remoteException_shouldReturnNull() - throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).getHotspotNetworkConnectionStatus(); - - assertThat(manager.getHotspotNetworkConnectionStatus()).isNull(); - } - - @Test - public void getHotspotNetworkConnectionStatus_serviceConnected_shouldReturnStatus() - throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - HotspotNetworkConnectionStatus status = new HotspotNetworkConnectionStatus.Builder() - .setStatus(HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT) - .setExtras(new Bundle()).build(); - manager.setService(mService); - when(mService.getHotspotNetworkConnectionStatus()).thenReturn(status); - - assertThat(manager.getHotspotNetworkConnectionStatus()).isEqualTo(status); - } - - @Test - public void getKnownNetworkConnectionStatus_serviceNotConnected_shouldReturnNull() - throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.getKnownNetworkConnectionStatus()).isNull(); - } - - @Test - public void getKnownNetworkConnectionStatus_remoteException_shouldReturnNull() - throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).getKnownNetworkConnectionStatus(); - - assertThat(manager.getKnownNetworkConnectionStatus()).isNull(); - } - - @Test - public void getKnownNetworkConnectionStatus_serviceConnected_shouldReturnStatus() - throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - KnownNetworkConnectionStatus status = new KnownNetworkConnectionStatus.Builder() - .setStatus(KnownNetworkConnectionStatus.CONNECTION_STATUS_SAVED) - .setExtras(new Bundle()).build(); - manager.setService(mService); - when(mService.getKnownNetworkConnectionStatus()).thenReturn(status); - - assertThat(manager.getKnownNetworkConnectionStatus()).isEqualTo(status); - } - - private void setResources(@Mock Context context) { - when(context.getResources()).thenReturn(mResources); - when(mResources.getString(anyInt())) - .thenReturn(SERVICE_PACKAGE_NAME, SERVICE_INTENT_ACTION); - } - - private HotspotNetwork buildHotspotNetwork() { - HotspotNetwork.Builder builder = new HotspotNetwork.Builder() - .setDeviceId(DEVICE_ID) - .setNetworkProviderInfo(NETWORK_PROVIDER_INFO) - .setHostNetworkType(NETWORK_TYPE) - .setNetworkName(NETWORK_NAME) - .setHotspotSsid(HOTSPOT_SSID); - Arrays.stream(HOTSPOT_SECURITY_TYPES).forEach(builder::addHotspotSecurityType); - return builder.build(); - } - - private KnownNetwork buildKnownNetwork() { - KnownNetwork.Builder builder = new KnownNetwork.Builder().setNetworkSource(NETWORK_SOURCE) - .setSsid(SSID).setNetworkProviderInfo(NETWORK_PROVIDER_INFO); - Arrays.stream(SECURITY_TYPES).forEach(builder::addSecurityType); - return builder.build(); - } -} diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsStateTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsStateTest.java deleted file mode 100644 index d6e7138dee2c..000000000000 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsStateTest.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.wifi.sharedconnectivity.app; - -import static com.google.common.truth.Truth.assertThat; - -import static org.junit.Assert.assertThrows; - -import android.app.PendingIntent; -import android.content.ComponentName; -import android.content.Intent; -import android.os.Parcel; - -import androidx.test.core.app.ApplicationProvider; -import androidx.test.filters.SmallTest; - -import org.junit.Test; - -/** - * Unit tests for {@link SharedConnectivitySettingsState}. - */ -@SmallTest -public class SharedConnectivitySettingsStateTest { - private static final boolean INSTANT_TETHER_STATE = true; - private static final String INTENT_ACTION = "instant.tether.settings"; - - private static final boolean INSTANT_TETHER_STATE_1 = false; - private static final String INTENT_ACTION_1 = "instant.tether.settings1"; - - @Test - public void pendingIntentMutable_buildShouldThrow() { - SharedConnectivitySettingsState.Builder builder = - new SharedConnectivitySettingsState.Builder() - .setInstantTetherEnabled(INSTANT_TETHER_STATE) - .setInstantTetherSettingsPendingIntent(PendingIntent.getActivity( - ApplicationProvider.getApplicationContext(), 0, - new Intent(INTENT_ACTION).setComponent(new ComponentName( - "com.test.package", "TestClass")), - PendingIntent.FLAG_MUTABLE)); - - Exception e = assertThrows(IllegalArgumentException.class, builder::build); - assertThat(e.getMessage()).contains("Pending intent must be immutable"); - } - - @Test - public void parcelOperation() { - SharedConnectivitySettingsState state = buildSettingsStateBuilder(INTENT_ACTION).build(); - - Parcel parcel = Parcel.obtain(); - state.writeToParcel(parcel, 0); - parcel.setDataPosition(0); - SharedConnectivitySettingsState fromParcel = - SharedConnectivitySettingsState.CREATOR.createFromParcel(parcel); - - assertThat(fromParcel).isEqualTo(state); - assertThat(fromParcel.hashCode()).isEqualTo(state.hashCode()); - } - - @Test - public void equalsOperation() { - SharedConnectivitySettingsState state1 = buildSettingsStateBuilder(INTENT_ACTION).build(); - SharedConnectivitySettingsState state2 = buildSettingsStateBuilder(INTENT_ACTION).build(); - assertThat(state1).isEqualTo(state2); - - SharedConnectivitySettingsState.Builder builder = buildSettingsStateBuilder(INTENT_ACTION) - .setInstantTetherEnabled(INSTANT_TETHER_STATE_1); - assertThat(builder.build()).isNotEqualTo(state1); - - builder = buildSettingsStateBuilder(INTENT_ACTION_1); - assertThat(builder.build()).isNotEqualTo(state1); - } - - @Test - public void getMethods() { - SharedConnectivitySettingsState state = buildSettingsStateBuilder(INTENT_ACTION).build(); - - assertThat(state.isInstantTetherEnabled()).isEqualTo(INSTANT_TETHER_STATE); - assertThat(state.getInstantTetherSettingsPendingIntent()) - .isEqualTo(buildPendingIntent(INTENT_ACTION)); - } - - @Test - public void hashCodeCalculation() { - SharedConnectivitySettingsState state1 = buildSettingsStateBuilder(INTENT_ACTION).build(); - SharedConnectivitySettingsState state2 = buildSettingsStateBuilder(INTENT_ACTION).build(); - - assertThat(state1.hashCode()).isEqualTo(state2.hashCode()); - } - - private SharedConnectivitySettingsState.Builder buildSettingsStateBuilder(String intentAction) { - return new SharedConnectivitySettingsState.Builder() - .setInstantTetherEnabled(INSTANT_TETHER_STATE) - .setInstantTetherSettingsPendingIntent(buildPendingIntent(intentAction)); - } - - private PendingIntent buildPendingIntent(String intentAction) { - return PendingIntent.getActivity( - ApplicationProvider.getApplicationContext(), 0, - new Intent(intentAction), PendingIntent.FLAG_IMMUTABLE); - } -} |