diff options
310 files changed, 2889 insertions, 1236 deletions
diff --git a/core/java/android/app/IUiAutomationConnection.aidl b/core/java/android/app/IUiAutomationConnection.aidl index fbb0748fc01f..63cae63e1e50 100644 --- a/core/java/android/app/IUiAutomationConnection.aidl +++ b/core/java/android/app/IUiAutomationConnection.aidl @@ -24,6 +24,8 @@ import android.view.SurfaceControl; import android.view.WindowContentFrameStats; import android.view.WindowAnimationFrameStats; import android.os.ParcelFileDescriptor; +import android.window.ScreenCapture.ScreenCaptureListener; +import android.window.ScreenCapture.LayerCaptureArgs; import java.util.List; @@ -43,8 +45,8 @@ interface IUiAutomationConnection { void injectInputEventToInputFilter(in InputEvent event); void syncInputTransactions(boolean waitForAnimations); boolean setRotation(int rotation); - Bitmap takeScreenshot(in Rect crop); - Bitmap takeSurfaceControlScreenshot(in SurfaceControl surfaceControl); + boolean takeScreenshot(in Rect crop, in ScreenCaptureListener listener); + boolean takeSurfaceControlScreenshot(in SurfaceControl surfaceControl, in ScreenCaptureListener listener); boolean clearWindowContentFrameStats(int windowId); WindowContentFrameStats getWindowContentFrameStats(int windowId); void clearWindowAnimationFrameStats(); diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 785470f2f22e..79b68c1456c7 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -571,6 +571,12 @@ public class NotificationManager { */ public static final int BUBBLE_PREFERENCE_SELECTED = 2; + /** + * Maximum length of the component name of a registered NotificationListenerService. + * @hide + */ + public static int MAX_SERVICE_COMPONENT_NAME_LENGTH = 500; + @UnsupportedAppUsage private static INotificationManager sService; diff --git a/core/java/android/app/TaskInfo.java b/core/java/android/app/TaskInfo.java index c4e49954f745..2b5175ca6659 100644 --- a/core/java/android/app/TaskInfo.java +++ b/core/java/android/app/TaskInfo.java @@ -242,6 +242,18 @@ public class TaskInfo { public boolean isLetterboxDoubleTapEnabled; /** + * Whether the user aspect ratio settings button is enabled + * @hide + */ + public boolean topActivityEligibleForUserAspectRatioButton; + + /** + * Hint about the letterbox state of the top activity. + * @hide + */ + public boolean topActivityBoundsLetterboxed; + + /** * Whether the update comes from a letterbox double-tap action from the user or not. * @hide */ @@ -460,7 +472,8 @@ public class TaskInfo { public boolean hasCompatUI() { return hasCameraCompatControl() || topActivityInSizeCompat || topActivityEligibleForLetterboxEducation - || isLetterboxDoubleTapEnabled; + || isLetterboxDoubleTapEnabled + || topActivityEligibleForUserAspectRatioButton; } /** @@ -510,6 +523,8 @@ public class TaskInfo { && supportsMultiWindow == that.supportsMultiWindow && displayAreaFeatureId == that.displayAreaFeatureId && isFromLetterboxDoubleTap == that.isFromLetterboxDoubleTap + && topActivityEligibleForUserAspectRatioButton + == that.topActivityEligibleForUserAspectRatioButton && topActivityLetterboxVerticalPosition == that.topActivityLetterboxVerticalPosition && topActivityLetterboxWidth == that.topActivityLetterboxWidth && topActivityLetterboxHeight == that.topActivityLetterboxHeight @@ -543,6 +558,8 @@ public class TaskInfo { && taskId == that.taskId && topActivityInSizeCompat == that.topActivityInSizeCompat && isFromLetterboxDoubleTap == that.isFromLetterboxDoubleTap + && topActivityEligibleForUserAspectRatioButton + == that.topActivityEligibleForUserAspectRatioButton && topActivityEligibleForLetterboxEducation == that.topActivityEligibleForLetterboxEducation && topActivityLetterboxVerticalPosition == that.topActivityLetterboxVerticalPosition @@ -606,6 +623,8 @@ public class TaskInfo { displayAreaFeatureId = source.readInt(); cameraCompatControlState = source.readInt(); isLetterboxDoubleTapEnabled = source.readBoolean(); + topActivityEligibleForUserAspectRatioButton = source.readBoolean(); + topActivityBoundsLetterboxed = source.readBoolean(); isFromLetterboxDoubleTap = source.readBoolean(); topActivityLetterboxVerticalPosition = source.readInt(); topActivityLetterboxHorizontalPosition = source.readInt(); @@ -660,6 +679,8 @@ public class TaskInfo { dest.writeInt(displayAreaFeatureId); dest.writeInt(cameraCompatControlState); dest.writeBoolean(isLetterboxDoubleTapEnabled); + dest.writeBoolean(topActivityEligibleForUserAspectRatioButton); + dest.writeBoolean(topActivityBoundsLetterboxed); dest.writeBoolean(isFromLetterboxDoubleTap); dest.writeInt(topActivityLetterboxVerticalPosition); dest.writeInt(topActivityLetterboxHorizontalPosition); @@ -701,8 +722,11 @@ public class TaskInfo { + " topActivityInSizeCompat=" + topActivityInSizeCompat + " topActivityEligibleForLetterboxEducation= " + topActivityEligibleForLetterboxEducation - + " topActivityLetterboxed= " + isLetterboxDoubleTapEnabled - + " isFromDoubleTap= " + isFromLetterboxDoubleTap + + " isLetterboxDoubleTapEnabled= " + isLetterboxDoubleTapEnabled + + " topActivityEligibleForUserAspectRatioButton= " + + topActivityEligibleForUserAspectRatioButton + + " topActivityBoundsLetterboxed= " + topActivityBoundsLetterboxed + + " isFromLetterboxDoubleTap= " + isFromLetterboxDoubleTap + " topActivityLetterboxVerticalPosition= " + topActivityLetterboxVerticalPosition + " topActivityLetterboxHorizontalPosition= " + topActivityLetterboxHorizontalPosition diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java index 247d5bc77ffb..c3d26d49c93a 100644 --- a/core/java/android/app/UiAutomation.java +++ b/core/java/android/app/UiAutomation.java @@ -37,6 +37,7 @@ import android.graphics.Bitmap; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Region; +import android.hardware.HardwareBuffer; import android.hardware.display.DisplayManagerGlobal; import android.os.Build; import android.os.Handler; @@ -71,6 +72,8 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityWindowInfo; import android.view.accessibility.IAccessibilityInteractionConnection; import android.view.inputmethod.EditorInfo; +import android.window.ScreenCapture; +import android.window.ScreenCapture.ScreenshotHardwareBuffer; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; @@ -1160,17 +1163,12 @@ public final class UiAutomation { Point displaySize = new Point(); display.getRealSize(displaySize); - int rotation = display.getRotation(); - // Take the screenshot - Bitmap screenShot = null; + ScreenCapture.SynchronousScreenCaptureListener syncScreenCapture = + ScreenCapture.createSyncCaptureListener(); try { - // Calling out without a lock held. - screenShot = mUiAutomationConnection.takeScreenshot( - new Rect(0, 0, displaySize.x, displaySize.y)); - if (screenShot == null) { - Log.e(LOG_TAG, "mUiAutomationConnection.takeScreenshot() returned null for display " - + mDisplayId); + if (!mUiAutomationConnection.takeScreenshot( + new Rect(0, 0, displaySize.x, displaySize.y), syncScreenCapture)) { return null; } } catch (RemoteException re) { @@ -1178,10 +1176,23 @@ public final class UiAutomation { return null; } - // Optimization - screenShot.setHasAlpha(false); + final ScreenshotHardwareBuffer screenshotBuffer = + syncScreenCapture.getBuffer(); + Bitmap screenShot = screenshotBuffer.asBitmap(); + if (screenShot == null) { + Log.e(LOG_TAG, "mUiAutomationConnection.takeScreenshot() returned null for display " + + mDisplayId); + return null; + } + Bitmap swBitmap; + try (HardwareBuffer buffer = screenshotBuffer.getHardwareBuffer()) { + swBitmap = screenShot.copy(Bitmap.Config.ARGB_8888, false); + } + screenShot.recycle(); - return screenShot; + // Optimization + swBitmap.setHasAlpha(false); + return swBitmap; } /** @@ -1218,12 +1229,27 @@ public final class UiAutomation { // Apply a sync transaction to ensure SurfaceFlinger is flushed before capturing a // screenshot. new SurfaceControl.Transaction().apply(true); + ScreenCapture.SynchronousScreenCaptureListener syncScreenCapture = + ScreenCapture.createSyncCaptureListener(); try { - return mUiAutomationConnection.takeSurfaceControlScreenshot(sc); + if (!mUiAutomationConnection.takeSurfaceControlScreenshot(sc, syncScreenCapture)) { + return null; + } + } catch (RemoteException re) { Log.e(LOG_TAG, "Error while taking screenshot!", re); return null; } + ScreenCapture.ScreenshotHardwareBuffer captureBuffer = + syncScreenCapture.getBuffer(); + Bitmap screenShot = captureBuffer.asBitmap(); + Bitmap swBitmap; + try (HardwareBuffer buffer = captureBuffer.getHardwareBuffer()) { + swBitmap = screenShot.copy(Bitmap.Config.ARGB_8888, false); + } + + screenShot.recycle(); + return swBitmap; } /** diff --git a/core/java/android/app/UiAutomationConnection.java b/core/java/android/app/UiAutomationConnection.java index 34f0964cf823..52949d6d1fbd 100644 --- a/core/java/android/app/UiAutomationConnection.java +++ b/core/java/android/app/UiAutomationConnection.java @@ -25,7 +25,6 @@ import android.annotation.Nullable; import android.annotation.UserIdInt; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; -import android.graphics.Bitmap; import android.graphics.Rect; import android.hardware.input.InputManager; import android.hardware.input.InputManagerGlobal; @@ -51,8 +50,6 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.IAccessibilityManager; import android.window.ScreenCapture; import android.window.ScreenCapture.CaptureArgs; -import android.window.ScreenCapture.ScreenshotHardwareBuffer; -import android.window.ScreenCapture.SynchronousScreenCaptureListener; import libcore.io.IoUtils; @@ -224,56 +221,54 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub { } @Override - public Bitmap takeScreenshot(Rect crop) { + public boolean takeScreenshot(Rect crop, ScreenCapture.ScreenCaptureListener listener) { synchronized (mLock) { throwIfCalledByNotTrustedUidLocked(); throwIfShutdownLocked(); throwIfNotConnectedLocked(); } + final long identity = Binder.clearCallingIdentity(); try { final CaptureArgs captureArgs = new CaptureArgs.Builder<>() .setSourceCrop(crop) .build(); - SynchronousScreenCaptureListener syncScreenCapture = - ScreenCapture.createSyncCaptureListener(); - mWindowManager.captureDisplay(DEFAULT_DISPLAY, captureArgs, - syncScreenCapture); - final ScreenshotHardwareBuffer screenshotBuffer = - syncScreenCapture.getBuffer(); - return screenshotBuffer == null ? null : screenshotBuffer.asBitmap(); + mWindowManager.captureDisplay(DEFAULT_DISPLAY, captureArgs, listener); } catch (RemoteException re) { re.rethrowAsRuntimeException(); } finally { Binder.restoreCallingIdentity(identity); } - return null; + + return true; } @Nullable @Override - public Bitmap takeSurfaceControlScreenshot(@NonNull SurfaceControl surfaceControl) { + public boolean takeSurfaceControlScreenshot(@NonNull SurfaceControl surfaceControl, + ScreenCapture.ScreenCaptureListener listener) { synchronized (mLock) { throwIfCalledByNotTrustedUidLocked(); throwIfShutdownLocked(); throwIfNotConnectedLocked(); } - ScreenCapture.ScreenshotHardwareBuffer captureBuffer; final long identity = Binder.clearCallingIdentity(); try { - captureBuffer = ScreenCapture.captureLayers( + ScreenCapture.LayerCaptureArgs args = new ScreenCapture.LayerCaptureArgs.Builder(surfaceControl) - .setChildrenOnly(false) - .build()); + .setChildrenOnly(false) + .build(); + int status = ScreenCapture.captureLayers(args, listener); + + if (status != 0) { + return false; + } } finally { Binder.restoreCallingIdentity(identity); } - if (captureBuffer == null) { - return null; - } - return captureBuffer.asBitmap(); + return true; } @Override diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 5d076d487b30..6d82922484bc 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -1413,7 +1413,7 @@ public abstract class Context { * </ul> * <p> * If a shared storage device is emulated (as determined by - * {@link Environment#isExternalStorageEmulated(File)}), it's contents are + * {@link Environment#isExternalStorageEmulated(File)}), its contents are * backed by a private user data partition, which means there is little * benefit to storing data here instead of the private directories returned * by {@link #getFilesDir()}, etc. @@ -1501,7 +1501,7 @@ public abstract class Context { * </ul> * <p> * If a shared storage device is emulated (as determined by - * {@link Environment#isExternalStorageEmulated(File)}), it's contents are + * {@link Environment#isExternalStorageEmulated(File)}), its contents are * backed by a private user data partition, which means there is little * benefit to storing data here instead of the private directories returned * by {@link #getFilesDir()}, etc. @@ -1812,7 +1812,7 @@ public abstract class Context { * </ul> * <p> * If a shared storage device is emulated (as determined by - * {@link Environment#isExternalStorageEmulated(File)}), it's contents are + * {@link Environment#isExternalStorageEmulated(File)}), its contents are * backed by a private user data partition, which means there is little * benefit to storing data here instead of the private directory returned by * {@link #getCacheDir()}. diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index 85f8ca66715b..a098362f16aa 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -67,6 +67,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.concurrent.Executor; @@ -178,22 +179,20 @@ public final class CameraManager { boolean folded = ArrayUtils.contains(mFoldedDeviceStates, state); mFoldedDeviceState = folded; - ArrayList<WeakReference<DeviceStateListener>> invalidListeners = new ArrayList<>(); - for (WeakReference<DeviceStateListener> listener : mDeviceStateListeners) { - DeviceStateListener callback = listener.get(); + Iterator<WeakReference<DeviceStateListener>> it = mDeviceStateListeners.iterator(); + while(it.hasNext()) { + DeviceStateListener callback = it.next().get(); if (callback != null) { callback.onDeviceStateChanged(folded); } else { - invalidListeners.add(listener); + it.remove(); } } - if (!invalidListeners.isEmpty()) { - mDeviceStateListeners.removeAll(invalidListeners); - } } public synchronized void addDeviceStateListener(DeviceStateListener listener) { listener.onDeviceStateChanged(mFoldedDeviceState); + mDeviceStateListeners.removeIf(l -> l.get() == null); mDeviceStateListeners.add(new WeakReference<>(listener)); } diff --git a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java index 65d4b433f132..7e3acdbb3ed5 100644 --- a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java @@ -526,7 +526,11 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes synchronized (mInterfaceLock) { if (mInitialized) { try { - mCaptureSession.stopRepeating(); + try { + mCaptureSession.stopRepeating(); + } catch (IllegalStateException e) { + // OK: already be closed, nothing else to do + } mSessionProcessor.stopRepeating(); mSessionProcessor.onCaptureSessionEnd(); mSessionClosed = true; diff --git a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java index 9ebef0b59ece..9e95d4968d31 100644 --- a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java @@ -111,6 +111,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { private int mPreviewProcessorType = IPreviewExtenderImpl.PROCESSOR_TYPE_NONE; private boolean mInitialized; + private boolean mSessionClosed; // Enable/Disable internal preview/(repeating request). Extensions expect // that preview/(repeating request) is enabled and active at any point in time. // In case the client doesn't explicitly enable repeating requests, the framework @@ -278,6 +279,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { mHandlerThread.start(); mHandler = new Handler(mHandlerThread.getLooper()); mInitialized = false; + mSessionClosed = false; mInitializeHandler = new InitializeSessionHandler(); mSessionId = sessionId; mSupportedRequestKeys = requestKeys; @@ -775,7 +777,12 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { synchronized (mInterfaceLock) { if (mInitialized) { mInternalRepeatingRequestEnabled = false; - mCaptureSession.stopRepeating(); + try { + mCaptureSession.stopRepeating(); + } catch (IllegalStateException e) { + // OK: already be closed, nothing else to do + mSessionClosed = true; + } ArrayList<CaptureStageImpl> captureStageList = new ArrayList<>(); try { @@ -793,13 +800,14 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { Log.e(TAG, "Failed to disable extension! Extension service does not " + "respond!"); } - if (!captureStageList.isEmpty()) { + if (!captureStageList.isEmpty() && !mSessionClosed) { CaptureRequest disableRequest = createRequest(mCameraDevice, captureStageList, mCameraRepeatingSurface, CameraDevice.TEMPLATE_PREVIEW); mCaptureSession.capture(disableRequest, new CloseRequestHandler(mRepeatingRequestImageCallback), mHandler); } + mSessionClosed = true; mStatsAggregator.commit(/*isFinal*/true); // Commit stats before closing session mCaptureSession.close(); } @@ -854,6 +862,11 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { mHandlerThread.quit(); try { + if (!mSessionClosed) { + // return value is omitted. nothing can do after session is closed. + mPreviewExtender.onDisableSession(); + mImageExtender.onDisableSession(); + } mPreviewExtender.onDeInit(); mImageExtender.onDeInit(); } catch (RemoteException e) { diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index 2f9c2073cd38..a9c4818393a8 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -52,6 +52,8 @@ import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; import static android.view.WindowInsets.Type.navigationBars; import static android.view.WindowInsets.Type.statusBars; +import static java.lang.annotation.RetentionPolicy.SOURCE; + import android.annotation.AnyThread; import android.annotation.CallSuper; import android.annotation.DrawableRes; @@ -158,7 +160,6 @@ import com.android.internal.inputmethod.InputMethodNavButtonFlags; import com.android.internal.inputmethod.InputMethodPrivilegedOperations; import com.android.internal.inputmethod.InputMethodPrivilegedOperationsRegistry; import com.android.internal.inputmethod.SoftInputShowHideReason; -import com.android.internal.util.Preconditions; import com.android.internal.util.RingBuffer; import org.xmlpull.v1.XmlPullParserException; @@ -481,53 +482,43 @@ public class InputMethodService extends AbstractInputMethodService { public static final int BACK_DISPOSITION_ADJUST_NOTHING = 3; /** - * Enum values to be used for {@link #setBackDisposition(int)}. + * Enum flag to be used for {@link #setBackDisposition(int)}. * * @hide */ - @IntDef(prefix = { "BACK_DISPOSITION_" }, value = { - BACK_DISPOSITION_DEFAULT, - BACK_DISPOSITION_WILL_NOT_DISMISS, - BACK_DISPOSITION_WILL_DISMISS, - BACK_DISPOSITION_ADJUST_NOTHING, - }) - @Retention(RetentionPolicy.SOURCE) + @Retention(SOURCE) + @IntDef(value = {BACK_DISPOSITION_DEFAULT, BACK_DISPOSITION_WILL_NOT_DISMISS, + BACK_DISPOSITION_WILL_DISMISS, BACK_DISPOSITION_ADJUST_NOTHING}, + prefix = "BACK_DISPOSITION_") public @interface BackDispositionMode {} /** - * Enum flags to be used for {@link #setImeWindowStatus}, representing the current state of the - * IME window visibility. - * * @hide + * The IME is active. It may or may not be visible. */ - @IntDef(flag = true, prefix = { "IME_" }, value = { - IME_ACTIVE, - IME_VISIBLE, - IME_VISIBLE_IMPERCEPTIBLE, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface ImeWindowVisibility {} + public static final int IME_ACTIVE = 0x1; /** - * The IME is active. It may or may not be visible. * @hide + * The IME is perceptibly visible to the user. */ - public static final int IME_ACTIVE = 0x1; + public static final int IME_VISIBLE = 0x2; /** - * The IME is perceptibly visible to the user. * @hide + * The IME is active and ready with views but set invisible. + * This flag cannot be combined with {@link #IME_VISIBLE}. */ - public static final int IME_VISIBLE = 0x2; + public static final int IME_INVISIBLE = 0x4; /** + * @hide * The IME is visible, but not yet perceptible to the user (e.g. fading in) * by {@link android.view.WindowInsetsController}. * * @see InputMethodManager#reportPerceptible - * @hide */ - public static final int IME_VISIBLE_IMPERCEPTIBLE = 0x4; + public static final int IME_VISIBLE_IMPERCEPTIBLE = 0x8; // Min and max values for back disposition. private static final int BACK_DISPOSITION_MIN = BACK_DISPOSITION_DEFAULT; @@ -640,18 +631,9 @@ public class InputMethodService extends AbstractInputMethodService { int mStatusIcon; - /** - * Latest value reported of back disposition mode. - */ @BackDispositionMode int mBackDisposition; - /** - * Latest value reported of IME window visibility flags. - */ - @ImeWindowVisibility - private int mImeWindowVisibility; - private Object mLock = new Object(); @GuardedBy("mLock") private boolean mNotifyUserActionSent; @@ -1228,14 +1210,8 @@ public class InputMethodService extends AbstractInputMethodService { mImeSurfaceRemoverRunnable = null; } - private void setImeWindowStatus(@ImeWindowVisibility int vis, - @BackDispositionMode int backDisposition) { - if (vis == mImeWindowVisibility && backDisposition == mBackDisposition) { - return; - } - mImeWindowVisibility = Preconditions.checkFlagsArgument(vis, IME_ACTIVE | IME_VISIBLE); - mBackDisposition = backDisposition; - mPrivOps.setImeWindowStatusAsync(mImeWindowVisibility, mBackDisposition); + private void setImeWindowStatus(int visibilityFlags, int backDisposition) { + mPrivOps.setImeWindowStatusAsync(visibilityFlags, backDisposition); } /** Set region of the keyboard to be avoided from back gesture */ @@ -1909,11 +1885,15 @@ public class InputMethodService extends AbstractInputMethodService { * @param disposition disposition mode to be set */ public void setBackDisposition(@BackDispositionMode int disposition) { - if (disposition < BACK_DISPOSITION_MIN || disposition > BACK_DISPOSITION_MAX) { + if (disposition == mBackDisposition) { + return; + } + if (disposition > BACK_DISPOSITION_MAX || disposition < BACK_DISPOSITION_MIN) { Log.e(TAG, "Invalid back disposition value (" + disposition + ") specified."); return; } - setImeWindowStatus(mImeWindowVisibility, disposition); + mBackDisposition = disposition; + setImeWindowStatus(mapToImeWindowStatus(), mBackDisposition); } /** @@ -2887,8 +2867,14 @@ public class InputMethodService extends AbstractInputMethodService { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.showWindow"); mDecorViewWasVisible = mDecorViewVisible; mInShowWindow = true; + final int previousImeWindowStatus = + (mDecorViewVisible ? IME_ACTIVE : 0) | (isInputViewShown() + ? (!mWindowVisible ? IME_INVISIBLE : IME_VISIBLE) : 0); startViews(prepareWindow(showInput)); - setImeWindowStatus(mapToImeWindowStatus(), mBackDisposition); + final int nextImeWindowStatus = mapToImeWindowStatus(); + if (previousImeWindowStatus != nextImeWindowStatus) { + setImeWindowStatus(nextImeWindowStatus, mBackDisposition); + } mNavigationBarController.onWindowShown(); // compute visibility @@ -4099,9 +4085,9 @@ public class InputMethodService extends AbstractInputMethodService { }; } - @ImeWindowVisibility private int mapToImeWindowStatus() { - return IME_ACTIVE | (mDecorViewVisible ? IME_VISIBLE : 0); + return IME_ACTIVE + | (isInputViewShown() ? IME_VISIBLE : 0); } private boolean isAutomotive() { diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index c9073fa4b72c..e6bdfe1b95c4 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -116,6 +116,8 @@ public class GraphicsEnvironment { private static final String ANGLE_GL_DRIVER_CHOICE_ANGLE = "angle"; private static final String ANGLE_GL_DRIVER_CHOICE_NATIVE = "native"; + private static final String PROPERTY_RO_ANGLE_SUPPORTED = "ro.gfx.angle.supported"; + private ClassLoader mClassLoader; private String mLibrarySearchPaths; private String mLibraryPermittedPaths; @@ -501,10 +503,12 @@ public class GraphicsEnvironment { final List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, PackageManager.MATCH_SYSTEM_ONLY); if (resolveInfos.size() != 1) { - Log.e(TAG, "Invalid number of ANGLE packages. Required: 1, Found: " + Log.v(TAG, "Invalid number of ANGLE packages. Required: 1, Found: " + resolveInfos.size()); - for (ResolveInfo resolveInfo : resolveInfos) { - Log.e(TAG, "Found ANGLE package: " + resolveInfo.activityInfo.packageName); + if (DEBUG) { + for (ResolveInfo resolveInfo : resolveInfos) { + Log.d(TAG, "Found ANGLE package: " + resolveInfo.activityInfo.packageName); + } } return ""; } @@ -539,26 +543,42 @@ public class GraphicsEnvironment { } /** - * Determine whether ANGLE should be used, set it up if so, and pass ANGLE details down to - * the C++ GraphicsEnv class. + * Determine whether ANGLE should be used, attempt to set up from apk first, if ANGLE can be + * set up from apk, pass ANGLE details down to the C++ GraphicsEnv class via + * GraphicsEnv::setAngleInfo(). If apk setup fails, attempt to set up to use system ANGLE. + * Return false if both fail. * - * If ANGLE will be used, GraphicsEnv::setAngleInfo() will be called to enable ANGLE to be - * properly used. - * - * @param context - * @param bundle - * @param pm + * @param context - Context of the application. + * @param bundle - Bundle of the application. + * @param packageManager - PackageManager of the application process. * @param packageName - package name of the application. - * @return true: ANGLE setup successfully - * false: ANGLE not setup (not on allowlist, ANGLE not present, etc.) + * @return true: can set up to use ANGLE successfully. + * false: can not set up to use ANGLE (not on allowlist, ANGLE not present, etc.) */ - private boolean setupAngle(Context context, Bundle bundle, PackageManager pm, + private boolean setupAngle(Context context, Bundle bundle, PackageManager packageManager, String packageName) { if (!shouldUseAngle(context, bundle, packageName)) { return false; } + return setupAngleFromApk(context, bundle, packageManager, packageName) + || setupAngleFromSystem(context, bundle, packageName); + } + + /** + * Attempt to set up ANGLE from the packaged apk, if the apk can be found, pass ANGLE details to + * the C++ GraphicsEnv class. + * + * @param context - Context of the application. + * @param bundle - Bundle of the application. + * @param packageManager - PackageManager of the application process. + * @param packageName - package name of the application. + * @return true: can set up to use ANGLE apk. + * false: can not set up to use ANGLE apk (ANGLE apk not present, etc.) + */ + private boolean setupAngleFromApk(Context context, Bundle bundle, PackageManager packageManager, + String packageName) { ApplicationInfo angleInfo = null; // If the developer has specified a debug package over ADB, attempt to find it @@ -567,7 +587,7 @@ public class GraphicsEnvironment { Log.v(TAG, "ANGLE debug package enabled: " + anglePkgName); try { // Note the debug package does not have to be pre-installed - angleInfo = pm.getApplicationInfo(anglePkgName, 0); + angleInfo = packageManager.getApplicationInfo(anglePkgName, 0); } catch (PackageManager.NameNotFoundException e) { // If the debug package is specified but not found, abort. Log.v(TAG, "ANGLE debug package '" + anglePkgName + "' not installed"); @@ -577,7 +597,7 @@ public class GraphicsEnvironment { // Otherwise, check to see if ANGLE is properly installed if (angleInfo == null) { - anglePkgName = getAnglePackageName(pm); + anglePkgName = getAnglePackageName(packageManager); if (TextUtils.isEmpty(anglePkgName)) { Log.v(TAG, "Failed to find ANGLE package."); return false; @@ -586,7 +606,7 @@ public class GraphicsEnvironment { Log.v(TAG, "ANGLE package enabled: " + anglePkgName); try { // Production ANGLE libraries must be pre-installed as a system app - angleInfo = pm.getApplicationInfo(anglePkgName, + angleInfo = packageManager.getApplicationInfo(anglePkgName, PackageManager.MATCH_SYSTEM_ONLY); } catch (PackageManager.NameNotFoundException e) { Log.v(TAG, "ANGLE package '" + anglePkgName + "' not installed"); @@ -610,8 +630,32 @@ public class GraphicsEnvironment { // If we make it to here, ANGLE will be used. Call setAngleInfo() with the package name, // and features to use. final String[] features = getAngleEglFeatures(context, bundle); - setAngleInfo(paths, packageName, ANGLE_GL_DRIVER_CHOICE_ANGLE, features); + setAngleInfo(paths, false, packageName, features); + + return true; + } + /** + * Attempt to set up ANGLE from system, if the apk can be found, pass ANGLE details to + * the C++ GraphicsEnv class. + * + * @param context - Context of the application. + * @param bundle - Bundle of the application. + * @param packageName - package name of the application. + * @return true: can set up to use system ANGLE. + * false: can not set up to use system ANGLE because it doesn't exist. + */ + private boolean setupAngleFromSystem(Context context, Bundle bundle, String packageName) { + final boolean systemAngleSupported = SystemProperties + .getBoolean(PROPERTY_RO_ANGLE_SUPPORTED, false); + if (!systemAngleSupported) { + return false; + } + + // If we make it to here, ANGLE will be used. Call setAngleInfo() with the package name, + // and features to use. + final String[] features = getAngleEglFeatures(context, bundle); + setAngleInfo("", true, packageName, features); return true; } @@ -651,7 +695,9 @@ public class GraphicsEnvironment { final Intent intent = new Intent(ACTION_ANGLE_FOR_ANDROID_TOAST_MESSAGE); final String anglePkg = getAnglePackageName(context.getPackageManager()); - intent.setPackage(anglePkg); + if (anglePkg.isEmpty()) { + return; + } context.sendOrderedBroadcast(intent, null, new BroadcastReceiver() { @Override @@ -890,8 +936,8 @@ public class GraphicsEnvironment { private static native void setDriverPathAndSphalLibraries(String path, String sphalLibraries); private static native void setGpuStats(String driverPackageName, String driverVersionName, long driverVersionCode, long driverBuildTime, String appPackageName, int vulkanVersion); - private static native void setAngleInfo(String path, String packageName, - String devOptIn, String[] features); + private static native void setAngleInfo(String path, boolean useSystemAngle, String packageName, + String[] features); private static native boolean setInjectLayersPrSetDumpable(); private static native void nativeToggleAngleAsSystemDriver(boolean enabled); diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 40b060ad0bbf..3f308e6fccee 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -2657,17 +2657,6 @@ public final class InputMethodManager { } } - if (windowGainingFocus == null) { - windowGainingFocus = view.getWindowToken(); - if (windowGainingFocus == null) { - Log.e(TAG, "ABORT input: ServedView must be attached to a Window"); - return false; - } - startInputFlags = getStartInputFlags(view, startInputFlags); - softInputMode = view.getViewRootImpl().mWindowAttributes.softInputMode; - windowFlags = view.getViewRootImpl().mWindowAttributes.flags; - } - // Now we need to get an input connection from the served view. // This is complicated in a couple ways: we can't be holding our lock // when calling out to the view, and we need to make sure we call into @@ -2690,6 +2679,17 @@ public final class InputMethodManager { return false; } + if (windowGainingFocus == null) { + windowGainingFocus = view.getWindowToken(); + if (windowGainingFocus == null) { + Log.e(TAG, "ABORT input: ServedView must be attached to a Window"); + return false; + } + startInputFlags = getStartInputFlags(view, startInputFlags); + softInputMode = view.getViewRootImpl().mWindowAttributes.softInputMode; + windowFlags = view.getViewRootImpl().mWindowAttributes.flags; + } + // Okay we are now ready to call into the served view and have it // do its stuff. // Life is good: let's hook everything up! diff --git a/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java b/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java index 1a3804900665..66e3333acf7c 100644 --- a/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java +++ b/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java @@ -20,7 +20,6 @@ import android.annotation.AnyThread; import android.annotation.DrawableRes; import android.annotation.NonNull; import android.annotation.Nullable; -import android.inputmethodservice.InputMethodService; import android.net.Uri; import android.os.IBinder; import android.os.RemoteException; @@ -106,10 +105,14 @@ public final class InputMethodPrivilegedOperations { * * @param vis visibility flags * @param backDisposition disposition flags + * @see android.inputmethodservice.InputMethodService#IME_ACTIVE + * @see android.inputmethodservice.InputMethodService#IME_VISIBLE + * @see android.inputmethodservice.InputMethodService#IME_INVISIBLE + * @see android.inputmethodservice.InputMethodService#BACK_DISPOSITION_DEFAULT + * @see android.inputmethodservice.InputMethodService#BACK_DISPOSITION_ADJUST_NOTHING */ @AnyThread - public void setImeWindowStatusAsync(@InputMethodService.ImeWindowVisibility int vis, - @InputMethodService.BackDispositionMode int backDisposition) { + public void setImeWindowStatusAsync(int vis, int backDisposition) { final IInputMethodPrivilegedOperations ops = mOps.getAndWarnIfNull(); if (ops == null) { return; diff --git a/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java b/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java index 8b9a9913183d..4f827cda6afa 100644 --- a/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java +++ b/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java @@ -16,7 +16,6 @@ package com.android.internal.statusbar; -import android.inputmethodservice.InputMethodService; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; @@ -32,9 +31,7 @@ public final class RegisterStatusBarResult implements Parcelable { public final int mDisabledFlags1; // switch[0] public final int mAppearance; // switch[1] public final AppearanceRegion[] mAppearanceRegions; // switch[2] - @InputMethodService.ImeWindowVisibility public final int mImeWindowVis; // switch[3] - @InputMethodService.BackDispositionMode public final int mImeBackDisposition; // switch[4] public final boolean mShowImeSwitcher; // switch[5] public final int mDisabledFlags2; // switch[6] @@ -47,12 +44,10 @@ public final class RegisterStatusBarResult implements Parcelable { public final LetterboxDetails[] mLetterboxDetails; public RegisterStatusBarResult(ArrayMap<String, StatusBarIcon> icons, int disabledFlags1, - int appearance, AppearanceRegion[] appearanceRegions, - @InputMethodService.ImeWindowVisibility int imeWindowVis, - @InputMethodService.BackDispositionMode int imeBackDisposition, boolean showImeSwitcher, - int disabledFlags2, IBinder imeToken, boolean navbarColorManagedByIme, int behavior, - int requestedVisibleTypes, String packageName, int transientBarTypes, - LetterboxDetails[] letterboxDetails) { + int appearance, AppearanceRegion[] appearanceRegions, int imeWindowVis, + int imeBackDisposition, boolean showImeSwitcher, int disabledFlags2, IBinder imeToken, + boolean navbarColorManagedByIme, int behavior, int requestedVisibleTypes, + String packageName, int transientBarTypes, LetterboxDetails[] letterboxDetails) { mIcons = new ArrayMap<>(icons); mDisabledFlags1 = disabledFlags1; mAppearance = appearance; diff --git a/core/jni/android_os_GraphicsEnvironment.cpp b/core/jni/android_os_GraphicsEnvironment.cpp index d94b9828808b..afc3cbd15f88 100644 --- a/core/jni/android_os_GraphicsEnvironment.cpp +++ b/core/jni/android_os_GraphicsEnvironment.cpp @@ -16,11 +16,12 @@ #define LOG_TAG "GraphicsEnvironment" -#include <vector> - #include <graphicsenv/GraphicsEnv.h> #include <nativehelper/ScopedUtfChars.h> #include <nativeloader/native_loader.h> + +#include <vector> + #include "core_jni_helpers.h" namespace { @@ -49,11 +50,10 @@ void setGpuStats_native(JNIEnv* env, jobject clazz, jstring driverPackageName, appPackageNameChars.c_str(), vulkanVersion); } -void setAngleInfo_native(JNIEnv* env, jobject clazz, jstring path, jstring packageName, - jstring devOptIn, jobjectArray featuresObj) { +void setAngleInfo_native(JNIEnv* env, jobject clazz, jstring path, jboolean useSystemAngle, + jstring packageName, jobjectArray featuresObj) { ScopedUtfChars pathChars(env, path); ScopedUtfChars packageNameChars(env, packageName); - ScopedUtfChars devOptInChars(env, devOptIn); std::vector<std::string> features; if (featuresObj != nullptr) { @@ -73,8 +73,8 @@ void setAngleInfo_native(JNIEnv* env, jobject clazz, jstring path, jstring packa } } - android::GraphicsEnv::getInstance().setAngleInfo(pathChars.c_str(), packageNameChars.c_str(), - devOptInChars.c_str(), features); + android::GraphicsEnv::getInstance().setAngleInfo(pathChars.c_str(), useSystemAngle, + packageNameChars.c_str(), features); } void setLayerPaths_native(JNIEnv* env, jobject clazz, jobject classLoader, jstring layerPaths) { @@ -118,8 +118,7 @@ const JNINativeMethod g_methods[] = { reinterpret_cast<void*>(setGpuStats_native)}, {"setInjectLayersPrSetDumpable", "()Z", reinterpret_cast<void*>(setInjectLayersPrSetDumpable_native)}, - {"setAngleInfo", - "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V", + {"setAngleInfo", "(Ljava/lang/String;ZLjava/lang/String;[Ljava/lang/String;)V", reinterpret_cast<void*>(setAngleInfo_native)}, {"setLayerPaths", "(Ljava/lang/ClassLoader;Ljava/lang/String;)V", reinterpret_cast<void*>(setLayerPaths_native)}, diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 04fef58e973e..f795bd7cc3fd 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -3792,7 +3792,7 @@ keyboard is connected --> <string name="show_ime">Keep it on screen while physical keyboard is active</string> <!-- Title of the physical keyboard category in the input method selector [CHAR LIMIT=30] --> - <string name="hardware">Show virtual keyboard</string> + <string name="hardware">Use on-screen keyboard</string> <!-- Title of the notification to prompt the user to configure physical keyboard settings. [CHAR LIMIT=NOTIF_TITLE] --> <string name="select_keyboard_layout_notification_title">Configure <xliff:g id="device_name" example="Foobar USB Keyboard">%s</xliff:g></string> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java index 24aaa9b75ebe..d6451d75a012 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java @@ -567,7 +567,16 @@ public class PipTransition extends PipTransitionController { mPipBoundsState.getDisplayBounds()); mFinishCallback = (wct, wctCB) -> { mPipOrganizer.onExitPipFinished(taskInfo); - if (!Transitions.SHELL_TRANSITIONS_ROTATION && toFullscreen) { + + // TODO(b/286346098): remove the OPEN app flicker completely + // not checking if we go to fullscreen helps avoid getting pip into an inconsistent + // state after the flicker occurs. This is a temp solution until flicker is removed. + if (!Transitions.SHELL_TRANSITIONS_ROTATION) { + // will help to debug the case when we are not exiting to fullscreen + if (!toFullscreen) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: startExitAnimation() not exiting to fullscreen", TAG); + } wct = wct != null ? wct : new WindowContainerTransaction(); wct.setBounds(pipTaskToken, null); mPipOrganizer.applyWindowingModeChangeOnExit(wct, TRANSITION_DIRECTION_LEAVE_PIP); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java index d8a88770072d..75659960bc32 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java @@ -27,6 +27,7 @@ import static android.view.WindowManager.TRANSIT_SLEEP; import static android.view.WindowManager.TRANSIT_TO_BACK; import static android.view.WindowManager.TRANSIT_TO_FRONT; import static android.view.WindowManager.fixScale; +import static android.window.TransitionInfo.FLAG_IS_BEHIND_STARTING_WINDOW; import static android.window.TransitionInfo.FLAG_IS_OCCLUDED; import static android.window.TransitionInfo.FLAG_IS_WALLPAPER; import static android.window.TransitionInfo.FLAG_MOVED_TO_TOP; @@ -728,11 +729,15 @@ public class Transitions implements RemoteCallable<Transitions>, final int changeSize = info.getChanges().size(); boolean taskChange = false; boolean transferStartingWindow = false; + int noAnimationBehindStartingWindow = 0; boolean allOccluded = changeSize > 0; for (int i = changeSize - 1; i >= 0; --i) { final TransitionInfo.Change change = info.getChanges().get(i); taskChange |= change.getTaskInfo() != null; transferStartingWindow |= change.hasFlags(FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT); + if (change.hasAllFlags(FLAG_IS_BEHIND_STARTING_WINDOW | FLAG_NO_ANIMATION)) { + noAnimationBehindStartingWindow++; + } if (!change.hasFlags(FLAG_IS_OCCLUDED)) { allOccluded = false; } @@ -740,9 +745,11 @@ public class Transitions implements RemoteCallable<Transitions>, // There does not need animation when: // A. Transfer starting window. Apply transfer starting window directly if there is no other // task change. Since this is an activity->activity situation, we can detect it by selecting - // transitions with only 2 changes where neither are tasks and one is a starting-window - // recipient. - if (!taskChange && transferStartingWindow && changeSize == 2 + // transitions with only 2 changes where + // 1. neither are tasks, and + // 2. one is a starting-window recipient, or all change is behind starting window. + if (!taskChange && (transferStartingWindow || noAnimationBehindStartingWindow == changeSize) + && changeSize == 2 // B. It's visibility change if the TRANSIT_TO_BACK/TO_FRONT happened when all // changes are underneath another change. || ((info.getType() == TRANSIT_TO_BACK || info.getType() == TRANSIT_TO_FRONT) diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SplitScreenUtils.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SplitScreenUtils.kt index 27eaa40ee49b..f4828f14d5ed 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SplitScreenUtils.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SplitScreenUtils.kt @@ -326,14 +326,14 @@ internal object SplitScreenUtils { dividerBar.drag( Point( if (dragToRight) { - displayBounds.width * 4 / 5 + displayBounds.right } else { - displayBounds.width * 1 / 5 + displayBounds.left }, if (dragToBottom) { - displayBounds.height * 4 / 5 + displayBounds.bottom } else { - displayBounds.height * 1 / 5 + displayBounds.top } ) ) diff --git a/libs/hwui/pipeline/skia/ShaderCache.cpp b/libs/hwui/pipeline/skia/ShaderCache.cpp index 00919dc3f22a..f71e7289bd37 100644 --- a/libs/hwui/pipeline/skia/ShaderCache.cpp +++ b/libs/hwui/pipeline/skia/ShaderCache.cpp @@ -79,7 +79,7 @@ bool ShaderCache::validateCache(const void* identity, ssize_t size) { void ShaderCache::initShaderDiskCache(const void* identity, ssize_t size) { ATRACE_NAME("initShaderDiskCache"); - std::lock_guard<std::mutex> lock(mMutex); + std::lock_guard lock(mMutex); // Emulators can switch between different renders either as part of config // or snapshot migration. Also, program binaries may not work well on some @@ -92,7 +92,7 @@ void ShaderCache::initShaderDiskCache(const void* identity, ssize_t size) { } void ShaderCache::setFilename(const char* filename) { - std::lock_guard<std::mutex> lock(mMutex); + std::lock_guard lock(mMutex); mFilename = filename; } @@ -104,7 +104,7 @@ BlobCache* ShaderCache::getBlobCacheLocked() { sk_sp<SkData> ShaderCache::load(const SkData& key) { ATRACE_NAME("ShaderCache::load"); size_t keySize = key.size(); - std::lock_guard<std::mutex> lock(mMutex); + std::lock_guard lock(mMutex); if (!mInitialized) { return nullptr; } @@ -181,13 +181,18 @@ void ShaderCache::saveToDiskLocked() { auto key = sIDKey; set(mBlobCache.get(), &key, sizeof(key), mIDHash.data(), mIDHash.size()); } + // The most straightforward way to make ownership shared + mMutex.unlock(); + mMutex.lock_shared(); mBlobCache->writeToFile(); + mMutex.unlock_shared(); + mMutex.lock(); } } void ShaderCache::store(const SkData& key, const SkData& data, const SkString& /*description*/) { ATRACE_NAME("ShaderCache::store"); - std::lock_guard<std::mutex> lock(mMutex); + std::lock_guard lock(mMutex); mNumShadersCachedInRam++; ATRACE_FORMAT("HWUI RAM cache: %d shaders", mNumShadersCachedInRam); @@ -229,7 +234,7 @@ void ShaderCache::store(const SkData& key, const SkData& data, const SkString& / mSavePending = true; std::thread deferredSaveThread([this]() { usleep(mDeferredSaveDelayMs * 1000); // milliseconds to microseconds - std::lock_guard<std::mutex> lock(mMutex); + std::lock_guard lock(mMutex); // Store file on disk if there a new shader or Vulkan pipeline cache size changed. if (mCacheDirty || mNewPipelineCacheSize != mOldPipelineCacheSize) { saveToDiskLocked(); @@ -245,11 +250,12 @@ void ShaderCache::store(const SkData& key, const SkData& data, const SkString& / void ShaderCache::onVkFrameFlushed(GrDirectContext* context) { { - std::lock_guard<std::mutex> lock(mMutex); - + mMutex.lock_shared(); if (!mInitialized || !mTryToStorePipelineCache) { + mMutex.unlock_shared(); return; } + mMutex.unlock_shared(); } mInStoreVkPipelineInProgress = true; context->storeVkPipelineCacheData(); diff --git a/libs/hwui/pipeline/skia/ShaderCache.h b/libs/hwui/pipeline/skia/ShaderCache.h index f5506d60f811..2f91c778b8a0 100644 --- a/libs/hwui/pipeline/skia/ShaderCache.h +++ b/libs/hwui/pipeline/skia/ShaderCache.h @@ -19,8 +19,10 @@ #include <GrContextOptions.h> #include <SkRefCnt.h> #include <cutils/compiler.h> +#include <ftl/shared_mutex.h> +#include <utils/Mutex.h> + #include <memory> -#include <mutex> #include <string> #include <vector> @@ -99,20 +101,20 @@ private: * this will do so, loading the serialized cache contents from disk if * possible. */ - BlobCache* getBlobCacheLocked(); + BlobCache* getBlobCacheLocked() REQUIRES(mMutex); /** * "validateCache" updates the cache to match the given identity. If the * cache currently has the wrong identity, all entries in the cache are cleared. */ - bool validateCache(const void* identity, ssize_t size); + bool validateCache(const void* identity, ssize_t size) REQUIRES(mMutex); /** - * "saveToDiskLocked" attemps to save the current contents of the cache to + * "saveToDiskLocked" attempts to save the current contents of the cache to * disk. If the identity hash exists, we will insert the identity hash into * the cache for next validation. */ - void saveToDiskLocked(); + void saveToDiskLocked() REQUIRES(mMutex); /** * "mInitialized" indicates whether the ShaderCache is in the initialized @@ -122,7 +124,7 @@ private: * the load and store methods will return without performing any cache * operations. */ - bool mInitialized = false; + bool mInitialized GUARDED_BY(mMutex) = false; /** * "mBlobCache" is the cache in which the key/value blob pairs are stored. It @@ -131,7 +133,7 @@ private: * The blob cache contains the Android build number. We treat version mismatches as an empty * cache (logic implemented in BlobCache::unflatten). */ - std::unique_ptr<FileBlobCache> mBlobCache; + std::unique_ptr<FileBlobCache> mBlobCache GUARDED_BY(mMutex); /** * "mFilename" is the name of the file for storing cache contents in between @@ -140,7 +142,7 @@ private: * empty string indicates that the cache should not be saved to or restored * from disk. */ - std::string mFilename; + std::string mFilename GUARDED_BY(mMutex); /** * "mIDHash" is the current identity hash for the cache validation. It is @@ -149,7 +151,7 @@ private: * indicates that cache validation is not performed, and the hash should * not be stored on disk. */ - std::vector<uint8_t> mIDHash; + std::vector<uint8_t> mIDHash GUARDED_BY(mMutex); /** * "mSavePending" indicates whether or not a deferred save operation is @@ -159,7 +161,7 @@ private: * contents to disk, unless mDeferredSaveDelayMs is 0 in which case saving * is disabled. */ - bool mSavePending = false; + bool mSavePending GUARDED_BY(mMutex) = false; /** * "mObservedBlobValueSize" is the maximum value size observed by the cache reading function. @@ -174,16 +176,16 @@ private: unsigned int mDeferredSaveDelayMs = 4 * 1000; /** - * "mMutex" is the mutex used to prevent concurrent access to the member + * "mMutex" is the shared mutex used to prevent concurrent access to the member * variables. It must be locked whenever the member variables are accessed. */ - mutable std::mutex mMutex; + mutable ftl::SharedMutex mMutex; /** * If set to "true", the next call to onVkFrameFlushed, will invoke * GrCanvas::storeVkPipelineCacheData. This does not guarantee that data will be stored on disk. */ - bool mTryToStorePipelineCache = true; + bool mTryToStorePipelineCache GUARDED_BY(mMutex) = true; /** * This flag is used by "ShaderCache::store" to distinguish between shader data and @@ -195,16 +197,16 @@ private: * "mNewPipelineCacheSize" has the size of the new Vulkan pipeline cache data. It is used * to prevent unnecessary disk writes, if the pipeline cache size has not changed. */ - size_t mNewPipelineCacheSize = -1; + size_t mNewPipelineCacheSize GUARDED_BY(mMutex) = -1; /** * "mOldPipelineCacheSize" has the size of the Vulkan pipeline cache data stored on disk. */ - size_t mOldPipelineCacheSize = -1; + size_t mOldPipelineCacheSize GUARDED_BY(mMutex) = -1; /** * "mCacheDirty" is true when there is new shader cache data, which is not saved to disk. */ - bool mCacheDirty = false; + bool mCacheDirty GUARDED_BY(mMutex) = false; /** * "sCache" is the singleton ShaderCache object. @@ -221,7 +223,7 @@ private: * interesting to keep track of how many shaders are stored in RAM. This * class provides a convenient entry point for that. */ - int mNumShadersCachedInRam = 0; + int mNumShadersCachedInRam GUARDED_BY(mMutex) = 0; friend class ShaderCacheTestUtils; // used for unit testing }; diff --git a/libs/hwui/tests/unit/ShaderCacheTests.cpp b/libs/hwui/tests/unit/ShaderCacheTests.cpp index 7bcd45c6b643..9aa2e1db4461 100644 --- a/libs/hwui/tests/unit/ShaderCacheTests.cpp +++ b/libs/hwui/tests/unit/ShaderCacheTests.cpp @@ -49,7 +49,7 @@ public: */ static void reinitializeAllFields(ShaderCache& cache) { ShaderCache newCache = ShaderCache(); - std::lock_guard<std::mutex> lock(cache.mMutex); + std::lock_guard lock(cache.mMutex), newLock(newCache.mMutex); // By order of declaration cache.mInitialized = newCache.mInitialized; cache.mBlobCache.reset(nullptr); @@ -72,7 +72,7 @@ public: * manually, as seen in the "terminate" testing helper function. */ static void setSaveDelayMs(ShaderCache& cache, unsigned int saveDelayMs) { - std::lock_guard<std::mutex> lock(cache.mMutex); + std::lock_guard lock(cache.mMutex); cache.mDeferredSaveDelayMs = saveDelayMs; } @@ -81,7 +81,7 @@ public: * Next call to "initShaderDiskCache" will load again the in-memory cache from disk. */ static void terminate(ShaderCache& cache, bool saveContent) { - std::lock_guard<std::mutex> lock(cache.mMutex); + std::lock_guard lock(cache.mMutex); if (saveContent) { cache.saveToDiskLocked(); } @@ -93,6 +93,7 @@ public: */ template <typename T> static bool validateCache(ShaderCache& cache, std::vector<T> hash) { + std::lock_guard lock(cache.mMutex); return cache.validateCache(hash.data(), hash.size() * sizeof(T)); } @@ -108,7 +109,7 @@ public: */ static void waitForPendingSave(ShaderCache& cache, const int timeoutMs = 50) { { - std::lock_guard<std::mutex> lock(cache.mMutex); + std::lock_guard lock(cache.mMutex); ASSERT_TRUE(cache.mSavePending); } bool saving = true; @@ -123,7 +124,7 @@ public: usleep(delayMicroseconds); elapsedMilliseconds += (float)delayMicroseconds / 1000; - std::lock_guard<std::mutex> lock(cache.mMutex); + std::lock_guard lock(cache.mMutex); saving = cache.mSavePending; } } diff --git a/packages/SettingsLib/res/layout/dialog_with_icon.xml b/packages/SettingsLib/res/layout/dialog_with_icon.xml index 2f30508ca504..3586dcb2909c 100644 --- a/packages/SettingsLib/res/layout/dialog_with_icon.xml +++ b/packages/SettingsLib/res/layout/dialog_with_icon.xml @@ -33,13 +33,13 @@ android:importantForAccessibility="no"/> <TextView android:id="@+id/dialog_with_icon_title" - android:layout_width="wrap_content" + android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" style="@style/DialogWithIconTitle"/> <TextView android:id="@+id/dialog_with_icon_message" - android:layout_width="wrap_content" + android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" style="@style/TextAppearanceSmall"/> diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java index b5e4fa38d244..af06d7304160 100644 --- a/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java +++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java @@ -243,7 +243,9 @@ public class RestrictedSwitchPreference extends SwitchPreference { return mHelper != null ? mHelper.packageName : null; } - public void updateState(@NonNull String packageName, int uid, boolean isEnabled) { + /** Updates enabled state based on associated package. */ + public void updateState( + @NonNull String packageName, int uid, boolean isEnableAllowed, boolean isEnabled) { mHelper.updatePackageDetails(packageName, uid); if (mAppOpsManager == null) { mAppOpsManager = getContext().getSystemService(AppOpsManager.class); @@ -254,7 +256,9 @@ public class RestrictedSwitchPreference extends SwitchPreference { final boolean ecmEnabled = getContext().getResources().getBoolean( com.android.internal.R.bool.config_enhancedConfirmationModeEnabled); final boolean appOpsAllowed = !ecmEnabled || mode == AppOpsManager.MODE_ALLOWED; - if (isEnabled) { + if (!isEnableAllowed && !isEnabled) { + setEnabled(false); + } else if (isEnabled) { setEnabled(true); } else if (appOpsAllowed && isDisabledByAppOps()) { setEnabled(true); diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index f2abf8727155..2a486a9a613b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -91,6 +91,7 @@ public class InfoMediaManager extends MediaManager { MediaRouter2Manager mRouterManager; @VisibleForTesting String mPackageName; + boolean mIsScanning = false; private MediaDevice mCurrentConnectedDevice; private LocalBluetoothManager mBluetoothManager; @@ -110,22 +111,29 @@ public class InfoMediaManager extends MediaManager { @Override public void startScan() { - mMediaDevices.clear(); - mRouterManager.registerCallback(mExecutor, mMediaRouterCallback); - mRouterManager.registerScanRequest(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE - && !TextUtils.isEmpty(mPackageName)) { - RouteListingPreference routeListingPreference = - mRouterManager.getRouteListingPreference(mPackageName); - Api34Impl.onRouteListingPreferenceUpdated(routeListingPreference, mPreferenceItemMap); + if (!mIsScanning) { + mMediaDevices.clear(); + mRouterManager.registerCallback(mExecutor, mMediaRouterCallback); + mRouterManager.registerScanRequest(); + mIsScanning = true; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE + && !TextUtils.isEmpty(mPackageName)) { + RouteListingPreference routeListingPreference = + mRouterManager.getRouteListingPreference(mPackageName); + Api34Impl.onRouteListingPreferenceUpdated(routeListingPreference, + mPreferenceItemMap); + } + refreshDevices(); } - refreshDevices(); } @Override public void stopScan() { - mRouterManager.unregisterCallback(mMediaRouterCallback); - mRouterManager.unregisterScanRequest(); + if (mIsScanning) { + mRouterManager.unregisterCallback(mMediaRouterCallback); + mRouterManager.unregisterScanRequest(); + mIsScanning = false; + } } /** @@ -701,20 +709,19 @@ public class InfoMediaManager extends MediaManager { List<MediaRoute2Info> selectedRouteInfos, List<MediaRoute2Info> infolist, List<RouteListingPreference.Item> preferenceRouteListing) { final List<MediaRoute2Info> sortedInfoList = new ArrayList<>(selectedRouteInfos); + infolist.removeAll(selectedRouteInfos); + sortedInfoList.addAll(infolist.stream().filter( + MediaRoute2Info::isSystemRoute).collect(Collectors.toList())); for (RouteListingPreference.Item item : preferenceRouteListing) { for (MediaRoute2Info info : infolist) { if (item.getRouteId().equals(info.getId()) - && !selectedRouteInfos.contains(info)) { + && !selectedRouteInfos.contains(info) + && !info.isSystemRoute()) { sortedInfoList.add(info); break; } } } - if (sortedInfoList.size() != infolist.size()) { - infolist.removeAll(sortedInfoList); - sortedInfoList.addAll(infolist.stream().filter( - MediaRoute2Info::isSystemRoute).collect(Collectors.toList())); - } return sortedInfoList; } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java index 39780f3a96ed..7b8815e7c05c 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java @@ -114,6 +114,23 @@ public class InfoMediaManagerTest { } @Test + public void stopScan_notStartFirst_notCallsUnregister() { + mInfoMediaManager.mRouterManager = mRouterManager; + mInfoMediaManager.stopScan(); + + verify(mRouterManager, never()).unregisterScanRequest(); + } + + @Test + public void stopScan_startFirst_callsUnregister() { + mInfoMediaManager.mRouterManager = mRouterManager; + mInfoMediaManager.startScan(); + mInfoMediaManager.stopScan(); + + verify(mRouterManager).unregisterScanRequest(); + } + + @Test public void onRouteAdded_getAvailableRoutes_shouldAddMediaDevice() { final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>(); final RoutingSessionInfo sessionInfo = mock(RoutingSessionInfo.class); @@ -327,11 +344,12 @@ public class InfoMediaManagerTest { routeListingPreference); mInfoMediaManager.mMediaRouterCallback.onRoutesUpdated(); - assertThat(mInfoMediaManager.mMediaDevices).hasSize(3); + assertThat(mInfoMediaManager.mMediaDevices).hasSize(4); assertThat(mInfoMediaManager.mMediaDevices.get(0).getId()).isEqualTo(TEST_ID); - assertThat(mInfoMediaManager.mMediaDevices.get(1).getId()).isEqualTo(TEST_ID_4); - assertThat(mInfoMediaManager.mMediaDevices.get(1).isSuggestedDevice()).isTrue(); - assertThat(mInfoMediaManager.mMediaDevices.get(2).getId()).isEqualTo(TEST_ID_3); + assertThat(mInfoMediaManager.mMediaDevices.get(1).getId()).isEqualTo(TEST_ID_1); + assertThat(mInfoMediaManager.mMediaDevices.get(2).getId()).isEqualTo(TEST_ID_4); + assertThat(mInfoMediaManager.mMediaDevices.get(2).isSuggestedDevice()).isTrue(); + assertThat(mInfoMediaManager.mMediaDevices.get(3).getId()).isEqualTo(TEST_ID_3); } @Test @@ -405,8 +423,13 @@ public class InfoMediaManagerTest { when(availableInfo3.getClientPackageName()).thenReturn(packageName); availableRoutes.add(availableInfo3); - when(mRouterManager.getAvailableRoutes(packageName)).thenReturn( - availableRoutes); + final MediaRoute2Info availableInfo4 = mock(MediaRoute2Info.class); + when(availableInfo4.getId()).thenReturn(TEST_ID_1); + when(availableInfo4.isSystemRoute()).thenReturn(true); + when(availableInfo4.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME); + availableRoutes.add(availableInfo4); + + when(mRouterManager.getAvailableRoutes(packageName)).thenReturn(availableRoutes); return availableRoutes; } diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/Expandable.kt b/packages/SystemUI/compose/core/src/com/android/compose/animation/Expandable.kt index d4a81f9c765d..ac1ef1509415 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/Expandable.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/animation/Expandable.kt @@ -70,8 +70,10 @@ import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.dp -import androidx.lifecycle.ViewTreeLifecycleOwner -import androidx.lifecycle.ViewTreeViewModelStoreOwner +import androidx.lifecycle.findViewTreeLifecycleOwner +import androidx.lifecycle.findViewTreeViewModelStoreOwner +import androidx.lifecycle.setViewTreeLifecycleOwner +import androidx.lifecycle.setViewTreeViewModelStoreOwner import com.android.systemui.animation.Expandable import com.android.systemui.animation.LaunchAnimator import kotlin.math.max @@ -368,13 +370,10 @@ private fun AnimatedContentInOverlay( context, overlay, ) - ViewTreeLifecycleOwner.set( - overlayViewGroup, - ViewTreeLifecycleOwner.get(composeViewRoot), - ) - ViewTreeViewModelStoreOwner.set( - overlayViewGroup, - ViewTreeViewModelStoreOwner.get(composeViewRoot), + + overlayViewGroup.setViewTreeLifecycleOwner(composeViewRoot.findViewTreeLifecycleOwner()) + overlayViewGroup.setViewTreeViewModelStoreOwner( + composeViewRoot.findViewTreeViewModelStoreOwner() ) ViewTreeSavedStateRegistryOwner.set( overlayViewGroup, diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/footer/ui/compose/FooterActions.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/footer/ui/compose/FooterActions.kt index 75bf2813a321..13acde206247 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/footer/ui/compose/FooterActions.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/footer/ui/compose/FooterActions.kt @@ -121,8 +121,8 @@ fun FooterActions( } } - val backgroundColor = colorAttr(R.attr.underSurfaceColor) - val contentColor = LocalAndroidColorScheme.current.deprecated.textColorPrimary + val backgroundColor = colorAttr(R.attr.underSurface) + val contentColor = LocalAndroidColorScheme.current.onSurface val backgroundTopRadius = dimensionResource(R.dimen.qs_corner_radius) val backgroundModifier = remember( @@ -268,7 +268,7 @@ private fun NumberButton( val interactionSource = remember { MutableInteractionSource() } Expandable( - color = colorAttr(R.attr.offStateColor), + color = colorAttr(R.attr.shadeInactive), shape = CircleShape, onClick = onClick, interactionSource = interactionSource, @@ -287,7 +287,7 @@ private fun NumberButton( number.toString(), modifier = Modifier.align(Alignment.Center), style = MaterialTheme.typography.bodyLarge, - color = LocalAndroidColorScheme.current.deprecated.textColorPrimary, + color = colorAttr(R.attr.onShadeInactiveVariant), // TODO(b/242040009): This should only use a standard text style instead and // should not override the text size. fontSize = 18.sp, @@ -305,7 +305,7 @@ private fun NumberButton( @Composable private fun NewChangesDot(modifier: Modifier = Modifier) { val contentDescription = stringResource(R.string.fgs_dot_content_description) - val color = LocalAndroidColorScheme.current.deprecated.colorAccentTertiary + val color = LocalAndroidColorScheme.current.tertiary Canvas(modifier.size(12.dp).semantics { this.contentDescription = contentDescription }) { drawCircle(color) @@ -323,10 +323,9 @@ private fun TextButton( ) { Expandable( shape = CircleShape, - color = colorAttr(R.attr.underSurfaceColor), - contentColor = LocalAndroidColorScheme.current.deprecated.textColorSecondary, - borderStroke = - BorderStroke(1.dp, LocalAndroidColorScheme.current.deprecated.colorBackground), + color = colorAttr(R.attr.underSurface), + contentColor = LocalAndroidColorScheme.current.onSurfaceVariant, + borderStroke = BorderStroke(1.dp, colorAttr(R.attr.onShadeActive)), modifier = modifier.padding(horizontal = 4.dp), onClick = onClick, ) { diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt index 648ef03895cd..d2084047583b 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt @@ -34,7 +34,7 @@ import com.android.systemui.animation.GlyphCallback import com.android.systemui.animation.TextAnimator import com.android.systemui.customization.R import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.DEBUG import java.io.PrintWriter import java.util.Calendar import java.util.Locale diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt index 14434655fc92..12f7452fe913 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt @@ -24,11 +24,11 @@ import android.provider.Settings import android.util.Log import androidx.annotation.OpenForTesting import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel -import com.android.systemui.log.LogMessage import com.android.systemui.log.LogMessageImpl -import com.android.systemui.log.MessageInitializer -import com.android.systemui.log.MessagePrinter +import com.android.systemui.log.core.LogLevel +import com.android.systemui.log.core.LogMessage +import com.android.systemui.log.core.MessageInitializer +import com.android.systemui.log.core.MessagePrinter import com.android.systemui.plugins.ClockController import com.android.systemui.plugins.ClockId import com.android.systemui.plugins.ClockMetadata diff --git a/packages/SystemUI/log/src/com/android/systemui/log/ConstantStringsLoggerImpl.kt b/packages/SystemUI/log/src/com/android/systemui/log/ConstantStringsLoggerImpl.kt index 6fc525369e8b..a4f4e134733f 100644 --- a/packages/SystemUI/log/src/com/android/systemui/log/ConstantStringsLoggerImpl.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/ConstantStringsLoggerImpl.kt @@ -16,6 +16,7 @@ package com.android.systemui.log +import com.android.systemui.log.core.LogLevel import com.google.errorprone.annotations.CompileTimeConstant class ConstantStringsLoggerImpl(val buffer: LogBuffer, val tag: String) : ConstantStringsLogger { diff --git a/packages/SystemUI/log/src/com/android/systemui/log/LogBuffer.kt b/packages/SystemUI/log/src/com/android/systemui/log/LogBuffer.kt index 2007e7606ab8..e0051f59469d 100644 --- a/packages/SystemUI/log/src/com/android/systemui/log/LogBuffer.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/LogBuffer.kt @@ -19,6 +19,11 @@ package com.android.systemui.log import android.os.Trace import android.util.Log import com.android.systemui.common.buffer.RingBuffer +import com.android.systemui.log.core.LogLevel +import com.android.systemui.log.core.LogMessage +import com.android.systemui.log.core.MessageBuffer +import com.android.systemui.log.core.MessageInitializer +import com.android.systemui.log.core.MessagePrinter import com.google.errorprone.annotations.CompileTimeConstant import java.io.PrintWriter import java.util.concurrent.ArrayBlockingQueue @@ -73,7 +78,7 @@ constructor( private val maxSize: Int, private val logcatEchoTracker: LogcatEchoTracker, private val systrace: Boolean = true, -) { +) : MessageBuffer { private val buffer = RingBuffer(maxSize) { LogMessageImpl.create() } private val echoMessageQueue: BlockingQueue<LogMessage>? = @@ -174,11 +179,11 @@ constructor( * store any relevant data on the message and then call [commit]. */ @Synchronized - fun obtain( + override fun obtain( tag: String, level: LogLevel, messagePrinter: MessagePrinter, - exception: Throwable? = null, + exception: Throwable?, ): LogMessage { if (!mutable) { return FROZEN_MESSAGE @@ -195,7 +200,7 @@ constructor( * have finished filling in its data fields. The message will be echoed to logcat if necessary. */ @Synchronized - fun commit(message: LogMessage) { + override fun commit(message: LogMessage) { if (!mutable) { return } @@ -292,11 +297,5 @@ constructor( } } -/** - * A function that will be called immediately to store relevant data on the log message. The value - * of `this` will be the LogMessage to be initialized. - */ -typealias MessageInitializer = LogMessage.() -> Unit - private const val TAG = "LogBuffer" private val FROZEN_MESSAGE = LogMessageImpl.create() diff --git a/packages/SystemUI/log/src/com/android/systemui/log/LogMessageImpl.kt b/packages/SystemUI/log/src/com/android/systemui/log/LogMessageImpl.kt index 5e10f783850f..33cc199e7131 100644 --- a/packages/SystemUI/log/src/com/android/systemui/log/LogMessageImpl.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/LogMessageImpl.kt @@ -16,6 +16,10 @@ package com.android.systemui.log +import com.android.systemui.log.core.LogLevel +import com.android.systemui.log.core.LogMessage +import com.android.systemui.log.core.MessagePrinter + /** Recyclable implementation of [LogMessage]. */ data class LogMessageImpl( override var level: LogLevel, diff --git a/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTracker.kt b/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTracker.kt index 55f3a738e4f1..ae717df50fce 100644 --- a/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTracker.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTracker.kt @@ -16,6 +16,8 @@ package com.android.systemui.log +import com.android.systemui.log.core.LogLevel + /** Keeps track of which [LogBuffer] messages should also appear in logcat. */ interface LogcatEchoTracker { /** Whether [bufferName] should echo messages of [level] or higher to logcat. */ diff --git a/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTrackerDebug.kt b/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTrackerDebug.kt index d0ad28f04670..9ff48cabc6f4 100644 --- a/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTrackerDebug.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTrackerDebug.kt @@ -23,6 +23,7 @@ import android.os.Handler import android.os.Looper import android.os.Trace import android.provider.Settings +import com.android.systemui.log.core.LogLevel /** * Version of [LogcatEchoTracker] for debuggable builds diff --git a/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTrackerProd.kt b/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTrackerProd.kt index 56966773d1b0..044d97f92b50 100644 --- a/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTrackerProd.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTrackerProd.kt @@ -16,6 +16,8 @@ package com.android.systemui.log +import com.android.systemui.log.core.LogLevel + /** Production version of [LogcatEchoTracker] that isn't configurable. */ class LogcatEchoTrackerProd : LogcatEchoTracker { override val logInBackgroundThread = false diff --git a/packages/SystemUI/log/src/com/android/systemui/log/LogLevel.kt b/packages/SystemUI/log/src/com/android/systemui/log/core/LogLevel.kt index 7d9647a13149..d30d8e9fe003 100644 --- a/packages/SystemUI/log/src/com/android/systemui/log/LogLevel.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/core/LogLevel.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.log +package com.android.systemui.log.core import android.util.Log diff --git a/packages/SystemUI/log/src/com/android/systemui/log/LogMessage.kt b/packages/SystemUI/log/src/com/android/systemui/log/core/LogMessage.kt index 8c3988b027fe..3bd6473738c7 100644 --- a/packages/SystemUI/log/src/com/android/systemui/log/LogMessage.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/core/LogMessage.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.log +package com.android.systemui.log.core import android.icu.text.SimpleDateFormat import java.io.PrintWriter @@ -67,6 +67,12 @@ interface LogMessage { } /** + * A function that will be called immediately to store relevant data on the log message. The value + * of `this` will be the LogMessage to be initialized. + */ +typealias MessageInitializer = LogMessage.() -> Unit + +/** * A function that will be called if and when the message needs to be dumped to logcat or a bug * report. It should read the data stored by the initializer and convert it to a human-readable * string. The value of `this` will be the LogMessage to be printed. **IMPORTANT:** The printer diff --git a/packages/SystemUI/log/src/com/android/systemui/log/core/Logger.kt b/packages/SystemUI/log/src/com/android/systemui/log/core/Logger.kt new file mode 100644 index 000000000000..5729ab270487 --- /dev/null +++ b/packages/SystemUI/log/src/com/android/systemui/log/core/Logger.kt @@ -0,0 +1,224 @@ +/* + * 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.log.core + +import com.google.errorprone.annotations.CompileTimeConstant + +/** Logs messages to the [MessageBuffer] with [tag]. */ +open class Logger(val buffer: MessageBuffer, val tag: String) { + /** + * Logs a message to the buffer. + * + * The actual string of the log message is not constructed until it is needed. To accomplish + * this, logging a message is a two-step process. First, a fresh instance of [LogMessage] is + * obtained and is passed to the [messageInitializer]. The initializer stores any relevant data + * on the message's fields. The message is then inserted into the buffer where it waits until it + * is either pushed out by newer messages or it needs to printed. If and when this latter moment + * occurs, the [messagePrinter] function is called on the message. It reads whatever data the + * initializer stored and converts it to a human-readable log message. + * + * @param level Which level to log the message at, both to the buffer and to logcat if it's + * echoed. In general, a module should split most of its logs into either INFO or DEBUG level. + * INFO level should be reserved for information that other parts of the system might care + * about, leaving the specifics of code's day-to-day operations to DEBUG. + * @param messagePrinter A function that will be called if and when the message needs to be + * dumped to logcat or a bug report. It should read the data stored by the initializer and + * convert it to a human-readable string. The value of `this` will be the [LogMessage] to be + * printed. **IMPORTANT:** The printer should ONLY ever reference fields on the [LogMessage] + * and NEVER any variables in its enclosing scope. Otherwise, the runtime will need to + * allocate a new instance of the printer for each call, thwarting our attempts at avoiding + * any sort of allocation. + * @param exception Provide any exception that need to be logged. This is saved as + * [LogMessage.exception] + * @param messageInitializer A function that will be called immediately to store relevant data + * on the log message. The value of `this` will be the [LogMessage] to be initialized. + */ + @JvmOverloads + inline fun log( + level: LogLevel, + noinline messagePrinter: MessagePrinter, + exception: Throwable? = null, + messageInitializer: MessageInitializer, + ) { + val message = buffer.obtain(tag, level, messagePrinter, exception) + messageInitializer(message) + buffer.commit(message) + } + + /** + * Logs a compile-time string constant [message] to the log buffer. Use sparingly. + * + * This is for simpler use-cases where [message] is a compile time string constant. For + * use-cases where the log message is built during runtime, use the [log] overloaded method that + * takes in an initializer and a message printer. + * + * Buffers are limited by the number of entries, so logging more frequently will limit the time + * window that the [MessageBuffer] covers in a bug report. Richer logs, on the other hand, make + * a bug report more actionable, so using the [log] with a [MessagePrinter] to add more details + * to every log may do more to improve overall logging than adding more logs with this method. + */ + @JvmOverloads + fun log( + level: LogLevel, + @CompileTimeConstant message: String, + exception: Throwable? = null, + ) = log(level, { str1!! }, exception) { str1 = message } + + /** + * Logs a message to the buffer at [LogLevel.VERBOSE]. + * + * @see log + */ + @JvmOverloads + inline fun v( + noinline messagePrinter: MessagePrinter, + exception: Throwable? = null, + messageInitializer: MessageInitializer, + ) = log(LogLevel.VERBOSE, messagePrinter, exception, messageInitializer) + + /** + * Logs a compile-time string constant [message] to the log buffer at [LogLevel.VERBOSE]. Use + * sparingly. + * + * @see log + */ + @JvmOverloads + fun v( + @CompileTimeConstant message: String, + exception: Throwable? = null, + ) = log(LogLevel.VERBOSE, message, exception) + + /** + * Logs a message to the buffer at [LogLevel.DEBUG]. + * + * @see log + */ + @JvmOverloads + inline fun d( + noinline messagePrinter: MessagePrinter, + exception: Throwable? = null, + messageInitializer: MessageInitializer, + ) = log(LogLevel.DEBUG, messagePrinter, exception, messageInitializer) + + /** + * Logs a compile-time string constant [message] to the log buffer at [LogLevel.DEBUG]. Use + * sparingly. + * + * @see log + */ + @JvmOverloads + fun d( + @CompileTimeConstant message: String, + exception: Throwable? = null, + ) = log(LogLevel.DEBUG, message, exception) + + /** + * Logs a message to the buffer at [LogLevel.INFO]. + * + * @see log + */ + @JvmOverloads + inline fun i( + noinline messagePrinter: MessagePrinter, + exception: Throwable? = null, + messageInitializer: MessageInitializer, + ) = log(LogLevel.INFO, messagePrinter, exception, messageInitializer) + + /** + * Logs a compile-time string constant [message] to the log buffer at [LogLevel.INFO]. Use + * sparingly. + * + * @see log + */ + @JvmOverloads + fun i( + @CompileTimeConstant message: String, + exception: Throwable? = null, + ) = log(LogLevel.INFO, message, exception) + + /** + * Logs a message to the buffer at [LogLevel.WARNING]. + * + * @see log + */ + @JvmOverloads + inline fun w( + noinline messagePrinter: MessagePrinter, + exception: Throwable? = null, + messageInitializer: MessageInitializer, + ) = log(LogLevel.WARNING, messagePrinter, exception, messageInitializer) + + /** + * Logs a compile-time string constant [message] to the log buffer at [LogLevel.WARNING]. Use + * sparingly. + * + * @see log + */ + @JvmOverloads + fun w( + @CompileTimeConstant message: String, + exception: Throwable? = null, + ) = log(LogLevel.WARNING, message, exception) + + /** + * Logs a message to the buffer at [LogLevel.ERROR]. + * + * @see log + */ + @JvmOverloads + inline fun e( + noinline messagePrinter: MessagePrinter, + exception: Throwable? = null, + messageInitializer: MessageInitializer, + ) = log(LogLevel.ERROR, messagePrinter, exception, messageInitializer) + + /** + * Logs a compile-time string constant [message] to the log buffer at [LogLevel.ERROR]. Use + * sparingly. + * + * @see log + */ + @JvmOverloads + fun e( + @CompileTimeConstant message: String, + exception: Throwable? = null, + ) = log(LogLevel.ERROR, message, exception) + + /** + * Logs a message to the buffer at [LogLevel.WTF]. + * + * @see log + */ + @JvmOverloads + inline fun wtf( + noinline messagePrinter: MessagePrinter, + exception: Throwable? = null, + messageInitializer: MessageInitializer, + ) = log(LogLevel.WTF, messagePrinter, exception, messageInitializer) + + /** + * Logs a compile-time string constant [message] to the log buffer at [LogLevel.WTF]. Use + * sparingly. + * + * @see log + */ + @JvmOverloads + fun wtf( + @CompileTimeConstant message: String, + exception: Throwable? = null, + ) = log(LogLevel.WTF, message, exception) +} diff --git a/packages/SystemUI/log/src/com/android/systemui/log/core/MessageBuffer.kt b/packages/SystemUI/log/src/com/android/systemui/log/core/MessageBuffer.kt new file mode 100644 index 000000000000..bb91633c4d87 --- /dev/null +++ b/packages/SystemUI/log/src/com/android/systemui/log/core/MessageBuffer.kt @@ -0,0 +1,42 @@ +/* + * 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.log.core + +/** + * [MessageBuffer] is an interface that represents a buffer of log messages, and provides methods to + * [obtain] a log message and [commit] it to the buffer. + */ +interface MessageBuffer { + /** + * Obtains the next [LogMessage] from the buffer. + * + * After calling [obtain], the caller must store any relevant data on the message and then call + * [commit]. + */ + fun obtain( + tag: String, + level: LogLevel, + messagePrinter: MessagePrinter, + exception: Throwable? = null, + ): LogMessage + + /** + * After acquiring a log message via [obtain], call this method to signal to the buffer that + * data fields have been filled. + */ + fun commit(message: LogMessage) +} diff --git a/packages/SystemUI/res-keyguard/color/shade_disabled.xml b/packages/SystemUI/res-keyguard/color/shade_disabled.xml new file mode 100644 index 000000000000..241f20385eb4 --- /dev/null +++ b/packages/SystemUI/res-keyguard/color/shade_disabled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ 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. + --> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@android:color/system_neutral1_500" android:lStar="4" /> +</selector>
\ No newline at end of file diff --git a/packages/SystemUI/res-keyguard/layout/footer_actions_number_button.xml b/packages/SystemUI/res-keyguard/layout/footer_actions_number_button.xml index a7ffe9ca256f..c09607d19bdd 100644 --- a/packages/SystemUI/res-keyguard/layout/footer_actions_number_button.xml +++ b/packages/SystemUI/res-keyguard/layout/footer_actions_number_button.xml @@ -26,7 +26,7 @@ android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.QS.SecurityFooter" android:layout_gravity="center" - android:textColor="?android:attr/textColorPrimary" + android:textColor="?attr/onShadeInactiveVariant" android:textSize="18sp"/> <ImageView android:id="@+id/new_dot" diff --git a/packages/SystemUI/res-keyguard/layout/footer_actions_text_button.xml b/packages/SystemUI/res-keyguard/layout/footer_actions_text_button.xml index 6fe7d39f748a..1c31f1da0681 100644 --- a/packages/SystemUI/res-keyguard/layout/footer_actions_text_button.xml +++ b/packages/SystemUI/res-keyguard/layout/footer_actions_text_button.xml @@ -33,7 +33,7 @@ android:layout_marginEnd="12dp" android:contentDescription="@null" android:src="@drawable/ic_info_outline" - android:tint="?android:attr/textColorSecondary" /> + android:tint="?attr/onSurfaceVariant" /> <TextView android:id="@+id/text" @@ -43,7 +43,7 @@ android:maxLines="1" android:ellipsize="end" android:textAppearance="@style/TextAppearance.QS.SecurityFooter" - android:textColor="?android:attr/textColorSecondary"/> + android:textColor="?attr/onSurfaceVariant"/> <ImageView android:id="@+id/new_dot" @@ -62,5 +62,5 @@ android:contentDescription="@null" android:src="@*android:drawable/ic_chevron_end" android:autoMirrored="true" - android:tint="?android:attr/textColorSecondary" /> + android:tint="?attr/onSurfaceVariant" /> </com.android.systemui.animation.view.LaunchableLinearLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/brightness_mirror_background.xml b/packages/SystemUI/res/drawable/brightness_mirror_background.xml index 209510365fe0..b5c181bd896c 100644 --- a/packages/SystemUI/res/drawable/brightness_mirror_background.xml +++ b/packages/SystemUI/res/drawable/brightness_mirror_background.xml @@ -15,6 +15,6 @@ ~ limitations under the License --> <shape xmlns:android="http://schemas.android.com/apk/res/android"> - <solid android:color="?attr/underSurfaceColor" /> + <solid android:color="?attr/underSurface" /> <corners android:radius="@dimen/rounded_slider_background_rounded_corner" /> </shape> diff --git a/packages/SystemUI/res/drawable/brightness_progress_drawable.xml b/packages/SystemUI/res/drawable/brightness_progress_drawable.xml index 569ee76586c2..95c7778c0e76 100644 --- a/packages/SystemUI/res/drawable/brightness_progress_drawable.xml +++ b/packages/SystemUI/res/drawable/brightness_progress_drawable.xml @@ -24,7 +24,7 @@ <shape> <size android:height="@dimen/rounded_slider_track_width" /> <corners android:radius="@dimen/rounded_slider_track_corner_radius" /> - <solid android:color="?attr/offStateColor" /> + <solid android:color="?attr/shadeInactive" /> </shape> </inset> </item> diff --git a/packages/SystemUI/res/drawable/brightness_progress_full_drawable.xml b/packages/SystemUI/res/drawable/brightness_progress_full_drawable.xml index 4d9188c40822..2ea90c717863 100644 --- a/packages/SystemUI/res/drawable/brightness_progress_full_drawable.xml +++ b/packages/SystemUI/res/drawable/brightness_progress_full_drawable.xml @@ -22,7 +22,7 @@ android:height="@dimen/rounded_slider_height"> <shape> <size android:height="@dimen/rounded_slider_height" /> - <solid android:color="?priv-android:attr/colorAccentPrimary" /> + <solid android:color="?attr/shadeActive" /> <corners android:radius="@dimen/rounded_slider_corner_radius"/> </shape> </item> @@ -34,7 +34,7 @@ android:right="@dimen/rounded_slider_icon_inset"> <com.android.systemui.util.AlphaTintDrawableWrapper android:drawable="@drawable/ic_brightness" - android:tint="?android:attr/textColorPrimaryInverse" + android:tint="?attr/onShadeActive" /> </item> </layer-list>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/fgs_dot.xml b/packages/SystemUI/res/drawable/fgs_dot.xml index 3669e1d3c374..0881d7c5c2b5 100644 --- a/packages/SystemUI/res/drawable/fgs_dot.xml +++ b/packages/SystemUI/res/drawable/fgs_dot.xml @@ -19,5 +19,5 @@ android:shape="oval" android:width="12dp" android:height="12dp"> - <solid android:color="?androidprv:attr/colorAccentTertiary" /> + <solid android:color="?attr/tertiary" /> </shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/qs_customizer_background_primary.xml b/packages/SystemUI/res/drawable/qs_customizer_background_primary.xml index ea0aafd321e1..e138d094f869 100644 --- a/packages/SystemUI/res/drawable/qs_customizer_background_primary.xml +++ b/packages/SystemUI/res/drawable/qs_customizer_background_primary.xml @@ -15,7 +15,7 @@ --> <inset xmlns:android="http://schemas.android.com/apk/res/android"> <shape> - <solid android:color="?attr/underSurfaceColor"/> + <solid android:color="?attr/underSurface"/> <corners android:radius="?android:attr/dialogCornerRadius" /> </shape> </inset> diff --git a/packages/SystemUI/res/drawable/qs_customizer_toolbar.xml b/packages/SystemUI/res/drawable/qs_customizer_toolbar.xml index ef950fe67ad2..f1a24aa7af9d 100644 --- a/packages/SystemUI/res/drawable/qs_customizer_toolbar.xml +++ b/packages/SystemUI/res/drawable/qs_customizer_toolbar.xml @@ -15,6 +15,6 @@ --> <inset xmlns:android="http://schemas.android.com/apk/res/android"> <shape> - <solid android:color="?attr/underSurfaceColor"/> + <solid android:color="?attr/underSurface"/> </shape> </inset> diff --git a/packages/SystemUI/res/drawable/qs_dialog_btn_filled.xml b/packages/SystemUI/res/drawable/qs_dialog_btn_filled.xml index 14cb1de9fa2d..c4e45bf2c223 100644 --- a/packages/SystemUI/res/drawable/qs_dialog_btn_filled.xml +++ b/packages/SystemUI/res/drawable/qs_dialog_btn_filled.xml @@ -28,7 +28,7 @@ <item> <shape android:shape="rectangle"> <corners android:radius="?android:attr/buttonCornerRadius"/> - <solid android:color="?androidprv:attr/colorAccentPrimary"/> + <solid android:color="?androidprv:attr/materialColorPrimary"/> <padding android:left="@dimen/dialog_button_horizontal_padding" android:top="@dimen/dialog_button_vertical_padding" android:right="@dimen/dialog_button_horizontal_padding" diff --git a/packages/SystemUI/res/drawable/qs_dialog_btn_filled_large.xml b/packages/SystemUI/res/drawable/qs_dialog_btn_filled_large.xml index 0544b871fa06..1590daa8b7f9 100644 --- a/packages/SystemUI/res/drawable/qs_dialog_btn_filled_large.xml +++ b/packages/SystemUI/res/drawable/qs_dialog_btn_filled_large.xml @@ -26,7 +26,7 @@ <item> <shape android:shape="rectangle"> <corners android:radius="18dp"/> - <solid android:color="?androidprv:attr/colorAccentPrimary"/> + <solid android:color="?androidprv:attr/materialColorPrimaryFixed"/> </shape> </item> </ripple> diff --git a/packages/SystemUI/res/drawable/qs_dialog_btn_outline.xml b/packages/SystemUI/res/drawable/qs_dialog_btn_outline.xml index a47299d6f854..b0dc6523e971 100644 --- a/packages/SystemUI/res/drawable/qs_dialog_btn_outline.xml +++ b/packages/SystemUI/res/drawable/qs_dialog_btn_outline.xml @@ -29,7 +29,7 @@ <shape android:shape="rectangle"> <corners android:radius="?android:attr/buttonCornerRadius"/> <solid android:color="@android:color/transparent"/> - <stroke android:color="?androidprv:attr/colorAccentPrimaryVariant" + <stroke android:color="?androidprv:attr/materialColorPrimary" android:width="1dp" /> <padding android:left="@dimen/dialog_button_horizontal_padding" diff --git a/packages/SystemUI/res/drawable/qs_footer_action_circle.xml b/packages/SystemUI/res/drawable/qs_footer_action_circle.xml index c8c36b0081c0..4a5d4af96497 100644 --- a/packages/SystemUI/res/drawable/qs_footer_action_circle.xml +++ b/packages/SystemUI/res/drawable/qs_footer_action_circle.xml @@ -28,7 +28,7 @@ </item> <item> <shape android:shape="rectangle"> - <solid android:color="?attr/offStateColor"/> + <solid android:color="?attr/shadeInactive"/> <corners android:radius="@dimen/qs_footer_action_corner_radius"/> </shape> </item> diff --git a/packages/SystemUI/res/drawable/qs_footer_action_circle_color.xml b/packages/SystemUI/res/drawable/qs_footer_action_circle_color.xml index 6a365000a21c..a8c034986425 100644 --- a/packages/SystemUI/res/drawable/qs_footer_action_circle_color.xml +++ b/packages/SystemUI/res/drawable/qs_footer_action_circle_color.xml @@ -28,7 +28,7 @@ </item> <item> <shape android:shape="rectangle"> - <solid android:color="?android:attr/colorAccent"/> + <solid android:color="?attr/shadeActive"/> <corners android:radius="@dimen/qs_footer_action_corner_radius"/> </shape> </item> diff --git a/packages/SystemUI/res/drawable/qs_footer_actions_background.xml b/packages/SystemUI/res/drawable/qs_footer_actions_background.xml index c9517cd905dc..a7e8762a2593 100644 --- a/packages/SystemUI/res/drawable/qs_footer_actions_background.xml +++ b/packages/SystemUI/res/drawable/qs_footer_actions_background.xml @@ -15,7 +15,7 @@ --> <inset xmlns:android="http://schemas.android.com/apk/res/android"> <shape> - <solid android:color="?attr/underSurfaceColor"/> + <solid android:color="?attr/underSurface"/> <corners android:topLeftRadius="@dimen/qs_corner_radius" android:topRightRadius="@dimen/qs_corner_radius"/> </shape> diff --git a/packages/SystemUI/res/drawable/qs_security_footer_background.xml b/packages/SystemUI/res/drawable/qs_security_footer_background.xml index 381af503d47c..0b0055b1f020 100644 --- a/packages/SystemUI/res/drawable/qs_security_footer_background.xml +++ b/packages/SystemUI/res/drawable/qs_security_footer_background.xml @@ -29,7 +29,7 @@ <item> <shape android:shape="rectangle"> <stroke android:width="1dp" - android:color="?android:attr/colorBackground"/> + android:color="?attr/shadeInactive"/> <corners android:radius="@dimen/qs_security_footer_corner_radius"/> </shape> </item> diff --git a/packages/SystemUI/res/layout/alert_dialog_title_systemui.xml b/packages/SystemUI/res/layout/alert_dialog_title_systemui.xml index 88f13b451bbe..ca7df86d8296 100644 --- a/packages/SystemUI/res/layout/alert_dialog_title_systemui.xml +++ b/packages/SystemUI/res/layout/alert_dialog_title_systemui.xml @@ -42,7 +42,7 @@ android:layout_marginBottom="16dp" android:scaleType="fitCenter" android:src="@null" - android:tint="?androidprv:attr/colorAccentPrimaryVariant" + android:tint="?androidprv:attr/materialColorPrimary" /> <TextView diff --git a/packages/SystemUI/res/layout/qs_footer_impl.xml b/packages/SystemUI/res/layout/qs_footer_impl.xml index 745cfc6c1655..b8f4c0f212c3 100644 --- a/packages/SystemUI/res/layout/qs_footer_impl.xml +++ b/packages/SystemUI/res/layout/qs_footer_impl.xml @@ -53,6 +53,7 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="center_vertical" + android:tint="?attr/shadeActive" android:visibility="gone" /> <FrameLayout @@ -70,7 +71,7 @@ android:focusable="true" android:padding="@dimen/qs_footer_icon_padding" android:src="@*android:drawable/ic_mode_edit" - android:tint="?android:attr/textColorPrimary" /> + android:tint="?attr/onSurfaceVariant" /> </FrameLayout> </LinearLayout> diff --git a/packages/SystemUI/res/layout/qs_tile_label.xml b/packages/SystemUI/res/layout/qs_tile_label.xml index c124aea01afc..974cad32f937 100644 --- a/packages/SystemUI/res/layout/qs_tile_label.xml +++ b/packages/SystemUI/res/layout/qs_tile_label.xml @@ -54,6 +54,6 @@ android:focusable="false" android:importantForAccessibility="no" android:textAppearance="@style/TextAppearance.QS.TileLabel.Secondary" - android:textColor="?android:attr/textColorSecondary"/> + android:textColor="?attr/onShadeInactive"/> </com.android.systemui.qs.tileimpl.IgnorableChildLinearLayout> diff --git a/packages/SystemUI/res/layout/screen_record_dialog.xml b/packages/SystemUI/res/layout/screen_record_dialog.xml index bbf3adfb8c67..f6ce70d4d032 100644 --- a/packages/SystemUI/res/layout/screen_record_dialog.xml +++ b/packages/SystemUI/res/layout/screen_record_dialog.xml @@ -15,6 +15,7 @@ limitations under the License. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> @@ -47,7 +48,7 @@ <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textAppearance="?android:attr/textAppearanceLarge" + android:textAppearance="@style/TextAppearance.Dialog.Title" android:fontFamily="@*android:string/config_headlineFontFamily" android:text="@string/screenrecord_permission_dialog_title" android:layout_marginTop="22dp" @@ -56,8 +57,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/screenrecord_permission_dialog_warning_entire_screen" - android:textAppearance="?android:attr/textAppearanceSmall" - android:textColor="?android:textColorSecondary" + android:textAppearance="@style/TextAppearance.Dialog.Body.Message" android:gravity="center" android:layout_marginBottom="20dp"/> @@ -81,6 +81,7 @@ android:minHeight="48dp" android:layout_weight="1" android:popupBackground="@drawable/screenrecord_spinner_background" + android:textColor="?androidprv:attr/materialColorOnSurface" android:dropDownWidth="274dp" android:prompt="@string/screenrecord_audio_label"/> <Switch @@ -117,7 +118,7 @@ android:text="@string/screenrecord_taps_label" android:textAppearance="?android:attr/textAppearanceMedium" android:fontFamily="@*android:string/config_headlineFontFamily" - android:textColor="?android:attr/textColorPrimary" + android:textColor="?androidprv:attr/materialColorOnSurface" android:importantForAccessibility="no"/> <Switch android:layout_width="wrap_content" diff --git a/packages/SystemUI/res/layout/screen_share_dialog.xml b/packages/SystemUI/res/layout/screen_share_dialog.xml index ab522a388735..9af46c5b739c 100644 --- a/packages/SystemUI/res/layout/screen_share_dialog.xml +++ b/packages/SystemUI/res/layout/screen_share_dialog.xml @@ -36,14 +36,13 @@ android:layout_width="@dimen/screenrecord_logo_size" android:layout_height="@dimen/screenrecord_logo_size" android:src="@drawable/ic_media_projection_permission" - android:tint="?androidprv:attr/colorAccentPrimaryVariant" + android:tint="?androidprv:attr/materialColorPrimary" android:importantForAccessibility="no"/> <TextView android:id="@+id/screen_share_dialog_title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textAppearance="?android:attr/textAppearanceLarge" - android:fontFamily="@*android:string/config_headlineFontFamily" + android:textAppearance="@style/TextAppearance.Dialog.Title" android:layout_marginTop="@dimen/screenrecord_title_margin_top" android:gravity="center"/> <Spinner @@ -64,8 +63,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/screenrecord_permission_dialog_warning_entire_screen" - android:textAppearance="?android:attr/textAppearanceSmall" - android:textColor="?android:textColorSecondary" + style="@style/TextAppearance.Dialog.Body.Message" android:gravity="start" android:lineHeight="@dimen/screenrecord_warning_line_height"/> diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml index 3a1d1a8cbf9d..d693631080af 100644 --- a/packages/SystemUI/res/values/attrs.xml +++ b/packages/SystemUI/res/values/attrs.xml @@ -118,8 +118,25 @@ <attr name="wallpaperTextColorSecondary" format="reference|color" /> <attr name="wallpaperTextColorAccent" format="reference|color" /> <attr name="backgroundProtectedStyle" format="reference" /> - <attr name="offStateColor" format="reference|color" /> - <attr name="underSurfaceColor" format="reference|color" /> + + <!-- color attribute tokens for QS --> + <attr name="isQsTheme" format="boolean" /> + <attr name="underSurface" format="reference|color"/> + <attr name="shadeActive" format="reference|color" /> + <attr name="onShadeActive" format="reference|color" /> + <attr name="onShadeActiveVariant" format="reference|color" /> + <attr name="shadeInactive" format="reference|color" /> + <attr name="onShadeInactive" format="reference|color" /> + <attr name="onShadeInactiveVariant" format="reference|color" /> + <attr name="shadeDisabled" format="reference|color" /> + <attr name="surfaceBright" format="reference|color" /> + <attr name="scHigh" format="reference|color" /> + <attr name="tertiary" format="reference|color" /> + <attr name="onSurface" format="reference|color" /> + <attr name="onSurfaceVariant" format="reference|color" /> + <attr name="outline" format="reference|color" /> + <attr name="primary" format="reference|color" /> + <declare-styleable name="SmartReplyView"> <attr name="spacing" format="dimension" /> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index cb5342a0d66b..fd74c7eae361 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -83,7 +83,7 @@ <style name="TextAppearance.QS"> <item name="android:textStyle">normal</item> - <item name="android:textColor">?android:attr/textColorPrimary</item> + <item name="android:textColor">?attr/onShadeInactive</item> <item name="android:fontFamily">@*android:string/config_bodyFontFamily</item> </style> @@ -93,7 +93,7 @@ <style name="TextAppearance.QS.DetailItemSecondary"> <item name="android:textSize">@dimen/qs_tile_text_size</item> - <item name="android:textColor">?android:attr/colorAccent</item> + <item name="android:textColor">?attr/shadeActive</item> </style> <style name="TextAppearance.QS.Introduction"> @@ -117,11 +117,11 @@ <style name="TextAppearance.QS.DataUsage.Usage"> <item name="android:textSize">@dimen/qs_data_usage_usage_text_size</item> - <item name="android:textColor">?android:attr/colorAccent</item> + <item name="android:textColor">?attr/shadeActive</item> </style> <style name="TextAppearance.QS.DataUsage.Secondary"> - <item name="android:textColor">?android:attr/textColorSecondary</item> + <item name="android:textColor">?attr/onShadeInactiveVariant</item> </style> <style name="TextAppearance.QS.TileLabel"> @@ -137,31 +137,31 @@ <style name="TextAppearance.QS.UserSwitcher"> <item name="android:textSize">@dimen/qs_tile_text_size</item> - <item name="android:textColor">?android:attr/textColorSecondary</item> + <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item> </style> <!-- This is hard coded to be sans-serif-condensed to match the icons --> <style name="TextAppearance.QS.Status"> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> - <item name="android:textColor">?android:attr/textColorPrimary</item> + <item name="android:textColor">?attr/onSurface</item> <item name="android:textSize">14sp</item> <item name="android:letterSpacing">0.01</item> </style> <style name="TextAppearance.QS.SecurityFooter" parent="@style/TextAppearance.QS.Status"> <item name="android:fontFamily">@*android:string/config_bodyFontFamily</item> - <item name="android:textColor">?android:attr/textColorSecondary</item> + <item name="android:textColor">?attr/onSurface</item> </style> <style name="TextAppearance.QS.Status.Carriers" /> <style name="TextAppearance.QS.Status.Carriers.NoCarrierText"> - <item name="android:textColor">?android:attr/textColorSecondary</item> + <item name="android:textColor">?attr/onSurfaceVariant</item> </style> <style name="TextAppearance.QS.Status.Build"> - <item name="android:textColor">?android:attr/textColorSecondary</item> + <item name="android:textColor">?attr/onSurfaceVariant</item> </style> <style name="TextAppearance.DeviceManagementDialog.Title" parent="@android:style/TextAppearance.DeviceDefault.DialogWindowTitle"/> @@ -278,10 +278,10 @@ <style name="DeviceManagementDialogTitle"> <item name="android:gravity">center</item> - <item name="android:textAppearance">@style/TextAppearance.DeviceManagementDialog.Title</item> + <item name="android:textAppearance">@style/TextAppearance.Dialog.Title</item> </style> - <style name="TextAppearance.DeviceManagementDialog.Content" parent="@*android:style/TextAppearance.DeviceDefault.Subhead"/> + <style name="TextAppearance.DeviceManagementDialog.Content" parent="@style/TextAppearance.Dialog.Body.Message"/> <style name="BaseBrightnessDialogContainer" parent="@style/Theme.SystemUI"> <item name="android:layout_width">match_parent</item> @@ -371,14 +371,30 @@ </style> <style name="Theme.SystemUI.QuickSettings" parent="@*android:style/Theme.DeviceDefault"> + <item name="isQsTheme">true</item> <item name="lightIconTheme">@style/QSIconTheme</item> <item name="darkIconTheme">@style/QSIconTheme</item> <item name="android:colorError">@*android:color/error_color_material_dark</item> <item name="android:windowIsFloating">true</item> <item name="android:homeAsUpIndicator">@drawable/ic_arrow_back</item> - <item name="offStateColor">@color/material_dynamic_neutral20</item> - <item name="underSurfaceColor">@color/material_dynamic_neutral0</item> - <item name="android:colorBackground">@color/material_dynamic_neutral10</item> + + <item name="surfaceBright">?androidprv:attr/materialColorSurfaceBright</item> + <item name="android:colorBackground">?attr/surfaceBright</item> + <item name="scHigh">?androidprv:attr/materialColorSurfaceContainerHigh</item> + <item name="primary">?androidprv:attr/materialColorPrimary</item> + <item name="tertiary">?androidprv:attr/materialColorTertiary</item> + <item name="onSurface">?androidprv:attr/materialColorOnSurface</item> + <item name="onSurfaceVariant">?androidprv:attr/materialColorOnSurfaceVariant</item> + <item name="outline">?androidprv:attr/materialColorOutline</item> + + <item name="shadeActive">@color/material_dynamic_primary90</item> + <item name="onShadeActive">@color/material_dynamic_primary10</item> + <item name="onShadeActiveVariant">@color/material_dynamic_primary30</item> + <item name="shadeInactive">@color/material_dynamic_neutral20</item> + <item name="onShadeInactive">@color/material_dynamic_neutral90</item> + <item name="onShadeInactiveVariant">@color/material_dynamic_neutral_variant80</item> + <item name="shadeDisabled">@color/shade_disabled</item> + <item name="underSurface">@color/material_dynamic_neutral0</item> <item name="android:itemTextAppearance">@style/Control.MenuItem</item> </style> @@ -390,8 +406,15 @@ <item name="android:windowBackground">@android:color/transparent</item> </style> - <style name="Theme.SystemUI.QuickSettings.Dialog" parent="@android:style/Theme.DeviceDefault.Dialog"> + <style name="Theme.SystemUI.QuickSettings.Dialog" parent="@style/Theme.SystemUI.Dialog.QuickSettings"> + </style> + + <!-- Parent style overrides style in the dot inheritance --> + <style name="Theme.SystemUI.Dialog.QuickSettings" parent="@style/Theme.SystemUI.QuickSettings"> <item name="android:dialogCornerRadius">@dimen/notification_corner_radius</item> + <item name="android:buttonBarPositiveButtonStyle">@style/Widget.Dialog.Button.QuickSettings</item> + <item name="android:buttonBarNegativeButtonStyle">@style/Widget.Dialog.Button.QuickSettings</item> + <item name="android:buttonBarNeutralButtonStyle">@style/Widget.Dialog.Button.QuickSettings</item> </style> <!-- Overridden by values-television/styles.xml with tv-specific settings --> @@ -406,7 +429,7 @@ <item name="android:buttonBarPositiveButtonStyle">@style/Widget.Dialog.Button</item> <item name="android:buttonBarNegativeButtonStyle">@style/Widget.Dialog.Button.BorderButton</item> <item name="android:buttonBarNeutralButtonStyle">@style/Widget.Dialog.Button.BorderButton</item> - <item name="android:colorBackground">?androidprv:attr/colorSurface</item> + <item name="android:colorBackground">?androidprv:attr/materialColorSurfaceBright</item> <item name="android:alertDialogStyle">@style/ScrollableAlertDialogStyle</item> <item name="android:buttonBarStyle">@style/ButtonBarStyle</item> <item name="android:buttonBarButtonStyle">@style/Widget.Dialog.Button.Large</item> @@ -605,11 +628,11 @@ <item name="android:letterSpacing">0.01</item> <item name="android:lineHeight">20sp</item> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> - <item name="android:textColor">?android:attr/textColorSecondary</item> + <item name="android:textColor">?attr/onSurfaceVariant</item> </style> <style name="QSCustomizeToolbar" parent="@*android:style/Widget.DeviceDefault.Toolbar"> - <item name="android:textColor">?android:attr/textColorPrimary</item> + <item name="android:textColor">?attr/onSurface</item> <item name="android:elevation">10dp</item> </style> @@ -1055,7 +1078,7 @@ </style> <style name="TextAppearance.Dialog.Title" parent="@android:style/TextAppearance.DeviceDefault.Large"> - <item name="android:textColor">?android:attr/textColorPrimary</item> + <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> <item name="android:textSize">@dimen/dialog_title_text_size</item> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> <item name="android:lineHeight">32sp</item> @@ -1064,7 +1087,7 @@ </style> <style name="TextAppearance.Dialog.Body" parent="@android:style/TextAppearance.DeviceDefault.Medium"> - <item name="android:textColor">?android:attr/textColorSecondary</item> + <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item> <item name="android:textSize">14sp</item> <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> <item name="android:lineHeight">20sp</item> @@ -1092,7 +1115,7 @@ <style name="Widget.Dialog.Button"> <item name="android:buttonCornerRadius">28dp</item> <item name="android:background">@drawable/qs_dialog_btn_filled</item> - <item name="android:textColor">?androidprv:attr/textColorOnAccent</item> + <item name="android:textColor">?androidprv:attr/materialColorOnPrimary</item> <item name="android:textSize">14sp</item> <item name="android:lineHeight">20sp</item> <item name="android:fontFamily">@*android:string/config_bodyFontFamilyMedium</item> @@ -1102,12 +1125,18 @@ <style name="Widget.Dialog.Button.BorderButton"> <item name="android:background">@drawable/qs_dialog_btn_outline</item> - <item name="android:textColor">?android:attr/textColorPrimary</item> + <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item> </style> <style name="Widget.Dialog.Button.Large"> <item name="android:background">@drawable/qs_dialog_btn_filled_large</item> <item name="android:minHeight">56dp</item> + <item name="android:textColor">?androidprv:attr/materialColorOnPrimaryFixed</item> + </style> + + <style name="Widget.Dialog.Button.QuickSettings"> + <item name="android:textColor">?attr/primary</item> + <item name="android:background">?android:attr/selectableItemBackground</item> </style> <style name="MainSwitch.Settingslib" parent="@android:style/Theme.DeviceDefault"> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/Utilities.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/Utilities.java index 2e6c485336f3..751a3f8458bd 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/Utilities.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/Utilities.java @@ -104,8 +104,7 @@ public class Utilities { * @return updated set of flags from InputMethodService based off {@param oldHints} * Leaves original hints unmodified */ - public static int calculateBackDispositionHints(int oldHints, - @InputMethodService.BackDispositionMode int backDisposition, + public static int calculateBackDispositionHints(int oldHints, int backDisposition, boolean imeShown, boolean showImeSwitcher) { int hints = oldHints; switch (backDisposition) { diff --git a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt index 84a2c25999a0..91937af6f540 100644 --- a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt +++ b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt @@ -42,7 +42,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInterac import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.DEBUG import com.android.systemui.log.dagger.KeyguardLargeClockLog import com.android.systemui.log.dagger.KeyguardSmallClockLog import com.android.systemui.plugins.ClockController diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index 360f755623f7..4793b4f37eb3 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -29,7 +29,7 @@ import com.android.app.animation.Interpolators; import com.android.keyguard.dagger.KeyguardStatusViewScope; import com.android.systemui.R; import com.android.systemui.log.LogBuffer; -import com.android.systemui.log.LogLevel; +import com.android.systemui.log.core.LogLevel; import com.android.systemui.plugins.ClockController; import com.android.systemui.shared.clocks.DefaultClockController; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java index 62a2f90a0378..dba124685fe1 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java @@ -40,7 +40,7 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.log.LogBuffer; -import com.android.systemui.log.LogLevel; +import com.android.systemui.log.core.LogLevel; import com.android.systemui.log.dagger.KeyguardClockLog; import com.android.systemui.plugins.ClockController; import com.android.systemui.plugins.statusbar.StatusBarStateController; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 89ef749f05bf..518baec6b089 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -24,6 +24,8 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.content.Intent.ACTION_USER_REMOVED; import static android.content.Intent.ACTION_USER_STOPPED; import static android.content.Intent.ACTION_USER_UNLOCKED; +import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE; +import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT; import static android.hardware.biometrics.BiometricConstants.BIOMETRIC_LOCKOUT_NONE; import static android.hardware.biometrics.BiometricConstants.BIOMETRIC_LOCKOUT_PERMANENT; import static android.hardware.biometrics.BiometricConstants.BIOMETRIC_LOCKOUT_TIMED; @@ -251,6 +253,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private static final int MSG_REQUIRE_NFC_UNLOCK = 345; private static final int MSG_KEYGUARD_DISMISS_ANIMATION_FINISHED = 346; private static final int MSG_SERVICE_PROVIDERS_UPDATED = 347; + private static final int MSG_BIOMETRIC_ENROLLMENT_STATE_CHANGED = 348; /** Biometric authentication state: Not listening. */ private static final int BIOMETRIC_STATE_STOPPED = 0; @@ -300,6 +303,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private static final ComponentName FALLBACK_HOME_COMPONENT = new ComponentName( "com.android.settings", "com.android.settings.FallbackHome"); + private static final List<Integer> ABSENT_SIM_STATE_LIST = Arrays.asList( + TelephonyManager.SIM_STATE_ABSENT, + TelephonyManager.SIM_STATE_UNKNOWN, + TelephonyManager.SIM_STATE_NOT_READY); + private final Context mContext; private final UserTracker mUserTracker; private final KeyguardUpdateMonitorLogger mLogger; @@ -2484,6 +2492,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab case MSG_KEYGUARD_DISMISS_ANIMATION_FINISHED: handleKeyguardDismissAnimationFinished(); break; + case MSG_BIOMETRIC_ENROLLMENT_STATE_CHANGED: + notifyAboutEnrollmentChange(msg.arg1); + break; default: super.handleMessage(msg); break; @@ -2584,6 +2595,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab @Override public void onEnrollmentsChanged(@BiometricAuthenticator.Modality int modality) { + mHandler.obtainMessage(MSG_BIOMETRIC_ENROLLMENT_STATE_CHANGED, modality, 0) + .sendToTarget(); mainExecutor.execute(() -> updateBiometricListeningState(BIOMETRIC_ACTION_UPDATE, FACE_AUTH_TRIGGERED_ENROLLMENTS_CHANGED)); } @@ -3433,6 +3446,25 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab return mIsFaceEnrolled; } + private void notifyAboutEnrollmentChange(@BiometricAuthenticator.Modality int modality) { + BiometricSourceType biometricSourceType; + if (modality == TYPE_FINGERPRINT) { + biometricSourceType = FINGERPRINT; + } else if (modality == TYPE_FACE) { + biometricSourceType = FACE; + } else { + return; + } + mLogger.notifyAboutEnrollmentsChanged(biometricSourceType); + Assert.isMainThread(); + for (int i = 0; i < mCallbacks.size(); i++) { + KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); + if (cb != null) { + cb.onBiometricEnrollmentStateChanged(biometricSourceType); + } + } + } + private void stopListeningForFingerprint() { mLogger.v("stopListeningForFingerprint()"); if (mFingerprintRunningState == BIOMETRIC_STATE_RUNNING) { @@ -3715,8 +3747,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab mLogger.logSimState(subId, slotId, state); boolean becameAbsent = false; - if (!SubscriptionManager.isValidSubscriptionId(subId) - && state != TelephonyManager.SIM_STATE_UNKNOWN) { + if (!SubscriptionManager.isValidSubscriptionId(subId)) { mLogger.w("invalid subId in handleSimStateChange()"); /* Only handle No SIM(ABSENT) and Card Error(CARD_IO_ERROR) due to * handleServiceStateChange() handle other case */ @@ -3734,11 +3765,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } } else if (state == TelephonyManager.SIM_STATE_CARD_IO_ERROR) { updateTelephonyCapable(true); - } else { - return; } } + becameAbsent |= ABSENT_SIM_STATE_LIST.contains(state); + SimData data = mSimDatas.get(subId); final boolean changed; if (data == null) { @@ -3751,7 +3782,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab data.subId = subId; data.slotId = slotId; } - if ((changed || becameAbsent) || state == TelephonyManager.SIM_STATE_UNKNOWN) { + if ((changed || becameAbsent)) { for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java index 73940055c89f..7b596328ca13 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java @@ -327,4 +327,9 @@ public class KeyguardUpdateMonitorCallback { * Called when the enabled trust agents associated with the specified user. */ public void onEnabledTrustAgentsChanged(int userId) { } + + /** + * On biometric enrollment state changed + */ + public void onBiometricEnrollmentStateChanged(BiometricSourceType biometricSourceType) { } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java b/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java index 61af7228fe0d..71f78c32317c 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java @@ -23,7 +23,7 @@ import android.view.View; import com.android.app.animation.Interpolators; import com.android.systemui.log.LogBuffer; -import com.android.systemui.log.LogLevel; +import com.android.systemui.log.core.LogLevel; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.PropertyAnimator; diff --git a/packages/SystemUI/src/com/android/keyguard/logging/BiometricMessageDeferralLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/BiometricMessageDeferralLogger.kt index e7295ef9052c..54738c62646a 100644 --- a/packages/SystemUI/src/com/android/keyguard/logging/BiometricMessageDeferralLogger.kt +++ b/packages/SystemUI/src/com/android/keyguard/logging/BiometricMessageDeferralLogger.kt @@ -18,7 +18,7 @@ package com.android.keyguard.logging import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.DEBUG import com.android.systemui.log.dagger.BiometricLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/keyguard/logging/BiometricUnlockLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/BiometricUnlockLogger.kt index c00b2c612fa2..cfad614a460d 100644 --- a/packages/SystemUI/src/com/android/keyguard/logging/BiometricUnlockLogger.kt +++ b/packages/SystemUI/src/com/android/keyguard/logging/BiometricUnlockLogger.kt @@ -19,9 +19,9 @@ package com.android.keyguard.logging import android.hardware.biometrics.BiometricSourceType import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel -import com.android.systemui.log.LogLevel.DEBUG -import com.android.systemui.log.LogLevel.INFO +import com.android.systemui.log.core.LogLevel +import com.android.systemui.log.core.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.INFO import com.android.systemui.log.dagger.BiometricLog import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_DISMISS_BOUNCER import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_NONE diff --git a/packages/SystemUI/src/com/android/keyguard/logging/CarrierTextManagerLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/CarrierTextManagerLogger.kt index 19787154bec4..d02b72f37795 100644 --- a/packages/SystemUI/src/com/android/keyguard/logging/CarrierTextManagerLogger.kt +++ b/packages/SystemUI/src/com/android/keyguard/logging/CarrierTextManagerLogger.kt @@ -19,7 +19,7 @@ package com.android.keyguard.logging import androidx.annotation.IntDef import com.android.keyguard.CarrierTextManager.CarrierTextCallbackInfo import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.CarrierTextManagerLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardLogger.kt index 8b925b1bfb54..bddf3b07dbb5 100644 --- a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardLogger.kt +++ b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardLogger.kt @@ -19,7 +19,7 @@ package com.android.keyguard.logging import com.android.systemui.biometrics.AuthRippleController import com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.KeyguardLog import com.android.systemui.statusbar.KeyguardIndicationController import com.google.errorprone.annotations.CompileTimeConstant diff --git a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt index a192803ea0e8..eec5b3ed8ef4 100644 --- a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt +++ b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt @@ -18,6 +18,7 @@ package com.android.keyguard.logging import android.content.Intent import android.hardware.biometrics.BiometricConstants.LockoutMode +import android.hardware.biometrics.BiometricSourceType import android.os.PowerManager import android.os.PowerManager.WakeReason import android.telephony.ServiceState @@ -32,12 +33,12 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.keyguard.TrustGrantFlags import com.android.settingslib.fuelgauge.BatteryStatus import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel -import com.android.systemui.log.LogLevel.DEBUG -import com.android.systemui.log.LogLevel.ERROR -import com.android.systemui.log.LogLevel.INFO -import com.android.systemui.log.LogLevel.VERBOSE -import com.android.systemui.log.LogLevel.WARNING +import com.android.systemui.log.core.LogLevel +import com.android.systemui.log.core.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.ERROR +import com.android.systemui.log.core.LogLevel.INFO +import com.android.systemui.log.core.LogLevel.VERBOSE +import com.android.systemui.log.core.LogLevel.WARNING import com.android.systemui.log.dagger.KeyguardUpdateMonitorLog import com.google.errorprone.annotations.CompileTimeConstant import javax.inject.Inject @@ -370,16 +371,14 @@ constructor(@KeyguardUpdateMonitorLog private val logBuffer: LogBuffer) { fun logServiceProvidersUpdated(intent: Intent) { logBuffer.log( - TAG, - VERBOSE, - { - int1 = intent.getIntExtra(EXTRA_SUBSCRIPTION_INDEX, INVALID_SUBSCRIPTION_ID) - str1 = intent.getStringExtra(TelephonyManager.EXTRA_SPN) - str2 = intent.getStringExtra(TelephonyManager.EXTRA_PLMN) - }, - { - "action SERVICE_PROVIDERS_UPDATED subId=$int1 spn=$str1 plmn=$str2" - } + TAG, + VERBOSE, + { + int1 = intent.getIntExtra(EXTRA_SUBSCRIPTION_INDEX, INVALID_SUBSCRIPTION_ID) + str1 = intent.getStringExtra(TelephonyManager.EXTRA_SPN) + str2 = intent.getStringExtra(TelephonyManager.EXTRA_PLMN) + }, + { "action SERVICE_PROVIDERS_UPDATED subId=$int1 spn=$str1 plmn=$str2" } ) } @@ -719,4 +718,13 @@ constructor(@KeyguardUpdateMonitorLog private val logBuffer: LogBuffer) { fun scheduleWatchdog(@CompileTimeConstant watchdogType: String) { logBuffer.log(TAG, DEBUG, "Scheduling biometric watchdog for $watchdogType") } + + fun notifyAboutEnrollmentsChanged(biometricSourceType: BiometricSourceType) { + logBuffer.log( + TAG, + DEBUG, + { str1 = "$biometricSourceType" }, + { "notifying about enrollments changed: $str1" } + ) + } } diff --git a/packages/SystemUI/src/com/android/keyguard/logging/TrustRepositoryLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/TrustRepositoryLogger.kt index cb764a8f94aa..57b5db15de67 100644 --- a/packages/SystemUI/src/com/android/keyguard/logging/TrustRepositoryLogger.kt +++ b/packages/SystemUI/src/com/android/keyguard/logging/TrustRepositoryLogger.kt @@ -21,8 +21,8 @@ import com.android.systemui.keyguard.shared.model.ActiveUnlockModel import com.android.systemui.keyguard.shared.model.TrustManagedModel import com.android.systemui.keyguard.shared.model.TrustModel import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel -import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel +import com.android.systemui.log.core.LogLevel.DEBUG import com.android.systemui.log.dagger.KeyguardUpdateMonitorLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt index 6f0f6331ef50..946ddba6a341 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt @@ -37,7 +37,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.keyguard.WakefulnessLifecycle -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.CircleReveal import com.android.systemui.statusbar.LiftReveal diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsLogger.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsLogger.kt index 39199d194cc9..2102a1f72be2 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsLogger.kt @@ -17,10 +17,10 @@ package com.android.systemui.biometrics import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel -import com.android.systemui.log.LogLevel.ERROR -import com.android.systemui.log.LogLevel.VERBOSE -import com.android.systemui.log.LogLevel.WARNING +import com.android.systemui.log.core.LogLevel +import com.android.systemui.log.core.LogLevel.ERROR +import com.android.systemui.log.core.LogLevel.VERBOSE +import com.android.systemui.log.core.LogLevel.WARNING import com.android.systemui.log.dagger.UdfpsLog import com.google.errorprone.annotations.CompileTimeConstant import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/BluetoothLogger.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/BluetoothLogger.kt index 96af42bfda22..2a457ebd62f7 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/BluetoothLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/BluetoothLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.bluetooth import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.BluetoothLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/broadcast/logging/BroadcastDispatcherLogger.kt b/packages/SystemUI/src/com/android/systemui/broadcast/logging/BroadcastDispatcherLogger.kt index 5b3a982ab5e2..068f32986cf1 100644 --- a/packages/SystemUI/src/com/android/systemui/broadcast/logging/BroadcastDispatcherLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/broadcast/logging/BroadcastDispatcherLogger.kt @@ -21,10 +21,10 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel -import com.android.systemui.log.LogLevel.DEBUG -import com.android.systemui.log.LogLevel.INFO -import com.android.systemui.log.LogMessage +import com.android.systemui.log.core.LogLevel +import com.android.systemui.log.core.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.INFO +import com.android.systemui.log.core.LogMessage import com.android.systemui.log.dagger.BroadcastDispatcherLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt index d629e3ea365e..8e41974b9acc 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt @@ -154,7 +154,7 @@ open class ControlsEditingActivity @Inject constructor( private fun bindViews() { setContentView(R.layout.controls_management) - getLifecycle().addObserver( + lifecycle.addObserver( ControlsAnimations.observerForAnimations( requireViewById<ViewGroup>(R.id.controls_management_root), window, diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt index d3ffc9585335..d3aa449b9cad 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt @@ -268,7 +268,7 @@ open class ControlsFavoritingActivity @Inject constructor( private fun bindViews() { setContentView(R.layout.controls_management) - getLifecycle().addObserver( + lifecycle.addObserver( ControlsAnimations.observerForAnimations( requireViewById<ViewGroup>(R.id.controls_management_root), window, diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt index fb19ac99d19e..d5b8693af42d 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt @@ -91,7 +91,7 @@ open class ControlsProviderSelectorActivity @Inject constructor( setContentView(R.layout.controls_management) - getLifecycle().addObserver( + lifecycle.addObserver( ControlsAnimations.observerForAnimations( requireViewById<ViewGroup>(R.id.controls_management_root), window, diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt index 4a22e4eecc2b..557dcf4accc7 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt @@ -72,7 +72,7 @@ open class ControlsActivity @Inject constructor( setContentView(R.layout.controls_fullscreen) - getLifecycle().addObserver( + lifecycle.addObserver( ControlsAnimations.observerForAnimations( requireViewById(R.id.control_detail_root), window, diff --git a/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayMetricsRepository.kt b/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayMetricsRepository.kt index c962e5155697..bcfeeb9eaadd 100644 --- a/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayMetricsRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayMetricsRepository.kt @@ -23,7 +23,7 @@ import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCall import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.DisplayMetricsRepoLog import com.android.systemui.statusbar.policy.ConfigurationController import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLogger.kt b/packages/SystemUI/src/com/android/systemui/doze/DozeLogger.kt index 536978009f71..75b8e513c14a 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLogger.kt @@ -20,9 +20,9 @@ import android.view.Display import com.android.systemui.doze.DozeLog.Reason import com.android.systemui.doze.DozeLog.reasonToString import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.DEBUG -import com.android.systemui.log.LogLevel.ERROR -import com.android.systemui.log.LogLevel.INFO +import com.android.systemui.log.core.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.ERROR +import com.android.systemui.log.core.LogLevel.INFO import com.android.systemui.log.dagger.DozeLog import com.android.systemui.statusbar.policy.DevicePostureController import com.google.errorprone.annotations.CompileTimeConstant diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamLogger.kt b/packages/SystemUI/src/com/android/systemui/dreams/DreamLogger.kt index fdb765130157..0e224060a36f 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamLogger.kt @@ -17,7 +17,7 @@ package com.android.systemui.dreams import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.DreamLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayLifecycleOwner.kt b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayLifecycleOwner.kt index 83253563e969..003d2c73fa06 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayLifecycleOwner.kt +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayLifecycleOwner.kt @@ -28,7 +28,8 @@ import javax.inject.Inject class DreamOverlayLifecycleOwner @Inject constructor() : LifecycleOwner { val registry: LifecycleRegistry = LifecycleRegistry(this) - override fun getLifecycle(): Lifecycle { - return registry - } + override val lifecycle: Lifecycle + get() { + return registry + } } diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index db5f5465d56d..94c85514f721 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -308,7 +308,7 @@ object Flags { ) @JvmField - val QS_PIPELINE_NEW_HOST = releasedFlag(504, "qs_pipeline_new_host") + val QS_PIPELINE_NEW_HOST = unreleasedFlag(504, "qs_pipeline_new_host", teamfood = true) // TODO(b/278068252): Tracking Bug @JvmField diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt index e8881a482765..df83aafecb4b 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt @@ -59,7 +59,7 @@ constructor( // At startup, 2 views with the ID `R.id.keyguard_indication_area` will be available. // Disable one of them if (featureFlags.isEnabled(Flags.MIGRATE_INDICATION_AREA)) { - legacyParent.requireViewById<View>(R.id.keyguard_indication_area).let { + legacyParent.findViewById<View>(R.id.keyguard_indication_area)?.let { legacyParent.removeView(it) } } else { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 155e0231e9d2..fdec2094e1ba 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -649,6 +649,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, switch (simState) { case TelephonyManager.SIM_STATE_NOT_READY: case TelephonyManager.SIM_STATE_ABSENT: + case TelephonyManager.SIM_STATE_UNKNOWN: + mPendingPinLock = false; // only force lock screen in case of missing sim if user hasn't // gone through setup wizard synchronized (KeyguardViewMediator.this) { @@ -713,9 +715,6 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, } } break; - case TelephonyManager.SIM_STATE_UNKNOWN: - mPendingPinLock = false; - break; default: if (DEBUG_SIM_STATES) Log.v(TAG, "Unspecific state: " + simState); break; diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt index 128057ae6b62..3d8f6fd40e6b 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt @@ -254,13 +254,17 @@ constructor( private fun observeFaceDetectGatingChecks() { // Face detection can run only when lockscreen bypass is enabled - // & detection is supported & biometric unlock is not allowed. + // & detection is supported + // & biometric unlock is not allowed + // or user is trusted by trust manager & we want to run face detect to dismiss keyguard listOf( canFaceAuthOrDetectRun(faceDetectLog), logAndObserve(isBypassEnabled, "isBypassEnabled", faceDetectLog), logAndObserve( - biometricSettingsRepository.isNonStrongBiometricAllowed.isFalse(), - "nonStrongBiometricIsNotAllowed", + biometricSettingsRepository.isNonStrongBiometricAllowed + .isFalse() + .or(trustRepository.isCurrentUserTrusted), + "nonStrongBiometricIsNotAllowedOrCurrentUserIsTrusted", faceDetectLog ), // We don't want to run face detect if fingerprint can be used to unlock the device @@ -312,18 +316,19 @@ constructor( tableLogBuffer ), logAndObserve( - keyguardRepository.wakefulness.map { it.isStartingToSleepOrAsleep() }.isFalse(), - "deviceNotSleepingOrNotStartingToSleep", + keyguardRepository.wakefulness.map { it.isStartingToSleep() }.isFalse(), + "deviceNotStartingToSleep", tableLogBuffer ), logAndObserve( - combine( - keyguardInteractor.isSecureCameraActive, - alternateBouncerInteractor.isVisible - ) { a, b -> - !a || b - }, - "secureCameraNotActiveOrAltBouncerIsShowing", + keyguardInteractor.isSecureCameraActive + .isFalse() + .or( + alternateBouncerInteractor.isVisible.or( + keyguardInteractor.primaryBouncerShowing + ) + ), + "secureCameraNotActiveOrAnyBouncerIsShowing", tableLogBuffer ), logAndObserve( @@ -365,6 +370,7 @@ constructor( "nonStrongBiometricIsAllowed", faceAuthLog ), + logAndObserve(isAuthenticated.isFalse(), "faceNotAuthenticated", faceAuthLog), ) .reduce(::and) .distinctUntilChanged() @@ -639,6 +645,10 @@ constructor( private fun and(flow: Flow<Boolean>, anotherFlow: Flow<Boolean>) = flow.combine(anotherFlow) { a, b -> a && b } +/** Combine two boolean flows by or-ing both of them */ +private fun Flow<Boolean>.or(anotherFlow: Flow<Boolean>) = + this.combine(anotherFlow) { a, b -> a || b } + /** "Not" the given flow. The return [Flow] will be true when [this] flow is false. */ private fun Flow<Boolean>.isFalse(): Flow<Boolean> { return this.map { !it } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt index 7c5641fcda9c..4f7abd4a2174 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt @@ -19,7 +19,7 @@ package com.android.systemui.keyguard.domain.interactor import com.android.keyguard.logging.KeyguardLogger import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application -import com.android.systemui.log.LogLevel.VERBOSE +import com.android.systemui.log.core.LogLevel.VERBOSE import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt index 8b749f0f4bc4..d467225a9d63 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt @@ -16,9 +16,12 @@ package com.android.systemui.keyguard.domain.interactor +import android.content.Context +import android.hardware.biometrics.BiometricFaceConstants import com.android.keyguard.FaceAuthUiEvent import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.CoreStartable +import com.android.systemui.R import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor import com.android.systemui.dagger.SysUISingleton @@ -27,6 +30,8 @@ import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.keyguard.data.repository.DeviceEntryFaceAuthRepository +import com.android.systemui.keyguard.shared.model.AuthenticationStatus +import com.android.systemui.keyguard.shared.model.ErrorAuthenticationStatus import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.log.FaceAuthenticationLogger import com.android.systemui.util.kotlin.pairwise @@ -34,7 +39,9 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map @@ -50,6 +57,7 @@ import kotlinx.coroutines.launch class SystemUIKeyguardFaceAuthInteractor @Inject constructor( + private val context: Context, @Application private val applicationScope: CoroutineScope, @Main private val mainDispatcher: CoroutineDispatcher, private val repository: DeviceEntryFaceAuthRepository, @@ -157,17 +165,28 @@ constructor( repository.cancel() } + private val _authenticationStatusOverride = MutableStateFlow<AuthenticationStatus?>(null) /** Provide the status of face authentication */ - override val authenticationStatus = repository.authenticationStatus + override val authenticationStatus = + merge(_authenticationStatusOverride.filterNotNull(), repository.authenticationStatus) /** Provide the status of face detection */ override val detectionStatus = repository.detectionStatus private fun runFaceAuth(uiEvent: FaceAuthUiEvent, fallbackToDetect: Boolean) { if (featureFlags.isEnabled(Flags.FACE_AUTH_REFACTOR)) { - applicationScope.launch { - faceAuthenticationLogger.authRequested(uiEvent) - repository.authenticate(uiEvent, fallbackToDetection = fallbackToDetect) + if (repository.isLockedOut.value) { + _authenticationStatusOverride.value = + ErrorAuthenticationStatus( + BiometricFaceConstants.FACE_ERROR_LOCKOUT_PERMANENT, + context.resources.getString(R.string.keyguard_face_unlock_unavailable) + ) + } else { + _authenticationStatusOverride.value = null + applicationScope.launch { + faceAuthenticationLogger.authRequested(uiEvent) + repository.authenticate(uiEvent, fallbackToDetection = fallbackToDetect) + } } } else { faceAuthenticationLogger.ignoredFaceAuthTrigger( diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/FaceAuthenticationModels.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/FaceAuthenticationModels.kt index 9e7dec4dc1d0..b354cfd27687 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/FaceAuthenticationModels.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/FaceAuthenticationModels.kt @@ -17,6 +17,7 @@ package com.android.systemui.keyguard.shared.model import android.hardware.face.FaceManager +import android.os.SystemClock.elapsedRealtime /** * Authentication status provided by @@ -38,8 +39,12 @@ data class AcquiredAuthenticationStatus(val acquiredInfo: Int) : AuthenticationS object FailedAuthenticationStatus : AuthenticationStatus() /** Face authentication error message */ -data class ErrorAuthenticationStatus(val msgId: Int, val msg: String? = null) : - AuthenticationStatus() { +data class ErrorAuthenticationStatus( + val msgId: Int, + val msg: String? = null, + // present to break equality check if the same error occurs repeatedly. + val createdAt: Long = elapsedRealtime() +) : AuthenticationStatus() { /** * Method that checks if [msgId] is a lockout error. A lockout error means that face * authentication is locked out. diff --git a/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt b/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt index 34a67403fc84..e06483990c90 100644 --- a/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt +++ b/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt @@ -167,9 +167,10 @@ class ViewLifecycleOwner( registry.currentState = Lifecycle.State.DESTROYED } - override fun getLifecycle(): Lifecycle { - return registry - } + override val lifecycle: Lifecycle + get() { + return registry + } private fun updateState() { registry.currentState = diff --git a/packages/SystemUI/src/com/android/systemui/log/BouncerLogger.kt b/packages/SystemUI/src/com/android/systemui/log/BouncerLogger.kt index 3226865d1d82..d4b799f444e5 100644 --- a/packages/SystemUI/src/com/android/systemui/log/BouncerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/log/BouncerLogger.kt @@ -18,6 +18,7 @@ package com.android.systemui.log import com.android.systemui.bouncer.shared.model.BouncerMessageModel import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.BouncerLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt b/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt index fefa1b29b576..68cdfb6d5865 100644 --- a/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt @@ -6,7 +6,7 @@ import com.android.keyguard.FaceAuthUiEvent import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.shared.model.ErrorAuthenticationStatus import com.android.systemui.keyguard.shared.model.TransitionStep -import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.DEBUG import com.android.systemui.log.dagger.FaceAuthLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt b/packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt index 27301e92eca2..150de26c12c7 100644 --- a/packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt @@ -21,9 +21,9 @@ import android.graphics.Rect import android.graphics.RectF import androidx.core.graphics.toRectF import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.log.LogLevel.DEBUG -import com.android.systemui.log.LogLevel.ERROR -import com.android.systemui.log.LogLevel.INFO +import com.android.systemui.log.core.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.ERROR +import com.android.systemui.log.core.LogLevel.INFO import com.android.systemui.log.dagger.ScreenDecorationsLog import com.google.errorprone.annotations.CompileTimeConstant import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt b/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt index 8d622ae1ca03..67a985eb44bc 100644 --- a/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt +++ b/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt @@ -21,8 +21,8 @@ import android.os.Trace import com.android.systemui.Dumpable import com.android.systemui.common.buffer.RingBuffer import com.android.systemui.dagger.qualifiers.Background -import com.android.systemui.log.LogLevel import com.android.systemui.log.LogcatEchoTracker +import com.android.systemui.log.core.LogLevel import com.android.systemui.plugins.log.TableLogBufferBase import com.android.systemui.util.time.SystemClock import java.io.PrintWriter diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaTimeoutLogger.kt b/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaTimeoutLogger.kt index e2e269de71a0..534241edb253 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaTimeoutLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaTimeoutLogger.kt @@ -19,7 +19,7 @@ package com.android.systemui.media.controls.pipeline import android.media.session.PlaybackState import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.MediaTimeoutListenerLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/resume/ResumeMediaBrowserLogger.kt b/packages/SystemUI/src/com/android/systemui/media/controls/resume/ResumeMediaBrowserLogger.kt index 9e53d77dec99..888b9c7cc901 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/resume/ResumeMediaBrowserLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/resume/ResumeMediaBrowserLogger.kt @@ -19,7 +19,7 @@ package com.android.systemui.media.controls.resume import android.content.ComponentName import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.MediaBrowserLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselControllerLogger.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselControllerLogger.kt index 0ed24349bdf4..3dc00004e900 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselControllerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselControllerLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.media.controls.ui import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.MediaCarouselControllerLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewLogger.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewLogger.kt index c781b7699b26..8f1595d7d7a2 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.media.controls.ui import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.MediaViewLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitLogger.kt b/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitLogger.kt index bbcf259418c8..417168209b43 100644 --- a/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitLogger.kt @@ -3,7 +3,7 @@ package com.android.systemui.media.muteawait import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.dagger.MediaMuteAwaitLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import javax.inject.Inject /** Log messages for [MediaMuteAwaitConnectionManager]. */ diff --git a/packages/SystemUI/src/com/android/systemui/media/nearby/NearbyMediaDevicesLogger.kt b/packages/SystemUI/src/com/android/systemui/media/nearby/NearbyMediaDevicesLogger.kt index 66399d580582..46c0132deff7 100644 --- a/packages/SystemUI/src/com/android/systemui/media/nearby/NearbyMediaDevicesLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/nearby/NearbyMediaDevicesLogger.kt @@ -3,7 +3,7 @@ package com.android.systemui.media.nearby import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.dagger.NearbyMediaDevicesLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import javax.inject.Inject /** Log messages for [NearbyMediaDevicesManager]. */ diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtils.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtils.kt index eeda102702d2..3c2226f6a240 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtils.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtils.kt @@ -17,7 +17,7 @@ package com.android.systemui.media.taptotransfer.common import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel /** A helper for logging media tap-to-transfer events. */ object MediaTttLoggerUtils { diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogger.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogger.kt index 206e5e3ee090..503afd3a675a 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogger.kt @@ -20,7 +20,7 @@ import android.app.StatusBarManager import com.android.internal.logging.InstanceId import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.media.taptotransfer.common.MediaTttLoggerUtils import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java index 99c591f25edb..8225c47d904b 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java @@ -462,7 +462,7 @@ public final class NavBarHelper implements * @return Whether the IME is shown on top of the screen given the {@code vis} flag of * {@link InputMethodService} and the keyguard states. */ - public boolean isImeShown(@InputMethodService.ImeWindowVisibility int vis) { + public boolean isImeShown(int vis) { View shadeWindowView = mNotificationShadeWindowController.getWindowRootView(); boolean isKeyguardShowing = mKeyguardStateController.isShowing(); boolean imeVisibleOnShade = shadeWindowView != null && shadeWindowView.isAttachedToWindow() diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 5bae1cba4ac4..682335e0b419 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -66,7 +66,6 @@ import android.graphics.Point; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; -import android.inputmethodservice.InputMethodService; import android.os.Binder; import android.os.Bundle; import android.os.Handler; @@ -1048,9 +1047,8 @@ public class NavigationBar extends ViewController<NavigationBarView> implements // ----- CommandQueue Callbacks ----- @Override - public void setImeWindowStatus(int displayId, IBinder token, - @InputMethodService.ImeWindowVisibility int vis, - @InputMethodService.BackDispositionMode int backDisposition, boolean showImeSwitcher) { + public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition, + boolean showImeSwitcher) { if (displayId != mDisplayId) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java index cecf043c572e..3b32313e76a0 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java @@ -338,9 +338,8 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, } @Override - public void setImeWindowStatus(int displayId, IBinder token, - @InputMethodService.ImeWindowVisibility int vis, - @InputMethodService.BackDispositionMode int backDisposition, boolean showImeSwitcher) { + public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition, + boolean showImeSwitcher) { boolean imeShown = mNavBarHelper.isImeShown(vis); if (!imeShown) { // Count imperceptible changes as visible so we transition taskbar out quickly. diff --git a/packages/SystemUI/src/com/android/systemui/privacy/logging/PrivacyLogger.kt b/packages/SystemUI/src/com/android/systemui/privacy/logging/PrivacyLogger.kt index e56106d1c065..f934346d9775 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/logging/PrivacyLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/logging/PrivacyLogger.kt @@ -20,8 +20,8 @@ import android.icu.text.SimpleDateFormat import android.permission.PermissionGroupUsage import com.android.systemui.log.dagger.PrivacyLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel -import com.android.systemui.log.LogMessage +import com.android.systemui.log.core.LogLevel +import com.android.systemui.log.core.LogMessage import com.android.systemui.privacy.PrivacyDialog import com.android.systemui.privacy.PrivacyItem import java.util.Locale diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragmentDisableFlagsLogger.kt b/packages/SystemUI/src/com/android/systemui/qs/QSFragmentDisableFlagsLogger.kt index ac6aabb2e5bd..6563e425190d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragmentDisableFlagsLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragmentDisableFlagsLogger.kt @@ -2,7 +2,7 @@ package com.android.systemui.qs import com.android.systemui.log.dagger.QSFragmentDisableLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.statusbar.disableflags.DisableFlagsLogger import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileRequestDialog.kt b/packages/SystemUI/src/com/android/systemui/qs/external/TileRequestDialog.kt index 6265b3c056e7..3432628e6d67 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileRequestDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileRequestDialog.kt @@ -18,6 +18,7 @@ package com.android.systemui.qs.external import android.content.Context import android.graphics.drawable.Icon +import android.view.ContextThemeWrapper import android.view.LayoutInflater import android.view.ViewGroup import android.widget.TextView @@ -66,7 +67,8 @@ class TileRequestDialog( } private fun createTileView(tileData: TileData): QSTileView { - val tile = QSTileViewImpl(context, QSIconViewImpl(context), true) + val themedContext = ContextThemeWrapper(context, R.style.Theme_SystemUI_QuickSettings) + val tile = QSTileViewImpl(themedContext, QSIconViewImpl(themedContext), true) val state = QSTile.BooleanState().apply { label = tileData.label handlesLongClick = false diff --git a/packages/SystemUI/src/com/android/systemui/qs/footer/ui/binder/FooterActionsViewBinder.kt b/packages/SystemUI/src/com/android/systemui/qs/footer/ui/binder/FooterActionsViewBinder.kt index 9c9ad33e4918..3c53d77c6beb 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/footer/ui/binder/FooterActionsViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/footer/ui/binder/FooterActionsViewBinder.kt @@ -244,8 +244,8 @@ class FooterActionsViewBinder @Inject constructor() { val backgroundResource = when (model.backgroundColor) { - R.attr.offStateColor -> R.drawable.qs_footer_action_circle - com.android.internal.R.attr.colorAccent -> R.drawable.qs_footer_action_circle_color + R.attr.shadeInactive -> R.drawable.qs_footer_action_circle + R.attr.shadeActive -> R.drawable.qs_footer_action_circle_color else -> error("Unsupported icon background resource ${model.backgroundColor}") } buttonView.setBackgroundResource(backgroundResource) diff --git a/packages/SystemUI/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModel.kt index b3596a254b7d..32146b5b00e4 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModel.kt @@ -145,8 +145,12 @@ class FooterActionsViewModel( R.drawable.ic_settings, ContentDescription.Resource(R.string.accessibility_quick_settings_settings) ), - iconTint = null, - backgroundColor = R.attr.offStateColor, + iconTint = + Utils.getColorAttrDefaultColor( + context, + R.attr.onShadeInactiveVariant, + ), + backgroundColor = R.attr.shadeInactive, this::onSettingsButtonClicked, ) @@ -162,9 +166,9 @@ class FooterActionsViewModel( iconTint = Utils.getColorAttrDefaultColor( context, - com.android.internal.R.attr.textColorOnAccent, + R.attr.onShadeActive, ), - backgroundColor = com.android.internal.R.attr.colorAccent, + backgroundColor = R.attr.shadeActive, this::onPowerButtonClicked, ) } else { @@ -264,7 +268,7 @@ class FooterActionsViewModel( ), ), iconTint = null, - backgroundColor = R.attr.offStateColor, + backgroundColor = R.attr.shadeInactive, onClick = this::onUserSwitcherClicked, ) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/logging/QSLogger.kt b/packages/SystemUI/src/com/android/systemui/qs/logging/QSLogger.kt index c00a81cbf12b..39745c8cbeea 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/logging/QSLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/logging/QSLogger.kt @@ -24,9 +24,9 @@ import android.view.View import com.android.systemui.log.ConstantStringsLogger import com.android.systemui.log.ConstantStringsLoggerImpl import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.DEBUG -import com.android.systemui.log.LogLevel.ERROR -import com.android.systemui.log.LogLevel.VERBOSE +import com.android.systemui.log.core.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.ERROR +import com.android.systemui.log.core.LogLevel.VERBOSE import com.android.systemui.log.dagger.QSConfigLog import com.android.systemui.log.dagger.QSLog import com.android.systemui.plugins.qs.QSTile diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt index d400faa3091e..573cb7154c4f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.qs.pipeline.shared.logging import android.annotation.UserIdInt import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.qs.pipeline.dagger.QSAutoAddLog import com.android.systemui.qs.pipeline.dagger.QSTileListLog import com.android.systemui.qs.pipeline.shared.TileSpec diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java index e54168162de6..7e45491adc83 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java @@ -248,13 +248,11 @@ public class QSIconViewImpl extends QSIconView { */ private static int getIconColorForState(Context context, QSTile.State state) { if (state.disabledByPolicy || state.state == Tile.STATE_UNAVAILABLE) { - return Utils.getColorAttrDefaultColor( - context, com.android.internal.R.attr.textColorTertiary); + return Utils.getColorAttrDefaultColor(context, R.attr.outline); } else if (state.state == Tile.STATE_INACTIVE) { - return Utils.getColorAttrDefaultColor(context, android.R.attr.textColorPrimary); + return Utils.getColorAttrDefaultColor(context, R.attr.onShadeInactiveVariant); } else if (state.state == Tile.STATE_ACTIVE) { - return Utils.getColorAttrDefaultColor(context, - com.android.internal.R.attr.textColorOnAccent); + return Utils.getColorAttrDefaultColor(context, R.attr.onShadeActive); } else { Log.e("QSIconView", "Invalid state " + state); return 0; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt index b80668379e49..d81e4c229aa7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt @@ -29,6 +29,7 @@ import android.os.Trace import android.service.quicksettings.Tile import android.text.TextUtils import android.util.Log +import android.util.TypedValue import android.view.Gravity import android.view.LayoutInflater import android.view.View @@ -92,24 +93,21 @@ open class QSTileViewImpl @JvmOverloads constructor( updateHeight() } - private val colorActive = Utils.getColorAttrDefaultColor(context, - com.android.internal.R.attr.colorAccentPrimary) - private val colorInactive = Utils.getColorAttrDefaultColor(context, R.attr.offStateColor) - private val colorUnavailable = Utils.applyAlpha(UNAVAILABLE_ALPHA, colorInactive) + private val colorActive = Utils.getColorAttrDefaultColor(context, R.attr.shadeActive) + private val colorInactive = Utils.getColorAttrDefaultColor(context, R.attr.shadeInactive) + private val colorUnavailable = Utils.getColorAttrDefaultColor(context, R.attr.shadeDisabled) - private val colorLabelActive = - Utils.getColorAttrDefaultColor(context, com.android.internal.R.attr.textColorOnAccent) - private val colorLabelInactive = - Utils.getColorAttrDefaultColor(context, android.R.attr.textColorPrimary) + private val colorLabelActive = Utils.getColorAttrDefaultColor(context, R.attr.onShadeActive) + private val colorLabelInactive = Utils.getColorAttrDefaultColor(context, R.attr.onShadeInactive) private val colorLabelUnavailable = - Utils.getColorAttrDefaultColor(context, com.android.internal.R.attr.textColorTertiary) + Utils.getColorAttrDefaultColor(context, R.attr.outline) private val colorSecondaryLabelActive = - Utils.getColorAttrDefaultColor(context, android.R.attr.textColorSecondaryInverse) + Utils.getColorAttrDefaultColor(context, R.attr.onShadeActiveVariant) private val colorSecondaryLabelInactive = - Utils.getColorAttrDefaultColor(context, android.R.attr.textColorSecondary) + Utils.getColorAttrDefaultColor(context, R.attr.onShadeInactiveVariant) private val colorSecondaryLabelUnavailable = - Utils.getColorAttrDefaultColor(context, com.android.internal.R.attr.textColorTertiary) + Utils.getColorAttrDefaultColor(context, R.attr.outline) private lateinit var label: TextView protected lateinit var secondaryLabel: TextView @@ -151,6 +149,11 @@ open class QSTileViewImpl @JvmOverloads constructor( private val locInScreen = IntArray(2) init { + val typedValue = TypedValue() + if (!getContext().theme.resolveAttribute(R.attr.isQsTheme, typedValue, true)) { + throw IllegalStateException("QSViewImpl must be inflated with a theme that contains " + + "Theme.SystemUI.QuickSettings") + } setId(generateViewId()) orientation = LinearLayout.HORIZONTAL gravity = Gravity.CENTER_VERTICAL or Gravity.START diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootView.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootView.kt index 9b5898f42279..2ad5429668d0 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootView.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootView.kt @@ -52,9 +52,8 @@ class SceneWindowRootView( setOnBackInvokedDispatcher(viewRootImpl.onBackInvokedDispatcher) } - override fun getLifecycle(): Lifecycle { - return this@repeatWhenAttached.lifecycle - } + override val lifecycle: Lifecycle = + this@repeatWhenAttached.lifecycle } ) diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 2ef9e0772d93..44436b912724 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -117,6 +117,7 @@ import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants; import com.android.systemui.classifier.Classifier; import com.android.systemui.classifier.FalsingCollector; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.DisplayId; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.doze.DozeLog; @@ -208,7 +209,6 @@ import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager; import com.android.systemui.statusbar.phone.TapAgainViewController; import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; -import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent; import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardQsUserSwitchController; @@ -238,7 +238,7 @@ import kotlin.Unit; import kotlinx.coroutines.CoroutineDispatcher; -@CentralSurfacesComponent.CentralSurfacesScope +@SysUISingleton public final class NotificationPanelViewController implements ShadeSurface, Dumpable { public static final String TAG = NotificationPanelView.class.getSimpleName(); @@ -1407,11 +1407,13 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mKeyguardBottomArea = keyguardBottomArea; } - void setOpenCloseListener(OpenCloseListener openCloseListener) { + @Override + public void setOpenCloseListener(OpenCloseListener openCloseListener) { mOpenCloseListener = openCloseListener; } - void setTrackingStartedListener(TrackingStartedListener trackingStartedListener) { + @Override + public void setTrackingStartedListener(TrackingStartedListener trackingStartedListener) { mTrackingStartedListener = trackingStartedListener; } @@ -3378,11 +3380,13 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump ViewGroupFadeHelper.reset(mView); } - void addOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener listener) { + @Override + public void addOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener listener) { mView.getViewTreeObserver().addOnGlobalLayoutListener(listener); } - void removeOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener listener) { + @Override + public void removeOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener listener) { mView.getViewTreeObserver().removeOnGlobalLayoutListener(listener); } @@ -3565,6 +3569,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } private void endMotionEvent(MotionEvent event, float x, float y, boolean forceCancel) { + mShadeLog.logEndMotionEvent("endMotionEvent called", forceCancel, false); mTrackingPointer = -1; mAmbientState.setSwipingUp(false); if ((mTracking && mTouchSlopExceeded) || Math.abs(x - mInitialExpandX) > mTouchSlop @@ -3586,15 +3591,19 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } else if (event.getActionMasked() == MotionEvent.ACTION_CANCEL || forceCancel) { if (onKeyguard) { expand = true; + mShadeLog.logEndMotionEvent("endMotionEvent: cancel while on keyguard", + forceCancel, expand); } else if (mCentralSurfaces.isBouncerShowingOverDream()) { expand = false; } else { // If we get a cancel, put the shade back to the state it was in when the // gesture started expand = !mPanelClosedOnDown; + mShadeLog.logEndMotionEvent("endMotionEvent: cancel", forceCancel, expand); } } else { expand = flingExpands(vel, vectorVel, x, y); + mShadeLog.logEndMotionEvent("endMotionEvent: flingExpands", forceCancel, expand); } mDozeLog.traceFling( @@ -3847,8 +3856,8 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump return !isFullyCollapsed() && !mTracking && !mClosing; } - /** Collapses the shade instantly without animation. */ - void instantCollapse() { + @Override + public void instantCollapse() { abortAnimations(); setExpandedFraction(0f); if (mExpanding) { @@ -4021,8 +4030,8 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mFixedDuration = NO_FIXED_DURATION; } - /** */ - boolean postToView(Runnable action) { + @Override + public boolean postToView(Runnable action) { return mView.post(action); } @@ -4731,6 +4740,8 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mTouchSlopExceeded = mTouchSlopExceededBeforeDown; mMotionAborted = false; mPanelClosedOnDown = isFullyCollapsed(); + mShadeLog.logPanelClosedOnDown("intercept down touch", mPanelClosedOnDown, + mExpandedFraction); mCollapsedAndHeadsUpOnDown = false; mHasLayoutedSinceDown = false; mUpdateFlingOnLayout = false; @@ -4948,6 +4959,8 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump startExpandMotion(x, y, false /* startTracking */, mExpandedHeight); mMinExpandHeight = 0.0f; mPanelClosedOnDown = isFullyCollapsed(); + mShadeLog.logPanelClosedOnDown("handle down touch", mPanelClosedOnDown, + mExpandedFraction); mHasLayoutedSinceDown = false; mUpdateFlingOnLayout = false; mMotionAborted = false; @@ -5113,18 +5126,5 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump return super.performAccessibilityAction(host, action, args); } } - - /** Listens for when touch tracking begins. */ - interface TrackingStartedListener { - void onTrackingStarted(); - } - - /** Listens for when shade begins opening of finishes closing. */ - interface OpenCloseListener { - /** Called when the shade finishes closing. */ - void onClosingFinished(); - /** Called when the shade starts opening. */ - void onOpenStarted(); - } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java index 1361c9f25eff..fe1b3656bb4f 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java @@ -68,6 +68,7 @@ import com.android.systemui.Dumpable; import com.android.systemui.R; import com.android.systemui.classifier.Classifier; import com.android.systemui.classifier.FalsingCollector; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.fragments.FragmentHostManager; @@ -98,7 +99,6 @@ import com.android.systemui.statusbar.phone.LockscreenGestureLogger; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager; -import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent; import com.android.systemui.statusbar.policy.CastController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.LargeScreenUtils; @@ -113,7 +113,7 @@ import javax.inject.Inject; /** Handles QuickSettings touch handling, expansion and animation state * TODO (b/264460656) make this dumpable */ -@CentralSurfacesComponent.CentralSurfacesScope +@SysUISingleton public class QuickSettingsController implements Dumpable { public static final String TAG = "QuickSettingsController"; diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeController.java b/packages/SystemUI/src/com/android/systemui/shade/ShadeController.java index 9ed0e9a8b359..317d88585958 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeController.java @@ -165,8 +165,7 @@ public interface ShadeController { NotificationShadeWindowViewController notificationShadeWindowViewController); /** */ - void setNotificationPanelViewController( - NotificationPanelViewController notificationPanelViewController); + void setShadeViewController(ShadeViewController shadeViewController); /** Listens for shade visibility changes. */ interface ShadeVisibilityListener { diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java index c9338b3614ea..b92afac047fa 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java @@ -70,7 +70,8 @@ public final class ShadeControllerImpl implements ShadeController { private boolean mExpandedVisible; - private NotificationPanelViewController mNotificationPanelViewController; + // TODO(b/237661616): Rename this variable to mShadeViewController. + private ShadeViewController mNotificationPanelViewController; private NotificationPresenter mPresenter; private NotificationShadeWindowViewController mNotificationShadeWindowViewController; private ShadeVisibilityListener mShadeVisibilityListener; @@ -426,12 +427,11 @@ public final class ShadeControllerImpl implements ShadeController { } @Override - public void setNotificationPanelViewController( - NotificationPanelViewController notificationPanelViewController) { - mNotificationPanelViewController = notificationPanelViewController; + public void setShadeViewController(ShadeViewController shadeViewController) { + mNotificationPanelViewController = shadeViewController; mNotificationPanelViewController.setTrackingStartedListener(this::runPostCollapseRunnables); mNotificationPanelViewController.setOpenCloseListener( - new NotificationPanelViewController.OpenCloseListener() { + new OpenCloseListener() { @Override public void onClosingFinished() { ShadeControllerImpl.this.onClosingFinished(); diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt index 3af75cef3d4c..8789a8b3b7f4 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt @@ -195,7 +195,9 @@ constructor( set(value) { if (visible && field != value) { field = value + iconContainer.setQsExpansionTransitioning(value > 0f && value < 1.0f) updatePosition() + updateIgnoredSlots() } } @@ -216,6 +218,8 @@ constructor( view.onApplyWindowInsets(insets) } + private var singleCarrier = false + private val demoModeReceiver = object : DemoMode { override fun demoCommands() = listOf(DemoMode.COMMAND_CLOCK) @@ -479,17 +483,20 @@ constructor( private fun updateListeners() { mShadeCarrierGroupController.setListening(visible) if (visible) { - updateSingleCarrier(mShadeCarrierGroupController.isSingleCarrier) + singleCarrier = mShadeCarrierGroupController.isSingleCarrier + updateIgnoredSlots() mShadeCarrierGroupController.setOnSingleCarrierChangedListener { - updateSingleCarrier(it) + singleCarrier = it + updateIgnoredSlots() } } else { mShadeCarrierGroupController.setOnSingleCarrierChangedListener(null) } } - private fun updateSingleCarrier(singleCarrier: Boolean) { - if (singleCarrier) { + private fun updateIgnoredSlots() { + // switching from QQS to QS state halfway through the transition + if (singleCarrier || qsExpandedFraction < 0.5) { iconContainer.removeIgnoredSlots(carrierIconSlots) } else { iconContainer.addIgnoredSlots(carrierIconSlots) diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt index 2da8d5f4d921..1c30bddfe859 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt @@ -19,7 +19,7 @@ package com.android.systemui.shade import android.view.MotionEvent import com.android.systemui.log.dagger.ShadeLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.shade.ShadeViewController.Companion.FLING_COLLAPSE import com.android.systemui.shade.ShadeViewController.Companion.FLING_EXPAND import com.android.systemui.shade.ShadeViewController.Companion.FLING_HIDE @@ -90,7 +90,7 @@ class ShadeLogger @Inject constructor(@ShadeLog private val buffer: LogBuffer) { double1 = event.y.toDouble() }, { - "$str1\neventTime=$long1,downTime=$long2,y=$double1,action=$int1,class=$int2" + "$str1: eventTime=$long1,downTime=$long2,y=$double1,action=$int1,class=$int2" } ) } @@ -280,6 +280,42 @@ class ShadeLogger @Inject constructor(@ShadeLog private val buffer: LogBuffer) { ) } + fun logEndMotionEvent( + msg: String, + forceCancel: Boolean, + expand: Boolean, + ) + { + buffer.log( + TAG, + LogLevel.VERBOSE, + { + str1 = msg + bool1 = forceCancel + bool2 = expand + }, + { "$str1; force=$bool1; expand=$bool2" } + ) + } + + fun logPanelClosedOnDown( + msg: String, + panelClosedOnDown: Boolean, + expandFraction: Float, + ) + { + buffer.log( + TAG, + LogLevel.VERBOSE, + { + str1 = msg + bool1 = panelClosedOnDown + double1 = expandFraction.toDouble() + }, + { "$str1; mPanelClosedOnDown=$bool1; mExpandedFraction=$double1" } + ) + } + fun flingQs(flingType: Int, isClick: Boolean) { buffer.log( TAG, diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt index a2b93516695a..0500a5844155 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt @@ -49,6 +49,7 @@ import com.android.systemui.statusbar.NotificationShelfController import com.android.systemui.statusbar.notification.row.dagger.NotificationShelfComponent import com.android.systemui.statusbar.notification.shelf.ui.viewbinder.NotificationShelfViewBinderWrapperControllerImpl import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout +import com.android.systemui.statusbar.phone.KeyguardBottomAreaView import com.android.systemui.statusbar.phone.StatusIconContainer import com.android.systemui.statusbar.phone.TapAgainView import com.android.systemui.statusbar.policy.BatteryController @@ -71,6 +72,12 @@ abstract class ShadeModule { @ClassKey(AuthRippleController::class) abstract fun bindAuthRippleController(controller: AuthRippleController): CoreStartable + @Binds + @SysUISingleton + abstract fun bindsShadeViewController( + notificationPanelViewController: NotificationPanelViewController + ): ShadeViewController + companion object { const val SHADE_HEADER = "large_screen_shade_header" @@ -165,6 +172,20 @@ abstract class ShadeModule { return notificationShadeWindowView.findViewById(R.id.notification_panel) } + /** + * Constructs a new, unattached [KeyguardBottomAreaView]. + * + * Note that this is explicitly _not_ a singleton, as we want to be able to reinflate it + */ + @Provides + fun providesKeyguardBottomAreaView( + npv: NotificationPanelView, + layoutInflater: LayoutInflater, + ): KeyguardBottomAreaView { + return layoutInflater.inflate(R.layout.keyguard_bottom_area, npv, false) + as KeyguardBottomAreaView + } + @Provides @SysUISingleton fun providesLightRevealScrim( diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt index 3d9fcf9cdecb..9aa5eb0cd68b 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt @@ -17,6 +17,7 @@ package com.android.systemui.shade import android.view.MotionEvent import android.view.ViewGroup +import android.view.ViewTreeObserver import com.android.systemui.keyguard.shared.model.WakefulnessModel import com.android.systemui.statusbar.RemoteInputController import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow @@ -77,6 +78,9 @@ interface ShadeViewController { /** Collapses the shade with an animation duration in milliseconds. */ fun collapseWithDuration(animationDuration: Int) + /** Collapses the shade instantly without animation. */ + fun instantCollapse() + /** * Animate QS collapse by flinging it. If QS is expanded, it will collapse into QQS and stop. If * in split shade, it will collapse the whole shade. @@ -100,6 +104,9 @@ interface ShadeViewController { /** Returns whether the shade's top level view is enabled. */ val isViewEnabled: Boolean + /** Sets a listener to be notified when the shade starts opening or finishes closing. */ + fun setOpenCloseListener(openCloseListener: OpenCloseListener) + /** Returns whether status bar icons should be hidden when the shade is expanded. */ fun shouldHideStatusBarIconsWhenExpanded(): Boolean @@ -109,6 +116,9 @@ interface ShadeViewController { */ fun blockExpansionForCurrentTouch() + /** Sets a listener to be notified when touch tracking begins. */ + fun setTrackingStartedListener(trackingStartedListener: TrackingStartedListener) + /** * Disables the shade header. * @@ -178,6 +188,15 @@ interface ShadeViewController { /** Ensures that the touchable region is updated. */ fun updateTouchableRegion() + /** Adds a global layout listener. */ + fun addOnGlobalLayoutListener(listener: ViewTreeObserver.OnGlobalLayoutListener) + + /** Removes a global layout listener. */ + fun removeOnGlobalLayoutListener(listener: ViewTreeObserver.OnGlobalLayoutListener) + + /** Posts the given runnable to the view. */ + fun postToView(action: Runnable): Boolean + // ******* Begin Keyguard Section ********* /** Animate to expanded shade after a delay in ms. Used for lockscreen to shade transition. */ fun transitionToExpandedShade(delay: Long) @@ -337,3 +356,17 @@ interface ShadeViewStateProvider { /** Return the fraction of the shade that's expanded, when in lockscreen. */ val lockscreenShadeDragProgress: Float } + +/** Listens for when touch tracking begins. */ +interface TrackingStartedListener { + fun onTrackingStarted() +} + +/** Listens for when shade begins opening or finishes closing. */ +interface OpenCloseListener { + /** Called when the shade finishes closing. */ + fun onClosingFinished() + + /** Called when the shade starts opening. */ + fun onOpenStarted() +} diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeWindowLogger.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeWindowLogger.kt index d06634b63b6b..51a27cf8989a 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeWindowLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeWindowLogger.kt @@ -21,9 +21,9 @@ import com.android.systemui.log.dagger.ShadeWindowLog import com.android.systemui.log.ConstantStringsLogger import com.android.systemui.log.ConstantStringsLoggerImpl import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel -import com.android.systemui.log.LogLevel.DEBUG -import com.android.systemui.log.LogMessage +import com.android.systemui.log.core.LogLevel +import com.android.systemui.log.core.LogLevel.DEBUG +import com.android.systemui.log.core.LogMessage import javax.inject.Inject private const val TAG = "systemui.shadewindow" diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt index eceda8453902..6fde84a35fb1 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt @@ -17,38 +17,52 @@ package com.android.systemui.shade.domain.interactor import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardRepository import com.android.systemui.statusbar.disableflags.data.repository.DisableFlagsRepository import com.android.systemui.statusbar.pipeline.mobile.data.repository.UserSetupRepository import com.android.systemui.statusbar.policy.DeviceProvisionedController import com.android.systemui.user.domain.interactor.UserInteractor import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn /** Business logic for shade interactions. */ @SysUISingleton class ShadeInteractor @Inject constructor( + @Application scope: CoroutineScope, disableFlagsRepository: DisableFlagsRepository, keyguardRepository: KeyguardRepository, userSetupRepository: UserSetupRepository, deviceProvisionedController: DeviceProvisionedController, userInteractor: UserInteractor, ) { + /** Emits true if the shade is currently allowed and false otherwise. */ + val isShadeEnabled: StateFlow<Boolean> = + disableFlagsRepository.disableFlags + .map { it.isShadeEnabled() } + .stateIn(scope, SharingStarted.Eagerly, initialValue = false) + /** Emits true if the shade can be expanded from QQS to QS and false otherwise. */ val isExpandToQsEnabled: Flow<Boolean> = combine( disableFlagsRepository.disableFlags, + isShadeEnabled, keyguardRepository.isDozing, userSetupRepository.isUserSetupFlow, - ) { disableFlags, isDozing, isUserSetup -> + ) { disableFlags, isShadeEnabled, isDozing, isUserSetup -> deviceProvisionedController.isDeviceProvisioned && // Disallow QS during setup if it's a simple user switcher. (The user intends to // use the lock screen user switcher, QS is not needed.) (isUserSetup || !userInteractor.isSimpleUserSwitcher) && - disableFlags.isShadeEnabled() && + isShadeEnabled && disableFlags.isQuickSettingsEnabled() && !isDozing } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActionClickLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/ActionClickLogger.kt index e008ec0dc75c..d3c19b75a71d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ActionClickLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActionClickLogger.kt @@ -19,7 +19,7 @@ package com.android.systemui.statusbar import android.app.PendingIntent import com.android.systemui.log.dagger.NotifInteractionLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.statusbar.notification.collection.NotificationEntry import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 6c2c0cf12aad..a532195c5b9f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar; import static android.app.StatusBarManager.DISABLE2_NONE; import static android.app.StatusBarManager.DISABLE_NONE; import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEFAULT; +import static android.inputmethodservice.InputMethodService.IME_INVISIBLE; import static android.view.Display.INVALID_DISPLAY; import android.annotation.Nullable; @@ -36,7 +37,7 @@ import android.hardware.biometrics.IBiometricContextListener; import android.hardware.biometrics.IBiometricSysuiReceiver; import android.hardware.biometrics.PromptInfo; import android.hardware.fingerprint.IUdfpsRefreshRateRequestCallback; -import android.inputmethodservice.InputMethodService; +import android.inputmethodservice.InputMethodService.BackDispositionMode; import android.media.INearbyMediaDevicesProvider; import android.media.MediaRoute2Info; import android.os.Binder; @@ -225,10 +226,8 @@ public class CommandQueue extends IStatusBar.Stub implements * @param backDisposition Disposition mode of back button. It should be one of below flags: * @param showImeSwitcher {@code true} to show IME switch button. */ - default void setImeWindowStatus(int displayId, IBinder token, - @InputMethodService.ImeWindowVisibility int vis, - @InputMethodService.BackDispositionMode int backDisposition, - boolean showImeSwitcher) { } + default void setImeWindowStatus(int displayId, IBinder token, int vis, + @BackDispositionMode int backDisposition, boolean showImeSwitcher) { } default void showRecentApps(boolean triggeredFromAltTab) { } default void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) { } default void toggleTaskbar() { } @@ -679,9 +678,7 @@ public class CommandQueue extends IStatusBar.Stub implements } @Override - public void setImeWindowStatus(int displayId, IBinder token, - @InputMethodService.ImeWindowVisibility int vis, - @InputMethodService.BackDispositionMode int backDisposition, + public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition, boolean showImeSwitcher) { synchronized (mLock) { mHandler.removeMessages(MSG_SHOW_IME_BUTTON); @@ -1095,9 +1092,7 @@ public class CommandQueue extends IStatusBar.Stub implements } } - private void handleShowImeButton(int displayId, IBinder token, - @InputMethodService.ImeWindowVisibility int vis, - @InputMethodService.BackDispositionMode int backDisposition, + private void handleShowImeButton(int displayId, IBinder token, int vis, int backDisposition, boolean showImeSwitcher) { if (displayId == INVALID_DISPLAY) return; @@ -1117,7 +1112,7 @@ public class CommandQueue extends IStatusBar.Stub implements private void sendImeInvisibleStatusForPrevNavBar() { for (int i = 0; i < mCallbacks.size(); i++) { mCallbacks.get(i).setImeWindowStatus(mLastUpdatedImeDisplayId, - null /* token */, 0 /* vis */, BACK_DISPOSITION_DEFAULT, + null /* token */, IME_INVISIBLE, BACK_DISPOSITION_DEFAULT, false /* showImeSwitcher */); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java index 39181449aaa0..ec66e994b58a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java @@ -557,19 +557,7 @@ public final class KeyboardShortcutListSearch { new ShortcutKeyGroupMultiMappingInfo( context.getString(R.string.group_system_access_google_assistant), Arrays.asList( - Pair.create(KeyEvent.KEYCODE_A, KeyEvent.META_META_ON))), - /* Lock screen: Meta + L */ - new ShortcutKeyGroupMultiMappingInfo( - context.getString(R.string.group_system_lock_screen), - Arrays.asList( - Pair.create(KeyEvent.KEYCODE_L, KeyEvent.META_META_ON))), - /* Pull up Notes app for quick memo: Meta + Ctrl + N */ - new ShortcutKeyGroupMultiMappingInfo( - context.getString(R.string.group_system_quick_memo), - Arrays.asList( - Pair.create( - KeyEvent.KEYCODE_N, - KeyEvent.META_META_ON | KeyEvent.META_CTRL_ON))) + Pair.create(KeyEvent.KEYCODE_A, KeyEvent.META_META_ON))) ); for (ShortcutKeyGroupMultiMappingInfo info : infoList) { systemGroup.addItem(info.getShortcutMultiMappingInfo()); @@ -611,21 +599,12 @@ public final class KeyboardShortcutListSearch { new ArrayList<>()); // System multitasking shortcuts: - // Enter Split screen with current app to RHS: Meta + Ctrl + Right arrow - // Enter Split screen with current app to LHS: Meta + Ctrl + Left arrow // Switch from Split screen to full screen: Meta + Ctrl + Up arrow - // During Split screen: replace an app from one to another: Meta + Ctrl + Down arrow String[] shortcutLabels = { - context.getString(R.string.system_multitasking_rhs), - context.getString(R.string.system_multitasking_lhs), context.getString(R.string.system_multitasking_full_screen), - context.getString(R.string.system_multitasking_replace) }; int[] keyCodes = { - KeyEvent.KEYCODE_DPAD_RIGHT, - KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.KEYCODE_DPAD_UP, - KeyEvent.KEYCODE_DPAD_DOWN }; for (int i = 0; i < shortcutLabels.length; i++) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 96924821cc1d..42ebaa3877d8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -41,7 +41,7 @@ import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewCont import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_TRUST; import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_USER_LOCKED; import static com.android.systemui.keyguard.ScreenLifecycle.SCREEN_ON; -import static com.android.systemui.log.LogLevel.ERROR; +import static com.android.systemui.log.core.LogLevel.ERROR; import static com.android.systemui.plugins.FalsingManager.LOW_PENALTY; import android.app.AlarmManager; @@ -97,7 +97,7 @@ import com.android.systemui.keyguard.KeyguardIndication; import com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.util.IndicationHelper; -import com.android.systemui.log.LogLevel; +import com.android.systemui.log.core.LogLevel; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.settings.UserTracker; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt index e2d2ac0fcb58..4710574ac20d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt @@ -32,6 +32,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.shade.ShadeViewController import com.android.systemui.shade.data.repository.ShadeRepository +import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableView @@ -76,6 +77,7 @@ class LockscreenShadeTransitionController @Inject constructor( dumpManager: DumpManager, qsTransitionControllerFactory: LockscreenShadeQsTransitionController.Factory, private val shadeRepository: ShadeRepository, + private val shadeInteractor: ShadeInteractor, private val powerInteractor: PowerInteractor, ) : Dumpable { private var pulseHeight: Float = 0f @@ -558,7 +560,7 @@ class LockscreenShadeTransitionController @Inject constructor( animationHandler: ((Long) -> Unit)? = null, cancelAction: Runnable? = null ) { - if (centralSurfaces.isShadeDisabled) { + if (!shadeInteractor.isShadeEnabled.value) { cancelAction?.run() logger.logShadeDisabledOnGoToLockedShade() return diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java index 2465c21c956f..73f181b8c734 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java @@ -74,7 +74,7 @@ import com.android.systemui.demomode.DemoMode; import com.android.systemui.demomode.DemoModeController; import com.android.systemui.dump.DumpManager; import com.android.systemui.log.LogBuffer; -import com.android.systemui.log.LogLevel; +import com.android.systemui.log.core.LogLevel; import com.android.systemui.log.dagger.StatusBarNetworkControllerLog; import com.android.systemui.qs.tiles.dialog.InternetDialogFactory; import com.android.systemui.settings.UserTracker; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java index 075b41b91d97..035fa0454bfc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java @@ -41,6 +41,8 @@ import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.power.domain.interactor.PowerInteractor; import com.android.systemui.settings.DisplayTracker; +import com.android.systemui.shade.NotificationPanelViewController; +import com.android.systemui.shade.ShadeSurface; import com.android.systemui.shade.carrier.ShadeCarrierGroupController; import com.android.systemui.statusbar.ActionClickLogger; import com.android.systemui.statusbar.CommandQueue; @@ -273,6 +275,21 @@ public interface CentralSurfacesDependenciesModule { return ongoingCallController; } + /** + * {@link NotificationPanelViewController} implements two interfaces: + * - {@link com.android.systemui.shade.ShadeViewController}, which can be used by any class + * needing access to the shade. + * - {@link ShadeSurface}, which should *only* be used by {@link CentralSurfacesImpl}. + * + * Since {@link ShadeSurface} should only be accessible by {@link CentralSurfacesImpl}, it's + * *only* bound in this CentralSurfaces dependencies module. + * The {@link com.android.systemui.shade.ShadeViewController} interface is bound in + * {@link com.android.systemui.shade.ShadeModule} so others can access it. + */ + @Binds + @SysUISingleton + ShadeSurface provideShadeSurface(NotificationPanelViewController impl); + /** */ @Binds ShadeCarrierGroupController.SlotIndexResolver provideSlotIndexResolver( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/disableflags/data/model/DisableFlagsModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/disableflags/data/model/DisableFlagsModel.kt index ac05248a2b87..2bb476523cb8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/disableflags/data/model/DisableFlagsModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/disableflags/data/model/DisableFlagsModel.kt @@ -20,7 +20,7 @@ import android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS import android.app.StatusBarManager.DISABLE_NONE import android.app.StatusBarManager.DISABLE_NOTIFICATION_ALERTS import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.statusbar.disableflags.DisableFlagsLogger /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusBarEventsModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusBarEventsModule.kt index 3d6d48917dd3..84796f9acbc0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusBarEventsModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusBarEventsModule.kt @@ -22,6 +22,8 @@ import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogBufferFactory import com.android.systemui.statusbar.window.StatusBarWindowController import com.android.systemui.util.concurrency.DelayableExecutor import com.android.systemui.util.time.SystemClock @@ -36,6 +38,13 @@ interface StatusBarEventsModule { @Provides @SysUISingleton + @SystemStatusAnimationSchedulerLog + fun provideSystemStatusAnimationSchedulerLogBuffer(factory: LogBufferFactory): LogBuffer { + return factory.create("SystemStatusAnimationSchedulerLog", 60) + } + + @Provides + @SysUISingleton fun provideSystemStatusAnimationScheduler( featureFlags: FeatureFlags, coordinator: SystemEventCoordinator, @@ -44,7 +53,8 @@ interface StatusBarEventsModule { dumpManager: DumpManager, systemClock: SystemClock, @Application coroutineScope: CoroutineScope, - @Main executor: DelayableExecutor + @Main executor: DelayableExecutor, + logger: SystemStatusAnimationSchedulerLogger ): SystemStatusAnimationScheduler { return if (featureFlags.isEnabled(Flags.PLUG_IN_STATUS_BAR_CHIP)) { SystemStatusAnimationSchedulerImpl( @@ -53,7 +63,8 @@ interface StatusBarEventsModule { statusBarWindowController, dumpManager, systemClock, - coroutineScope + coroutineScope, + logger ) } else { SystemStatusAnimationSchedulerLegacyImpl( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt index 56ea703668d0..6fc715a2b578 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt @@ -18,7 +18,6 @@ package com.android.systemui.statusbar.events import android.os.Process import android.provider.DeviceConfig -import android.util.Log import androidx.core.animation.Animator import androidx.core.animation.AnimatorListenerAdapter import androidx.core.animation.AnimatorSet @@ -69,7 +68,8 @@ constructor( private val statusBarWindowController: StatusBarWindowController, dumpManager: DumpManager, private val systemClock: SystemClock, - @Application private val coroutineScope: CoroutineScope + @Application private val coroutineScope: CoroutineScope, + private val logger: SystemStatusAnimationSchedulerLogger? ) : SystemStatusAnimationScheduler { companion object { @@ -121,6 +121,10 @@ constructor( } } } + + coroutineScope.launch { + animationState.collect { logger?.logAnimationStateUpdate(it) } + } } @SystemAnimationState override fun getAnimationState(): Int = animationState.value @@ -140,32 +144,17 @@ constructor( ) { // a event can only be scheduled if no other event is in progress or it has a higher // priority. If a persistent dot is currently displayed, don't schedule the event. - if (DEBUG) { - Log.d(TAG, "scheduling event $event") - } - + logger?.logScheduleEvent(event) scheduleEvent(event) } else if (currentlyDisplayedEvent?.shouldUpdateFromEvent(event) == true) { - if (DEBUG) { - Log.d( - TAG, - "updating current event from: $event. animationState=${animationState.value}" - ) - } + logger?.logUpdateEvent(event, animationState.value) currentlyDisplayedEvent?.updateFromEvent(event) if (event.forceVisible) hasPersistentDot = true } else if (scheduledEvent.value?.shouldUpdateFromEvent(event) == true) { - if (DEBUG) { - Log.d( - TAG, - "updating scheduled event from: $event. animationState=${animationState.value}" - ) - } + logger?.logUpdateEvent(event, animationState.value) scheduledEvent.value?.updateFromEvent(event) } else { - if (DEBUG) { - Log.d(TAG, "ignoring event $event") - } + logger?.logIgnoreEvent(event) } } @@ -356,6 +345,7 @@ constructor( } private fun notifyTransitionToPersistentDot(): Animator? { + logger?.logTransitionToPersistentDotCallbackInvoked() val anims: List<Animator> = listeners.mapNotNull { it.onSystemStatusAnimationTransitionToPersistentDot( @@ -373,6 +363,7 @@ constructor( private fun notifyHidePersistentDot(): Animator? { Assert.isMainThread() + logger?.logHidePersistentDotCallbackInvoked() val anims: List<Animator> = listeners.mapNotNull { it.onHidePersistentDot() } if (animationState.value == SHOWING_PERSISTENT_DOT) { @@ -424,5 +415,4 @@ constructor( } } -private const val DEBUG = false private const val TAG = "SystemStatusAnimationSchedulerImpl" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLog.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLog.kt new file mode 100644 index 000000000000..4ac94a60d4c6 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLog.kt @@ -0,0 +1,25 @@ +/* + * 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.statusbar.events + +import javax.inject.Qualifier + +/** Logs for the SystemStatusAnimationScheduler. */ +@Qualifier +@MustBeDocumented +@kotlin.annotation.Retention(AnnotationRetention.RUNTIME) +annotation class SystemStatusAnimationSchedulerLog diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLogger.kt new file mode 100644 index 000000000000..22b0b691ad3b --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLogger.kt @@ -0,0 +1,92 @@ +package com.android.systemui.statusbar.events + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.core.LogLevel +import javax.inject.Inject + +/** Logs for the SystemStatusAnimationScheduler. */ +@SysUISingleton +class SystemStatusAnimationSchedulerLogger +@Inject +constructor( + @SystemStatusAnimationSchedulerLog private val logBuffer: LogBuffer, +) { + + fun logScheduleEvent(event: StatusEvent) { + logBuffer.log( + TAG, + LogLevel.DEBUG, + { + str1 = event.javaClass.simpleName + int1 = event.priority + bool1 = event.forceVisible + bool2 = event.showAnimation + }, + { "Scheduling event: $str1(forceVisible=$bool1, priority=$int1, showAnimation=$bool2)" } + ) + } + + fun logUpdateEvent(event: StatusEvent, @SystemAnimationState animationState: Int) { + logBuffer.log( + TAG, + LogLevel.DEBUG, + { + str1 = event.javaClass.simpleName + int1 = event.priority + bool1 = event.forceVisible + bool2 = event.showAnimation + int2 = animationState + }, + { + "Updating current event from: $str1(forceVisible=$bool1, priority=$int1, " + + "showAnimation=$bool2), animationState=${animationState.name()}" + } + ) + } + + fun logIgnoreEvent(event: StatusEvent) { + logBuffer.log( + TAG, + LogLevel.DEBUG, + { + str1 = event.javaClass.simpleName + int1 = event.priority + bool1 = event.forceVisible + bool2 = event.showAnimation + }, + { "Ignore event: $str1(forceVisible=$bool1, priority=$int1, showAnimation=$bool2)" } + ) + } + + fun logHidePersistentDotCallbackInvoked() { + logBuffer.log(TAG, LogLevel.DEBUG, "Hide persistent dot callback invoked") + } + + fun logTransitionToPersistentDotCallbackInvoked() { + logBuffer.log(TAG, LogLevel.DEBUG, "Transition to persistent dot callback invoked") + } + + fun logAnimationStateUpdate(@SystemAnimationState animationState: Int) { + logBuffer.log( + TAG, + LogLevel.DEBUG, + { int1 = animationState }, + { "AnimationState update: ${int1.name()}" } + ) + animationState.name() + } + + private fun @receiver:SystemAnimationState Int.name() = + when (this) { + IDLE -> "IDLE" + ANIMATION_QUEUED -> "ANIMATION_QUEUED" + ANIMATING_IN -> "ANIMATING_IN" + RUNNING_CHIP_ANIM -> "RUNNING_CHIP_ANIM" + ANIMATING_OUT -> "ANIMATING_OUT" + SHOWING_PERSISTENT_DOT -> "SHOWING_PERSISTENT_DOT" + else -> "UNKNOWN_ANIMATION_STATE" + } +} + +private const val TAG = "SystemStatusAnimationSchedulerLog" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeUpGestureLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeUpGestureLogger.kt index a67c26c06cb9..96725fc09d6a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeUpGestureLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeUpGestureLogger.kt @@ -19,7 +19,7 @@ package com.android.systemui.statusbar.gesture import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.dagger.SwipeUpLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import javax.inject.Inject /** Log messages for [SwipeUpGestureHandler]. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClickerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClickerLogger.kt index a3a72d92c2e4..cea2b595f595 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClickerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClickerLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.statusbar.notification import com.android.systemui.log.dagger.NotifInteractionLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.statusbar.notification.collection.NotificationEntry import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt index f7679ed058c6..502e1d9ea639 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt @@ -14,7 +14,7 @@ package com.android.systemui.statusbar.notification import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.DEBUG import com.android.systemui.log.dagger.NotificationLockscreenLog import com.android.systemui.statusbar.StatusBarState import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/RemoteInputControllerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/RemoteInputControllerLogger.kt index 487a5f87d0bd..7809eaafe0b3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/RemoteInputControllerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/RemoteInputControllerLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.statusbar.notification import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.DEBUG import com.android.systemui.log.dagger.NotificationRemoteInputLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coalescer/GroupCoalescerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coalescer/GroupCoalescerLogger.kt index 39d0833c57d4..0ab348d174b7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coalescer/GroupCoalescerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coalescer/GroupCoalescerLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.statusbar.notification.collection.coalescer import com.android.systemui.log.dagger.NotificationLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import javax.inject.Inject class GroupCoalescerLogger @Inject constructor( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/GutsCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/GutsCoordinatorLogger.kt index 79c63e6b0db1..bd1141e79278 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/GutsCoordinatorLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/GutsCoordinatorLogger.kt @@ -2,7 +2,7 @@ package com.android.systemui.statusbar.notification.collection.coordinator import com.android.systemui.log.dagger.NotificationLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.statusbar.notification.row.NotificationGuts import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt index e17ce5cff37d..496fb83c1cf9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt @@ -4,7 +4,7 @@ import android.util.Log import com.android.systemui.log.dagger.NotificationHeadsUpLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import javax.inject.Inject private const val TAG = "HeadsUpCoordinator" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorLogger.kt index 1f8ec3411bcd..4c33524346eb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorLogger.kt @@ -17,7 +17,7 @@ package com.android.systemui.statusbar.notification.collection.coordinator import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.UnseenNotificationLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorLogger.kt index 6271d38f1efa..bf65043ea534 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.statusbar.notification.collection.coordinator import com.android.systemui.log.dagger.NotificationLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.statusbar.notification.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ShadeEventCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ShadeEventCoordinatorLogger.kt index 1f4861a10e75..0d9681f801f7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ShadeEventCoordinatorLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ShadeEventCoordinatorLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.statusbar.notification.collection.coordinator import com.android.systemui.log.dagger.NotificationLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import javax.inject.Inject private const val TAG = "ShadeEventCoordinator" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/listbuilder/ShadeListBuilderLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/listbuilder/ShadeListBuilderLogger.kt index f13ff6814df8..a8409d0c6fa0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/listbuilder/ShadeListBuilderLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/listbuilder/ShadeListBuilderLogger.kt @@ -18,9 +18,9 @@ package com.android.systemui.statusbar.notification.collection.listbuilder import com.android.systemui.log.dagger.NotificationLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.DEBUG -import com.android.systemui.log.LogLevel.INFO -import com.android.systemui.log.LogLevel.WARNING +import com.android.systemui.log.core.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.INFO +import com.android.systemui.log.core.LogLevel.WARNING import com.android.systemui.statusbar.notification.NotifPipelineFlags import com.android.systemui.statusbar.notification.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.ListEntry diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifCollectionLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifCollectionLogger.kt index 73227ab9f4fb..014ac549591e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifCollectionLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifCollectionLogger.kt @@ -22,11 +22,11 @@ import android.service.notification.NotificationListenerService.RankingMap import android.service.notification.StatusBarNotification import com.android.systemui.log.dagger.NotificationLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.DEBUG -import com.android.systemui.log.LogLevel.ERROR -import com.android.systemui.log.LogLevel.INFO -import com.android.systemui.log.LogLevel.WARNING -import com.android.systemui.log.LogLevel.WTF +import com.android.systemui.log.core.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.ERROR +import com.android.systemui.log.core.LogLevel.INFO +import com.android.systemui.log.core.LogLevel.WARNING +import com.android.systemui.log.core.LogLevel.WTF import com.android.systemui.statusbar.notification.collection.NotifCollection import com.android.systemui.statusbar.notification.collection.NotifCollection.CancellationReason import com.android.systemui.statusbar.notification.collection.NotifCollection.FutureDismissal diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilderLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilderLogger.kt index 07fd349d3786..e61f9bdda3d9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilderLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilderLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.statusbar.notification.collection.render import com.android.systemui.log.dagger.NotificationLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.statusbar.notification.NotifPipelineFlags import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection import com.android.systemui.util.Compile diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewDifferLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewDifferLogger.kt index a880b7157708..082f308bc731 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewDifferLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewDifferLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.statusbar.notification.collection.render import com.android.systemui.log.dagger.NotificationLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import java.lang.RuntimeException import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt index 0b31265963ed..c6d2861a8c68 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt @@ -2,7 +2,7 @@ package com.android.systemui.statusbar.notification.interruption import com.android.systemui.log.dagger.NotificationHeadsUpLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.INFO +import com.android.systemui.log.core.LogLevel.INFO import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptLogger.kt index 5bac2a9350a5..4a823a40a272 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptLogger.kt @@ -20,9 +20,9 @@ import android.util.Log import com.android.systemui.log.dagger.NotificationInterruptLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.DEBUG -import com.android.systemui.log.LogLevel.INFO -import com.android.systemui.log.LogLevel.WARNING +import com.android.systemui.log.core.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.INFO +import com.android.systemui.log.core.LogLevel.WARNING import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey import com.android.systemui.util.Compile diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationRoundnessLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationRoundnessLogger.kt index fe03b2ad6a32..0e1f66f7cbd6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationRoundnessLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationRoundnessLogger.kt @@ -17,7 +17,7 @@ package com.android.systemui.statusbar.notification.logging import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.INFO +import com.android.systemui.log.core.LogLevel.INFO import com.android.systemui.log.dagger.NotificationRenderLog import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableView diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotifBindPipelineLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotifBindPipelineLogger.kt index 45be0b151870..385670080f63 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotifBindPipelineLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotifBindPipelineLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.statusbar.notification.row import com.android.systemui.log.dagger.NotificationLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.INFO +import com.android.systemui.log.core.LogLevel.INFO import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowLogger.kt index 89338f9eeed3..4f5a04f2bdc9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowLogger.kt @@ -19,7 +19,7 @@ package com.android.systemui.statusbar.notification.row import android.view.ViewGroup import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.NotificationLog import com.android.systemui.log.dagger.NotificationRenderLog import com.android.systemui.statusbar.notification.collection.NotificationEntry diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindStageLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindStageLogger.kt index 684a276ed635..02627fd8f975 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindStageLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindStageLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.statusbar.notification.row import com.android.systemui.log.dagger.NotificationLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.INFO +import com.android.systemui.log.core.LogLevel.INFO import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerLogger.kt index 6be1ef8711df..4986b632472d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerLogger.kt @@ -17,7 +17,7 @@ package com.android.systemui.statusbar.notification.stack import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.NotificationRenderLog import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsLogger.kt index f9531876e30d..2da55828e30d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsLogger.kt @@ -19,7 +19,7 @@ package com.android.systemui.statusbar.notification.stack import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.dagger.NotificationSectionLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import javax.inject.Inject private const val TAG = "NotifSections" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt index 9c1bd174107e..2c38b8dfca04 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt @@ -1,11 +1,11 @@ package com.android.systemui.statusbar.notification.stack import android.view.ViewGroup -import com.android.systemui.log.dagger.NotificationHeadsUpLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.DEBUG -import com.android.systemui.log.LogLevel.INFO -import com.android.systemui.log.LogLevel.ERROR +import com.android.systemui.log.core.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.INFO +import com.android.systemui.log.core.LogLevel.ERROR +import com.android.systemui.log.dagger.NotificationHeadsUpLog import com.android.systemui.log.dagger.NotificationRenderLog import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateLogger.kt index c7f80f311650..0b2c4863157c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateLogger.kt @@ -1,8 +1,8 @@ package com.android.systemui.statusbar.notification.stack -import com.android.systemui.log.dagger.NotificationHeadsUpLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel +import com.android.systemui.log.dagger.NotificationHeadsUpLog import com.android.systemui.log.dagger.NotificationRenderLog import com.android.systemui.statusbar.notification.logKey import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java index 4ba09e175b8b..478baf2f58d6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java @@ -203,8 +203,6 @@ public interface CentralSurfaces extends Dumpable, LifecycleOwner { int getStatusBarHeight(); - boolean isShadeDisabled(); - boolean isLaunchingActivityOverLockscreen(); void onKeyguardViewManagerStatesUpdated(); @@ -380,14 +378,6 @@ public interface CentralSurfaces extends Dumpable, LifecycleOwner { void resendMessage(Object msg); - int getDisabled1(); - - void setDisabled1(int disabled); - - int getDisabled2(); - - void setDisabled2(int disabled); - void setLastCameraLaunchSource(int source); void setLaunchCameraOnFinishedGoingToSleep(boolean launch); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java index 332be2aa957d..6431ef958239 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java @@ -111,6 +111,9 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba private static final VibrationAttributes HARDWARE_FEEDBACK_VIBRATION_ATTRIBUTES = VibrationAttributes.createForUsage(VibrationAttributes.USAGE_HARDWARE_FEEDBACK); + private int mDisabled1; + private int mDisabled2; + @Inject CentralSurfacesCommandQueueCallbacks( CentralSurfaces centralSurfaces, @@ -256,22 +259,14 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba return; } - int state2BeforeAdjustment = state2; - state2 = mRemoteInputQuickSettingsDisabler.adjustDisableFlags(state2); - Log.d(CentralSurfaces.TAG, - mDisableFlagsLogger.getDisableFlagsString( - /* new= */ new DisableFlagsLogger.DisableState( - state1, state2BeforeAdjustment), - /* newStateAfterLocalModification= */ new DisableFlagsLogger.DisableState( - state1, state2))); - - final int old1 = mCentralSurfaces.getDisabled1(); + final int old1 = mDisabled1; final int diff1 = state1 ^ old1; - mCentralSurfaces.setDisabled1(state1); + mDisabled1 = state1; - final int old2 = mCentralSurfaces.getDisabled2(); + state2 = mRemoteInputQuickSettingsDisabler.adjustDisableFlags(state2); + final int old2 = mDisabled2; final int diff2 = state2 ^ old2; - mCentralSurfaces.setDisabled2(state2); + mDisabled2 = state2; if ((diff1 & StatusBarManager.DISABLE_EXPAND) != 0) { if ((state1 & StatusBarManager.DISABLE_EXPAND) != 0) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index 88ccae624dd0..39b13d95345f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -182,7 +182,6 @@ import com.android.systemui.scrim.ScrimView; import com.android.systemui.settings.UserTracker; import com.android.systemui.settings.brightness.BrightnessSliderController; import com.android.systemui.shade.CameraLauncher; -import com.android.systemui.shade.NotificationPanelViewController; import com.android.systemui.shade.NotificationShadeWindowView; import com.android.systemui.shade.NotificationShadeWindowViewController; import com.android.systemui.shade.QuickSettingsController; @@ -363,26 +362,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { } @Override - public int getDisabled1() { - return mDisabled1; - } - - @Override - public void setDisabled1(int disabled) { - mDisabled1 = disabled; - } - - @Override - public int getDisabled2() { - return mDisabled2; - } - - @Override - public void setDisabled2(int disabled) { - mDisabled2 = disabled; - } - - @Override public void setLastCameraLaunchSource(int source) { mLastCameraLaunchSource = source; } @@ -497,14 +476,12 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { private final Lazy<LightRevealScrimViewModel> mLightRevealScrimViewModelLazy; /** Controller for the Shade. */ - @VisibleForTesting - ShadeSurface mShadeSurface; + private final ShadeSurface mShadeSurface; private final ShadeLogger mShadeLogger; // settings private QSPanelController mQSPanelController; - @VisibleForTesting - QuickSettingsController mQsController; + private final QuickSettingsController mQsController; KeyguardIndicationController mKeyguardIndicationController; @@ -530,11 +507,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { private CentralSurfacesComponent mCentralSurfacesComponent; - // Flags for disabling the status bar - // Two variables because the first one evidently ran out of room for new flags. - private int mDisabled1 = 0; - private int mDisabled2 = 0; - /** * This keeps track of whether we have (or haven't) registered the predictive back callback. * Since we can have visible -> visible transitions, we need to avoid @@ -729,9 +701,11 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { MetricsLogger metricsLogger, ShadeLogger shadeLogger, @UiBackground Executor uiBgExecutor, + ShadeSurface shadeSurface, NotificationMediaManager notificationMediaManager, NotificationLockscreenUserManager lockScreenUserManager, NotificationRemoteInputManager remoteInputManager, + QuickSettingsController quickSettingsController, UserSwitcherController userSwitcherController, BatteryController batteryController, SysuiColorExtractor colorExtractor, @@ -830,9 +804,11 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mMetricsLogger = metricsLogger; mShadeLogger = shadeLogger; mUiBgExecutor = uiBgExecutor; + mShadeSurface = shadeSurface; mMediaManager = notificationMediaManager; mLockscreenUserManager = lockScreenUserManager; mRemoteInputManager = remoteInputManager; + mQsController = quickSettingsController; mUserSwitcherController = userSwitcherController; mBatteryController = batteryController; mColorExtractor = colorExtractor; @@ -1636,13 +1612,9 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { // (Right now, there's a circular dependency.) mNotificationShadeWindowController.setWindowRootView(windowRootView); mNotificationShadeWindowViewController.setupExpandedStatusBar(); - NotificationPanelViewController npvc = - mCentralSurfacesComponent.getNotificationPanelViewController(); - mShadeSurface = npvc; - mShadeController.setNotificationPanelViewController(npvc); + mShadeController.setShadeViewController(mShadeSurface); mShadeController.setNotificationShadeWindowViewController( mNotificationShadeWindowViewController); - mQsController = mCentralSurfacesComponent.getQuickSettingsController(); mBackActionInteractor.setup(mQsController, mShadeSurface); mPresenter = mCentralSurfacesComponent.getNotificationPresenter(); mNotificationActivityStarter = mCentralSurfacesComponent.getNotificationActivityStarter(); @@ -1724,11 +1696,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { return mStatusBarWindowController.getStatusBarHeight(); } - @Override - public boolean isShadeDisabled() { - return (mDisabled2 & StatusBarManager.DISABLE2_NOTIFICATION_SHADE) != 0; - } - private void updateReportRejectedTouchVisibility() { if (mReportRejectedTouch == null) { return; @@ -1843,7 +1810,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { @Override public void onStatusBarTrackpadEvent(MotionEvent event) { - mCentralSurfacesComponent.getNotificationPanelViewController().handleExternalTouch(event); + mShadeSurface.handleExternalTouch(event); } private void onExpandedInvisible() { @@ -2213,7 +2180,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { if (mLockscreenWallpaper != null && !mWallpaperManager.isLockscreenLiveWallpaperEnabled()) { mLockscreenWallpaper.setCurrentUser(newUserId); } - mScrimController.setCurrentUser(newUserId); if (mWallpaperSupported) { mWallpaperChangedReceiver.onReceive(mContext, null); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java index 4d716c206908..680f19a79a05 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java @@ -45,7 +45,7 @@ import com.android.keyguard.logging.KeyguardLogger; import com.android.systemui.R; import com.android.systemui.battery.BatteryMeterViewController; import com.android.systemui.dagger.qualifiers.Main; -import com.android.systemui.log.LogLevel; +import com.android.systemui.log.core.LogLevel; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shade.ShadeViewStateProvider; import com.android.systemui.statusbar.CommandQueue; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LSShadeTransitionLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LSShadeTransitionLogger.kt index 5c357d7cd3ab..686efb7f1553 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LSShadeTransitionLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LSShadeTransitionLogger.kt @@ -21,7 +21,7 @@ import android.view.View import com.android.internal.logging.nano.MetricsProto.MetricsEvent import com.android.systemui.log.dagger.LSShadeTransitionLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableView import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 47c4023ca8aa..c16e13cd4af3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -1476,10 +1476,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } } - public void setCurrentUser(int currentUser) { - // Don't care in the base class. - } - private void updateThemeColors() { if (mScrimBehind == null) return; int background = Utils.getColorAttr(mScrimBehind.getContext(), diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt index 12f023b21701..d07378e86ced 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt @@ -19,10 +19,10 @@ package com.android.systemui.statusbar.phone import android.app.PendingIntent import com.android.systemui.log.dagger.NotifInteractionLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.DEBUG -import com.android.systemui.log.LogLevel.ERROR -import com.android.systemui.log.LogLevel.INFO -import com.android.systemui.log.LogLevel.WARNING +import com.android.systemui.log.core.LogLevel.DEBUG +import com.android.systemui.log.core.LogLevel.ERROR +import com.android.systemui.log.core.LogLevel.INFO +import com.android.systemui.log.core.LogLevel.WARNING import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java index c3322808b2b8..604b1f5008db 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java @@ -64,6 +64,7 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout { private boolean mNeedsUnderflow; // Individual StatusBarIconViews draw their etc dots centered in this width private int mIconDotFrameWidth; + private boolean mQsExpansionTransitioning; private boolean mShouldRestrictIcons = true; // Used to count which states want to be visible during layout private ArrayList<StatusIconState> mLayoutStates = new ArrayList<>(); @@ -87,6 +88,10 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout { super.onFinishInflate(); } + public void setQsExpansionTransitioning(boolean expansionTransitioning) { + mQsExpansionTransitioning = expansionTransitioning; + } + public void setShouldRestrictIcons(boolean should) { mShouldRestrictIcons = should; } @@ -386,6 +391,7 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout { StatusIconState vs = getViewStateFromChild(child); if (vs != null) { vs.applyToView(child); + vs.qsExpansionTransitioning = mQsExpansionTransitioning; } } } @@ -420,6 +426,7 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout { /// StatusBarIconView.STATE_* public int visibleState = STATE_ICON; public boolean justAdded = true; + public boolean qsExpansionTransitioning = false; // How far we are from the end of the view actually is the most relevant for animation float distanceToViewEnd = -1; @@ -462,12 +469,13 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout { } icon.setVisibleState(visibleState, animateVisibility); - if (animationProperties != null) { + if (animationProperties != null && !qsExpansionTransitioning) { animateTo(view, animationProperties); } else { super.applyToView(view); } + qsExpansionTransitioning = false; justAdded = false; distanceToViewEnd = currentDistanceToEnd; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/CentralSurfacesComponent.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/CentralSurfacesComponent.java index c618be843832..4ae460a3f0e1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/CentralSurfacesComponent.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/CentralSurfacesComponent.java @@ -21,10 +21,8 @@ import static com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.ST import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.android.systemui.scene.ui.view.WindowRootView; -import com.android.systemui.shade.NotificationPanelViewController; import com.android.systemui.shade.NotificationShadeWindowView; import com.android.systemui.shade.NotificationShadeWindowViewController; -import com.android.systemui.shade.QuickSettingsController; import com.android.systemui.shade.ShadeHeaderController; import com.android.systemui.statusbar.NotificationPresenter; import com.android.systemui.statusbar.notification.NotificationActivityStarter; @@ -89,14 +87,6 @@ public interface CentralSurfacesComponent { NotificationShadeWindowViewController getNotificationShadeWindowViewController(); /** - * Creates a NotificationPanelViewController. - */ - NotificationPanelViewController getNotificationPanelViewController(); - - /** Creates a QuickSettingsController. */ - QuickSettingsController getQuickSettingsController(); - - /** * Creates a StatusBarHeadsUpChangeListener. */ StatusBarHeadsUpChangeListener getStatusBarHeadsUpChangeListener(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java index 6b0746f08df0..77381dd3311b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java @@ -16,22 +16,16 @@ package com.android.systemui.statusbar.phone.dagger; -import android.view.LayoutInflater; - import com.android.keyguard.KeyguardUpdateMonitor; -import com.android.systemui.R; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.shade.NotificationPanelView; -import com.android.systemui.shade.NotificationPanelViewController; import com.android.systemui.shade.ShadeExpansionStateManager; import com.android.systemui.shade.ShadeViewController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.OperatorNameViewController; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; -import com.android.systemui.statusbar.phone.KeyguardBottomAreaView; import com.android.systemui.statusbar.phone.NotificationIconAreaController; import com.android.systemui.statusbar.phone.StatusBarBoundsProvider; import com.android.systemui.statusbar.phone.StatusBarHideIconsForBouncerManager; @@ -70,12 +64,6 @@ public abstract class StatusBarViewModule { public static final String STATUS_BAR_FRAGMENT = "status_bar_fragment"; - /** */ - @Binds - @CentralSurfacesComponent.CentralSurfacesScope - abstract ShadeViewController bindsShadeViewController( - NotificationPanelViewController notificationPanelViewController); - @Binds @IntoSet abstract StatusBarBoundsProvider.BoundsChangeListener sysBarAttrsListenerAsBoundsListener( @@ -145,17 +133,4 @@ public abstract class StatusBarViewModule { statusBarWindowStateController, keyguardUpdateMonitor); } - - /** - * Constructs a new, unattached {@link KeyguardBottomAreaView}. - * - * Note that this is explicitly _not_ a singleton, as we want to be able to reinflate it - */ - @Provides - public static KeyguardBottomAreaView providesKeyguardBottomAreaView( - NotificationPanelView npv, LayoutInflater layoutInflater) { - return (KeyguardBottomAreaView) layoutInflater.inflate(R - .layout.keyguard_bottom_area, npv, false); - } - } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java index fcae23b068bf..0d580792a9dc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java @@ -14,9 +14,6 @@ package com.android.systemui.statusbar.phone.fragment; -import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.IDLE; -import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.SHOWING_PERSISTENT_DOT; - import android.annotation.Nullable; import android.annotation.SuppressLint; import android.app.Fragment; @@ -39,6 +36,7 @@ import androidx.annotation.VisibleForTesting; import androidx.core.animation.Animator; import com.android.app.animation.Interpolators; +import com.android.app.animation.InterpolatorsAndroidX; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.Dumpable; import com.android.systemui.R; @@ -77,6 +75,8 @@ import com.android.systemui.util.CarrierConfigTracker.CarrierConfigChangedListen import com.android.systemui.util.CarrierConfigTracker.DefaultDataSubscriptionChangedListener; import com.android.systemui.util.settings.SecureSettings; +import kotlin.Unit; + import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; @@ -99,12 +99,16 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue private static final String EXTRA_PANEL_STATE = "panel_state"; public static final String STATUS_BAR_ICON_MANAGER_TAG = "status_bar_icon_manager"; public static final int FADE_IN_DURATION = 320; + public static final int FADE_OUT_DURATION = 160; public static final int FADE_IN_DELAY = 50; + private static final int SOURCE_SYSTEM_EVENT_ANIMATOR = 1; + private static final int SOURCE_OTHER = 2; private StatusBarFragmentComponent mStatusBarFragmentComponent; private PhoneStatusBarView mStatusBar; private final StatusBarStateController mStatusBarStateController; private final KeyguardStateController mKeyguardStateController; private final ShadeViewController mShadeViewController; + private MultiSourceMinAlphaController mEndSideAlphaController; private LinearLayout mEndSideContent; private View mClockView; private View mOngoingCallChip; @@ -149,7 +153,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue } }; private OperatorNameViewController mOperatorNameViewController; - private StatusBarSystemEventAnimator mSystemEventAnimator; + private StatusBarSystemEventDefaultAnimator mSystemEventAnimator; private final CarrierConfigChangedListener mCarrierConfigCallback = new CarrierConfigChangedListener() { @@ -297,14 +301,14 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue updateBlockedIcons(); mStatusBarIconController.addIconGroup(mDarkIconManager); mEndSideContent = mStatusBar.findViewById(R.id.status_bar_end_side_content); + mEndSideAlphaController = new MultiSourceMinAlphaController(mEndSideContent); mClockView = mStatusBar.findViewById(R.id.clock); mOngoingCallChip = mStatusBar.findViewById(R.id.ongoing_call_chip); showEndSideContent(false); showClock(false); initOperatorName(); initNotificationIconArea(); - mSystemEventAnimator = - new StatusBarSystemEventAnimator(mEndSideContent, getResources()); + mSystemEventAnimator = getSystemEventAnimator(); mCarrierConfigTracker.addCallback(mCarrierConfigCallback); mCarrierConfigTracker.addDefaultDataSubscriptionChangedListener(mDefaultDataListener); @@ -593,18 +597,27 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue } private void hideEndSideContent(boolean animate) { - animateHide(mEndSideContent, animate); + if (!animate) { + mEndSideAlphaController.setAlpha(/*alpha*/ 0f, SOURCE_OTHER); + } else { + mEndSideAlphaController.animateToAlpha(/*alpha*/ 0f, SOURCE_OTHER, FADE_OUT_DURATION, + InterpolatorsAndroidX.ALPHA_OUT, /*startDelay*/ 0); + } } private void showEndSideContent(boolean animate) { - // Only show the system icon area if we are not currently animating - int state = mAnimationScheduler.getAnimationState(); - if (state == IDLE || state == SHOWING_PERSISTENT_DOT) { - animateShow(mEndSideContent, animate); + if (!animate) { + mEndSideAlphaController.setAlpha(1f, SOURCE_OTHER); + return; + } + if (mKeyguardStateController.isKeyguardFadingAway()) { + mEndSideAlphaController.animateToAlpha(/*alpha*/ 1f, SOURCE_OTHER, + mKeyguardStateController.getKeyguardFadingAwayDuration(), + InterpolatorsAndroidX.LINEAR_OUT_SLOW_IN, + mKeyguardStateController.getKeyguardFadingAwayDelay()); } else { - // We are in the middle of a system status event animation, which will animate the - // alpha (but not the visibility). Allow the view to become visible again - mEndSideContent.setVisibility(View.VISIBLE); + mEndSideAlphaController.animateToAlpha(/*alpha*/ 1f, SOURCE_OTHER, FADE_IN_DURATION, + InterpolatorsAndroidX.ALPHA_IN, FADE_IN_DELAY); } } @@ -671,7 +684,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue v.animate() .alpha(0f) - .setDuration(160) + .setDuration(FADE_OUT_DURATION) .setStartDelay(0) .setInterpolator(Interpolators.ALPHA_OUT) .withEndAction(() -> v.setVisibility(state)); @@ -754,6 +767,16 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue return mSystemEventAnimator.onSystemEventAnimationFinish(hasPersistentDot); } + private StatusBarSystemEventDefaultAnimator getSystemEventAnimator() { + return new StatusBarSystemEventDefaultAnimator(getResources(), (alpha) -> { + mEndSideAlphaController.setAlpha(alpha, SOURCE_SYSTEM_EVENT_ANIMATOR); + return Unit.INSTANCE; + }, (translationX) -> { + mEndSideContent.setTranslationX(translationX); + return Unit.INSTANCE; + }, /*isAnimationRunning*/ false); + } + private void updateStatusBarLocation(int left, int right) { int leftMargin = left - mStatusBar.getLeft(); int rightMargin = mStatusBar.getRight() - right; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLogger.kt index f4ab408cc275..7cdb9c0a7aa8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.statusbar.phone.fragment import com.android.systemui.log.dagger.CollapsedSbFragmentLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.statusbar.disableflags.DisableFlagsLogger import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/MultiSourceMinAlphaController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/MultiSourceMinAlphaController.kt new file mode 100644 index 000000000000..c8836e4235dc --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/MultiSourceMinAlphaController.kt @@ -0,0 +1,82 @@ +/* + * 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.statusbar.phone.fragment + +import android.view.View +import androidx.core.animation.Interpolator +import androidx.core.animation.ValueAnimator +import com.android.app.animation.InterpolatorsAndroidX + +/** + * A controller that keeps track of multiple sources applying alpha value changes to a view. It will + * always apply the minimum alpha value of all sources. + */ +internal class MultiSourceMinAlphaController +@JvmOverloads +constructor(private val view: View, private val initialAlpha: Float = 1f) { + + private val alphas = mutableMapOf<Int, Float>() + private val animators = mutableMapOf<Int, ValueAnimator>() + + /** + * Sets the alpha of the provided source and applies it to the view (if no other source has set + * a lower alpha currently). If an animator of the same source is still running (i.e. + * [animateToAlpha] was called before), that animator is cancelled. + */ + fun setAlpha(alpha: Float, sourceId: Int) { + animators[sourceId]?.cancel() + updateAlpha(alpha, sourceId) + } + + /** Animates to the alpha of the provided source. */ + fun animateToAlpha( + alpha: Float, + sourceId: Int, + duration: Long, + interpolator: Interpolator = InterpolatorsAndroidX.ALPHA_IN, + startDelay: Long = 0 + ) { + animators[sourceId]?.cancel() + val animator = ValueAnimator.ofFloat(getMinAlpha(), alpha) + animator.duration = duration + animator.startDelay = startDelay + animator.interpolator = interpolator + animator.addUpdateListener { updateAlpha(animator.animatedValue as Float, sourceId) } + animator.start() + animators[sourceId] = animator + } + + fun reset() { + alphas.clear() + animators.forEach { it.value.cancel() } + animators.clear() + applyAlphaToView() + } + + private fun updateAlpha(alpha: Float, sourceId: Int) { + alphas[sourceId] = alpha + applyAlphaToView() + } + + private fun applyAlphaToView() { + val minAlpha = getMinAlpha() + view.visibility = if (minAlpha != 0f) View.VISIBLE else View.INVISIBLE + view.alpha = minAlpha + } + + private fun getMinAlpha() = alphas.minOfOrNull { it.value } ?: initialAlpha +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/MobileInputLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/MobileInputLogger.kt index b3a1c4075d87..051e88f9264d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/MobileInputLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/MobileInputLogger.kt @@ -23,7 +23,7 @@ import com.android.settingslib.SignalIcon import com.android.settingslib.mobile.MobileMappings import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.statusbar.pipeline.dagger.MobileInputLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt index 74352d29cd9b..54948a4a41c8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt @@ -250,15 +250,8 @@ constructor( .distinctUntilChanged() .onEach { logger.logDefaultMobileIconGroup(it) } - override fun getRepoForSubId(subId: Int): FullMobileConnectionRepository { - if (!isValidSubId(subId)) { - throw IllegalArgumentException( - "subscriptionId $subId is not in the list of valid subscriptions" - ) - } - - return getOrCreateRepoForSubId(subId) - } + override fun getRepoForSubId(subId: Int): FullMobileConnectionRepository = + getOrCreateRepoForSubId(subId) private fun getOrCreateRepoForSubId(subId: Int) = subIdRepositoryCache[subId] diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileViewLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileViewLogger.kt index 7e0c145696c9..cea6654a48de 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileViewLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileViewLogger.kt @@ -21,7 +21,7 @@ import com.android.systemui.Dumpable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.statusbar.pipeline.dagger.MobileViewLog import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.LocationBasedMobileViewModel import java.io.PrintWriter diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/VerboseMobileViewLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/VerboseMobileViewLogger.kt index 507549b1e234..f4c572308e59 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/VerboseMobileViewLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/VerboseMobileViewLogger.kt @@ -20,7 +20,7 @@ import android.view.View import com.android.systemui.common.shared.model.Icon import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.statusbar.pipeline.dagger.VerboseMobileViewLog import com.android.systemui.statusbar.pipeline.mobile.ui.MobileViewLogger.Companion.getIdForLogging import com.android.systemui.statusbar.pipeline.mobile.ui.model.SignalIconModel diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityInputLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityInputLogger.kt index cac0ae3dbab4..8a4d14e69652 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityInputLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityInputLogger.kt @@ -20,7 +20,7 @@ import android.net.Network import android.net.NetworkCapabilities import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.statusbar.pipeline.dagger.SharedConnectivityInputLog import com.android.systemui.statusbar.pipeline.shared.data.model.DefaultConnectionModel import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/LoggerHelper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/LoggerHelper.kt index 328d901b541d..4b9de85915ae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/LoggerHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/LoggerHelper.kt @@ -19,7 +19,7 @@ package com.android.systemui.statusbar.pipeline.shared import android.net.Network import android.net.NetworkCapabilities import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel /** Helper object for logs that are shared between wifi and mobile. */ object LoggerHelper { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/data/model/DefaultConnectionModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/data/model/DefaultConnectionModel.kt index 058eda4400df..9a504c9534f8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/data/model/DefaultConnectionModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/data/model/DefaultConnectionModel.kt @@ -17,7 +17,7 @@ package com.android.systemui.statusbar.pipeline.shared.data.model import android.net.NetworkCapabilities -import com.android.systemui.log.LogMessage +import com.android.systemui.log.core.LogMessage /** * A model for all of the current default connections(s). diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/shared/WifiInputLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/shared/WifiInputLogger.kt index 4a9ceacb0bd1..f244376f5a5a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/shared/WifiInputLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/shared/WifiInputLogger.kt @@ -20,7 +20,7 @@ import android.net.Network import android.net.NetworkCapabilities import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.statusbar.pipeline.dagger.WifiInputLog import com.android.systemui.statusbar.pipeline.shared.LoggerHelper import javax.inject.Inject 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 6ba2a81b4b13..096ad1f45841 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceStateRotationLockSettingControllerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceStateRotationLockSettingControllerLogger.kt @@ -22,7 +22,7 @@ import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_LOCK_LOCKED import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_LOCK_UNLOCKED import com.android.internal.R import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.VERBOSE +import com.android.systemui.log.core.LogLevel.VERBOSE import com.android.systemui.log.dagger.DeviceStateAutoRotationLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManagerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManagerLogger.kt index 06ed1fd279b5..175473fcfe08 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManagerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManagerLogger.kt @@ -18,8 +18,8 @@ package com.android.systemui.statusbar.policy import com.android.systemui.log.dagger.NotificationHeadsUpLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel.INFO -import com.android.systemui.log.LogLevel.VERBOSE +import com.android.systemui.log.core.LogLevel.INFO +import com.android.systemui.log.core.LogLevel.VERBOSE import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java index a82646aba825..710588c82a4a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.policy; +import static android.hardware.biometrics.BiometricSourceType.FACE; + import android.annotation.NonNull; import android.content.BroadcastReceiver; import android.content.Context; @@ -199,6 +201,11 @@ public class KeyguardStateControllerImpl implements KeyguardStateController, Dum Trace.endSection(); } + private void notifyKeyguardFaceAuthEnabledChanged() { + // Copy the list to allow removal during callback. + new ArrayList<>(mCallbacks).forEach(Callback::onFaceAuthEnabledChanged); + } + private void notifyUnlockedChanged() { Trace.beginSection("KeyguardStateController#notifyUnlockedChanged"); // Copy the list to allow removal during callback. @@ -419,6 +426,16 @@ public class KeyguardStateControllerImpl implements KeyguardStateController, Dum } @Override + public void onBiometricEnrollmentStateChanged(BiometricSourceType biometricSourceType) { + if (biometricSourceType == FACE) { + // We only care about enrollment state here. Keyguard face auth enabled is just + // same as face auth enrolled + update(false); + notifyKeyguardFaceAuthEnabledChanged(); + } + } + + @Override public void onStartedWakingUp() { update(false /* updateAlways */); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyStateInflater.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyStateInflater.kt index 21d03386b9e2..cac5e3290a26 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyStateInflater.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyStateInflater.kt @@ -22,6 +22,13 @@ import android.app.PendingIntent import android.app.RemoteInput import android.content.Context import android.content.Intent +import android.graphics.Bitmap +import android.graphics.ImageDecoder +import android.graphics.drawable.AdaptiveIconDrawable +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable +import android.graphics.drawable.GradientDrawable +import android.graphics.drawable.Icon import android.os.Build import android.os.Bundle import android.os.SystemClock @@ -48,7 +55,13 @@ import com.android.systemui.statusbar.policy.InflatedSmartReplyState.SuppressedA import com.android.systemui.statusbar.policy.SmartReplyView.SmartActions import com.android.systemui.statusbar.policy.SmartReplyView.SmartButtonType import com.android.systemui.statusbar.policy.SmartReplyView.SmartReplies +import java.util.concurrent.FutureTask +import java.util.concurrent.SynchronousQueue +import java.util.concurrent.ThreadPoolExecutor +import java.util.concurrent.TimeUnit import javax.inject.Inject +import kotlin.system.measureTimeMillis + /** Returns whether we should show the smart reply view and its smart suggestions. */ fun shouldShowSmartReplyView( @@ -281,6 +294,51 @@ interface SmartActionInflater { ): Button } +private const val ICON_TASK_TIMEOUT_MS = 500L +private val iconTaskThreadPool = ThreadPoolExecutor(0, 25, 1, TimeUnit.MINUTES, SynchronousQueue()) + +private fun loadIconDrawableWithTimeout( + icon: Icon, + packageContext: Context, + targetSize: Int, +): Drawable? { + if (icon.type != Icon.TYPE_URI && icon.type != Icon.TYPE_URI_ADAPTIVE_BITMAP) { + return icon.loadDrawable(packageContext) + } + val bitmapTask = FutureTask { + val bitmap: Bitmap? + val durationMillis = measureTimeMillis { + val source = ImageDecoder.createSource(packageContext.contentResolver, icon.uri) + bitmap = ImageDecoder.decodeBitmap(source) { decoder, _, _ -> + decoder.setTargetSize(targetSize, targetSize) + decoder.allocator = ImageDecoder.ALLOCATOR_DEFAULT + } + } + if (durationMillis > ICON_TASK_TIMEOUT_MS) { + Log.w(TAG, "Loading $icon took ${durationMillis / 1000f} sec") + } + checkNotNull(bitmap) { "ImageDecoder.decodeBitmap() returned null" } + } + val bitmap = runCatching { + iconTaskThreadPool.execute(bitmapTask) + bitmapTask.get(ICON_TASK_TIMEOUT_MS, TimeUnit.MILLISECONDS) + }.getOrElse { ex -> + Log.e(TAG, "Failed to load $icon: $ex") + bitmapTask.cancel(true) + return null + } + // TODO(b/288561520): rewrite Icon so that we don't need to duplicate this logic + val bitmapDrawable = BitmapDrawable(packageContext.resources, bitmap) + val result = if (icon.type == Icon.TYPE_URI_ADAPTIVE_BITMAP) + AdaptiveIconDrawable(null, bitmapDrawable) else bitmapDrawable + if (icon.hasTint()) { + result.mutate() + result.setTintList(icon.tintList) + result.setTintBlendMode(icon.tintBlendMode) + } + return result +} + /* internal */ class SmartActionInflaterImpl @Inject constructor( private val constants: SmartReplyConstants, private val activityStarter: ActivityStarter, @@ -304,12 +362,12 @@ interface SmartActionInflater { // We received the Icon from the application - so use the Context of the application to // reference icon resources. - val iconDrawable = action.getIcon().loadDrawable(packageContext) - .apply { - val newIconSize: Int = context.resources.getDimensionPixelSize( - R.dimen.smart_action_button_icon_size) - setBounds(0, 0, newIconSize, newIconSize) - } + val newIconSize = context.resources + .getDimensionPixelSize(R.dimen.smart_action_button_icon_size) + val iconDrawable = + loadIconDrawableWithTimeout(action.getIcon(), packageContext, newIconSize) + ?: GradientDrawable() + iconDrawable.setBounds(0, 0, newIconSize, newIconSize) // Add the action icon to the Smart Action button. setCompoundDrawablesRelative(iconDrawable, null, null, null) diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewLogger.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewLogger.kt index 066ac04c2727..a9d202911e93 100644 --- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.temporarydisplay import android.view.View import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel /** A logger for temporary view changes -- see [TemporaryViewDisplayController]. */ open class TemporaryViewLogger<T : TemporaryViewInfo>( diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarLogger.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarLogger.kt index d55751b9d8a0..6706873ebeb4 100644 --- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.temporarydisplay.chipbar import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.temporarydisplay.TemporaryViewLogger import com.android.systemui.temporarydisplay.dagger.ChipbarLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/toast/ToastLogger.kt b/packages/SystemUI/src/com/android/systemui/toast/ToastLogger.kt index dfe748afbd41..c109eb4134bb 100644 --- a/packages/SystemUI/src/com/android/systemui/toast/ToastLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/toast/ToastLogger.kt @@ -18,9 +18,9 @@ package com.android.systemui.toast import com.android.systemui.log.dagger.ToastLog import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel -import com.android.systemui.log.LogLevel.DEBUG -import com.android.systemui.log.LogMessage +import com.android.systemui.log.core.LogLevel +import com.android.systemui.log.core.LogLevel.DEBUG +import com.android.systemui.log.core.LogMessage import javax.inject.Inject private const val TAG = "ToastLog" diff --git a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLockLogger.kt b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLockLogger.kt index 09268007dddc..d69b10ffb210 100644 --- a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLockLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLockLogger.kt @@ -18,7 +18,7 @@ package com.android.systemui.util.wakelock import android.os.PowerManager import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import javax.inject.Inject class WakeLockLogger @Inject constructor(@WakeLockLog private val buffer: LogBuffer) { diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java index 4c7e6b007f38..5144d1966222 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java @@ -334,10 +334,8 @@ public final class WMShell implements } @Override - public void setImeWindowStatus(int displayId, IBinder token, - @InputMethodService.ImeWindowVisibility int vis, - @InputMethodService.BackDispositionMode int backDisposition, - boolean showImeSwitcher) { + public void setImeWindowStatus(int displayId, IBinder token, int vis, + int backDisposition, boolean showImeSwitcher) { if (displayId == mDisplayTracker.getDefaultDisplayId() && (vis & InputMethodService.IME_VISIBLE) != 0) { oneHanded.stopOneHanded( diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index 901c3fb05b2f..5abab6239b1e 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -83,6 +83,7 @@ import android.content.pm.ServiceInfo; import android.content.pm.UserInfo; import android.database.ContentObserver; import android.hardware.SensorPrivacyManager; +import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.BiometricSourceType; @@ -3000,6 +3001,34 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { TelephonyManager.SIM_STATE_UNKNOWN); } + @Test + public void testOnSimStateChanged_HandleSimStateNotReady() { + KeyguardUpdateMonitorCallback keyguardUpdateMonitorCallback = spy( + KeyguardUpdateMonitorCallback.class); + mKeyguardUpdateMonitor.registerCallback(keyguardUpdateMonitorCallback); + mKeyguardUpdateMonitor.handleSimStateChange(-1, 0, TelephonyManager.SIM_STATE_NOT_READY); + verify(keyguardUpdateMonitorCallback).onSimStateChanged(-1, 0, + TelephonyManager.SIM_STATE_NOT_READY); + } + + @Test + public void onAuthEnrollmentChangesCallbacksAreNotified() { + KeyguardUpdateMonitorCallback callback = mock(KeyguardUpdateMonitorCallback.class); + ArgumentCaptor<AuthController.Callback> authCallback = ArgumentCaptor.forClass( + AuthController.Callback.class); + verify(mAuthController).addCallback(authCallback.capture()); + + mKeyguardUpdateMonitor.registerCallback(callback); + + authCallback.getValue().onEnrollmentsChanged(TYPE_FINGERPRINT); + mTestableLooper.processAllMessages(); + verify(callback).onBiometricEnrollmentStateChanged(BiometricSourceType.FINGERPRINT); + + authCallback.getValue().onEnrollmentsChanged(BiometricAuthenticator.TYPE_FACE); + mTestableLooper.processAllMessages(); + verify(callback).onBiometricEnrollmentStateChanged(BiometricSourceType.FACE); + } + private void verifyFingerprintAuthenticateNeverCalled() { verify(mFingerprintManager, never()).authenticate(any(), any(), any(), any(), any()); verify(mFingerprintManager, never()).authenticate(any(), any(), any(), any(), anyInt(), diff --git a/packages/SystemUI/tests/src/com/android/systemui/dump/LogBufferHelper.kt b/packages/SystemUI/tests/src/com/android/systemui/dump/LogBufferHelper.kt index bd029a727ee3..a341ca365ada 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dump/LogBufferHelper.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/dump/LogBufferHelper.kt @@ -17,7 +17,7 @@ package com.android.systemui.dump import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel +import com.android.systemui.log.core.LogLevel import com.android.systemui.log.LogcatEchoTracker /** diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt index 5922cbf6268e..e042564646e7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt @@ -260,6 +260,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { assertThat(authStatus()).isEqualTo(SuccessAuthenticationStatus(successResult)) assertThat(authenticated()).isTrue() assertThat(authRunning()).isFalse() + assertThat(canFaceAuthRun()).isFalse() } private fun uiEventIsLogged(faceAuthUiEvent: FaceAuthUiEvent) { @@ -417,13 +418,9 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { FACE_ERROR_CANCELED, "First auth attempt cancellation completed" ) - assertThat(authStatus()) - .isEqualTo( - ErrorAuthenticationStatus( - FACE_ERROR_CANCELED, - "First auth attempt cancellation completed" - ) - ) + val value = authStatus() as ErrorAuthenticationStatus + assertThat(value.msgId).isEqualTo(FACE_ERROR_CANCELED) + assertThat(value.msg).isEqualTo("First auth attempt cancellation completed") faceAuthenticateIsCalled() uiEventIsLogged(FACE_AUTH_TRIGGERED_ALTERNATE_BIOMETRIC_BOUNCER_SHOWN) @@ -551,20 +548,6 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { } @Test - fun authenticateDoesNotRunWhenDeviceIsSleeping() = - testScope.runTest { - testGatingCheckForFaceAuth { - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - state = WakefulnessState.ASLEEP, - lastWakeReason = WakeSleepReason.OTHER, - lastSleepReason = WakeSleepReason.OTHER, - ) - ) - } - } - - @Test fun authenticateDoesNotRunWhenNonStrongBiometricIsNotAllowed() = testScope.runTest { testGatingCheckForFaceAuth { @@ -586,6 +569,29 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { } @Test + fun authenticateRunsWhenSecureCameraIsActiveIfBouncerIsShowing() = + testScope.runTest { + initCollectors() + allPreconditionsToRunFaceAuthAreTrue() + bouncerRepository.setAlternateVisible(false) + bouncerRepository.setPrimaryShow(false) + + assertThat(canFaceAuthRun()).isTrue() + + // launch secure camera + fakeCommandQueue.doForEachCallback { + it.onCameraLaunchGestureDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP) + } + keyguardRepository.setKeyguardOccluded(true) + runCurrent() + assertThat(canFaceAuthRun()).isFalse() + + // but bouncer is shown after that. + bouncerRepository.setPrimaryShow(true) + assertThat(canFaceAuthRun()).isTrue() + } + + @Test fun authenticateDoesNotRunOnUnsupportedPosture() = testScope.runTest { testGatingCheckForFaceAuth { @@ -616,6 +622,27 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { } @Test + fun authenticateFallbacksToDetectionWhenUserIsAlreadyTrustedByTrustManager() = + testScope.runTest { + whenever(faceManager.sensorPropertiesInternal) + .thenReturn(listOf(createFaceSensorProperties(supportsFaceDetection = true))) + whenever(bypassController.bypassEnabled).thenReturn(true) + underTest = createDeviceEntryFaceAuthRepositoryImpl() + initCollectors() + allPreconditionsToRunFaceAuthAreTrue() + + trustRepository.setCurrentUserTrusted(true) + assertThat(canFaceAuthRun()).isFalse() + underTest.authenticate( + FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER, + fallbackToDetection = true + ) + faceAuthenticateIsNotCalled() + + faceDetectIsCalled() + } + + @Test fun everythingWorksWithFaceAuthRefactorFlagDisabled() = testScope.runTest { featureFlags.set(FACE_AUTH_REFACTOR, false) diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt index 80700e59a2d4..ee5c1cc31b0b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt @@ -17,6 +17,7 @@ package com.android.systemui.keyguard.domain.interactor +import android.hardware.biometrics.BiometricFaceConstants import android.os.Handler import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest @@ -30,6 +31,7 @@ import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerCallbackInte import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor import com.android.systemui.bouncer.ui.BouncerView import com.android.systemui.classifier.FalsingCollector +import com.android.systemui.coroutines.collectLastValue import com.android.systemui.dump.logcatLogBuffer import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags @@ -39,6 +41,7 @@ import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFaceAuthRepo import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepository import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository import com.android.systemui.keyguard.data.repository.FakeTrustRepository +import com.android.systemui.keyguard.shared.model.ErrorAuthenticationStatus import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep @@ -90,6 +93,7 @@ class KeyguardFaceAuthInteractorTest : SysuiTestCase() { underTest = SystemUIKeyguardFaceAuthInteractor( + mContext, testScope.backgroundScope, dispatcher, faceAuthRepository, @@ -144,6 +148,22 @@ class KeyguardFaceAuthInteractorTest : SysuiTestCase() { } @Test + fun whenFaceIsLockedOutAnyAttemptsToTriggerFaceAuthMustProvideLockoutError() = + testScope.runTest { + underTest.start() + val authenticationStatus = collectLastValue(underTest.authenticationStatus) + faceAuthRepository.setLockedOut(true) + + underTest.onDeviceLifted() + + val outputValue = authenticationStatus()!! as ErrorAuthenticationStatus + assertThat(outputValue.msgId) + .isEqualTo(BiometricFaceConstants.FACE_ERROR_LOCKOUT_PERMANENT) + assertThat(outputValue.msg).isEqualTo("Face Unlock unavailable") + assertThat(faceAuthRepository.runningAuthRequest.value).isNull() + } + + @Test fun faceAuthIsRequestedWhenLockscreenBecomesVisibleFromAodState() = testScope.runTest { underTest.start() diff --git a/packages/SystemUI/tests/src/com/android/systemui/log/LogBufferTest.kt b/packages/SystemUI/tests/src/com/android/systemui/log/LogBufferTest.kt index 0cf6d3da7e9c..b5eae5b03b74 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/log/LogBufferTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/log/LogBufferTest.kt @@ -2,6 +2,7 @@ package com.android.systemui.log import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.log.core.Logger import com.google.common.truth.Truth.assertThat import java.io.PrintWriter import java.io.StringWriter @@ -32,7 +33,8 @@ class LogBufferTest : SysuiTestCase() { @Test fun log_shouldSaveLogToBuffer() { - buffer.log("Test", LogLevel.INFO, "Some test message") + val logger = Logger(buffer, "Test") + logger.i("Some test message") val dumpedString = dumpBuffer() @@ -41,8 +43,9 @@ class LogBufferTest : SysuiTestCase() { @Test fun log_shouldRotateIfLogBufferIsFull() { - buffer.log("Test", LogLevel.INFO, "This should be rotated") - buffer.log("Test", LogLevel.INFO, "New test message") + val logger = Logger(buffer, "Test") + logger.i("This should be rotated") + logger.i("New test message") val dumpedString = dumpBuffer() @@ -53,7 +56,8 @@ class LogBufferTest : SysuiTestCase() { fun dump_writesExceptionAndStacktrace() { buffer = createBuffer() val exception = createTestException("Exception message", "TestClass") - buffer.log("Tag", LogLevel.ERROR, { str1 = "Extra message" }, { str1!! }, exception) + val logger = Logger(buffer, "Test") + logger.e("Extra message", exception) val dumpedString = dumpBuffer() @@ -72,7 +76,8 @@ class LogBufferTest : SysuiTestCase() { "TestClass", cause = createTestException("The real cause!", "TestClass") ) - buffer.log("Tag", LogLevel.ERROR, { str1 = "Extra message" }, { str1!! }, exception) + val logger = Logger(buffer, "Test") + logger.e("Extra message", exception) val dumpedString = dumpBuffer() @@ -93,7 +98,8 @@ class LogBufferTest : SysuiTestCase() { ) ) exception.addSuppressed(createTestException("Second suppressed exception", "SecondClass")) - buffer.log("Tag", LogLevel.ERROR, { str1 = "Extra message" }, { str1!! }, exception) + val logger = Logger(buffer, "Test") + logger.e("Extra message", exception) val dumpedStr = dumpBuffer() diff --git a/packages/SystemUI/tests/src/com/android/systemui/log/core/LoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/log/core/LoggerTest.kt new file mode 100644 index 000000000000..ab19b3aeceb0 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/log/core/LoggerTest.kt @@ -0,0 +1,140 @@ +package com.android.systemui.log.core + +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.log.LogMessageImpl +import com.android.systemui.util.mockito.any +import com.android.systemui.util.mockito.eq +import com.android.systemui.util.mockito.nullable +import com.android.systemui.util.mockito.whenever +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.anyString +import org.mockito.Mockito.isNull +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations +import org.mockito.junit.MockitoJUnitRunner + +@SmallTest +@RunWith(MockitoJUnitRunner::class) +class LoggerTest : SysuiTestCase() { + @Mock private lateinit var buffer: MessageBuffer + private lateinit var message: LogMessage + + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + whenever(buffer.obtain(any(), any(), any(), isNull())).thenAnswer { + message = LogMessageImpl.Factory.create() + return@thenAnswer message + } + } + + @Test + fun log_shouldCommitLogMessage() { + val logger = Logger(buffer, "LoggerTest") + logger.log(LogLevel.DEBUG, { "count=$int1" }) { + int1 = 1 + str1 = "test" + bool1 = true + } + + assertThat(message.int1).isEqualTo(1) + assertThat(message.str1).isEqualTo("test") + assertThat(message.bool1).isEqualTo(true) + } + + @Test + fun log_shouldUseCorrectLoggerTag() { + val logger = Logger(buffer, "LoggerTest") + logger.log(LogLevel.DEBUG, { "count=$int1" }) { int1 = 1 } + verify(buffer).obtain(eq("LoggerTest"), any(), any(), nullable()) + } + + @Test + fun v_withMessageInitializer_shouldLogAtCorrectLevel() { + val logger = Logger(buffer, "LoggerTest") + logger.v({ "count=$int1" }) { int1 = 1 } + verify(buffer).obtain(anyString(), eq(LogLevel.VERBOSE), any(), nullable()) + } + + @Test + fun v_withCompileTimeMessage_shouldLogAtCorrectLevel() { + val logger = Logger(buffer, "LoggerTest") + logger.v("Message") + verify(buffer).obtain(anyString(), eq(LogLevel.VERBOSE), any(), nullable()) + } + + @Test + fun d_withMessageInitializer_shouldLogAtCorrectLevel() { + val logger = Logger(buffer, "LoggerTest") + logger.d({ "count=$int1" }) { int1 = 1 } + verify(buffer).obtain(anyString(), eq(LogLevel.DEBUG), any(), nullable()) + } + + @Test + fun d_withCompileTimeMessage_shouldLogAtCorrectLevel() { + val logger = Logger(buffer, "LoggerTest") + logger.d("Message") + verify(buffer).obtain(anyString(), eq(LogLevel.DEBUG), any(), nullable()) + } + + @Test + fun i_withMessageInitializer_shouldLogAtCorrectLevel() { + val logger = Logger(buffer, "LoggerTest") + logger.i({ "count=$int1" }) { int1 = 1 } + verify(buffer).obtain(anyString(), eq(LogLevel.INFO), any(), nullable()) + } + + @Test + fun i_withCompileTimeMessage_shouldLogAtCorrectLevel() { + val logger = Logger(buffer, "LoggerTest") + logger.i("Message") + verify(buffer).obtain(anyString(), eq(LogLevel.INFO), any(), nullable()) + } + + @Test + fun w_withMessageInitializer_shouldLogAtCorrectLevel() { + val logger = Logger(buffer, "LoggerTest") + logger.w({ "count=$int1" }) { int1 = 1 } + verify(buffer).obtain(anyString(), eq(LogLevel.WARNING), any(), nullable()) + } + + @Test + fun w_withCompileTimeMessage_shouldLogAtCorrectLevel() { + val logger = Logger(buffer, "LoggerTest") + logger.w("Message") + verify(buffer).obtain(anyString(), eq(LogLevel.WARNING), any(), nullable()) + } + + @Test + fun e_withMessageInitializer_shouldLogAtCorrectLevel() { + val logger = Logger(buffer, "LoggerTest") + logger.e({ "count=$int1" }) { int1 = 1 } + verify(buffer).obtain(anyString(), eq(LogLevel.ERROR), any(), nullable()) + } + + @Test + fun e_withCompileTimeMessage_shouldLogAtCorrectLevel() { + val logger = Logger(buffer, "LoggerTest") + logger.e("Message") + verify(buffer).obtain(anyString(), eq(LogLevel.ERROR), any(), nullable()) + } + + @Test + fun wtf_withMessageInitializer_shouldLogAtCorrectLevel() { + val logger = Logger(buffer, "LoggerTest") + logger.wtf({ "count=$int1" }) { int1 = 1 } + verify(buffer).obtain(anyString(), eq(LogLevel.WTF), any(), nullable()) + } + + @Test + fun wtf_withCompileTimeMessage_shouldLogAtCorrectLevel() { + val logger = Logger(buffer, "LoggerTest") + logger.wtf("Message") + verify(buffer).obtain(anyString(), eq(LogLevel.WTF), any(), nullable()) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/log/table/TableLogBufferTest.kt b/packages/SystemUI/tests/src/com/android/systemui/log/table/TableLogBufferTest.kt index 12f46898ab8d..83182c5cf1b0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/log/table/TableLogBufferTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/log/table/TableLogBufferTest.kt @@ -18,8 +18,8 @@ package com.android.systemui.log.table import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.log.LogLevel import com.android.systemui.log.LogcatEchoTracker +import com.android.systemui.log.core.LogLevel import com.android.systemui.log.table.TableChange.Companion.IS_INITIAL_PREFIX import com.android.systemui.log.table.TableChange.Companion.MAX_STRING_LENGTH import com.android.systemui.util.mockito.any diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java index 697d1a3b775c..25d494cee5e8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java @@ -20,6 +20,7 @@ import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT; import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN; import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SWITCHER_SHOWN; import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEFAULT; +import static android.inputmethodservice.InputMethodService.IME_INVISIBLE; import static android.inputmethodservice.InputMethodService.IME_VISIBLE; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS; @@ -363,7 +364,7 @@ public class NavigationBarTest extends SysuiTestCase { externalNavBar.setImeWindowStatus(EXTERNAL_DISPLAY_ID, null, IME_VISIBLE, BACK_DISPOSITION_DEFAULT, true); defaultNavBar.setImeWindowStatus( - DEFAULT_DISPLAY, null, 0 /* vis */, BACK_DISPOSITION_DEFAULT, false); + DEFAULT_DISPLAY, null, IME_INVISIBLE, BACK_DISPOSITION_DEFAULT, false); // Verify IME window state will be updated in external NavBar & default NavBar state reset. assertEquals(NAVIGATION_HINT_BACK_ALT | NAVIGATION_HINT_IME_SHOWN | NAVIGATION_HINT_IME_SWITCHER_SHOWN, diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt index a60dad4a14fe..fe6c9b3fe7b1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt @@ -15,9 +15,11 @@ package com.android.systemui.qs import android.graphics.Rect import android.testing.AndroidTestingRunner +import android.testing.TestableContext import android.testing.TestableLooper import android.testing.TestableLooper.RunWithLooper import android.testing.ViewUtils +import android.view.ContextThemeWrapper import android.view.View import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.accessibility.AccessibilityNodeInfo @@ -55,19 +57,24 @@ class QSPanelTest : SysuiTestCase() { private lateinit var footer: View + private val themedContext = TestableContext( + ContextThemeWrapper(context, R.style.Theme_SystemUI_QuickSettings) + ) + @Before @Throws(Exception::class) fun setup() { MockitoAnnotations.initMocks(this) testableLooper = TestableLooper.get(this) + // Apply only the values of the theme that are not defined testableLooper.runWithLooper { - qsPanel = QSPanel(context, null) + qsPanel = QSPanel(themedContext, null) qsPanel.mUsingMediaPlayer = true qsPanel.initialize(qsLogger) // QSPanel inflates a footer inside of it, mocking it here - footer = LinearLayout(context).apply { id = R.id.qs_footer } + footer = LinearLayout(themedContext).apply { id = R.id.qs_footer } qsPanel.addView(footer, MATCH_PARENT, 100) qsPanel.onFinishInflate() // Provides a parent with non-zero size for QSPanel @@ -105,12 +112,12 @@ class QSPanelTest : SysuiTestCase() { qsPanel.tileLayout?.addTile( QSPanelControllerBase.TileRecord( mock(QSTile::class.java), - QSTileViewImpl(context, QSIconViewImpl(context)) + QSTileViewImpl(themedContext, QSIconViewImpl(themedContext)) ) ) - val mediaView = FrameLayout(context) - mediaView.addView(View(context), MATCH_PARENT, 800) + val mediaView = FrameLayout(themedContext) + mediaView.addView(View(themedContext), MATCH_PARENT, 800) qsPanel.setUsingHorizontalLayout(/* horizontal */ true, mediaView, /* force */ true) qsPanel.measure( @@ -135,12 +142,12 @@ class QSPanelTest : SysuiTestCase() { qsPanel.tileLayout?.addTile( QSPanelControllerBase.TileRecord( mock(QSTile::class.java), - QSTileViewImpl(context, QSIconViewImpl(context)) + QSTileViewImpl(themedContext, QSIconViewImpl(themedContext)) ) ) - val mediaView = FrameLayout(context) - mediaView.addView(View(context), MATCH_PARENT, 800) + val mediaView = FrameLayout(themedContext) + mediaView.addView(View(themedContext), MATCH_PARENT, 800) qsPanel.setUsingHorizontalLayout(/* horizontal */ true, mediaView, /* force */ true) qsPanel.measure( @@ -161,7 +168,10 @@ class QSPanelTest : SysuiTestCase() { @Test fun testBottomPadding() { val padding = 10 - context.orCreateTestableResources.addOverride(R.dimen.qs_panel_padding_bottom, padding) + themedContext.orCreateTestableResources.addOverride( + R.dimen.qs_panel_padding_bottom, + padding + ) qsPanel.updatePadding() assertThat(qsPanel.paddingBottom).isEqualTo(padding) } @@ -170,8 +180,11 @@ class QSPanelTest : SysuiTestCase() { fun testTopPadding() { val padding = 10 val paddingCombined = 100 - context.orCreateTestableResources.addOverride(R.dimen.qs_panel_padding_top, padding) - context.orCreateTestableResources.addOverride(R.dimen.qs_panel_padding_top, paddingCombined) + themedContext.orCreateTestableResources.addOverride(R.dimen.qs_panel_padding_top, padding) + themedContext.orCreateTestableResources.addOverride( + R.dimen.qs_panel_padding_top, + paddingCombined + ) qsPanel.updatePadding() assertThat(qsPanel.paddingTop).isEqualTo(paddingCombined) diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java index 87892539ccfe..f55ef65a8fc1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java @@ -26,12 +26,14 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; import android.test.suitebuilder.annotation.SmallTest; import android.testing.TestableLooper; +import android.view.ContextThemeWrapper; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; @@ -56,14 +58,17 @@ public class TileLayoutTest extends SysuiTestCase { private Resources mResources; private int mLayoutSizeForOneTile; private TileLayout mTileLayout; // under test + private Context mSpyContext; + @Before public void setUp() throws Exception { - Context context = Mockito.spy(mContext); - mResources = Mockito.spy(context.getResources()); - Mockito.when(mContext.getResources()).thenReturn(mResources); + mSpyContext = Mockito.spy( + new ContextThemeWrapper(mContext, R.style.Theme_SystemUI_QuickSettings)); + mResources = Mockito.spy(mSpyContext.getResources()); + when(mSpyContext.getResources()).thenReturn(mResources); - mTileLayout = new TileLayout(context); + mTileLayout = new TileLayout(mSpyContext); // Layout needs to leave space for the tile margins. Three times the margin size is // sufficient for any number of columns. mLayoutSizeForOneTile = @@ -73,7 +78,7 @@ public class TileLayoutTest extends SysuiTestCase { private QSPanelControllerBase.TileRecord createTileRecord() { return new QSPanelControllerBase.TileRecord( mock(QSTile.class), - spy(new QSTileViewImpl(mContext, new QSIconViewImpl(mContext)))); + spy(new QSTileViewImpl(mSpyContext, new QSIconViewImpl(mSpyContext)))); } @Test @@ -161,7 +166,7 @@ public class TileLayoutTest extends SysuiTestCase { .layout(left2.capture(), top2.capture(), right2.capture(), bottom2.capture()); // We assume two tiles will always fit side-by-side. - assertTrue(mContext.getResources().getInteger(R.integer.quick_settings_num_columns) > 1); + assertTrue(mSpyContext.getResources().getInteger(R.integer.quick_settings_num_columns) > 1); // left <= right, top <= bottom assertTrue(left1.getValue() <= right1.getValue()); @@ -218,16 +223,16 @@ public class TileLayoutTest extends SysuiTestCase { @Test public void resourcesChanged_updateResources_returnsTrue() { - Mockito.when(mResources.getInteger(R.integer.quick_settings_num_columns)).thenReturn(1); + when(mResources.getInteger(R.integer.quick_settings_num_columns)).thenReturn(1); mTileLayout.updateResources(); // setup with 1 - Mockito.when(mResources.getInteger(R.integer.quick_settings_num_columns)).thenReturn(2); + when(mResources.getInteger(R.integer.quick_settings_num_columns)).thenReturn(2); assertEquals(true, mTileLayout.updateResources()); } @Test public void resourcesSame_updateResources_returnsFalse() { - Mockito.when(mResources.getInteger(R.integer.quick_settings_num_columns)).thenReturn(1); + when(mResources.getInteger(R.integer.quick_settings_num_columns)).thenReturn(1); mTileLayout.updateResources(); // setup with 1 assertEquals(false, mTileLayout.updateResources()); @@ -250,7 +255,7 @@ public class TileLayoutTest extends SysuiTestCase { QSPanelControllerBase.TileRecord tileRecord = createTileRecord(); mTileLayout.addTile(tileRecord); - FakeTileView tileView = new FakeTileView(mContext); + FakeTileView tileView = new FakeTileView(mSpyContext); QSTile.State state = new QSTile.State(); state.label = "TEST LABEL"; state.secondaryLabel = "TEST SECONDARY LABEL"; @@ -276,9 +281,10 @@ public class TileLayoutTest extends SysuiTestCase { } private void changeFontScaling(float scale) { - Configuration configuration = new Configuration(mContext.getResources().getConfiguration()); + Configuration configuration = + new Configuration(mSpyContext.getResources().getConfiguration()); configuration.fontScale = scale; // updateConfiguration could help update on both resource configuration and displayMetrics - mContext.getResources().updateConfiguration(configuration, null, null); + mSpyContext.getResources().updateConfiguration(configuration, null, null); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModelTest.kt index 2cc6709d0f37..d647d6add512 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModelTest.kt @@ -21,6 +21,7 @@ import android.os.UserManager import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.testing.TestableLooper.RunWithLooper +import android.view.ContextThemeWrapper import androidx.test.filters.SmallTest import com.android.settingslib.Utils import com.android.settingslib.drawable.UserIconDrawable @@ -63,6 +64,8 @@ class FooterActionsViewModelTest : SysuiTestCase() { private val testScope = TestScope() private lateinit var utils: FooterActionsTestUtils + private val themedContext = ContextThemeWrapper(context, R.style.Theme_SystemUI_QuickSettings) + @Before fun setUp() { utils = FooterActionsTestUtils(context, TestableLooper.get(this), testScope.testScheduler) @@ -84,8 +87,14 @@ class FooterActionsViewModelTest : SysuiTestCase() { ContentDescription.Resource(R.string.accessibility_quick_settings_settings) ) ) - assertThat(settings.backgroundColor).isEqualTo(R.attr.offStateColor) - assertThat(settings.iconTint).isNull() + assertThat(settings.backgroundColor).isEqualTo(R.attr.shadeInactive) + assertThat(settings.iconTint) + .isEqualTo( + Utils.getColorAttrDefaultColor( + themedContext, + R.attr.onShadeInactiveVariant, + ) + ) } @Test @@ -105,12 +114,12 @@ class FooterActionsViewModelTest : SysuiTestCase() { ContentDescription.Resource(R.string.accessibility_quick_settings_power_menu) ) ) - assertThat(power.backgroundColor).isEqualTo(com.android.internal.R.attr.colorAccent) + assertThat(power.backgroundColor).isEqualTo(R.attr.shadeActive) assertThat(power.iconTint) .isEqualTo( Utils.getColorAttrDefaultColor( - context, - com.android.internal.R.attr.textColorOnAccent, + themedContext, + R.attr.onShadeActive, ), ) } @@ -170,7 +179,7 @@ class FooterActionsViewModelTest : SysuiTestCase() { assertThat(userSwitcher).isNotNull() assertThat(userSwitcher!!.icon) .isEqualTo(Icon.Loaded(picture, ContentDescription.Loaded("Signed in as foo"))) - assertThat(userSwitcher.backgroundColor).isEqualTo(R.attr.offStateColor) + assertThat(userSwitcher.backgroundColor).isEqualTo(R.attr.shadeInactive) // Change the current user name. userSwitcherControllerWrapper.currentUserName = "bar" diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt index 28aeba461c50..3c667725c78a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt @@ -22,6 +22,7 @@ import android.service.quicksettings.Tile import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.text.TextUtils +import android.view.ContextThemeWrapper import android.view.View import android.view.accessibility.AccessibilityNodeInfo import android.widget.TextView @@ -386,7 +387,11 @@ class QSTileViewImplTest : SysuiTestCase() { context: Context, icon: QSIconView, collapsed: Boolean - ) : QSTileViewImpl(context, icon, collapsed) { + ) : QSTileViewImpl( + ContextThemeWrapper(context, R.style.Theme_SystemUI_QuickSettings), + icon, + collapsed + ) { fun changeState(state: QSTile.State) { handleStateChanged(state) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DndTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DndTileTest.kt index f0e4e3adda7c..77a443666442 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DndTileTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DndTileTest.kt @@ -25,6 +25,7 @@ import android.provider.Settings.Global.ZEN_MODE_NO_INTERRUPTIONS import android.provider.Settings.Global.ZEN_MODE_OFF import android.testing.AndroidTestingRunner import android.testing.TestableLooper +import android.view.ContextThemeWrapper import android.view.View import androidx.test.filters.SmallTest import com.android.internal.logging.MetricsLogger @@ -110,7 +111,9 @@ class DndTileTest : SysuiTestCase() { whenever(qsHost.userId).thenReturn(DEFAULT_USER) - val wrappedContext = object : ContextWrapper(context) { + val wrappedContext = object : ContextWrapper( + ContextThemeWrapper(context, R.style.Theme_SystemUI_QuickSettings) + ) { override fun getSharedPreferences(file: File?, mode: Int): SharedPreferences { return sharedPreferences } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java index ef7c7bc0844d..9188293dc751 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java @@ -80,6 +80,7 @@ import com.android.keyguard.logging.KeyguardLogger; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.biometrics.AuthController; +import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor; import com.android.systemui.classifier.FalsingCollectorFake; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.common.ui.view.LongPressHandlingView; @@ -91,7 +92,6 @@ import com.android.systemui.fragments.FragmentService; import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.KeyguardViewConfigurator; import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository; -import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardBottomAreaInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardFaceAuthInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; @@ -629,7 +629,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { mHeadsUpManager); mNotificationPanelViewController.setTrackingStartedListener(() -> {}); mNotificationPanelViewController.setOpenCloseListener( - new NotificationPanelViewController.OpenCloseListener() { + new OpenCloseListener() { @Override public void onClosingFinished() {} diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java index c72f4e77d4eb..a2c291281fdf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java @@ -169,6 +169,7 @@ public class QuickSettingsControllerBaseTest extends SysuiTestCase { when(mDeviceProvisionedController.isDeviceProvisioned()).thenReturn(true); mShadeInteractor = new ShadeInteractor( + mTestScope.getBackgroundScope(), mDisableFlagsRepository, mKeyguardRepository, new FakeUserSetupRepository(), diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeControllerImplTest.kt index 00a056708f07..729c4a9145c2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeControllerImplTest.kt @@ -56,7 +56,7 @@ class ShadeControllerImplTest : SysuiTestCase() { @Mock private lateinit var windowManager: WindowManager @Mock private lateinit var assistManager: AssistManager @Mock private lateinit var gutsManager: NotificationGutsManager - @Mock private lateinit var notificationPanelViewController: NotificationPanelViewController + @Mock private lateinit var shadeViewController: ShadeViewController @Mock private lateinit var nswvc: NotificationShadeWindowViewController @Mock private lateinit var display: Display @@ -82,7 +82,7 @@ class ShadeControllerImplTest : SysuiTestCase() { Lazy { gutsManager }, ) shadeController.setNotificationShadeWindowViewController(nswvc) - shadeController.setNotificationPanelViewController(notificationPanelViewController) + shadeController.setShadeViewController(shadeViewController) } @Test @@ -91,9 +91,9 @@ class ShadeControllerImplTest : SysuiTestCase() { // Trying to open it does nothing. shadeController.animateExpandShade() - verify(notificationPanelViewController, never()).expandToNotifications() + verify(shadeViewController, never()).expandToNotifications() shadeController.animateExpandQs() - verify(notificationPanelViewController, never()).expand(ArgumentMatchers.anyBoolean()) + verify(shadeViewController, never()).expand(ArgumentMatchers.anyBoolean()) } @Test @@ -102,15 +102,15 @@ class ShadeControllerImplTest : SysuiTestCase() { // Can now be opened. shadeController.animateExpandShade() - verify(notificationPanelViewController).expandToNotifications() + verify(shadeViewController).expandToNotifications() shadeController.animateExpandQs() - verify(notificationPanelViewController).expandToQs() + verify(shadeViewController).expandToQs() } @Test fun cancelExpansionAndCollapseShade_callsCancelCurrentTouch() { // GIVEN the shade is tracking a touch - whenever(notificationPanelViewController.isTracking).thenReturn(true) + whenever(shadeViewController.isTracking).thenReturn(true) // WHEN cancelExpansionAndCollapseShade is called shadeController.cancelExpansionAndCollapseShade() @@ -122,7 +122,7 @@ class ShadeControllerImplTest : SysuiTestCase() { @Test fun cancelExpansionAndCollapseShade_doesNotCallAnimateCollapseShade_whenCollapsed() { // GIVEN the shade is tracking a touch - whenever(notificationPanelViewController.isTracking).thenReturn(false) + whenever(shadeViewController.isTracking).thenReturn(false) // WHEN cancelExpansionAndCollapseShade is called shadeController.cancelExpansionAndCollapseShade() diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt index 2da2e9238d0a..f542ab099517 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt @@ -237,11 +237,22 @@ class ShadeHeaderControllerTest : SysuiTestCase() { whenever(mShadeCarrierGroupController.isSingleCarrier).thenReturn(false) makeShadeVisible() + shadeHeaderController.qsExpandedFraction = 1.0f verify(statusIcons).addIgnoredSlots(carrierIconSlots) } @Test + fun dualCarrier_enablesCarrierIconsInStatusIcons_qsExpanded() { + whenever(mShadeCarrierGroupController.isSingleCarrier).thenReturn(false) + + makeShadeVisible() + shadeHeaderController.qsExpandedFraction = 0.0f + + verify(statusIcons, times(2)).removeIgnoredSlots(carrierIconSlots) + } + + @Test fun disableQS_notDisabled_visible() { makeShadeVisible() shadeHeaderController.disable(0, 0, false) diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/carrier/ShadeCarrierTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/carrier/ShadeCarrierTest.java index 44613103a5b2..dae9c975b997 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/carrier/ShadeCarrierTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/carrier/ShadeCarrierTest.java @@ -20,8 +20,10 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import android.content.Context; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; +import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; @@ -48,7 +50,9 @@ public class ShadeCarrierTest extends SysuiTestCase { @Before public void setUp() throws Exception { mTestableLooper = TestableLooper.get(this); - LayoutInflater inflater = LayoutInflater.from(mContext); + Context themedContext = + new ContextThemeWrapper(mContext, R.style.Theme_SystemUI_QuickSettings); + LayoutInflater inflater = LayoutInflater.from(themedContext); mContext.ensureTestableResources(); mTestableLooper.runWithLooper(() -> mShadeCarrier = (ShadeCarrier) inflater.inflate(R.layout.shade_carrier, null)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeInteractorTest.kt index 7392a94a04c2..45247977283a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeInteractorTest.kt @@ -117,6 +117,7 @@ class ShadeInteractorTest : SysuiTestCase() { ) underTest = ShadeInteractor( + testScope.backgroundScope, disableFlagsRepository, keyguardRepository, userSetupRepository, @@ -126,6 +127,20 @@ class ShadeInteractorTest : SysuiTestCase() { } @Test + fun isShadeEnabled_matchesDisableFlagsRepo() = + testScope.runTest { + val actual by collectLastValue(underTest.isShadeEnabled) + + disableFlagsRepository.disableFlags.value = + DisableFlagsModel(disable2 = DISABLE2_NOTIFICATION_SHADE) + assertThat(actual).isFalse() + + disableFlagsRepository.disableFlags.value = DisableFlagsModel(disable2 = DISABLE2_NONE) + + assertThat(actual).isTrue() + } + + @Test fun isExpandToQsEnabled_deviceNotProvisioned_false() = testScope.runTest { whenever(deviceProvisionedController.isDeviceProvisioned).thenReturn(false) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java index 385d556092a6..1643e174ee13 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar; import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE; import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEFAULT; +import static android.inputmethodservice.InputMethodService.IME_INVISIBLE; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowInsetsController.BEHAVIOR_DEFAULT; @@ -200,7 +201,7 @@ public class CommandQueueTest extends SysuiTestCase { mCommandQueue.setImeWindowStatus(SECONDARY_DISPLAY, null, 1, 2, true); waitForIdleSync(); - verify(mCallbacks).setImeWindowStatus(eq(DEFAULT_DISPLAY), eq(null), eq(0), + verify(mCallbacks).setImeWindowStatus(eq(DEFAULT_DISPLAY), eq(null), eq(IME_INVISIBLE), eq(BACK_DISPOSITION_DEFAULT), eq(false)); verify(mCallbacks).setImeWindowStatus( eq(SECONDARY_DISPLAY), eq(null), eq(1), eq(2), eq(true)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt index 21e0f68cff2d..ff2f1065049b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt @@ -1,5 +1,6 @@ package com.android.systemui.statusbar +import android.app.StatusBarManager.DISABLE2_NOTIFICATION_SHADE import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.testing.TestableLooper.RunWithLooper @@ -11,6 +12,7 @@ import com.android.systemui.classifier.FalsingCollector import com.android.systemui.classifier.FalsingCollectorFake import com.android.systemui.dump.DumpManager import com.android.systemui.keyguard.WakefulnessLifecycle +import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.media.controls.ui.MediaHierarchyManager import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.FalsingManager @@ -19,6 +21,9 @@ import com.android.systemui.power.data.repository.FakePowerRepository import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.shade.ShadeViewController import com.android.systemui.shade.data.repository.FakeShadeRepository +import com.android.systemui.shade.domain.interactor.ShadeInteractor +import com.android.systemui.statusbar.disableflags.data.model.DisableFlagsModel +import com.android.systemui.statusbar.disableflags.data.repository.FakeDisableFlagsRepository import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.NotificationTestHelper import com.android.systemui.statusbar.notification.stack.AmbientState @@ -28,8 +33,13 @@ import com.android.systemui.statusbar.phone.CentralSurfaces import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.phone.LSShadeTransitionLogger import com.android.systemui.statusbar.phone.ScrimController +import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeUserSetupRepository import com.android.systemui.statusbar.policy.FakeConfigurationController import com.android.systemui.util.mockito.mock +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent import org.junit.After import org.junit.Assert.assertFalse import org.junit.Assert.assertNotNull @@ -60,8 +70,11 @@ private fun <T> anyObject(): T { @SmallTest @RunWithLooper(setAsMainLooper = true) @RunWith(AndroidTestingRunner::class) +@OptIn(ExperimentalCoroutinesApi::class) class LockscreenShadeTransitionControllerTest : SysuiTestCase() { + private val testScope = TestScope(StandardTestDispatcher()) + lateinit var transitionController: LockscreenShadeTransitionController lateinit var row: ExpandableNotificationRow @Mock lateinit var statusbarStateController: SysuiStatusBarStateController @@ -87,6 +100,15 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { @Mock lateinit var qsTransitionController: LockscreenShadeQsTransitionController @Mock lateinit var activityStarter: ActivityStarter @Mock lateinit var transitionControllerCallback: LockscreenShadeTransitionController.Callback + private val disableFlagsRepository = FakeDisableFlagsRepository() + private val shadeInteractor = ShadeInteractor( + testScope.backgroundScope, + disableFlagsRepository, + keyguardRepository = FakeKeyguardRepository(), + userSetupRepository = FakeUserSetupRepository(), + deviceProvisionedController = mock(), + userInteractor = mock(), + ) private val powerInteractor = PowerInteractor( FakePowerRepository(), FalsingCollectorFake(), @@ -99,6 +121,10 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { @Before fun setup() { + // By default, have the shade enabled + disableFlagsRepository.disableFlags.value = DisableFlagsModel() + testScope.runCurrent() + val helper = NotificationTestHelper( mContext, mDependency, @@ -139,6 +165,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { qsTransitionControllerFactory = { qsTransitionController }, activityStarter = activityStarter, shadeRepository = FakeShadeRepository(), + shadeInteractor = shadeInteractor, powerInteractor = powerInteractor, ) transitionController.addCallback(transitionControllerCallback) @@ -214,7 +241,10 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { @Test fun testDontGoWhenShadeDisabled() { - whenever(mCentralSurfaces.isShadeDisabled).thenReturn(true) + disableFlagsRepository.disableFlags.value = DisableFlagsModel( + disable2 = DISABLE2_NOTIFICATION_SHADE, + ) + testScope.runCurrent() transitionController.goToLockedShade(null) verify(statusbarStateController, never()).setState(anyInt()) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt index 914301f2e830..2af0cebf3519 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt @@ -69,6 +69,8 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { @Mock private lateinit var listener: SystemStatusAnimationCallback + @Mock private lateinit var logger: SystemStatusAnimationSchedulerLogger + private lateinit var systemClock: FakeSystemClock private lateinit var chipAnimationController: SystemEventChipAnimationController private lateinit var systemStatusAnimationScheduler: SystemStatusAnimationScheduler @@ -538,7 +540,8 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { statusBarWindowController, dumpManager, systemClock, - CoroutineScope(StandardTestDispatcher(testScope.testScheduler)) + CoroutineScope(StandardTestDispatcher(testScope.testScheduler)), + logger ) // add a mock listener systemStatusAnimationScheduler.addCallback(listener) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLoggerTest.kt index a37c38669bfd..902dd51d3a87 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLoggerTest.kt @@ -20,8 +20,8 @@ import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel import com.android.systemui.log.LogcatEchoTracker +import com.android.systemui.log.core.LogLevel import com.android.systemui.statusbar.StatusBarState import com.google.common.truth.Truth.assertThat import org.junit.Before diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/StackStateLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/StackStateLoggerTest.kt index 7707a7e8bf8c..47c5e5b021ae 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/StackStateLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/StackStateLoggerTest.kt @@ -20,8 +20,8 @@ import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.log.LogBuffer -import com.android.systemui.log.LogLevel import com.android.systemui.log.LogcatEchoTracker +import com.android.systemui.log.core.LogLevel import com.android.systemui.statusbar.notification.stack.StackStateLogger import com.google.common.truth.Truth import org.junit.Before diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java index 036b8becfbbc..8545b894ad41 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java @@ -20,6 +20,7 @@ import static android.view.Display.DEFAULT_DISPLAY; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; @@ -144,23 +145,32 @@ public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase { @Test public void testDisableNotificationShade() { - when(mCentralSurfaces.getDisabled1()).thenReturn(StatusBarManager.DISABLE_NONE); - when(mCentralSurfaces.getDisabled2()).thenReturn(StatusBarManager.DISABLE_NONE); + // Start with nothing disabled + mSbcqCallbacks.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_NONE, + StatusBarManager.DISABLE2_NONE, false); + when(mCommandQueue.panelsEnabled()).thenReturn(false); + // WHEN the new disable flags have the shade disabled mSbcqCallbacks.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_NONE, StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false); + // THEN the shade is collapsed verify(mShadeController).animateCollapseShade(); } @Test public void testEnableNotificationShade() { - when(mCentralSurfaces.getDisabled1()).thenReturn(StatusBarManager.DISABLE_NONE); - when(mCentralSurfaces.getDisabled2()) - .thenReturn(StatusBarManager.DISABLE2_NOTIFICATION_SHADE); + // Start with the shade disabled + mSbcqCallbacks.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_NONE, + StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false); + reset(mShadeController); + when(mCommandQueue.panelsEnabled()).thenReturn(true); + // WHEN the new disable flags have the shade enabled mSbcqCallbacks.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_NONE, StatusBarManager.DISABLE2_NONE, false); + + // THEN the shade is not collapsed verify(mShadeController, never()).animateCollapseShade(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java index 1ffffe4dca75..88d8dfc50b47 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java @@ -450,7 +450,7 @@ public class CentralSurfacesImplTest extends SysuiTestCase { () -> mAssistManager, () -> mNotificationGutsManager )); - mShadeController.setNotificationPanelViewController(mNotificationPanelViewController); + mShadeController.setShadeViewController(mNotificationPanelViewController); mShadeController.setNotificationShadeWindowViewController( mNotificationShadeWindowViewController); mShadeController.setNotificationPresenter(mNotificationPresenter); @@ -490,9 +490,11 @@ public class CentralSurfacesImplTest extends SysuiTestCase { mMetricsLogger, mShadeLogger, mUiBgExecutor, + mNotificationPanelViewController, mNotificationMediaManager, mLockscreenUserManager, mRemoteInputManager, + mQuickSettingsController, mUserSwitcherController, mBatteryController, mColorExtractor, @@ -587,8 +589,6 @@ public class CentralSurfacesImplTest extends SysuiTestCase { // TODO: we should be able to call mCentralSurfaces.start() and have all the below values // initialized automatically and make NPVC private. mCentralSurfaces.mNotificationShadeWindowView = mNotificationShadeWindowView; - mCentralSurfaces.mShadeSurface = mNotificationPanelViewController; - mCentralSurfaces.mQsController = mQuickSettingsController; mCentralSurfaces.mDozeScrimController = mDozeScrimController; mCentralSurfaces.mPresenter = mNotificationPresenter; mCentralSurfaces.mKeyguardIndicationController = mKeyguardIndicationController; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBypassControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBypassControllerTest.kt index 3e90ed9811d0..4aac8419af3b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBypassControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBypassControllerTest.kt @@ -42,6 +42,8 @@ import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock +import org.mockito.Mockito.anyBoolean +import org.mockito.Mockito.mock import org.mockito.Mockito.never import org.mockito.Mockito.reset import org.mockito.Mockito.verify @@ -135,6 +137,19 @@ class KeyguardBypassControllerTest : SysuiTestCase() { } @Test + fun onFaceAuthEnabledChanged_notifiesBypassEnabledListeners() { + initKeyguardBypassController() + val bypassListener = mock(KeyguardBypassController.OnBypassStateChangedListener::class.java) + val callback = ArgumentCaptor.forClass(KeyguardStateController.Callback::class.java) + + keyguardBypassController.registerOnBypassStateChangedListener(bypassListener) + verify(keyguardStateController).addCallback(callback.capture()) + + callback.value.onFaceAuthEnabledChanged() + verify(bypassListener).onBypassStateChanged(anyBoolean()) + } + + @Test fun configDevicePostureClosed_matchState_isPostureAllowedForFaceAuth_returnTrue() { defaultConfigPostureClosed() diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java index 9b1d93b691c3..5dcb90144b70 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java @@ -18,10 +18,6 @@ import static android.view.Display.DEFAULT_DISPLAY; import static com.android.systemui.shade.ShadeExpansionStateManagerKt.STATE_CLOSED; import static com.android.systemui.shade.ShadeExpansionStateManagerKt.STATE_OPEN; -import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.ANIMATING_IN; -import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.ANIMATING_OUT; -import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.IDLE; -import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.RUNNING_CHIP_ANIM; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -49,7 +45,7 @@ import android.view.View; import android.view.ViewPropertyAnimator; import android.widget.FrameLayout; -import androidx.core.animation.Animator; +import androidx.core.animation.AnimatorTestRule; import androidx.test.filters.SmallTest; import com.android.keyguard.KeyguardUpdateMonitor; @@ -85,6 +81,7 @@ import com.android.systemui.util.settings.SecureSettings; import com.android.systemui.util.time.FakeSystemClock; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -139,6 +136,8 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { private StatusBarWindowStateController mStatusBarWindowStateController; @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor; + @ClassRule + public static AnimatorTestRule mAnimatorTestRule = new AnimatorTestRule(); private List<StatusBarWindowStateListener> mStatusBarWindowStateListeners = new ArrayList<>(); @@ -172,7 +171,6 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { @Test public void testDisableSystemInfo_systemAnimationIdle_doesHide() { - when(mAnimationScheduler.getAnimationState()).thenReturn(IDLE); CollapsedStatusBarFragment fragment = resumeAndGetFragment(); fragment.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_SYSTEM_INFO, 0, false); @@ -192,24 +190,26 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { public void testSystemStatusAnimation_startedDisabled_finishedWithAnimator_showsSystemInfo() { // GIVEN the status bar hides the system info via disable flags, while there is no event CollapsedStatusBarFragment fragment = resumeAndGetFragment(); - when(mAnimationScheduler.getAnimationState()).thenReturn(IDLE); fragment.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_SYSTEM_INFO, 0, false); assertEquals(View.INVISIBLE, getEndSideContentView().getVisibility()); + // WHEN the system event animation starts + fragment.onSystemEventAnimationBegin().start(); + + // THEN the view remains invisible during the animation + assertEquals(0f, getEndSideContentView().getAlpha(), 0.01); + mAnimatorTestRule.advanceTimeBy(500); + assertEquals(0f, getEndSideContentView().getAlpha(), 0.01); + // WHEN the disable flags are cleared during a system event animation - when(mAnimationScheduler.getAnimationState()).thenReturn(RUNNING_CHIP_ANIM); fragment.disable(DEFAULT_DISPLAY, 0, 0, false); - // THEN the view is made visible again, but still low alpha - assertEquals(View.VISIBLE, getEndSideContentView().getVisibility()); + // THEN the view remains invisible assertEquals(0, getEndSideContentView().getAlpha(), 0.01); // WHEN the system event animation finishes - when(mAnimationScheduler.getAnimationState()).thenReturn(ANIMATING_OUT); - Animator anim = fragment.onSystemEventAnimationFinish(false); - anim.start(); - processAllMessages(); - anim.end(); + fragment.onSystemEventAnimationFinish(false).start(); + mAnimatorTestRule.advanceTimeBy(500); // THEN the system info is full alpha assertEquals(1, getEndSideContentView().getAlpha(), 0.01); @@ -219,20 +219,15 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { public void testSystemStatusAnimation_systemInfoDisabled_staysInvisible() { // GIVEN the status bar hides the system info via disable flags, while there is no event CollapsedStatusBarFragment fragment = resumeAndGetFragment(); - when(mAnimationScheduler.getAnimationState()).thenReturn(IDLE); fragment.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_SYSTEM_INFO, 0, false); assertEquals(View.INVISIBLE, getEndSideContentView().getVisibility()); // WHEN the system event animation finishes - when(mAnimationScheduler.getAnimationState()).thenReturn(ANIMATING_OUT); - Animator anim = fragment.onSystemEventAnimationFinish(false); - anim.start(); - processAllMessages(); - anim.end(); + fragment.onSystemEventAnimationFinish(false).start(); + mAnimatorTestRule.advanceTimeBy(500); - // THEN the system info is at full alpha, but still INVISIBLE (since the disable flag is - // still set) - assertEquals(1, getEndSideContentView().getAlpha(), 0.01); + // THEN the system info remains invisible (since the disable flag is still set) + assertEquals(0, getEndSideContentView().getAlpha(), 0.01); assertEquals(View.INVISIBLE, getEndSideContentView().getVisibility()); } @@ -241,15 +236,14 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { public void testSystemStatusAnimation_notDisabled_animatesAlphaZero() { // GIVEN the status bar is not disabled CollapsedStatusBarFragment fragment = resumeAndGetFragment(); - when(mAnimationScheduler.getAnimationState()).thenReturn(ANIMATING_IN); + assertEquals(1, getEndSideContentView().getAlpha(), 0.01); + // WHEN the system event animation begins - Animator anim = fragment.onSystemEventAnimationBegin(); - anim.start(); - processAllMessages(); - anim.end(); + fragment.onSystemEventAnimationBegin().start(); + mAnimatorTestRule.advanceTimeBy(500); - // THEN the system info is visible but alpha 0 - assertEquals(View.VISIBLE, getEndSideContentView().getVisibility()); + // THEN the system info is invisible + assertEquals(View.INVISIBLE, getEndSideContentView().getVisibility()); assertEquals(0, getEndSideContentView().getAlpha(), 0.01); } @@ -257,25 +251,21 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { public void testSystemStatusAnimation_notDisabled_animatesBackToAlphaOne() { // GIVEN the status bar is not disabled CollapsedStatusBarFragment fragment = resumeAndGetFragment(); - when(mAnimationScheduler.getAnimationState()).thenReturn(ANIMATING_IN); + assertEquals(1, getEndSideContentView().getAlpha(), 0.01); + // WHEN the system event animation begins - Animator anim = fragment.onSystemEventAnimationBegin(); - anim.start(); - processAllMessages(); - anim.end(); + fragment.onSystemEventAnimationBegin().start(); + mAnimatorTestRule.advanceTimeBy(500); - // THEN the system info is visible but alpha 0 - assertEquals(View.VISIBLE, getEndSideContentView().getVisibility()); + // THEN the system info is invisible + assertEquals(View.INVISIBLE, getEndSideContentView().getVisibility()); assertEquals(0, getEndSideContentView().getAlpha(), 0.01); // WHEN the system event animation finishes - when(mAnimationScheduler.getAnimationState()).thenReturn(ANIMATING_OUT); - anim = fragment.onSystemEventAnimationFinish(false); - anim.start(); - processAllMessages(); - anim.end(); + fragment.onSystemEventAnimationFinish(false).start(); + mAnimatorTestRule.advanceTimeBy(500); - // THEN the syste info is full alpha and VISIBLE + // THEN the system info is full alpha and VISIBLE assertEquals(View.VISIBLE, getEndSideContentView().getVisibility()); assertEquals(1, getEndSideContentView().getAlpha(), 0.01); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/MultiSourceMinAlphaControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/MultiSourceMinAlphaControllerTest.kt new file mode 100644 index 000000000000..2617613d1fc5 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/MultiSourceMinAlphaControllerTest.kt @@ -0,0 +1,106 @@ +/* + * 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.statusbar.phone.fragment + +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.view.View +import androidx.core.animation.AnimatorTestRule +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import junit.framework.Assert.assertEquals +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +private const val TEST_SOURCE_1 = 1 +private const val TEST_SOURCE_2 = 2 +private const val TEST_ANIMATION_DURATION = 100L +private const val INITIAL_ALPHA = 1f + +@RunWith(AndroidTestingRunner::class) +@TestableLooper.RunWithLooper(setAsMainLooper = true) +@SmallTest +class MultiSourceMinAlphaControllerTest : SysuiTestCase() { + + private val view = View(context) + private val multiSourceMinAlphaController = + MultiSourceMinAlphaController(view, initialAlpha = INITIAL_ALPHA) + + @get:Rule val animatorTestRule = AnimatorTestRule() + + @Before + fun setup() { + multiSourceMinAlphaController.reset() + } + + @Test + fun testSetAlpha() { + multiSourceMinAlphaController.setAlpha(alpha = 0.5f, sourceId = TEST_SOURCE_1) + assertEquals(0.5f, view.alpha) + } + + @Test + fun testAnimateToAlpha() { + multiSourceMinAlphaController.animateToAlpha( + alpha = 0.5f, + sourceId = TEST_SOURCE_1, + duration = TEST_ANIMATION_DURATION + ) + animatorTestRule.advanceTimeBy(TEST_ANIMATION_DURATION) + assertEquals(0.5f, view.alpha) + } + + @Test + fun testReset() { + multiSourceMinAlphaController.animateToAlpha( + alpha = 0.5f, + sourceId = TEST_SOURCE_1, + duration = TEST_ANIMATION_DURATION + ) + multiSourceMinAlphaController.setAlpha(alpha = 0.7f, sourceId = TEST_SOURCE_2) + multiSourceMinAlphaController.reset() + // advance time to ensure that animators are cancelled when the controller is reset + animatorTestRule.advanceTimeBy(TEST_ANIMATION_DURATION) + assertEquals(INITIAL_ALPHA, view.alpha) + } + + @Test + fun testMinOfTwoSourcesIsApplied() { + multiSourceMinAlphaController.setAlpha(alpha = 0f, sourceId = TEST_SOURCE_1) + multiSourceMinAlphaController.setAlpha(alpha = 0.5f, sourceId = TEST_SOURCE_2) + assertEquals(0f, view.alpha) + multiSourceMinAlphaController.setAlpha(alpha = 1f, sourceId = TEST_SOURCE_1) + assertEquals(0.5f, view.alpha) + } + + @Test + fun testSetAlphaForSameSourceCancelsAnimator() { + multiSourceMinAlphaController.animateToAlpha( + alpha = 0f, + sourceId = TEST_SOURCE_1, + duration = TEST_ANIMATION_DURATION + ) + animatorTestRule.advanceTimeBy(TEST_ANIMATION_DURATION / 2) + multiSourceMinAlphaController.setAlpha(alpha = 1f, sourceId = TEST_SOURCE_1) + animatorTestRule.advanceTimeBy(TEST_ANIMATION_DURATION / 2) + // verify that animation was cancelled and the setAlpha call overrides the alpha value of + // the animation + assertEquals(1f, view.alpha) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryTest.kt index 74bcdeec25cd..862eb001becc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryTest.kt @@ -73,7 +73,6 @@ import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertThrows import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test @@ -588,11 +587,10 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() { } @Test - fun testConnectionRepository_invalidSubId_throws() = + fun testConnectionRepository_invalidSubId_doesNotThrow() = testScope.runTest { - assertThrows(IllegalArgumentException::class.java) { - underTest.getRepoForSubId(SUB_1_ID) - } + underTest.getRepoForSubId(SUB_1_ID) + // No exception } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardStateControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardStateControllerTest.java index d787ada90a73..5cabcd4163b2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardStateControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardStateControllerTest.java @@ -24,6 +24,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.hardware.biometrics.BiometricSourceType; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -43,6 +44,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -66,6 +68,9 @@ public class KeyguardStateControllerTest extends SysuiTestCase { @Mock private KeyguardUpdateMonitorLogger mLogger; + @Captor + private ArgumentCaptor<KeyguardUpdateMonitorCallback> mUpdateCallbackCaptor; + @Before public void setup() { MockitoAnnotations.initMocks(this); @@ -84,6 +89,23 @@ public class KeyguardStateControllerTest extends SysuiTestCase { } @Test + public void testFaceAuthEnabledChanged_calledWhenFaceEnrollmentStateChanges() { + KeyguardStateController.Callback callback = mock(KeyguardStateController.Callback.class); + + when(mKeyguardUpdateMonitor.isFaceAuthEnabledForUser(anyInt())).thenReturn(false); + verify(mKeyguardUpdateMonitor).registerCallback(mUpdateCallbackCaptor.capture()); + mKeyguardStateController.addCallback(callback); + assertThat(mKeyguardStateController.isFaceAuthEnabled()).isFalse(); + + when(mKeyguardUpdateMonitor.isFaceAuthEnabledForUser(anyInt())).thenReturn(true); + mUpdateCallbackCaptor.getValue().onBiometricEnrollmentStateChanged( + BiometricSourceType.FACE); + + assertThat(mKeyguardStateController.isFaceAuthEnabled()).isTrue(); + verify(callback).onFaceAuthEnabledChanged(); + } + + @Test public void testIsShowing() { assertThat(mKeyguardStateController.isShowing()).isFalse(); mKeyguardStateController.notifyKeyguardState(true /* showing */, false /* occluded */); @@ -177,16 +199,14 @@ public class KeyguardStateControllerTest extends SysuiTestCase { @Test public void testOnEnabledTrustAgentsChangedCallback() { final Random random = new Random(); - final ArgumentCaptor<KeyguardUpdateMonitorCallback> updateCallbackCaptor = - ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback.class); - verify(mKeyguardUpdateMonitor).registerCallback(updateCallbackCaptor.capture()); + verify(mKeyguardUpdateMonitor).registerCallback(mUpdateCallbackCaptor.capture()); final KeyguardStateController.Callback stateCallback = mock(KeyguardStateController.Callback.class); mKeyguardStateController.addCallback(stateCallback); when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true); - updateCallbackCaptor.getValue().onEnabledTrustAgentsChanged(random.nextInt()); + mUpdateCallbackCaptor.getValue().onEnabledTrustAgentsChanged(random.nextInt()); verify(stateCallback).onUnlockedChanged(); } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeDeviceEntryFaceAuthRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeDeviceEntryFaceAuthRepository.kt index 738f09ddce3d..2715aaa82253 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeDeviceEntryFaceAuthRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeDeviceEntryFaceAuthRepository.kt @@ -41,7 +41,9 @@ class FakeDeviceEntryFaceAuthRepository : DeviceEntryFaceAuthRepository { fun setDetectionStatus(status: DetectionStatus) { _detectionStatus.value = status } - override val isLockedOut = MutableStateFlow(false) + + private val _isLockedOut = MutableStateFlow(false) + override val isLockedOut = _isLockedOut private val _runningAuthRequest = MutableStateFlow<Pair<FaceAuthUiEvent, Boolean>?>(null) val runningAuthRequest: StateFlow<Pair<FaceAuthUiEvent, Boolean>?> = _runningAuthRequest.asStateFlow() @@ -56,6 +58,10 @@ class FakeDeviceEntryFaceAuthRepository : DeviceEntryFaceAuthRepository { _isAuthRunning.value = true } + fun setLockedOut(value: Boolean) { + _isLockedOut.value = value + } + override fun cancel() { _isAuthRunning.value = false _runningAuthRequest.value = null diff --git a/services/core/java/com/android/server/am/PendingIntentController.java b/services/core/java/com/android/server/am/PendingIntentController.java index 7ee96aaca21d..a20623cd1ee9 100644 --- a/services/core/java/com/android/server/am/PendingIntentController.java +++ b/services/core/java/com/android/server/am/PendingIntentController.java @@ -26,6 +26,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NA import android.annotation.Nullable; import android.app.Activity; import android.app.ActivityManagerInternal; +import android.app.ActivityOptions; import android.app.AppGlobals; import android.app.PendingIntent; import android.app.PendingIntentStats; @@ -126,6 +127,18 @@ public class PendingIntentController { } } Bundle.setDefusable(bOptions, true); + ActivityOptions opts = ActivityOptions.fromBundle(bOptions); + if (opts != null && opts.getPendingIntentBackgroundActivityStartMode() + != ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED) { + Slog.wtf(TAG, "Resetting option setPendingIntentBackgroundActivityStartMode(" + + opts.getPendingIntentBackgroundActivityStartMode() + + ") to SYSTEM_DEFINED from the options provided by the pending " + + "intent creator (" + + packageName + + ") because this option is meant for the pending intent sender"); + opts.setPendingIntentBackgroundActivityStartMode( + ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED); + } final boolean noCreate = (flags & PendingIntent.FLAG_NO_CREATE) != 0; final boolean cancelCurrent = (flags & PendingIntent.FLAG_CANCEL_CURRENT) != 0; @@ -135,7 +148,7 @@ public class PendingIntentController { PendingIntentRecord.Key key = new PendingIntentRecord.Key(type, packageName, featureId, token, resultWho, requestCode, intents, resolvedTypes, flags, - SafeActivityOptions.fromBundle(bOptions), userId); + new SafeActivityOptions(opts), userId); WeakReference<PendingIntentRecord> ref; ref = mIntentSenderRecords.get(key); PendingIntentRecord rec = ref != null ? ref.get() : null; diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java index 202d407651ad..a0e76f1d6af9 100644 --- a/services/core/java/com/android/server/am/PendingIntentRecord.java +++ b/services/core/java/com/android/server/am/PendingIntentRecord.java @@ -457,6 +457,20 @@ public final class PendingIntentRecord extends IIntentSender.Stub { // can specify a consistent launch mode even if the PendingIntent is immutable final ActivityOptions opts = ActivityOptions.fromBundle(options); if (opts != null) { + if (opts.getPendingIntentCreatorBackgroundActivityStartMode() + != ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED) { + Slog.wtf(TAG, + "Resetting option " + + "setPendingIntentCreatorBackgroundActivityStartMode(" + + opts.getPendingIntentCreatorBackgroundActivityStartMode() + + ") to SYSTEM_DEFINED from the options provided by the " + + "pending intent sender (" + + key.packageName + + ") because this option is meant for the pending intent " + + "creator"); + opts.setPendingIntentCreatorBackgroundActivityStartMode( + ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED); + } finalIntent.addFlags(opts.getPendingIntentLaunchFlags()); } diff --git a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java index e4983846f1da..753fdaed2fe6 100644 --- a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java +++ b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java @@ -51,11 +51,11 @@ import android.util.SparseBooleanArray; import com.android.internal.annotations.CompositeRWLock; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import com.android.modules.expresslog.Counter; import com.android.internal.os.ProcessCpuTracker; import com.android.internal.os.TimeoutRecord; import com.android.internal.os.anr.AnrLatencyTracker; import com.android.internal.util.FrameworkStatsLog; +import com.android.modules.expresslog.Counter; import com.android.server.ResourcePressureUtil; import com.android.server.criticalevents.CriticalEventLog; import com.android.server.stats.pull.ProcfsMemoryUtil.MemorySnapshot; @@ -456,6 +456,11 @@ class ProcessErrorStateRecord { String currentPsiState = ResourcePressureUtil.currentPsiState(); latencyTracker.currentPsiStateReturned(); report.append(currentPsiState); + // The 'processCpuTracker' variable is a shared resource that might be initialized and + // updated in a different thread. In order to prevent thread visibility issues, which + // can occur when one thread does not immediately see the changes made to + // 'processCpuTracker' by another thread, it is necessary to use synchronization whenever + // 'processCpuTracker' is accessed or modified. ProcessCpuTracker processCpuTracker = new ProcessCpuTracker(true); // We push the native pids collection task to the helper thread through @@ -517,12 +522,16 @@ class ProcessErrorStateRecord { } mService.updateCpuStatsNow(); mService.mAppProfiler.printCurrentCpuState(report, anrTime); - info.append(processCpuTracker.printCurrentLoad()); + synchronized (processCpuTracker) { + info.append(processCpuTracker.printCurrentLoad()); + } info.append(report); } report.append(tracesFileException.getBuffer()); - info.append(processCpuTracker.printCurrentState(anrTime)); + synchronized (processCpuTracker) { + info.append(processCpuTracker.printCurrentState(anrTime)); + } Slog.e(TAG, info.toString()); if (tracesFile == null) { diff --git a/services/core/java/com/android/server/am/StackTracesDumpHelper.java b/services/core/java/com/android/server/am/StackTracesDumpHelper.java index cf69b535151c..ba0fd17a3f2f 100644 --- a/services/core/java/com/android/server/am/StackTracesDumpHelper.java +++ b/services/core/java/com/android/server/am/StackTracesDumpHelper.java @@ -464,28 +464,31 @@ public class StackTracesDumpHelper { latencyTracker.processCpuTrackerMethodsCalled(); } ArrayList<Integer> extraPids = new ArrayList<>(); - processCpuTracker.init(); + synchronized (processCpuTracker) { + processCpuTracker.init(); + } try { Thread.sleep(200); } catch (InterruptedException ignored) { } - processCpuTracker.update(); + synchronized (processCpuTracker) { + processCpuTracker.update(); + // We'll take the stack crawls of just the top apps using CPU. + final int workingStatsNumber = processCpuTracker.countWorkingStats(); + for (int i = 0; i < workingStatsNumber && extraPids.size() < 2; i++) { + ProcessCpuTracker.Stats stats = processCpuTracker.getWorkingStats(i); + if (lastPids.indexOfKey(stats.pid) >= 0) { + if (DEBUG_ANR) { + Slog.d(TAG, "Collecting stacks for extra pid " + stats.pid); + } - // We'll take the stack crawls of just the top apps using CPU. - final int workingStatsNumber = processCpuTracker.countWorkingStats(); - for (int i = 0; i < workingStatsNumber && extraPids.size() < 2; i++) { - ProcessCpuTracker.Stats stats = processCpuTracker.getWorkingStats(i); - if (lastPids.indexOfKey(stats.pid) >= 0) { - if (DEBUG_ANR) { - Slog.d(TAG, "Collecting stacks for extra pid " + stats.pid); + extraPids.add(stats.pid); + } else { + Slog.i(TAG, + "Skipping next CPU consuming process, not a java proc: " + + stats.pid); } - - extraPids.add(stats.pid); - } else { - Slog.i(TAG, - "Skipping next CPU consuming process, not a java proc: " - + stats.pid); } } if (latencyTracker != null) { diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java index e4a5a3e0ed00..ca15dd79adbc 100644 --- a/services/core/java/com/android/server/app/GameManagerService.java +++ b/services/core/java/com/android/server/app/GameManagerService.java @@ -2166,7 +2166,7 @@ public final class GameManagerService extends IGameManagerService.Stub { @Override public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) { synchronized (mUidObserverLock) { - if (ActivityManager.isProcStateBackground(procState)) { + if (procState != ActivityManager.PROCESS_STATE_TOP) { disableGameMode(uid); return; } diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java index 50ffbcb9f4c4..3f4f981dc0b8 100644 --- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java +++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java @@ -957,6 +957,7 @@ public final class PlaybackActivityMonitor players = (HashMap<Integer, AudioPlaybackConfiguration>) mPlayers.clone(); } mFadingManager.unfadeOutUid(uid, players); + mDuckingManager.unduckUid(uid, players); } //================================================================= diff --git a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java index b0b1d676bc4b..ba9e280be49d 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java @@ -352,7 +352,6 @@ final class InputMethodBindingController { clearCurMethodAndSessions(); mService.clearInputShownLocked(); mService.unbindCurrentClientLocked(UnbindReason.DISCONNECT_IME); - mService.resetSystemUiLocked(); } } } diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 4dbd82065a66..1ab83f7c5fe5 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -48,6 +48,7 @@ import static android.view.WindowManager.DISPLAY_IME_POLICY_LOCAL; import static com.android.server.inputmethod.ImeVisibilityStateComputer.ImeTargetWindowState; import static com.android.server.inputmethod.ImeVisibilityStateComputer.ImeVisibilityResult; +import static com.android.server.inputmethod.ImeVisibilityStateComputer.STATE_HIDE_IME; import static com.android.server.inputmethod.InputMethodBindingController.TIME_TO_RECONNECT; import static com.android.server.inputmethod.InputMethodUtils.isSoftInputModeStateVisibleAllowed; @@ -633,9 +634,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub private InputMethodSubtype mCurrentSubtype; /** - * {@code true} if the IME has not been mostly hidden via {@link android.view.InsetsController}. + * {@code true} if the IME has not been mostly hidden via {@link android.view.InsetsController} */ - @GuardedBy("ImfLock.class") private boolean mCurPerceptible; /** @@ -749,26 +749,33 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub SparseArray<AccessibilitySessionState> mEnabledAccessibilitySessions = new SparseArray<>(); /** - * {@code true} if the device is currently interactive with the user, initially true. - * - * @see #handleSetInteractive + * True if the device is currently interactive with user. The value is true initially. */ - @GuardedBy("ImfLock.class") boolean mIsInteractive = true; - @GuardedBy("ImfLock.class") - @InputMethodService.BackDispositionMode int mBackDisposition = InputMethodService.BACK_DISPOSITION_DEFAULT; /** - * The {@link InputMethodService.ImeWindowVisibility} of the currently bound IME, - * or {@code 0} if no IME is bound. + * A set of status bits regarding the active IME. * - * <p><em>Do not update this value outside of {@link #setImeWindowStatus(IBinder, int, int)} and + * <p>This value is a combination of following two bits:</p> + * <dl> + * <dt>{@link InputMethodService#IME_ACTIVE}</dt> + * <dd> + * If this bit is ON, connected IME is ready to accept touch/key events. + * </dd> + * <dt>{@link InputMethodService#IME_VISIBLE}</dt> + * <dd> + * If this bit is ON, some of IME view, e.g. software input, candidate view, is visible. + * </dd> + * <dt>{@link InputMethodService#IME_INVISIBLE}</dt> + * <dd> If this bit is ON, IME is ready with views from last EditorInfo but is + * currently invisible. + * </dd> + * </dl> + * <em>Do not update this value outside of {@link #setImeWindowStatus(IBinder, int, int)} and * {@link InputMethodBindingController#unbindCurrentMethod()}.</em> */ - @GuardedBy("ImfLock.class") - @InputMethodService.ImeWindowVisibility int mImeWindowVis; private LocaleList mLastSystemLocales; @@ -1529,6 +1536,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub // Uh oh, current input method is no longer around! // Pick another one... Slog.i(TAG, "Current input method removed: " + curInputMethodId); + updateSystemUiLocked(0 /* vis */, mBackDisposition); if (!chooseNewDefaultIMELocked()) { changed = true; curIm = null; @@ -2360,6 +2368,28 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub } } + /** + * Called when {@link #resetCurrentMethodAndClientLocked(int)} invoked for clean-up states + * before unbinding the current method. + */ + @GuardedBy("ImfLock.class") + void onUnbindCurrentMethodByReset() { + final ImeTargetWindowState winState = mVisibilityStateComputer.getWindowStateOrNull( + mCurFocusedWindow); + if (winState != null && !winState.isRequestedImeVisible() + && !mVisibilityStateComputer.isInputShown()) { + // Normally, the focus window will apply the IME visibility state to + // WindowManager when the IME has applied it. But it would be too late when + // switching IMEs in between different users. (Since the focused IME will + // first unbind the service to switch to bind the next user of the IME + // service, that wouldn't make the attached IME token validity check in time) + // As a result, we have to notify WM to apply IME visibility before clearing the + // binding states in the first place. + mVisibilityApplier.applyImeVisibility(mCurFocusedWindow, mCurStatsToken, + STATE_HIDE_IME); + } + } + /** {@code true} when a {@link ClientState} has attached from starting the input connection. */ @GuardedBy("ImfLock.class") boolean hasAttachedClient() { @@ -2831,6 +2861,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub @GuardedBy("ImfLock.class") void resetCurrentMethodAndClientLocked(@UnbindReason int unbindClientReason) { setSelectedMethodIdLocked(null); + // Callback before clean-up binding states. + onUnbindCurrentMethodByReset(); mBindingController.unbindCurrentMethod(); unbindCurrentClientLocked(unbindClientReason); } @@ -2931,6 +2963,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub sessionState.mSession.finishSession(); } catch (RemoteException e) { Slog.w(TAG, "Session failed to close due to remote exception", e); + updateSystemUiLocked(0 /* vis */, mBackDisposition); } sessionState.mSession = null; } @@ -3040,8 +3073,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub } @GuardedBy("ImfLock.class") - private boolean shouldShowImeSwitcherLocked( - @InputMethodService.ImeWindowVisibility int visibility) { + private boolean shouldShowImeSwitcherLocked(int visibility) { if (!mShowOngoingImeSwitcherForPhones) return false; // When the IME switcher dialog is shown, the IME switcher button should be hidden. if (mMenuController.getSwitchingDialogLocked() != null) return false; @@ -3053,7 +3085,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub && mWindowManagerInternal.isKeyguardSecure(mSettings.getCurrentUserId())) { return false; } - if ((visibility & InputMethodService.IME_ACTIVE) == 0) { + if ((visibility & InputMethodService.IME_ACTIVE) == 0 + || (visibility & InputMethodService.IME_INVISIBLE) != 0) { return false; } if (mWindowManagerInternal.isHardKeyboardAvailable()) { @@ -3112,9 +3145,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub @BinderThread @SuppressWarnings("deprecation") - private void setImeWindowStatus(@NonNull IBinder token, - @InputMethodService.ImeWindowVisibility int vis, - @InputMethodService.BackDispositionMode int backDisposition) { + private void setImeWindowStatus(@NonNull IBinder token, int vis, int backDisposition) { final int topFocusedDisplayId = mWindowManagerInternal.getTopFocusedDisplayId(); synchronized (ImfLock.class) { @@ -3131,7 +3162,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub } mImeWindowVis = vis; mBackDisposition = backDisposition; - updateSystemUiLocked(mImeWindowVis, mBackDisposition); + updateSystemUiLocked(vis, backDisposition); } final boolean dismissImeOnBackKeyPressed; @@ -3166,46 +3197,37 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub private void updateImeWindowStatus(boolean disableImeIcon) { synchronized (ImfLock.class) { - // TODO(b/285109020): disableImeIcon should be stored in a property like - // mIsSwitcherIconDisabled, but it is currently not reliably cleared. - updateSystemUiLocked(disableImeIcon ? 0 : mImeWindowVis, mBackDisposition); + if (disableImeIcon) { + updateSystemUiLocked(0, mBackDisposition); + } else { + updateSystemUiLocked(); + } } } @GuardedBy("ImfLock.class") void updateSystemUiLocked() { - // This is only used by InputMethodMenuController to trigger the IME switcher icon - // visibility, by having {@code shouldShowImeSwitcherLocked} called, which depends on the - // visibility of the IME switcher dialog. updateSystemUiLocked(mImeWindowVis, mBackDisposition); } // Caution! This method is called in this class. Handle multi-user carefully @GuardedBy("ImfLock.class") - private void updateSystemUiLocked(@InputMethodService.ImeWindowVisibility int vis, - @InputMethodService.BackDispositionMode int backDisposition) { + private void updateSystemUiLocked(int vis, int backDisposition) { if (getCurTokenLocked() == null) { return; } if (DEBUG) { Slog.d(TAG, "IME window vis: " + vis - + " active: " + ((vis & InputMethodService.IME_ACTIVE) != 0) - + " visible: " + ((vis & InputMethodService.IME_VISIBLE) != 0) - + " backDisposition: " + backDisposition - + " isInteractive: " + mIsInteractive - + " curPerceptible: " + mCurPerceptible + + " active: " + (vis & InputMethodService.IME_ACTIVE) + + " inv: " + (vis & InputMethodService.IME_INVISIBLE) + " displayId: " + mCurTokenDisplayId); } // TODO: Move this clearing calling identity block to setImeWindowStatus after making sure - // all updateSystemUi happens on system privilege. + // all updateSystemUi happens on system privilege. final long ident = Binder.clearCallingIdentity(); try { - if (!mIsInteractive) { - // When we are not interactive, - // the visibility should be 0 (no IME icons should be shown). - vis = 0; - } else if (!mCurPerceptible) { + if (!mCurPerceptible) { if ((vis & InputMethodService.IME_VISIBLE) != 0) { vis &= ~InputMethodService.IME_VISIBLE; vis |= InputMethodService.IME_VISIBLE_IMPERCEPTIBLE; @@ -3540,7 +3562,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub return; } mCurPerceptible = perceptible; - updateSystemUiLocked(mImeWindowVis, mBackDisposition); + updateSystemUiLocked(); } }); } @@ -5102,11 +5124,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub private void handleSetInteractive(final boolean interactive) { synchronized (ImfLock.class) { - if (mIsInteractive == interactive) { - return; - } mIsInteractive = interactive; - updateSystemUiLocked(mImeWindowVis, mBackDisposition); + updateSystemUiLocked(interactive ? mImeWindowVis : 0, mBackDisposition); // Inform the current client of the change in active status if (mCurClient == null || mCurClient.mClient == null) { @@ -6741,8 +6760,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub @BinderThread @Override - public void setImeWindowStatusAsync(@InputMethodService.ImeWindowVisibility int vis, - @InputMethodService.BackDispositionMode int backDisposition) { + public void setImeWindowStatusAsync(int vis, int backDisposition) { mImms.setImeWindowStatus(mToken, vis, backDisposition); } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 5b3227388460..68f49fd0481f 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -5595,6 +5595,11 @@ public class NotificationManagerService extends SystemService { boolean granted, boolean userSet) { Objects.requireNonNull(listener); checkNotificationListenerAccess(); + if (granted && listener.flattenToString().length() + > NotificationManager.MAX_SERVICE_COMPONENT_NAME_LENGTH) { + throw new IllegalArgumentException( + "Component name too long: " + listener.flattenToString()); + } if (!userSet && isNotificationListenerAccessUserSet(listener)) { // Don't override user's choice return; diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java index 7fda092a218d..24118203bb56 100644 --- a/services/core/java/com/android/server/pm/PackageSetting.java +++ b/services/core/java/com/android/server/pm/PackageSetting.java @@ -337,7 +337,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal final long previousFirstInstallTime = replacedPkgSetting.getUserStateOrDefault(userId).getFirstInstallTimeMillis(); if (previousFirstInstallTime != 0) { - modifyUserState(userId).setFirstInstallTime(previousFirstInstallTime); + modifyUserState(userId).setFirstInstallTimeMillis(previousFirstInstallTime); } } onChanged(); @@ -352,10 +352,10 @@ public class PackageSetting extends SettingBase implements PackageStateInternal if (userId == UserHandle.USER_ALL) { int userStateCount = mUserStates.size(); for (int i = 0; i < userStateCount; i++) { - mUserStates.valueAt(i).setFirstInstallTime(firstInstallTime); + mUserStates.valueAt(i).setFirstInstallTimeMillis(firstInstallTime); } } else { - modifyUserState(userId).setFirstInstallTime(firstInstallTime); + modifyUserState(userId).setFirstInstallTimeMillis(firstInstallTime); } onChanged(); return this; @@ -894,7 +894,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal .setVirtualPreload(virtualPreload) .setHarmfulAppWarning(harmfulAppWarning) .setSplashScreenTheme(splashScreenTheme) - .setFirstInstallTime(firstInstallTime); + .setFirstInstallTimeMillis(firstInstallTime); onChanged(); } diff --git a/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java b/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java index ed4aab9d15ef..e8e2d4179326 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java +++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java @@ -16,6 +16,7 @@ package com.android.server.pm.pkg; +import android.annotation.CurrentTimeMillisLong; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; @@ -61,6 +62,7 @@ public class PackageUserStateImpl extends WatchableImpl implements PackageUserSt private int mDistractionFlags; private boolean mInstantApp; private boolean mVirtualPreload; + @PackageManager.EnabledState private int mEnabledState = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; @PackageManager.InstallReason private int mInstallReason = PackageManager.INSTALL_REASON_UNKNOWN; @@ -90,7 +92,7 @@ public class PackageUserStateImpl extends WatchableImpl implements PackageUserSt @Nullable private WatchedArrayMap<ComponentName, Pair<String, Integer>> mComponentLabelIconOverrideMap; - private long mFirstInstallTime; + private @CurrentTimeMillisLong long mFirstInstallTimeMillis; // TODO(b/239050028): Remove, enforce notifying parent through PMS commit method @Nullable @@ -147,7 +149,7 @@ public class PackageUserStateImpl extends WatchableImpl implements PackageUserSt mSuspendParams = other.mSuspendParams == null ? null : other.mSuspendParams.snapshot(); mComponentLabelIconOverrideMap = other.mComponentLabelIconOverrideMap == null ? null : other.mComponentLabelIconOverrideMap.snapshot(); - mFirstInstallTime = other.mFirstInstallTime; + mFirstInstallTimeMillis = other.mFirstInstallTimeMillis; mSnapshot = new SnapshotCache.Sealed<>(); } @@ -538,8 +540,8 @@ public class PackageUserStateImpl extends WatchableImpl implements PackageUserSt return this; } - public @NonNull PackageUserStateImpl setFirstInstallTime(long value) { - mFirstInstallTime = value; + public @NonNull PackageUserStateImpl setFirstInstallTimeMillis(long value) { + mFirstInstallTimeMillis = value; onChanged(); return this; } @@ -643,7 +645,7 @@ public class PackageUserStateImpl extends WatchableImpl implements PackageUserSt } @DataClass.Generated.Member - public int getEnabledState() { + public @PackageManager.EnabledState int getEnabledState() { return mEnabledState; } @@ -691,8 +693,8 @@ public class PackageUserStateImpl extends WatchableImpl implements PackageUserSt } @DataClass.Generated.Member - public long getFirstInstallTimeMillis() { - return mFirstInstallTime; + public @CurrentTimeMillisLong long getFirstInstallTimeMillis() { + return mFirstInstallTimeMillis; } @DataClass.Generated.Member @@ -766,7 +768,7 @@ public class PackageUserStateImpl extends WatchableImpl implements PackageUserSt && Objects.equals(mSplashScreenTheme, that.mSplashScreenTheme) && Objects.equals(mSuspendParams, that.mSuspendParams) && Objects.equals(mComponentLabelIconOverrideMap, that.mComponentLabelIconOverrideMap) - && mFirstInstallTime == that.mFirstInstallTime + && mFirstInstallTimeMillis == that.mFirstInstallTimeMillis && watchableEquals(that.mWatchable) && snapshotEquals(that.mSnapshot); } @@ -798,17 +800,17 @@ public class PackageUserStateImpl extends WatchableImpl implements PackageUserSt _hash = 31 * _hash + Objects.hashCode(mSplashScreenTheme); _hash = 31 * _hash + Objects.hashCode(mSuspendParams); _hash = 31 * _hash + Objects.hashCode(mComponentLabelIconOverrideMap); - _hash = 31 * _hash + Long.hashCode(mFirstInstallTime); + _hash = 31 * _hash + Long.hashCode(mFirstInstallTimeMillis); _hash = 31 * _hash + watchableHashCode(); _hash = 31 * _hash + snapshotHashCode(); return _hash; } @DataClass.Generated( - time = 1668033772891L, + time = 1686952839807L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java", - inputSignatures = "protected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mDisabledComponentsWatched\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mEnabledComponentsWatched\nprivate long mCeDataInode\nprivate boolean mInstalled\nprivate boolean mStopped\nprivate boolean mNotLaunched\nprivate boolean mHidden\nprivate int mDistractionFlags\nprivate boolean mInstantApp\nprivate boolean mVirtualPreload\nprivate int mEnabledState\nprivate @android.content.pm.PackageManager.InstallReason int mInstallReason\nprivate @android.content.pm.PackageManager.UninstallReason int mUninstallReason\nprivate @android.annotation.Nullable java.lang.String mHarmfulAppWarning\nprivate @android.annotation.Nullable java.lang.String mLastDisableAppCaller\nprivate @android.annotation.Nullable android.content.pm.overlay.OverlayPaths mOverlayPaths\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths> mSharedLibraryOverlayPaths\nprivate @android.annotation.Nullable java.lang.String mSplashScreenTheme\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams> mSuspendParams\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>> mComponentLabelIconOverrideMap\nprivate long mFirstInstallTime\nprivate @android.annotation.Nullable com.android.server.utils.Watchable mWatchable\nfinal @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> mSnapshot\nprivate com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> makeCache()\nprivate void onChanged()\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageUserStateImpl snapshot()\npublic @android.annotation.Nullable boolean setOverlayPaths(android.content.pm.overlay.OverlayPaths)\npublic boolean setSharedLibraryOverlayPaths(java.lang.String,android.content.pm.overlay.OverlayPaths)\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getDisabledComponentsNoCopy()\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getEnabledComponentsNoCopy()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getDisabledComponents()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getEnabledComponents()\npublic @java.lang.Override boolean isComponentEnabled(java.lang.String)\npublic @java.lang.Override boolean isComponentDisabled(java.lang.String)\npublic @java.lang.Override android.content.pm.overlay.OverlayPaths getAllOverlayPaths()\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer)\npublic void resetOverrideComponentLabelIcon()\npublic @android.annotation.Nullable android.util.Pair<java.lang.String,java.lang.Integer> getOverrideLabelIconForComponent(android.content.ComponentName)\npublic @java.lang.Override boolean isSuspended()\npublic com.android.server.pm.pkg.PackageUserStateImpl putSuspendParams(java.lang.String,com.android.server.pm.pkg.SuspendParams)\npublic com.android.server.pm.pkg.PackageUserStateImpl removeSuspension(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setCeDataInode(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstalled(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setStopped(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setNotLaunched(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHidden(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDistractionFlags(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstantApp(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setVirtualPreload(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setUninstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHarmfulAppWarning(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setLastDisableAppCaller(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSharedLibraryOverlayPaths(android.util.ArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSplashScreenTheme(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSuspendParams(android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setComponentLabelIconOverrideMap(android.util.ArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setFirstInstallTime(long)\npublic @android.annotation.NonNull @java.lang.Override java.util.Map<java.lang.String,android.content.pm.overlay.OverlayPaths> getSharedLibraryOverlayPaths()\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setWatchable(com.android.server.utils.Watchable)\nprivate boolean watchableEquals(com.android.server.utils.Watchable)\nprivate int watchableHashCode()\nprivate boolean snapshotEquals(com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl>)\nprivate int snapshotHashCode()\nclass PackageUserStateImpl extends com.android.server.utils.WatchableImpl implements [com.android.server.pm.pkg.PackageUserStateInternal, com.android.server.utils.Snappable]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=false, genEqualsHashCode=true)") + inputSignatures = "protected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mDisabledComponentsWatched\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mEnabledComponentsWatched\nprivate long mCeDataInode\nprivate boolean mInstalled\nprivate boolean mStopped\nprivate boolean mNotLaunched\nprivate boolean mHidden\nprivate int mDistractionFlags\nprivate boolean mInstantApp\nprivate boolean mVirtualPreload\nprivate @android.content.pm.PackageManager.EnabledState int mEnabledState\nprivate @android.content.pm.PackageManager.InstallReason int mInstallReason\nprivate @android.content.pm.PackageManager.UninstallReason int mUninstallReason\nprivate @android.annotation.Nullable java.lang.String mHarmfulAppWarning\nprivate @android.annotation.Nullable java.lang.String mLastDisableAppCaller\nprivate @android.annotation.Nullable android.content.pm.overlay.OverlayPaths mOverlayPaths\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths> mSharedLibraryOverlayPaths\nprivate @android.annotation.Nullable java.lang.String mSplashScreenTheme\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams> mSuspendParams\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>> mComponentLabelIconOverrideMap\nprivate @android.annotation.CurrentTimeMillisLong long mFirstInstallTimeMillis\nprivate @android.annotation.Nullable com.android.server.utils.Watchable mWatchable\nfinal @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> mSnapshot\nprivate com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> makeCache()\nprivate void onChanged()\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageUserStateImpl snapshot()\npublic @android.annotation.Nullable boolean setOverlayPaths(android.content.pm.overlay.OverlayPaths)\npublic boolean setSharedLibraryOverlayPaths(java.lang.String,android.content.pm.overlay.OverlayPaths)\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getDisabledComponentsNoCopy()\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getEnabledComponentsNoCopy()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getDisabledComponents()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getEnabledComponents()\npublic @java.lang.Override boolean isComponentEnabled(java.lang.String)\npublic @java.lang.Override boolean isComponentDisabled(java.lang.String)\npublic @java.lang.Override android.content.pm.overlay.OverlayPaths getAllOverlayPaths()\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer)\npublic void resetOverrideComponentLabelIcon()\npublic @android.annotation.Nullable android.util.Pair<java.lang.String,java.lang.Integer> getOverrideLabelIconForComponent(android.content.ComponentName)\npublic @java.lang.Override boolean isSuspended()\npublic com.android.server.pm.pkg.PackageUserStateImpl putSuspendParams(java.lang.String,com.android.server.pm.pkg.SuspendParams)\npublic com.android.server.pm.pkg.PackageUserStateImpl removeSuspension(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setCeDataInode(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstalled(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setStopped(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setNotLaunched(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHidden(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDistractionFlags(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstantApp(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setVirtualPreload(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setUninstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHarmfulAppWarning(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setLastDisableAppCaller(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSharedLibraryOverlayPaths(android.util.ArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSplashScreenTheme(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSuspendParams(android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setComponentLabelIconOverrideMap(android.util.ArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setFirstInstallTimeMillis(long)\npublic @android.annotation.NonNull @java.lang.Override java.util.Map<java.lang.String,android.content.pm.overlay.OverlayPaths> getSharedLibraryOverlayPaths()\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setWatchable(com.android.server.utils.Watchable)\nprivate boolean watchableEquals(com.android.server.utils.Watchable)\nprivate int watchableHashCode()\nprivate boolean snapshotEquals(com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl>)\nprivate int snapshotHashCode()\nclass PackageUserStateImpl extends com.android.server.utils.WatchableImpl implements [com.android.server.pm.pkg.PackageUserStateInternal, com.android.server.utils.Snappable]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=false, genEqualsHashCode=true)") @Deprecated private void __metadata() {} diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index 6e9a22c7872b..efd8b6d9a943 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -19,7 +19,6 @@ package com.android.server.statusbar; import android.annotation.Nullable; import android.app.ITransientNotificationCallback; import android.hardware.fingerprint.IUdfpsRefreshRateRequestCallback; -import android.inputmethodservice.InputMethodService; import android.os.Bundle; import android.os.IBinder; import android.view.WindowInsets.Type.InsetsType; @@ -55,13 +54,13 @@ public interface StatusBarManagerInternal { * @param displayId The display to which the IME is bound to. * @param token The IME token. * @param vis Bit flags about the IME visibility. + * (e.g. {@link android.inputmethodservice.InputMethodService#IME_ACTIVE}) * @param backDisposition Bit flags about the IME back disposition. + * (e.g. {@link android.inputmethodservice.InputMethodService#BACK_DISPOSITION_DEFAULT}) * @param showImeSwitcher {@code true} when the IME switcher button should be shown. */ - void setImeWindowStatus(int displayId, IBinder token, - @InputMethodService.ImeWindowVisibility int vis, - @InputMethodService.BackDispositionMode int backDisposition, - boolean showImeSwitcher); + void setImeWindowStatus(int displayId, IBinder token, int vis, + int backDisposition, boolean showImeSwitcher); /** * See {@link android.app.StatusBarManager#setIcon(String, int, int, String)}. diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 2c381ca3bd41..cc849b6fbf91 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -59,7 +59,6 @@ import android.hardware.biometrics.PromptInfo; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManager.DisplayListener; import android.hardware.fingerprint.IUdfpsRefreshRateRequestCallback; -import android.inputmethodservice.InputMethodService; import android.media.INearbyMediaDevicesProvider; import android.media.MediaRoute2Info; import android.net.Uri; @@ -533,9 +532,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } @Override - public void setImeWindowStatus(int displayId, IBinder token, - @InputMethodService.ImeWindowVisibility int vis, - @InputMethodService.BackDispositionMode int backDisposition, + public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition, boolean showImeSwitcher) { StatusBarManagerService.this.setImeWindowStatus(displayId, token, vis, backDisposition, showImeSwitcher); @@ -1267,14 +1264,12 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } @Override - public void setImeWindowStatus(int displayId, final IBinder token, - @InputMethodService.ImeWindowVisibility final int vis, - @InputMethodService.BackDispositionMode final int backDisposition, - final boolean showImeSwitcher) { + public void setImeWindowStatus(int displayId, final IBinder token, final int vis, + final int backDisposition, final boolean showImeSwitcher) { enforceStatusBar(); if (SPEW) { - Slog.d(TAG, "setImeWindowStatus vis=" + vis + " backDisposition=" + backDisposition); + Slog.d(TAG, "swetImeWindowStatus vis=" + vis + " backDisposition=" + backDisposition); } synchronized(mLock) { @@ -1337,9 +1332,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D private String mPackageName = "none"; private int mDisabled1 = 0; private int mDisabled2 = 0; - @InputMethodService.ImeWindowVisibility private int mImeWindowVis = 0; - @InputMethodService.BackDispositionMode private int mImeBackDisposition = 0; private boolean mShowImeSwitcher = false; private IBinder mImeToken = null; @@ -1384,8 +1377,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D return mDisabled1 == disabled1 && mDisabled2 == disabled2; } - private void setImeWindowState(@InputMethodService.ImeWindowVisibility final int vis, - @InputMethodService.BackDispositionMode final int backDisposition, + private void setImeWindowState(final int vis, final int backDisposition, final boolean showImeSwitcher, final IBinder token) { mImeWindowVis = vis; mImeBackDisposition = backDisposition; diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java index b296ef2a1443..1ff01a6c70bf 100644 --- a/services/core/java/com/android/server/vr/VrManagerService.java +++ b/services/core/java/com/android/server/vr/VrManagerService.java @@ -1049,7 +1049,11 @@ public class VrManagerService extends SystemService for (ComponentName c : possibleServices) { if (Objects.equals(c.getPackageName(), pkg)) { - nm.setNotificationListenerAccessGrantedForUser(c, userId, true); + try { + nm.setNotificationListenerAccessGrantedForUser(c, userId, true); + } catch (Exception e) { + Slog.w(TAG, "Could not grant NLS access to package " + pkg, e); + } } } } diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 788bfbcd65c9..0994fa4464db 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -4560,6 +4560,26 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } task.forAllActivities(fromActivity -> { if (fromActivity == this) return true; + // The snapshot starting window could remove itself when receive resized request without + // redraw, so transfer it to a different size activity could only cause flicker. + // By schedule remove snapshot starting window, the remove process will happen when + // transition ready, transition ready means the app window is drawn. + final StartingData tmpStartingData = fromActivity.mStartingData; + if (tmpStartingData != null && tmpStartingData.mAssociatedTask == null + && mTransitionController.isCollecting(fromActivity) + && tmpStartingData instanceof SnapshotStartingData) { + final Rect fromBounds = fromActivity.getBounds(); + final Rect myBounds = getBounds(); + if (!fromBounds.equals(myBounds)) { + // Mark as no animation, so these changes won't merge into playing transition. + if (mTransitionController.inPlayingTransition(fromActivity)) { + mTransitionController.setNoAnimation(this); + mTransitionController.setNoAnimation(fromActivity); + } + fromActivity.removeStartingWindow(); + return true; + } + } return !fromActivity.isVisibleRequested() && transferStartingWindow(fromActivity); }); } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 4a658d6abaf4..10ff3a3b2e9b 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -546,6 +546,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { */ private volatile long mLastStopAppSwitchesTime; + @GuardedBy("itself") private final List<AnrController> mAnrController = new ArrayList<>(); IActivityController mController = null; boolean mControllerIsAMonkey = false; @@ -733,7 +734,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { private boolean mShowDialogs = true; /** Set if we are shutting down the system, similar to sleeping. */ - boolean mShuttingDown = false; + volatile boolean mShuttingDown; /** * We want to hold a wake lock while running a voice interaction session, since @@ -2298,14 +2299,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { /** Register an {@link AnrController} to control the ANR dialog behavior */ public void registerAnrController(AnrController controller) { - synchronized (mGlobalLock) { + synchronized (mAnrController) { mAnrController.add(controller); } } /** Unregister an {@link AnrController} */ public void unregisterAnrController(AnrController controller) { - synchronized (mGlobalLock) { + synchronized (mAnrController) { mAnrController.remove(controller); } } @@ -2321,7 +2322,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } final ArrayList<AnrController> controllers; - synchronized (mGlobalLock) { + synchronized (mAnrController) { controllers = new ArrayList<>(mAnrController); } @@ -6034,15 +6035,13 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public boolean isShuttingDown() { - synchronized (mGlobalLock) { - return mShuttingDown; - } + return mShuttingDown; } @Override public boolean shuttingDown(boolean booted, int timeout) { + mShuttingDown = true; synchronized (mGlobalLock) { - mShuttingDown = true; mRootWindowContainer.prepareForShutdown(); updateEventDispatchingLocked(booted); notifyTaskPersisterLocked(null, true); diff --git a/services/core/java/com/android/server/wm/AppWarnings.java b/services/core/java/com/android/server/wm/AppWarnings.java index f7ccc0d91969..0273a30e157c 100644 --- a/services/core/java/com/android/server/wm/AppWarnings.java +++ b/services/core/java/com/android/server/wm/AppWarnings.java @@ -16,7 +16,9 @@ package com.android.server.wm; +import android.annotation.NonNull; import android.annotation.UiThread; +import android.annotation.WorkerThread; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -30,14 +32,18 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.SystemProperties; +import android.util.ArrayMap; +import android.util.ArraySet; import android.util.AtomicFile; import android.util.DisplayMetrics; import android.util.Slog; import android.util.Xml; +import com.android.internal.annotations.GuardedBy; import com.android.internal.util.ArrayUtils; import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; +import com.android.server.IoThread; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -45,9 +51,7 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; /** * Manages warning dialogs shown during application lifecycle. @@ -61,11 +65,12 @@ class AppWarnings { public static final int FLAG_HIDE_DEPRECATED_SDK = 0x04; public static final int FLAG_HIDE_DEPRECATED_ABI = 0x08; - private final HashMap<String, Integer> mPackageFlags = new HashMap<>(); + @GuardedBy("mPackageFlags") + private final ArrayMap<String, Integer> mPackageFlags = new ArrayMap<>(); private final ActivityTaskManagerService mAtm; private final Context mUiContext; - private final ConfigHandler mHandler; + private final WriteConfigTask mWriteConfigTask; private final UiHandler mUiHandler; private final AtomicFile mConfigFile; @@ -75,30 +80,20 @@ class AppWarnings { private DeprecatedAbiDialog mDeprecatedAbiDialog; /** @see android.app.ActivityManager#alwaysShowUnsupportedCompileSdkWarning */ - private HashSet<ComponentName> mAlwaysShowUnsupportedCompileSdkWarningActivities = - new HashSet<>(); + private final ArraySet<ComponentName> mAlwaysShowUnsupportedCompileSdkWarningActivities = + new ArraySet<>(); /** @see android.app.ActivityManager#alwaysShowUnsupportedCompileSdkWarning */ void alwaysShowUnsupportedCompileSdkWarning(ComponentName activity) { mAlwaysShowUnsupportedCompileSdkWarningActivities.add(activity); } - /** - * Creates a new warning dialog manager. - * <p> - * <strong>Note:</strong> Must be called from the ActivityManagerService thread. - * - * @param atm - * @param uiContext - * @param handler - * @param uiHandler - * @param systemDir - */ + /** Creates a new warning dialog manager. */ public AppWarnings(ActivityTaskManagerService atm, Context uiContext, Handler handler, Handler uiHandler, File systemDir) { mAtm = atm; mUiContext = uiContext; - mHandler = new ConfigHandler(handler.getLooper()); + mWriteConfigTask = new WriteConfigTask(); mUiHandler = new UiHandler(uiHandler.getLooper()); mConfigFile = new AtomicFile(new File(systemDir, CONFIG_FILE_NAME), "warnings-config"); @@ -256,8 +251,9 @@ class AppWarnings { mUiHandler.hideDialogsForPackage(name); synchronized (mPackageFlags) { - mPackageFlags.remove(name); - mHandler.scheduleWrite(); + if (mPackageFlags.remove(name) != null) { + mWriteConfigTask.schedule(); + } } } @@ -425,7 +421,7 @@ class AppWarnings { } else { mPackageFlags.remove(name); } - mHandler.scheduleWrite(); + mWriteConfigTask.schedule(); } } } @@ -556,46 +552,30 @@ class AppWarnings { } } - /** - * Handles messages on the ActivityTaskManagerService thread. - */ - private final class ConfigHandler extends Handler { - private static final int MSG_WRITE = 1; - - private static final int DELAY_MSG_WRITE = 10000; - - public ConfigHandler(Looper looper) { - super(looper, null, true); - } + private final class WriteConfigTask implements Runnable { + private static final long WRITE_CONFIG_DELAY_MS = 10000; + final AtomicReference<ArrayMap<String, Integer>> mPendingPackageFlags = + new AtomicReference<>(); @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_WRITE: - writeConfigToFileAmsThread(); - break; + public void run() { + final ArrayMap<String, Integer> packageFlags = mPendingPackageFlags.getAndSet(null); + if (packageFlags != null) { + writeConfigToFile(packageFlags); } } - public void scheduleWrite() { - removeMessages(MSG_WRITE); - sendEmptyMessageDelayed(MSG_WRITE, DELAY_MSG_WRITE); + @GuardedBy("mPackageFlags") + void schedule() { + if (mPendingPackageFlags.getAndSet(new ArrayMap<>(mPackageFlags)) == null) { + IoThread.getHandler().postDelayed(this, WRITE_CONFIG_DELAY_MS); + } } } - /** - * Writes the configuration file. - * <p> - * <strong>Note:</strong> Should be called from the ActivityManagerService thread unless you - * don't care where you're doing I/O operations. But you <i>do</i> care, don't you? - */ - private void writeConfigToFileAmsThread() { - // Create a shallow copy so that we don't have to synchronize on config. - final HashMap<String, Integer> packageFlags; - synchronized (mPackageFlags) { - packageFlags = new HashMap<>(mPackageFlags); - } - + /** Writes the configuration file. */ + @WorkerThread + private void writeConfigToFile(@NonNull ArrayMap<String, Integer> packageFlags) { FileOutputStream fos = null; try { fos = mConfigFile.startWrite(); @@ -605,9 +585,9 @@ class AppWarnings { out.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); out.startTag(null, "packages"); - for (Map.Entry<String, Integer> entry : packageFlags.entrySet()) { - String pkg = entry.getKey(); - int mode = entry.getValue(); + for (int i = 0; i < packageFlags.size(); i++) { + final String pkg = packageFlags.keyAt(i); + final int mode = packageFlags.valueAt(i); if (mode == 0) { continue; } diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 54fec3e2f844..d9a954f1973b 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -1061,8 +1061,10 @@ class RootWindowContainer extends WindowContainer<DisplayContent> displayHasContent = true; } else if (displayContent != null && (!mObscureApplicationContentOnSecondaryDisplays + || displayContent.isKeyguardAlwaysUnlocked() || (obscured && type == TYPE_KEYGUARD_DIALOG))) { - // Allow full screen keyguard presentation dialogs to be seen. + // Allow full screen keyguard presentation dialogs to be seen, or simply ignore the + // keyguard if this display is always unlocked. displayHasContent = true; } if ((privateflags & PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE) != 0) { diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 39772dda4792..9c23beb21a92 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3473,6 +3473,11 @@ class Task extends TaskFragment { top.mLetterboxUiController.getLetterboxPositionForVerticalReachability(); } } + // User Aspect Ratio Settings is enabled if the app is not in SCM + info.topActivityEligibleForUserAspectRatioButton = + mWmService.mLetterboxConfiguration.isUserAppAspectRatioSettingsEnabled() + && top != null && !info.topActivityInSizeCompat; + info.topActivityBoundsLetterboxed = top != null && top.areBoundsLetterboxed(); } /** diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 79a54c3cfb32..f2e0260a5b84 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -1101,6 +1101,16 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { final Task task = ar.getTask(); if (task == null) continue; boolean visibleAtTransitionEnd = mVisibleAtTransitionEndTokens.contains(ar); + // visibleAtTransitionEnd is used to guard against pre-maturely committing + // invisible on a window which is actually hidden by a later transition and not this + // one. However, for a transient launch, we can't use this mechanism because the + // visibility is determined at finish. Instead, use a different heuristic: don't + // commit invisible if the window is already in a later transition. That later + // transition will then handle the commit. + if (isTransientLaunch(ar) && !ar.isVisibleRequested() + && mController.inCollectingTransition(ar)) { + visibleAtTransitionEnd = true; + } // We need both the expected visibility AND current requested-visibility to be // false. If it is expected-visible but not currently visible, it means that // another animation is queued-up to animate this to invisibility, so we can't diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index c065cb5f4ebe..e76cbe448f15 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -971,7 +971,7 @@ void NativeInputManager::notifyDropWindow(const sp<IBinder>& token, float x, flo void NativeInputManager::notifyDeviceInteraction(int32_t deviceId, nsecs_t timestamp, const std::set<gui::Uid>& uids) { static const bool ENABLE_INPUT_DEVICE_USAGE_METRICS = - sysprop::InputProperties::enable_input_device_usage_metrics().value_or(true); + sysprop::InputProperties::enable_input_device_usage_metrics().value_or(false); if (!ENABLE_INPUT_DEVICE_USAGE_METRICS) return; mInputManager->getMetricsCollector().notifyDeviceInteraction(deviceId, timestamp, uids); diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/DefaultImeVisibilityApplierTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/DefaultImeVisibilityApplierTest.java index a6ada4d77253..869497c28def 100644 --- a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/DefaultImeVisibilityApplierTest.java +++ b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/DefaultImeVisibilityApplierTest.java @@ -20,6 +20,7 @@ import static android.inputmethodservice.InputMethodService.IME_ACTIVE; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE; import static com.android.internal.inputmethod.SoftInputShowHideReason.HIDE_SOFT_INPUT; +import static com.android.internal.inputmethod.SoftInputShowHideReason.HIDE_SWITCH_USER; import static com.android.internal.inputmethod.SoftInputShowHideReason.SHOW_SOFT_INPUT; import static com.android.server.inputmethod.ImeVisibilityStateComputer.STATE_HIDE_IME; import static com.android.server.inputmethod.ImeVisibilityStateComputer.STATE_HIDE_IME_EXPLICIT; @@ -43,6 +44,7 @@ import android.view.inputmethod.InputMethodManager; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.android.dx.mockito.inline.extended.ExtendedMockito; import com.android.internal.inputmethod.InputBindResult; import com.android.internal.inputmethod.StartInputFlags; import com.android.internal.inputmethod.StartInputReason; @@ -165,6 +167,29 @@ public class DefaultImeVisibilityApplierTest extends InputMethodManagerServiceTe verify(mMockImeTargetVisibilityPolicy).removeImeScreenshot(eq(Display.DEFAULT_DISPLAY)); } + @Test + public void testApplyImeVisibility_hideImeWhenUnbinding() { + mInputMethodManagerService.setAttachedClientForTesting(null); + startInputOrWindowGainedFocus(mWindowToken, SOFT_INPUT_STATE_ALWAYS_VISIBLE); + ExtendedMockito.spyOn(mVisibilityApplier); + + synchronized (ImfLock.class) { + // Simulate the system hides the IME when switching IME services in different users. + // (e.g. unbinding the IME from the current user to the profile user) + final int displayIdToShowIme = mInputMethodManagerService.getDisplayIdToShowImeLocked(); + mInputMethodManagerService.hideCurrentInputLocked(mWindowToken, null, 0, null, + HIDE_SWITCH_USER); + mInputMethodManagerService.onUnbindCurrentMethodByReset(); + + // Expects applyImeVisibility() -> hideIme() will be called to notify WM for syncing + // the IME hidden state. + verify(mVisibilityApplier).applyImeVisibility(eq(mWindowToken), any(), + eq(STATE_HIDE_IME)); + verify(mInputMethodManagerService.mWindowManagerInternal).hideIme( + eq(mWindowToken), eq(displayIdToShowIme), eq(null)); + } + } + private InputBindResult startInputOrWindowGainedFocus(IBinder windowToken, int softInputMode) { return mInputMethodManagerService.startInputOrWindowGainedFocus( StartInputReason.WINDOW_FOCUS_GAIN /* startInputReason */, diff --git a/services/tests/displayservicetests/Android.bp b/services/tests/displayservicetests/Android.bp index b242ec2db420..f1ff33809184 100644 --- a/services/tests/displayservicetests/Android.bp +++ b/services/tests/displayservicetests/Android.bp @@ -22,11 +22,20 @@ android_test { "src/**/*.java", ], + libs: [ + "android.test.mock", + ], + static_libs: [ - "services.core", - "androidx.test.runner", - "androidx.test.rules", + "androidx.test.ext.junit", + "display-core-libs", + "frameworks-base-testutils", + "junit", + "junit-params", + "platform-compat-test-rules", "platform-test-annotations", + "services.core", + "servicestests-utils", ], defaults: [ @@ -47,3 +56,10 @@ android_test { enabled: false, }, } + +java_library { + name: "display-core-libs", + srcs: [ + "src/com/android/server/display/TestUtils.java", + ], +} diff --git a/services/tests/displayservicetests/AndroidManifest.xml b/services/tests/displayservicetests/AndroidManifest.xml index c2e417429eac..d2bd10dd18dc 100644 --- a/services/tests/displayservicetests/AndroidManifest.xml +++ b/services/tests/displayservicetests/AndroidManifest.xml @@ -21,6 +21,16 @@ Insert permissions here. eg: <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> --> + <uses-permission android:name="android.permission.CONTROL_DISPLAY_BRIGHTNESS" /> + <uses-permission android:name="android.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS" /> + <uses-permission android:name="android.permission.DEVICE_POWER" /> + <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> + <uses-permission android:name="android.permission.LOG_COMPAT_CHANGE" /> + <uses-permission android:name="android.permission.MANAGE_ACTIVITY_TASKS" /> + <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" /> + <uses-permission android:name="android.permission.READ_COMPAT_CHANGE_CONFIG" /> + <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" /> + <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> <application android:debuggable="true" android:testOnly="true"> diff --git a/services/tests/servicestests/src/com/android/server/display/AmbientBrightnessStatsTrackerTest.java b/services/tests/displayservicetests/src/com/android/server/display/AmbientBrightnessStatsTrackerTest.java index 2c4fe536b75c..7333bc75fe9d 100644 --- a/services/tests/servicestests/src/com/android/server/display/AmbientBrightnessStatsTrackerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/AmbientBrightnessStatsTrackerTest.java @@ -11,7 +11,7 @@ * 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 + * limitations under the License. */ package com.android.server.display; diff --git a/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/AutomaticBrightnessControllerTest.java index a6acd60f3bd7..a6acd60f3bd7 100644 --- a/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/AutomaticBrightnessControllerTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/BrightnessMappingStrategyTest.java index 5f81869903c3..ee7826f13578 100644 --- a/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/BrightnessMappingStrategyTest.java @@ -11,7 +11,7 @@ * 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 + * limitations under the License. */ package com.android.server.display; @@ -206,11 +206,11 @@ public class BrightnessMappingStrategyTest { BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); strategy.setBrightnessConfiguration(null); - final int N = DISPLAY_LEVELS_BACKLIGHT.length; + final int n = DISPLAY_LEVELS_BACKLIGHT.length; final float expectedBrightness = - (float) DISPLAY_LEVELS_BACKLIGHT[N - 1] / PowerManager.BRIGHTNESS_ON; + (float) DISPLAY_LEVELS_BACKLIGHT[n - 1] / PowerManager.BRIGHTNESS_ON; assertEquals(expectedBrightness, - strategy.getBrightness(LUX_LEVELS[N - 1]), 0.0001f /*tolerance*/); + strategy.getBrightness(LUX_LEVELS[n - 1]), 0.0001f /*tolerance*/); } @Test @@ -270,10 +270,10 @@ public class BrightnessMappingStrategyTest { // Check that null returns us to the default configuration. strategy.setBrightnessConfiguration(null); - final int N = DISPLAY_LEVELS_NITS.length; - final float expectedBrightness = DISPLAY_LEVELS_NITS[N - 1] / DISPLAY_RANGE_NITS[1]; + final int n = DISPLAY_LEVELS_NITS.length; + final float expectedBrightness = DISPLAY_LEVELS_NITS[n - 1] / DISPLAY_RANGE_NITS[1]; assertEquals(expectedBrightness, - strategy.getBrightness(LUX_LEVELS[N - 1]), 0.0001f /*tolerance*/); + strategy.getBrightness(LUX_LEVELS[n - 1]), 0.0001f /*tolerance*/); } @Test diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessThrottlerTest.java b/services/tests/displayservicetests/src/com/android/server/display/BrightnessThrottlerTest.java index 46956d74cc5c..8faaf5998d13 100644 --- a/services/tests/servicestests/src/com/android/server/display/BrightnessThrottlerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/BrightnessThrottlerTest.java @@ -159,7 +159,7 @@ public class BrightnessThrottlerTest { @Test public void testThermalThrottlingSingleLevel() throws Exception { final ThrottlingLevel level = new ThrottlingLevel(PowerManager.THERMAL_STATUS_CRITICAL, - 0.25f); + 0.25f); List<ThrottlingLevel> levels = new ArrayList<>(); levels.add(level); @@ -184,7 +184,7 @@ public class BrightnessThrottlerTest { assertEquals(level.brightness, throttler.getBrightnessCap(), 0f); assertTrue(throttler.isThrottled()); assertEquals(BrightnessInfo.BRIGHTNESS_MAX_REASON_THERMAL, - throttler.getBrightnessMaxReason()); + throttler.getBrightnessMaxReason()); // Set status more than high enough to trigger throttling listener.notifyThrottling(getSkinTemp(level.thermalStatus + 1)); @@ -192,7 +192,7 @@ public class BrightnessThrottlerTest { assertEquals(level.brightness, throttler.getBrightnessCap(), 0f); assertTrue(throttler.isThrottled()); assertEquals(BrightnessInfo.BRIGHTNESS_MAX_REASON_THERMAL, - throttler.getBrightnessMaxReason()); + throttler.getBrightnessMaxReason()); // Return to the lower throttling level listener.notifyThrottling(getSkinTemp(level.thermalStatus)); @@ -200,7 +200,7 @@ public class BrightnessThrottlerTest { assertEquals(level.brightness, throttler.getBrightnessCap(), 0f); assertTrue(throttler.isThrottled()); assertEquals(BrightnessInfo.BRIGHTNESS_MAX_REASON_THERMAL, - throttler.getBrightnessMaxReason()); + throttler.getBrightnessMaxReason()); // Cool down listener.notifyThrottling(getSkinTemp(level.thermalStatus - 1)); @@ -208,15 +208,15 @@ public class BrightnessThrottlerTest { assertEquals(PowerManager.BRIGHTNESS_MAX, throttler.getBrightnessCap(), 0f); assertFalse(throttler.isThrottled()); assertEquals(BrightnessInfo.BRIGHTNESS_MAX_REASON_NONE, - throttler.getBrightnessMaxReason()); + throttler.getBrightnessMaxReason()); } @Test public void testThermalThrottlingMultiLevel() throws Exception { final ThrottlingLevel levelLo = new ThrottlingLevel(PowerManager.THERMAL_STATUS_MODERATE, - 0.62f); + 0.62f); final ThrottlingLevel levelHi = new ThrottlingLevel(PowerManager.THERMAL_STATUS_CRITICAL, - 0.25f); + 0.25f); List<ThrottlingLevel> levels = new ArrayList<>(); levels.add(levelLo); @@ -242,7 +242,7 @@ public class BrightnessThrottlerTest { assertEquals(levelLo.brightness, throttler.getBrightnessCap(), 0f); assertTrue(throttler.isThrottled()); assertEquals(BrightnessInfo.BRIGHTNESS_MAX_REASON_THERMAL, - throttler.getBrightnessMaxReason()); + throttler.getBrightnessMaxReason()); // Set status to an intermediate throttling level listener.notifyThrottling(getSkinTemp(levelLo.thermalStatus + 1)); @@ -250,7 +250,7 @@ public class BrightnessThrottlerTest { assertEquals(levelLo.brightness, throttler.getBrightnessCap(), 0f); assertTrue(throttler.isThrottled()); assertEquals(BrightnessInfo.BRIGHTNESS_MAX_REASON_THERMAL, - throttler.getBrightnessMaxReason()); + throttler.getBrightnessMaxReason()); // Set status to the highest configured throttling level listener.notifyThrottling(getSkinTemp(levelHi.thermalStatus)); @@ -258,7 +258,7 @@ public class BrightnessThrottlerTest { assertEquals(levelHi.brightness, throttler.getBrightnessCap(), 0f); assertTrue(throttler.isThrottled()); assertEquals(BrightnessInfo.BRIGHTNESS_MAX_REASON_THERMAL, - throttler.getBrightnessMaxReason()); + throttler.getBrightnessMaxReason()); // Set status to exceed the highest configured throttling level listener.notifyThrottling(getSkinTemp(levelHi.thermalStatus + 1)); @@ -266,7 +266,7 @@ public class BrightnessThrottlerTest { assertEquals(levelHi.brightness, throttler.getBrightnessCap(), 0f); assertTrue(throttler.isThrottled()); assertEquals(BrightnessInfo.BRIGHTNESS_MAX_REASON_THERMAL, - throttler.getBrightnessMaxReason()); + throttler.getBrightnessMaxReason()); // Return to an intermediate throttling level listener.notifyThrottling(getSkinTemp(levelLo.thermalStatus + 1)); @@ -274,7 +274,7 @@ public class BrightnessThrottlerTest { assertEquals(levelLo.brightness, throttler.getBrightnessCap(), 0f); assertTrue(throttler.isThrottled()); assertEquals(BrightnessInfo.BRIGHTNESS_MAX_REASON_THERMAL, - throttler.getBrightnessMaxReason()); + throttler.getBrightnessMaxReason()); // Return to the lowest configured throttling level listener.notifyThrottling(getSkinTemp(levelLo.thermalStatus)); @@ -282,7 +282,7 @@ public class BrightnessThrottlerTest { assertEquals(levelLo.brightness, throttler.getBrightnessCap(), 0f); assertTrue(throttler.isThrottled()); assertEquals(BrightnessInfo.BRIGHTNESS_MAX_REASON_THERMAL, - throttler.getBrightnessMaxReason()); + throttler.getBrightnessMaxReason()); // Cool down listener.notifyThrottling(getSkinTemp(levelLo.thermalStatus - 1)); diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java b/services/tests/displayservicetests/src/com/android/server/display/BrightnessTrackerTest.java index 021f2d1df835..44c7dec7633e 100644 --- a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/BrightnessTrackerTest.java @@ -11,7 +11,7 @@ * 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 + * limitations under the License. */ package com.android.server.display; @@ -395,8 +395,8 @@ public class BrightnessTrackerTest { final long currentTime = mInjector.currentTimeMillis(); notifyBrightnessChanged(mTracker, brightness, displayId, new float[] {1000.0f}, new long[] {TimeUnit.NANOSECONDS.toMillis(mInjector.elapsedRealtimeNanos())}); - List<BrightnessChangeEvent> eventsNoPackage - = mTracker.getEvents(0, false).getList(); + List<BrightnessChangeEvent> eventsNoPackage = + mTracker.getEvents(0, false).getList(); List<BrightnessChangeEvent> events = mTracker.getEvents(0, true).getList(); mTracker.stop(); @@ -1037,9 +1037,9 @@ public class BrightnessTrackerTest { } void setBrightnessMode(boolean isBrightnessModeAutomatic) { - mIsBrightnessModeAutomatic = isBrightnessModeAutomatic; - mContentObserver.dispatchChange(false, null); - waitForHandler(); + mIsBrightnessModeAutomatic = isBrightnessModeAutomatic; + mContentObserver.dispatchChange(false, null); + waitForHandler(); } void sendScreenChange(boolean screenOn) { @@ -1184,8 +1184,8 @@ public class BrightnessTrackerTest { @Override public int getNightDisplayColorTemperature(Context context) { - return mSecureIntSettings.getOrDefault(Settings.Secure.NIGHT_DISPLAY_COLOR_TEMPERATURE, - mDefaultNightModeColorTemperature); + return mSecureIntSettings.getOrDefault(Settings.Secure.NIGHT_DISPLAY_COLOR_TEMPERATURE, + mDefaultNightModeColorTemperature); } @Override diff --git a/services/tests/servicestests/src/com/android/server/display/ColorFadeTest.java b/services/tests/displayservicetests/src/com/android/server/display/ColorFadeTest.java index 53d8de0c2bbb..53d8de0c2bbb 100644 --- a/services/tests/servicestests/src/com/android/server/display/ColorFadeTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/ColorFadeTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/DeviceStateToLayoutMapTest.java b/services/tests/displayservicetests/src/com/android/server/display/DeviceStateToLayoutMapTest.java index 130e6ad91b49..130e6ad91b49 100644 --- a/services/tests/servicestests/src/com/android/server/display/DeviceStateToLayoutMapTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DeviceStateToLayoutMapTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayDeviceConfigTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java index 8b04eca69132..8b04eca69132 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayDeviceConfigTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java index 5db9d1f6f5bd..d16c9c59bb1b 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java @@ -142,7 +142,7 @@ public class DisplayManagerServiceTest { private static final float FLOAT_TOLERANCE = 0.01f; private static final String VIRTUAL_DISPLAY_NAME = "Test Virtual Display"; - private static final String PACKAGE_NAME = "com.android.frameworks.servicestests"; + private static final String PACKAGE_NAME = "com.android.frameworks.displayservicetests"; private static final long STANDARD_DISPLAY_EVENTS = DisplayManager.EVENT_FLAG_DISPLAY_ADDED | DisplayManager.EVENT_FLAG_DISPLAY_CHANGED | DisplayManager.EVENT_FLAG_DISPLAY_REMOVED; @@ -238,7 +238,7 @@ public class DisplayManagerServiceTest { boolean getHdrOutputConversionSupport() { return true; } - } + } private final DisplayManagerService.Injector mBasicInjector = new BasicInjector(); diff --git a/services/tests/servicestests/src/com/android/server/display/HbmEventTest.java b/services/tests/displayservicetests/src/com/android/server/display/HbmEventTest.java index 24fc34849829..24fc34849829 100644 --- a/services/tests/servicestests/src/com/android/server/display/HbmEventTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/HbmEventTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/HighBrightnessModeControllerTest.java index e2a66f03f5ca..76e6ec7f6780 100644 --- a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/HighBrightnessModeControllerTest.java @@ -483,8 +483,10 @@ public class HighBrightnessModeControllerTest { // Verify Stats HBM_ON_HDR verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_HDR), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_HDR), + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 0 /*numberOfHdrLayers*/, 0, 0, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/); @@ -492,8 +494,10 @@ public class HighBrightnessModeControllerTest { // Verify Stats HBM_OFF verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF), + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); hbmc.setAutoBrightnessEnabled(AUTO_BRIGHTNESS_ENABLED); hbmc.onAmbientLuxChange(MINIMUM_LUX + 1); @@ -501,16 +505,20 @@ public class HighBrightnessModeControllerTest { // Verify Stats HBM_ON_SUNLIGHT verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_SUNLIGHT), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_SUNLIGHT), + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); hbmc.onAmbientLuxChange(1); advanceTime(TIME_ALLOWED_IN_WINDOW_MILLIS / 2 + 1); // Verify Stats HBM_OFF verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_SV_OFF_LUX_DROP)); + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF), + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__REASON__HBM_SV_OFF_LUX_DROP)); } @Test @@ -527,8 +535,8 @@ public class HighBrightnessModeControllerTest { // Verify Stats HBM_ON_HDR not report verify(mInjectorMock, never()).reportHbmStateChange(eq(displayStatsId), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_HDR), - anyInt()); + eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_HDR), + anyInt()); } @Test @@ -545,8 +553,8 @@ public class HighBrightnessModeControllerTest { // Verify Stats HBM_ON_SUNLIGHT not report verify(mInjectorMock, never()).reportHbmStateChange(eq(displayStatsId), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_SUNLIGHT), - anyInt()); + eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_SUNLIGHT), + anyInt()); } // Test reporting of thermal throttling when triggered externally through @@ -565,8 +573,10 @@ public class HighBrightnessModeControllerTest { BrightnessInfo.BRIGHTNESS_MAX_REASON_NONE); advanceTime(1); verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_SUNLIGHT), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_SUNLIGHT), + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); // Brightness is thermally throttled, HBM brightness denied (NBM brightness granted) hbmc.onBrightnessChanged(nbmBrightness, hbmBrightness, @@ -578,8 +588,8 @@ public class HighBrightnessModeControllerTest { // the HBM transition point. assertEquals(HIGH_BRIGHTNESS_MODE_SUNLIGHT, hbmc.getHighBrightnessMode()); verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_SV_OFF_THERMAL_LIMIT)); + eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF), + eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_SV_OFF_THERMAL_LIMIT)); } @Test @@ -592,15 +602,17 @@ public class HighBrightnessModeControllerTest { hbmcOnBrightnessChanged(hbmc, TRANSITION_POINT + 0.01f); advanceTime(0); verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_SUNLIGHT), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_SUNLIGHT), + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); // Use up all the time in the window. advanceTime(TIME_WINDOW_MILLIS + 1); verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_SV_OFF_TIME_LIMIT)); + eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF), + eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_SV_OFF_TIME_LIMIT)); } @Test @@ -613,13 +625,17 @@ public class HighBrightnessModeControllerTest { hbmcOnBrightnessChanged(hbmc, TRANSITION_POINT + 0.01f); advanceTime(0); verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_SUNLIGHT), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_SUNLIGHT), + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); hbmc.setAutoBrightnessEnabled(AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE); verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_SV_OFF_DISPLAY_OFF)); + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF), + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__REASON__HBM_SV_OFF_DISPLAY_OFF)); } @Test @@ -632,16 +648,18 @@ public class HighBrightnessModeControllerTest { hbmcOnBrightnessChanged(hbmc, TRANSITION_POINT + 0.01f); advanceTime(0); verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_SUNLIGHT), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_SUNLIGHT), + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/, DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/); advanceTime(0); verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_HDR), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_SV_OFF_HDR_PLAYING)); + eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_HDR), + eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_SV_OFF_HDR_PLAYING)); } @Test @@ -657,15 +675,17 @@ public class HighBrightnessModeControllerTest { assertEquals(HIGH_BRIGHTNESS_MODE_SUNLIGHT, hbmc.getHighBrightnessMode()); // verify HBM_ON_SUNLIGHT verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_SUNLIGHT), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__STATE__HBM_ON_SUNLIGHT), + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); hbmcOnBrightnessChanged(hbmc, DEFAULT_MIN); // verify HBM_SV_OFF due to LOW_REQUESTED_BRIGHTNESS verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId), - eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF), - eq(FrameworkStatsLog - .DISPLAY_HBM_STATE_CHANGED__REASON__HBM_SV_OFF_LOW_REQUESTED_BRIGHTNESS)); + eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF), + eq(FrameworkStatsLog + .DISPLAY_HBM_STATE_CHANGED__REASON__HBM_SV_OFF_LOW_REQUESTED_BRIGHTNESS)); } private void assertState(HighBrightnessModeController hbmc, diff --git a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeMetadataTest.java b/services/tests/displayservicetests/src/com/android/server/display/HighBrightnessModeMetadataTest.java index ede54e096ad0..ede54e096ad0 100644 --- a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeMetadataTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/HighBrightnessModeMetadataTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java b/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayMapperTest.java index 1eec70da3d20..1eec70da3d20 100644 --- a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayMapperTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java b/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayTest.java index 30ff8ba6e331..20654797a5d2 100644 --- a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayTest.java @@ -40,6 +40,7 @@ import androidx.test.filters.SmallTest; import com.android.server.display.layout.Layout; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import java.io.InputStream; @@ -121,7 +122,9 @@ public class LogicalDisplayTest { assertEquals(expectedPosition, mLogicalDisplay.getDisplayPosition()); } + // TODO: b/288880734 - fix test after display tests migration @Test + @Ignore public void testDisplayInputFlags() { SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class); mLogicalDisplay.configureDisplayLocked(t, mDisplayDevice, false); diff --git a/services/tests/servicestests/src/com/android/server/display/NormalBrightnessModeControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/NormalBrightnessModeControllerTest.java index c379d6b79ee7..c379d6b79ee7 100644 --- a/services/tests/servicestests/src/com/android/server/display/NormalBrightnessModeControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/NormalBrightnessModeControllerTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java b/services/tests/displayservicetests/src/com/android/server/display/PersistentDataStoreTest.java index 642f54c25a46..9f91916a4046 100644 --- a/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/PersistentDataStoreTest.java @@ -11,7 +11,7 @@ * 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 + * limitations under the License. */ package com.android.server.display; diff --git a/services/tests/servicestests/src/com/android/server/display/ScreenOffBrightnessSensorControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/ScreenOffBrightnessSensorControllerTest.java index 5b10dc4e0bab..5b10dc4e0bab 100644 --- a/services/tests/servicestests/src/com/android/server/display/ScreenOffBrightnessSensorControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/ScreenOffBrightnessSensorControllerTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/utils/SensorUtilsTest.java b/services/tests/displayservicetests/src/com/android/server/display/SensorUtilsTest.java index 4494b0c412dc..4494b0c412dc 100644 --- a/services/tests/servicestests/src/com/android/server/display/utils/SensorUtilsTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/SensorUtilsTest.java diff --git a/services/tests/displayservicetests/src/com/android/server/display/TestUtils.java b/services/tests/displayservicetests/src/com/android/server/display/TestUtils.java new file mode 100644 index 000000000000..8b45145b160f --- /dev/null +++ b/services/tests/displayservicetests/src/com/android/server/display/TestUtils.java @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2019 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.server.display; + +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.input.InputSensorInfo; +import android.os.Parcel; +import android.os.SystemClock; +import android.view.DisplayAddress; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +public final class TestUtils { + + public static SensorEvent createSensorEvent(Sensor sensor, int value) throws Exception { + final Constructor<SensorEvent> constructor = + SensorEvent.class.getDeclaredConstructor(int.class); + constructor.setAccessible(true); + final SensorEvent event = constructor.newInstance(1); + event.sensor = sensor; + event.values[0] = value; + event.timestamp = SystemClock.elapsedRealtimeNanos(); + return event; + } + + + public static void setSensorType(Sensor sensor, int type, String strType) throws Exception { + Method setter = Sensor.class.getDeclaredMethod("setType", Integer.TYPE); + setter.setAccessible(true); + setter.invoke(sensor, type); + if (strType != null) { + Field f = sensor.getClass().getDeclaredField("mStringType"); + f.setAccessible(true); + f.set(sensor, strType); + } + } + + public static void setMaximumRange(Sensor sensor, float maximumRange) throws Exception { + Method setter = Sensor.class.getDeclaredMethod("setRange", Float.TYPE, Float.TYPE); + setter.setAccessible(true); + setter.invoke(sensor, maximumRange, 1); + } + + public static Sensor createSensor(int type, String strType) throws Exception { + Constructor<Sensor> constr = Sensor.class.getDeclaredConstructor(); + constr.setAccessible(true); + Sensor sensor = constr.newInstance(); + setSensorType(sensor, type, strType); + return sensor; + } + + public static Sensor createSensor(int type, String strType, float maximumRange) + throws Exception { + Constructor<Sensor> constr = Sensor.class.getDeclaredConstructor(); + constr.setAccessible(true); + Sensor sensor = constr.newInstance(); + setSensorType(sensor, type, strType); + setMaximumRange(sensor, maximumRange); + return sensor; + } + + public static Sensor createSensor(String type, String name) { + return new Sensor(new InputSensorInfo( + name, "vendor", 0, 0, 0, 1f, 1f, 1, 1, 1, 1, + type, "", 0, 0, 0)); + } + + /** + * Create a custom {@link DisplayAddress} to ensure we're not relying on any specific + * display-address implementation in our code. Intentionally uses default object (reference) + * equality rules. + */ + public static class TestDisplayAddress extends DisplayAddress { + @Override + public void writeToParcel(Parcel out, int flags) { } + } +} diff --git a/services/tests/servicestests/src/com/android/server/display/brightness/BrightnessEventTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/BrightnessEventTest.java index c0c63c69add8..c0c63c69add8 100644 --- a/services/tests/servicestests/src/com/android/server/display/brightness/BrightnessEventTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/BrightnessEventTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/brightness/BrightnessReasonTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/BrightnessReasonTest.java index e58b3e891b70..e58b3e891b70 100644 --- a/services/tests/servicestests/src/com/android/server/display/brightness/BrightnessReasonTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/BrightnessReasonTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java index c4f483810478..c4f483810478 100644 --- a/services/tests/servicestests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/brightness/DisplayBrightnessStrategySelectorTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessStrategySelectorTest.java index a9e616d766c6..a9e616d766c6 100644 --- a/services/tests/servicestests/src/com/android/server/display/brightness/DisplayBrightnessStrategySelectorTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessStrategySelectorTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java index b652576a75c8..b652576a75c8 100644 --- a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/BoostBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/BoostBrightnessStrategyTest.java index c4346317a6ef..c4346317a6ef 100644 --- a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/BoostBrightnessStrategyTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/BoostBrightnessStrategyTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/DozeBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/DozeBrightnessStrategyTest.java index d60caf6efb7a..d60caf6efb7a 100644 --- a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/DozeBrightnessStrategyTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/DozeBrightnessStrategyTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/FollowerBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/FollowerBrightnessStrategyTest.java index 081f19d19f75..081f19d19f75 100644 --- a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/FollowerBrightnessStrategyTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/FollowerBrightnessStrategyTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/OverrideBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/OverrideBrightnessStrategyTest.java index 530245dacd8b..530245dacd8b 100644 --- a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/OverrideBrightnessStrategyTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/OverrideBrightnessStrategyTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/ScreenOffBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/ScreenOffBrightnessStrategyTest.java index 7147aa8d3701..7147aa8d3701 100644 --- a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/ScreenOffBrightnessStrategyTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/ScreenOffBrightnessStrategyTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/TemporaryBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/TemporaryBrightnessStrategyTest.java index 9830edbea645..9830edbea645 100644 --- a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/TemporaryBrightnessStrategyTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/TemporaryBrightnessStrategyTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/color/AppSaturationControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/color/AppSaturationControllerTest.java index a525814435ea..a525814435ea 100644 --- a/services/tests/servicestests/src/com/android/server/display/color/AppSaturationControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/color/AppSaturationControllerTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/color/CctEvaluatorTest.java b/services/tests/displayservicetests/src/com/android/server/display/color/CctEvaluatorTest.java index b96666ae40a3..b96666ae40a3 100644 --- a/services/tests/servicestests/src/com/android/server/display/color/CctEvaluatorTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/color/CctEvaluatorTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/color/ColorDisplayServiceTest.java b/services/tests/displayservicetests/src/com/android/server/display/color/ColorDisplayServiceTest.java index 618ab1b75587..c7c09b5deb35 100644 --- a/services/tests/servicestests/src/com/android/server/display/color/ColorDisplayServiceTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/color/ColorDisplayServiceTest.java @@ -1093,15 +1093,15 @@ public class ColorDisplayServiceTest { @Test public void compositionColorSpaces_invalidResources() { when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorModes)) - .thenReturn(new int[] { - ColorDisplayManager.COLOR_MODE_NATURAL, - // Missing second color mode - }); + .thenReturn(new int[] { + ColorDisplayManager.COLOR_MODE_NATURAL, + // Missing second color mode + }); when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorSpaces)) - .thenReturn(new int[] { - Display.COLOR_MODE_SRGB, - Display.COLOR_MODE_DISPLAY_P3 - }); + .thenReturn(new int[] { + Display.COLOR_MODE_SRGB, + Display.COLOR_MODE_DISPLAY_P3 + }); setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL); startService(); verify(mDisplayTransformManager).setColorMode( @@ -1111,13 +1111,13 @@ public class ColorDisplayServiceTest { @Test public void compositionColorSpaces_validResources_validColorMode() { when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorModes)) - .thenReturn(new int[] { - ColorDisplayManager.COLOR_MODE_NATURAL - }); + .thenReturn(new int[] { + ColorDisplayManager.COLOR_MODE_NATURAL + }); when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorSpaces)) - .thenReturn(new int[] { - Display.COLOR_MODE_SRGB, - }); + .thenReturn(new int[] { + Display.COLOR_MODE_SRGB, + }); setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL); startService(); verify(mDisplayTransformManager).setColorMode( @@ -1127,13 +1127,13 @@ public class ColorDisplayServiceTest { @Test public void compositionColorSpaces_validResources_invalidColorMode() { when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorModes)) - .thenReturn(new int[] { - ColorDisplayManager.COLOR_MODE_NATURAL - }); + .thenReturn(new int[] { + ColorDisplayManager.COLOR_MODE_NATURAL + }); when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorSpaces)) - .thenReturn(new int[] { - Display.COLOR_MODE_SRGB, - }); + .thenReturn(new int[] { + Display.COLOR_MODE_SRGB, + }); setColorMode(ColorDisplayManager.COLOR_MODE_BOOSTED); startService(); verify(mDisplayTransformManager).setColorMode( @@ -1143,7 +1143,7 @@ public class ColorDisplayServiceTest { @Test public void getColorMode_noAvailableModes_returnsNotSet() { when(mResourcesSpy.getIntArray(R.array.config_availableColorModes)) - .thenReturn(new int[] {}); + .thenReturn(new int[] {}); startService(); verify(mDisplayTransformManager, never()).setColorMode(anyInt(), any(), anyInt()); assertThat(mBinderService.getColorMode()).isEqualTo(-1); diff --git a/services/tests/servicestests/src/com/android/server/display/color/DisplayWhiteBalanceTintControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/color/DisplayWhiteBalanceTintControllerTest.java index e0bef1a83821..e0bef1a83821 100644 --- a/services/tests/servicestests/src/com/android/server/display/color/DisplayWhiteBalanceTintControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/color/DisplayWhiteBalanceTintControllerTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/color/GlobalSaturationTintControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/color/GlobalSaturationTintControllerTest.java index 4f0cb324f17f..4f0cb324f17f 100644 --- a/services/tests/servicestests/src/com/android/server/display/color/GlobalSaturationTintControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/color/GlobalSaturationTintControllerTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/color/ReduceBrightColorsTintControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/color/ReduceBrightColorsTintControllerTest.java index 35014dcb7492..35014dcb7492 100644 --- a/services/tests/servicestests/src/com/android/server/display/color/ReduceBrightColorsTintControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/color/ReduceBrightColorsTintControllerTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/mode/DisplayModeDirectorTest.java b/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java index 04273d6f4ed6..04273d6f4ed6 100644 --- a/services/tests/servicestests/src/com/android/server/display/mode/DisplayModeDirectorTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/mode/SkinThermalStatusObserverTest.java b/services/tests/displayservicetests/src/com/android/server/display/mode/SkinThermalStatusObserverTest.java index 9ab6ee5bd230..9ab6ee5bd230 100644 --- a/services/tests/servicestests/src/com/android/server/display/mode/SkinThermalStatusObserverTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/mode/SkinThermalStatusObserverTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/mode/VotesStorageTest.java b/services/tests/displayservicetests/src/com/android/server/display/mode/VotesStorageTest.java index 287fdd5c344b..287fdd5c344b 100644 --- a/services/tests/servicestests/src/com/android/server/display/mode/VotesStorageTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/mode/VotesStorageTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/utils/AmbientFilterTest.java b/services/tests/displayservicetests/src/com/android/server/display/utils/AmbientFilterTest.java index 9b76b13d2ede..9b76b13d2ede 100644 --- a/services/tests/servicestests/src/com/android/server/display/utils/AmbientFilterTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/utils/AmbientFilterTest.java diff --git a/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientFilterStubber.java b/services/tests/displayservicetests/src/com/android/server/display/whitebalance/AmbientFilterStubber.java index 4d2551087c59..4d2551087c59 100644 --- a/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientFilterStubber.java +++ b/services/tests/displayservicetests/src/com/android/server/display/whitebalance/AmbientFilterStubber.java diff --git a/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java b/services/tests/displayservicetests/src/com/android/server/display/whitebalance/AmbientLuxTest.java index ac97911027bf..f975b6fd1d6f 100644 --- a/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/whitebalance/AmbientLuxTest.java @@ -268,9 +268,9 @@ public final class AmbientLuxTest { controller.mBrightnessFilter = spy(new AmbientFilterStubber()); for (float luxOverride = 0.1f; luxOverride <= 10000; luxOverride *= 10) { - setEstimatedBrightnessAndUpdate(controller, luxOverride); - assertEquals(controller.mPendingAmbientColorTemperature, - ambientColorTemperature, 0.001); + setEstimatedBrightnessAndUpdate(controller, luxOverride); + assertEquals(controller.mPendingAmbientColorTemperature, + ambientColorTemperature, 0.001); } } @@ -286,9 +286,9 @@ public final class AmbientLuxTest { controller.mBrightnessFilter = spy(new AmbientFilterStubber()); for (float luxOverride = 0.1f; luxOverride <= 10000; luxOverride *= 10) { - setEstimatedBrightnessAndUpdate(controller, luxOverride); - assertEquals(controller.mPendingAmbientColorTemperature, - ambientColorTemperature, 0.001); + setEstimatedBrightnessAndUpdate(controller, luxOverride); + assertEquals(controller.mPendingAmbientColorTemperature, + ambientColorTemperature, 0.001); } } @@ -366,22 +366,22 @@ public final class AmbientLuxTest { @Test public void testSpline_InvalidCombinations() throws Exception { - setBrightnesses(100.0f, 200.0f); - setBiases(0.0f, 1.0f); - setHighLightBrightnesses(150.0f, 250.0f); - setHighLightBiases(0.0f, 1.0f); - - DisplayWhiteBalanceController controller = - DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); - final float ambientColorTemperature = 8000.0f; - setEstimatedColorTemperature(controller, ambientColorTemperature); - controller.mBrightnessFilter = spy(new AmbientFilterStubber()); - - for (float luxOverride = 0.1f; luxOverride <= 10000; luxOverride *= 10) { - setEstimatedBrightnessAndUpdate(controller, luxOverride); - assertEquals(controller.mPendingAmbientColorTemperature, - ambientColorTemperature, 0.001); - } + setBrightnesses(100.0f, 200.0f); + setBiases(0.0f, 1.0f); + setHighLightBrightnesses(150.0f, 250.0f); + setHighLightBiases(0.0f, 1.0f); + + DisplayWhiteBalanceController controller = + DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); + final float ambientColorTemperature = 8000.0f; + setEstimatedColorTemperature(controller, ambientColorTemperature); + controller.mBrightnessFilter = spy(new AmbientFilterStubber()); + + for (float luxOverride = 0.1f; luxOverride <= 10000; luxOverride *= 10) { + setEstimatedBrightnessAndUpdate(controller, luxOverride); + assertEquals(controller.mPendingAmbientColorTemperature, + ambientColorTemperature, 0.001); + } } @Test @@ -486,7 +486,7 @@ public final class AmbientLuxTest { private void mockResourcesFloat(int id, float floatValue) { doAnswer(new Answer<Void>() { public Void answer(InvocationOnMock invocation) { - TypedValue value = (TypedValue)invocation.getArgument(1); + TypedValue value = (TypedValue) invocation.getArgument(1); value.type = TypedValue.TYPE_FLOAT; value.data = Float.floatToIntBits(floatValue); return null; diff --git a/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientSensorTest.java b/services/tests/displayservicetests/src/com/android/server/display/whitebalance/AmbientSensorTest.java index 3e3e535df986..3e3e535df986 100644 --- a/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientSensorTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/whitebalance/AmbientSensorTest.java diff --git a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java index 32243f04f6e8..212a243c6a9e 100644 --- a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java @@ -2221,7 +2221,7 @@ public class GameManagerServiceTests { String[] packages = {mPackageName}; when(mMockPackageManager.getPackagesForUid(DEFAULT_PACKAGE_UID)).thenReturn(packages); gameManagerService.mUidObserver.onUidStateChanged( - DEFAULT_PACKAGE_UID, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0, 0); + DEFAULT_PACKAGE_UID, ActivityManager.PROCESS_STATE_TOP, 0, 0); verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME, true); } @@ -2238,12 +2238,12 @@ public class GameManagerServiceTests { doAnswer(inv -> powerState.put(inv.getArgument(0), inv.getArgument(1))) .when(mMockPowerManager).setPowerMode(anyInt(), anyBoolean()); gameManagerService.mUidObserver.onUidStateChanged( - DEFAULT_PACKAGE_UID, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0, 0); + DEFAULT_PACKAGE_UID, ActivityManager.PROCESS_STATE_TOP, 0, 0); assertTrue(powerState.get(Mode.GAME)); gameManagerService.mUidObserver.onUidStateChanged( DEFAULT_PACKAGE_UID, ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 0, 0); gameManagerService.mUidObserver.onUidStateChanged( - somePackageId, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0, 0); + somePackageId, ActivityManager.PROCESS_STATE_TOP, 0, 0); assertTrue(powerState.get(Mode.GAME)); gameManagerService.mUidObserver.onUidStateChanged( somePackageId, ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 0, 0); @@ -2260,13 +2260,13 @@ public class GameManagerServiceTests { int somePackageId = DEFAULT_PACKAGE_UID + 1; when(mMockPackageManager.getPackagesForUid(somePackageId)).thenReturn(packages2); gameManagerService.mUidObserver.onUidStateChanged( - DEFAULT_PACKAGE_UID, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0, 0); + DEFAULT_PACKAGE_UID, ActivityManager.PROCESS_STATE_TOP, 0, 0); gameManagerService.mUidObserver.onUidStateChanged( - somePackageId, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0, 0); + somePackageId, ActivityManager.PROCESS_STATE_TOP, 0, 0); gameManagerService.mUidObserver.onUidStateChanged( - DEFAULT_PACKAGE_UID, ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 0, 0); + DEFAULT_PACKAGE_UID, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0, 0); gameManagerService.mUidObserver.onUidStateChanged( - somePackageId, ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 0, 0); + somePackageId, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0, 0); verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME, true); verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME, false); } @@ -2277,9 +2277,9 @@ public class GameManagerServiceTests { String[] packages = {mPackageName}; when(mMockPackageManager.getPackagesForUid(DEFAULT_PACKAGE_UID)).thenReturn(packages); gameManagerService.mUidObserver.onUidStateChanged( - DEFAULT_PACKAGE_UID, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0, 0); + DEFAULT_PACKAGE_UID, ActivityManager.PROCESS_STATE_TOP, 0, 0); gameManagerService.mUidObserver.onUidStateChanged( - DEFAULT_PACKAGE_UID, ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 0, 0); + DEFAULT_PACKAGE_UID, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0, 0); verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME, false); } diff --git a/services/tests/servicestests/src/com/android/server/display/OWNERS b/services/tests/servicestests/src/com/android/server/display/OWNERS deleted file mode 100644 index 6ce1ee4d3de2..000000000000 --- a/services/tests/servicestests/src/com/android/server/display/OWNERS +++ /dev/null @@ -1 +0,0 @@ -include /services/core/java/com/android/server/display/OWNERS diff --git a/services/tests/servicestests/src/com/android/server/display/TEST_MAPPING b/services/tests/servicestests/src/com/android/server/display/TEST_MAPPING deleted file mode 100644 index 92d8abd4f173..000000000000 --- a/services/tests/servicestests/src/com/android/server/display/TEST_MAPPING +++ /dev/null @@ -1,13 +0,0 @@ -{ - "presubmit": [ - { - "name": "FrameworksServicesTests", - "options": [ - {"include-filter": "com.android.server.display"}, - {"exclude-annotation": "android.platform.test.annotations.FlakyTest"}, - {"exclude-annotation": "androidx.test.filters.FlakyTest"}, - {"exclude-annotation": "org.junit.Ignore"} - ] - } - ] -} diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index eaf483869be4..ba0743980077 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -4150,6 +4150,30 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { } @Test + public void testSetListenerAccessForUser_grantWithNameTooLong_throws() { + UserHandle user = UserHandle.of(mContext.getUserId() + 10); + ComponentName c = new ComponentName("com.example.package", + com.google.common.base.Strings.repeat("Blah", 150)); + + assertThrows(IllegalArgumentException.class, + () -> mBinderService.setNotificationListenerAccessGrantedForUser( + c, user.getIdentifier(), /* enabled= */ true, true)); + } + + @Test + public void testSetListenerAccessForUser_revokeWithNameTooLong_okay() throws Exception { + UserHandle user = UserHandle.of(mContext.getUserId() + 10); + ComponentName c = new ComponentName("com.example.package", + com.google.common.base.Strings.repeat("Blah", 150)); + + mBinderService.setNotificationListenerAccessGrantedForUser( + c, user.getIdentifier(), /* enabled= */ false, true); + + verify(mListeners).setPackageOrComponentEnabled( + c.flattenToString(), user.getIdentifier(), true, /* enabled= */ false, true); + } + + @Test public void testSetAssistantAccessForUser() throws Exception { UserInfo ui = new UserInfo(); ui.id = mContext.getUserId() + 10; diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java index 28241d30e168..f332b6988da0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java @@ -563,6 +563,36 @@ public class TaskTests extends WindowTestsBase { assertEquals(freeformBounds, task.getBounds()); } + @Test + public void testTopActivityEligibleForUserAspectRatioButton() { + DisplayContent display = mAtm.mRootWindowContainer.getDefaultDisplay(); + final Task rootTask = new TaskBuilder(mSupervisor).setCreateActivity(true) + .setWindowingMode(WINDOWING_MODE_FULLSCREEN).setDisplay(display).build(); + final Task task = rootTask.getBottomMostTask(); + final ActivityRecord root = task.getTopNonFinishingActivity(); + spyOn(mWm.mLetterboxConfiguration); + + // When device config flag is disabled the button is not enabled + doReturn(false).when(mWm.mLetterboxConfiguration) + .isUserAppAspectRatioSettingsEnabled(); + doReturn(false).when(mWm.mLetterboxConfiguration) + .isTranslucentLetterboxingEnabled(); + assertFalse(task.getTaskInfo().topActivityEligibleForUserAspectRatioButton); + + // The flag is enabled + doReturn(true).when(mWm.mLetterboxConfiguration) + .isUserAppAspectRatioSettingsEnabled(); + spyOn(root); + doReturn(task).when(root).getOrganizedTask(); + // When the flag is enabled and the top activity is not in size compat mode. + doReturn(false).when(root).inSizeCompatMode(); + assertTrue(task.getTaskInfo().topActivityEligibleForUserAspectRatioButton); + + // When in size compat mode the button is not enabled + doReturn(true).when(root).inSizeCompatMode(); + assertFalse(task.getTaskInfo().topActivityEligibleForUserAspectRatioButton); + } + /** * Tests that a task with forced orientation has orientation-consistent bounds within the * parent. diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java index 13945a119e6f..997015ff1c08 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java @@ -407,7 +407,9 @@ public class SoundTriggerService extends SystemService { var eventLogger = new EventLogger(SESSION_MAX_EVENT_SIZE, "SoundTriggerSessionLogs for package: " + Objects.requireNonNull(originatorIdentity.packageName) - + "#" + sessionId); + + "#" + sessionId + + " - " + originatorIdentity.uid + + "|" + originatorIdentity.pid); return new SoundTriggerSessionStub(client, newSoundTriggerHelper(moduleProperties, eventLogger), eventLogger); } @@ -428,7 +430,9 @@ public class SoundTriggerService extends SystemService { var eventLogger = new EventLogger(SESSION_MAX_EVENT_SIZE, "SoundTriggerSessionLogs for package: " + Objects.requireNonNull(originatorIdentity.packageName) + "#" - + sessionId); + + sessionId + + " - " + originatorIdentity.uid + + "|" + originatorIdentity.pid); return new SoundTriggerSessionStub(client, newSoundTriggerHelper(moduleProperties, eventLogger), eventLogger); } @@ -1801,7 +1805,9 @@ public class SoundTriggerService extends SystemService { ServiceEvent.Type.ATTACH, identity.packageName + "#" + sessionId)); var eventLogger = new EventLogger(SESSION_MAX_EVENT_SIZE, "LocalSoundTriggerEventLogger for package: " + - identity.packageName + "#" + sessionId); + identity.packageName + "#" + sessionId + + " - " + identity.uid + + "|" + identity.pid); return new SessionImpl(newSoundTriggerHelper(underlyingModule, eventLogger, isTrusted), client, eventLogger, identity); diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/DefaultHalFactory.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/DefaultHalFactory.java index 2f2cb594ff3a..55cbf29553f6 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/DefaultHalFactory.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/DefaultHalFactory.java @@ -22,7 +22,7 @@ import android.os.HwBinder; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; -import android.util.Log; +import android.util.Slog; import java.util.ArrayList; import java.util.Arrays; @@ -62,7 +62,7 @@ class DefaultHalFactory implements HalFactory { android.hardware.soundtrigger3.ISoundTriggerHw.class.getCanonicalName() + "/default"; if (ServiceManager.isDeclared(aidlServiceName)) { - Log.i(TAG, "Connecting to default soundtrigger3.ISoundTriggerHw"); + Slog.i(TAG, "Connecting to default soundtrigger3.ISoundTriggerHw"); return new SoundTriggerHw3Compat(ServiceManager.waitForService(aidlServiceName), () -> { // This property needs to be defined in an init.rc script and @@ -72,7 +72,7 @@ class DefaultHalFactory implements HalFactory { } // Fallback to soundtrigger-V2.x (HIDL). - Log.i(TAG, "Connecting to default soundtrigger-V2.x.ISoundTriggerHw"); + Slog.i(TAG, "Connecting to default soundtrigger-V2.x.ISoundTriggerHw"); ISoundTriggerHw driver = ISoundTriggerHw.getService(true); return SoundTriggerHw2Compat.create(driver, () -> { // This property needs to be defined in an init.rc script and @@ -81,7 +81,7 @@ class DefaultHalFactory implements HalFactory { }, mCaptureStateNotifier); } else if (mockHal == USE_MOCK_HAL_V2) { // Use V2 mock. - Log.i(TAG, "Connecting to mock soundtrigger-V2.x.ISoundTriggerHw"); + Slog.i(TAG, "Connecting to mock soundtrigger-V2.x.ISoundTriggerHw"); HwBinder.setTrebleTestingOverride(true); try { ISoundTriggerHw driver = ISoundTriggerHw.getService("mock", true); @@ -89,7 +89,7 @@ class DefaultHalFactory implements HalFactory { try { driver.debug(null, new ArrayList<>(Arrays.asList("reboot"))); } catch (Exception e) { - Log.e(TAG, "Failed to reboot mock HAL", e); + Slog.e(TAG, "Failed to reboot mock HAL", e); } }, mCaptureStateNotifier); } finally { @@ -100,14 +100,14 @@ class DefaultHalFactory implements HalFactory { final String aidlServiceName = android.hardware.soundtrigger3.ISoundTriggerHw.class.getCanonicalName() + "/mock"; - Log.i(TAG, "Connecting to mock soundtrigger3.ISoundTriggerHw"); + Slog.i(TAG, "Connecting to mock soundtrigger3.ISoundTriggerHw"); return new SoundTriggerHw3Compat(ServiceManager.waitForService(aidlServiceName), () -> { try { ServiceManager.waitForService(aidlServiceName).shellCommand(null, null, null, new String[]{"reboot"}, null, null); } catch (Exception e) { - Log.e(TAG, "Failed to reboot mock HAL", e); + Slog.e(TAG, "Failed to reboot mock HAL", e); } }); } else { diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ExternalCaptureStateTracker.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ExternalCaptureStateTracker.java index d195fbedcf2f..e3d64d4bf9db 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ExternalCaptureStateTracker.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ExternalCaptureStateTracker.java @@ -17,7 +17,7 @@ package com.android.server.soundtrigger_middleware; import android.annotation.NonNull; -import android.util.Log; +import android.util.Slog; import java.util.LinkedList; import java.util.List; @@ -94,7 +94,7 @@ class ExternalCaptureStateTracker implements ICaptureStateNotifier { } } } catch (Exception e) { - Log.e(TAG, "Exception caught while setting capture state", e); + Slog.e(TAG, "Exception caught while setting capture state", e); } } @@ -102,7 +102,7 @@ class ExternalCaptureStateTracker implements ICaptureStateNotifier { * Called by native code when the remote service died. */ private void binderDied() { - Log.w(TAG, "Audio policy service died"); + Slog.w(TAG, "Audio policy service died"); mNeedToConnect.release(); } } diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalEnforcer.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalEnforcer.java index c3e0a3cd0292..0f63347ccef8 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalEnforcer.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalEnforcer.java @@ -27,7 +27,7 @@ import android.media.soundtrigger_middleware.PhraseRecognitionEventSys; import android.media.soundtrigger_middleware.RecognitionEventSys; import android.os.DeadObjectException; import android.os.IBinder; -import android.util.Log; +import android.util.Slog; import java.util.HashMap; import java.util.Map; @@ -227,10 +227,10 @@ public class SoundTriggerHalEnforcer implements ISoundTriggerHal { } if (e.getCause() instanceof DeadObjectException) { // Server is dead, no need to reboot. - Log.e(TAG, "HAL died"); + Slog.e(TAG, "HAL died"); throw new RecoverableException(Status.DEAD_OBJECT); } - Log.e(TAG, "Exception caught from HAL, rebooting HAL"); + Slog.e(TAG, "Exception caught from HAL, rebooting HAL"); reboot(); throw e; } @@ -257,14 +257,14 @@ public class SoundTriggerHalEnforcer implements ISoundTriggerHal { synchronized (mModelStates) { ModelState state = mModelStates.get(model); if (state == null) { - Log.wtfStack(TAG, "Unexpected recognition event for model: " + model); + Slog.wtfStack(TAG, "Unexpected recognition event for model: " + model); reboot(); return; } if (event.recognitionEvent.recognitionStillActive && event.recognitionEvent.status != RecognitionStatus.SUCCESS && event.recognitionEvent.status != RecognitionStatus.FORCED) { - Log.wtfStack(TAG, + Slog.wtfStack(TAG, "recognitionStillActive is only allowed when the recognition status " + "is SUCCESS"); reboot(); @@ -283,14 +283,14 @@ public class SoundTriggerHalEnforcer implements ISoundTriggerHal { synchronized (mModelStates) { ModelState state = mModelStates.get(model); if (state == null) { - Log.wtfStack(TAG, "Unexpected recognition event for model: " + model); + Slog.wtfStack(TAG, "Unexpected recognition event for model: " + model); reboot(); return; } if (event.phraseRecognitionEvent.common.recognitionStillActive && event.phraseRecognitionEvent.common.status != RecognitionStatus.SUCCESS && event.phraseRecognitionEvent.common.status != RecognitionStatus.FORCED) { - Log.wtfStack(TAG, + Slog.wtfStack(TAG, "recognitionStillActive is only allowed when the recognition status " + "is SUCCESS"); reboot(); @@ -309,13 +309,13 @@ public class SoundTriggerHalEnforcer implements ISoundTriggerHal { synchronized (mModelStates) { ModelState state = mModelStates.get(modelHandle); if (state == null) { - Log.wtfStack(TAG, "Unexpected unload event for model: " + modelHandle); + Slog.wtfStack(TAG, "Unexpected unload event for model: " + modelHandle); reboot(); return; } if (state == ModelState.ACTIVE) { - Log.wtfStack(TAG, "Trying to unload an active model: " + modelHandle); + Slog.wtfStack(TAG, "Trying to unload an active model: " + modelHandle); reboot(); return; } diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalWatchdog.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalWatchdog.java index 0390f034ab23..5e525e0d194e 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalWatchdog.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHalWatchdog.java @@ -23,7 +23,7 @@ import android.media.soundtrigger.Properties; import android.media.soundtrigger.RecognitionConfig; import android.media.soundtrigger.SoundModel; import android.os.IBinder; -import android.util.Log; +import android.util.Slog; import java.util.Objects; @@ -172,7 +172,7 @@ public class SoundTriggerHalWatchdog implements ISoundTriggerHal { Watchdog() { mTask = mTimer.createTask(() -> { - Log.e(TAG, "HAL deadline expired. Rebooting.", mException); + Slog.e(TAG, "HAL deadline expired. Rebooting.", mException); reboot(); }, TIMEOUT_MS); } diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Compat.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Compat.java index df2e9b41662b..730e92cb2aee 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Compat.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Compat.java @@ -32,7 +32,7 @@ import android.os.IHwBinder; import android.os.RemoteException; import android.os.SystemClock; import android.system.OsConstants; -import android.util.Log; +import android.util.Slog; import java.io.IOException; import java.util.HashMap; @@ -240,7 +240,7 @@ final class SoundTriggerHw2Compat implements ISoundTriggerHal { try { hidlModel.data.close(); } catch (IOException e) { - Log.e(TAG, "Failed to close file", e); + Slog.e(TAG, "Failed to close file", e); } } } @@ -276,7 +276,7 @@ final class SoundTriggerHw2Compat implements ISoundTriggerHal { try { hidlModel.common.data.close(); } catch (IOException e) { - Log.e(TAG, "Failed to close file", e); + Slog.e(TAG, "Failed to close file", e); } } } diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl.java index 3b800de2f30b..5a064da314c6 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl.java @@ -20,7 +20,7 @@ import android.annotation.NonNull; import android.media.soundtrigger_middleware.ISoundTriggerCallback; import android.media.soundtrigger_middleware.ISoundTriggerModule; import android.media.soundtrigger_middleware.SoundTriggerModuleDescriptor; -import android.util.Log; +import android.util.Slog; import java.util.ArrayList; import java.util.List; @@ -85,7 +85,7 @@ public class SoundTriggerMiddlewareImpl implements ISoundTriggerMiddlewareIntern try { modules.add(new SoundTriggerModule(halFactory, audioSessionProvider)); } catch (Exception e) { - Log.e(TAG, "Failed to add a SoundTriggerModule instance", e); + Slog.e(TAG, "Failed to add a SoundTriggerModule instance", e); } } diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java index 7ec2d9fd7b23..0b9ed8c20e8e 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java @@ -36,7 +36,7 @@ import android.media.soundtrigger_middleware.SoundTriggerModuleDescriptor; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceSpecificException; -import android.util.Log; +import android.util.Slog; import android.util.SparseArray; import com.android.internal.util.Preconditions; @@ -150,7 +150,7 @@ public class SoundTriggerMiddlewareValidation implements ISoundTriggerMiddleware e.getMessage()); } - Log.wtf(TAG, "Unexpected exception", e); + Slog.wtf(TAG, "Unexpected exception", e); throw new ServiceSpecificException(Status.INTERNAL_ERROR, e.getMessage()); } @@ -701,7 +701,7 @@ public class SoundTriggerMiddlewareValidation implements ISoundTriggerMiddleware try { mCallback.onRecognition(modelHandle, event, captureSession); } catch (Exception e) { - Log.w(TAG, "Client callback exception.", e); + Slog.w(TAG, "Client callback exception.", e); } } @@ -719,7 +719,7 @@ public class SoundTriggerMiddlewareValidation implements ISoundTriggerMiddleware try { mCallback.onPhraseRecognition(modelHandle, event, captureSession); } catch (Exception e) { - Log.w(TAG, "Client callback exception.", e); + Slog.w(TAG, "Client callback exception.", e); } } @@ -734,7 +734,7 @@ public class SoundTriggerMiddlewareValidation implements ISoundTriggerMiddleware try { mCallback.onModelUnloaded(modelHandle); } catch (Exception e) { - Log.w(TAG, "Client callback exception.", e); + Slog.w(TAG, "Client callback exception.", e); } } @@ -746,7 +746,7 @@ public class SoundTriggerMiddlewareValidation implements ISoundTriggerMiddleware } catch (RemoteException e) { // Dead client will be handled by binderDied() - no need to handle here. // In any case, client callbacks are considered best effort. - Log.e(TAG, "Client callback exception.", e); + Slog.e(TAG, "Client callback exception.", e); } } @@ -761,7 +761,7 @@ public class SoundTriggerMiddlewareValidation implements ISoundTriggerMiddleware } catch (RemoteException e) { // Dead client will be handled by binderDied() - no need to handle here. // In any case, client callbacks are considered best effort. - Log.e(TAG, "Client callback exception.", e); + Slog.e(TAG, "Client callback exception.", e); } } @@ -795,11 +795,11 @@ public class SoundTriggerMiddlewareValidation implements ISoundTriggerMiddleware // Check if state updated unexpectedly to log race conditions. for (Map.Entry<Integer, ModelState> entry : mLoadedModels.entrySet()) { if (cachedMap.get(entry.getKey()) != entry.getValue().activityState) { - Log.e(TAG, "Unexpected state update in binderDied. Race occurred!"); + Slog.e(TAG, "Unexpected state update in binderDied. Race occurred!"); } } if (mLoadedModels.size() != cachedMap.size()) { - Log.e(TAG, "Unexpected state update in binderDied. Race occurred!"); + Slog.e(TAG, "Unexpected state update in binderDied. Race occurred!"); } try { // Detach diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java index e793f317d41f..45a7fafa90a7 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java @@ -31,7 +31,7 @@ import android.media.soundtrigger_middleware.RecognitionEventSys; import android.os.Binder; import android.os.IBinder; import android.os.RemoteException; -import android.util.Log; +import android.util.Slog; import java.util.ArrayList; import java.util.HashMap; @@ -136,7 +136,7 @@ class SoundTriggerModule implements IBinder.DeathRecipient, ISoundTriggerHal.Glo @Override public void binderDied() { - Log.w(TAG, "Underlying HAL driver died."); + Slog.w(TAG, "Underlying HAL driver died."); List<ISoundTriggerCallback> callbacks; synchronized (this) { callbacks = new ArrayList<>(mActiveSessions.size()); @@ -270,7 +270,7 @@ class SoundTriggerModule implements IBinder.DeathRecipient, ISoundTriggerHal.Glo try { mAudioSessionProvider.releaseSession(audioSession.mSessionHandle); } catch (Exception ee) { - Log.e(TAG, "Failed to release session.", ee); + Slog.e(TAG, "Failed to release session.", ee); } throw e; } @@ -286,7 +286,7 @@ class SoundTriggerModule implements IBinder.DeathRecipient, ISoundTriggerHal.Glo checkValid(); Model loadedModel = new Model(); int result = loadedModel.load(model, audioSession); - Log.d(TAG, String.format("loadPhraseModel()->%d", result)); + Slog.d(TAG, String.format("loadPhraseModel()->%d", result)); return result; } catch (Exception e) { // We must do this outside the lock, to avoid possible deadlocks with the remote @@ -294,7 +294,7 @@ class SoundTriggerModule implements IBinder.DeathRecipient, ISoundTriggerHal.Glo try { mAudioSessionProvider.releaseSession(audioSession.mSessionHandle); } catch (Exception ee) { - Log.e(TAG, "Failed to release session.", ee); + Slog.e(TAG, "Failed to release session.", ee); } throw e; } |