diff options
180 files changed, 2433 insertions, 1632 deletions
diff --git a/api/current.txt b/api/current.txt index 3b9733f68aad..4f3733d759ba 100644 --- a/api/current.txt +++ b/api/current.txt @@ -37297,6 +37297,7 @@ package android.provider { method public static java.lang.String getVolumeName(android.net.Uri); method public static android.provider.MediaStore.PendingSession openPending(android.content.Context, android.net.Uri); method public static android.net.Uri setIncludePending(android.net.Uri); + method public static android.net.Uri setRequireOriginal(android.net.Uri); field public static final java.lang.String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE"; field public static final java.lang.String ACTION_IMAGE_CAPTURE_SECURE = "android.media.action.IMAGE_CAPTURE_SECURE"; field public static final java.lang.String ACTION_REVIEW = "android.provider.action.REVIEW"; @@ -45848,6 +45849,7 @@ package android.text.style { method public deprecated java.lang.String getLocale(); method public java.util.Locale getLocaleObject(); method public int getSpanTypeId(); + method public int getUnderlineColor(); method public java.lang.String[] getSuggestions(); method public void setFlags(int); method public void updateDrawState(android.text.TextPaint); diff --git a/cmds/content/src/com/android/commands/content/Content.java b/cmds/content/src/com/android/commands/content/Content.java index 1597c8c9c2b2..52a2ab407f91 100644 --- a/cmds/content/src/com/android/commands/content/Content.java +++ b/cmds/content/src/com/android/commands/content/Content.java @@ -77,7 +77,7 @@ public class Content { + " <BINDING> binds a typed value to a column and is formatted:\n" + " <COLUMN_NAME>:<TYPE>:<COLUMN_VALUE> where:\n" + " <TYPE> specifies data type such as:\n" - + " b - boolean, s - string, i - integer, l - long, f - float, d - double\n" + + " b - boolean, s - string, i - integer, l - long, f - float, d - double, n - null\n" + " Note: Omit the value for passing an empty string, e.g column:s:\n" + " Example:\n" + " # Add \"new_setting\" secure setting with value \"new_value\".\n" @@ -153,6 +153,7 @@ public class Content { private static final String TYPE_LONG = "l"; private static final String TYPE_FLOAT = "f"; private static final String TYPE_DOUBLE = "d"; + private static final String TYPE_NULL = "n"; private static final String COLON = ":"; private static final String ARGUMENT_PREFIX = "--"; @@ -410,6 +411,8 @@ public class Content { values.put(column, Long.parseLong(value)); } else if (TYPE_FLOAT.equalsIgnoreCase(type) || TYPE_DOUBLE.equalsIgnoreCase(type)) { values.put(column, Double.parseDouble(value)); + } else if (TYPE_NULL.equalsIgnoreCase(type)) { + values.putNull(column); } else { throw new IllegalArgumentException("Unsupported type: " + type); } diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 89ec19bbc6dd..25fa897f2a56 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -1424,7 +1424,62 @@ public class NotificationManager { return other.priorityCategories == priorityCategories && other.priorityCallSenders == priorityCallSenders && other.priorityMessageSenders == priorityMessageSenders - && other.suppressedVisualEffects == suppressedVisualEffects; + && suppressedVisualEffectsEqual(suppressedVisualEffects, + other.suppressedVisualEffects); + } + + + private boolean suppressedVisualEffectsEqual(int suppressedEffects, + int otherSuppressedVisualEffects) { + if (suppressedEffects == otherSuppressedVisualEffects) { + return true; + } + + if ((suppressedEffects & SUPPRESSED_EFFECT_SCREEN_ON) != 0) { + suppressedEffects |= SUPPRESSED_EFFECT_PEEK; + } + if ((suppressedEffects & SUPPRESSED_EFFECT_SCREEN_OFF) != 0) { + suppressedEffects |= SUPPRESSED_EFFECT_FULL_SCREEN_INTENT; + suppressedEffects |= SUPPRESSED_EFFECT_LIGHTS; + suppressedEffects |= SUPPRESSED_EFFECT_AMBIENT; + } + + if ((otherSuppressedVisualEffects & SUPPRESSED_EFFECT_SCREEN_ON) != 0) { + otherSuppressedVisualEffects |= SUPPRESSED_EFFECT_PEEK; + } + if ((otherSuppressedVisualEffects & SUPPRESSED_EFFECT_SCREEN_OFF) != 0) { + otherSuppressedVisualEffects |= SUPPRESSED_EFFECT_FULL_SCREEN_INTENT; + otherSuppressedVisualEffects |= SUPPRESSED_EFFECT_LIGHTS; + otherSuppressedVisualEffects |= SUPPRESSED_EFFECT_AMBIENT; + } + + if ((suppressedEffects & SUPPRESSED_EFFECT_SCREEN_ON) + != (otherSuppressedVisualEffects & SUPPRESSED_EFFECT_SCREEN_ON)) { + int currSuppressedEffects = (suppressedEffects & SUPPRESSED_EFFECT_SCREEN_ON) != 0 + ? otherSuppressedVisualEffects : suppressedEffects; + if ((currSuppressedEffects & SUPPRESSED_EFFECT_PEEK) == 0) { + return false; + } + } + + if ((suppressedEffects & SUPPRESSED_EFFECT_SCREEN_OFF) + != (otherSuppressedVisualEffects & SUPPRESSED_EFFECT_SCREEN_OFF)) { + int currSuppressedEffects = (suppressedEffects & SUPPRESSED_EFFECT_SCREEN_OFF) != 0 + ? otherSuppressedVisualEffects : suppressedEffects; + if ((currSuppressedEffects & SUPPRESSED_EFFECT_FULL_SCREEN_INTENT) == 0 + || (currSuppressedEffects & SUPPRESSED_EFFECT_LIGHTS) == 0 + || (currSuppressedEffects & SUPPRESSED_EFFECT_AMBIENT) == 0) { + return false; + } + } + + int thisWithoutOldEffects = suppressedEffects + & ~SUPPRESSED_EFFECT_SCREEN_ON + & ~SUPPRESSED_EFFECT_SCREEN_OFF; + int otherWithoutOldEffects = otherSuppressedVisualEffects + & ~SUPPRESSED_EFFECT_SCREEN_ON + & ~SUPPRESSED_EFFECT_SCREEN_OFF; + return thisWithoutOldEffects == otherWithoutOldEffects; } @Override diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 7c3b5e48cb5b..98a135f96d98 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -1770,7 +1770,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { * is on the package whitelist. * * @param policy configured policy for this app, or {@link #HIDDEN_API_ENFORCEMENT_DEFAULT} - * if nothing configured. + * if nothing configured. * @hide */ public void maybeUpdateHiddenApiEnforcementPolicy(@HiddenApiEnforcementPolicy int policy) { diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java index 44b9e311dc0b..6de1ff4bc097 100644 --- a/core/java/android/os/ParcelFileDescriptor.java +++ b/core/java/android/os/ParcelFileDescriptor.java @@ -17,12 +17,6 @@ package android.os; import static android.system.OsConstants.AF_UNIX; -import static android.system.OsConstants.O_APPEND; -import static android.system.OsConstants.O_CREAT; -import static android.system.OsConstants.O_RDONLY; -import static android.system.OsConstants.O_RDWR; -import static android.system.OsConstants.O_TRUNC; -import static android.system.OsConstants.O_WRONLY; import static android.system.OsConstants.SEEK_SET; import static android.system.OsConstants.SOCK_SEQPACKET; import static android.system.OsConstants.SOCK_STREAM; @@ -254,8 +248,16 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { } /** {@hide} */ - public static ParcelFileDescriptor fromFd( - FileDescriptor fd, Handler handler, final OnCloseListener listener) throws IOException { + public static ParcelFileDescriptor fromPfd(ParcelFileDescriptor pfd, Handler handler, + final OnCloseListener listener) throws IOException { + final FileDescriptor original = new FileDescriptor(); + original.setInt$(pfd.detachFd()); + return fromFd(original, handler, listener); + } + + /** {@hide} */ + public static ParcelFileDescriptor fromFd(FileDescriptor fd, Handler handler, + final OnCloseListener listener) throws IOException { if (handler == null) { throw new IllegalArgumentException("Handler must not be null"); } diff --git a/core/java/android/os/RedactingFileDescriptor.java b/core/java/android/os/RedactingFileDescriptor.java index 60eb5c3c4a89..4e5eaac3442f 100644 --- a/core/java/android/os/RedactingFileDescriptor.java +++ b/core/java/android/os/RedactingFileDescriptor.java @@ -20,15 +20,18 @@ import android.content.Context; import android.os.storage.StorageManager; import android.system.ErrnoException; import android.system.Os; -import android.system.OsConstants; import android.util.Slog; +import com.android.internal.annotations.VisibleForTesting; + import libcore.io.IoUtils; +import libcore.util.EmptyArray; import java.io.File; import java.io.FileDescriptor; import java.io.IOException; import java.io.InterruptedIOException; +import java.util.Arrays; /** * Variant of {@link FileDescriptor} that allows its creator to specify regions @@ -40,20 +43,21 @@ public class RedactingFileDescriptor { private static final String TAG = "RedactingFileDescriptor"; private static final boolean DEBUG = true; - private final long[] mRedactRanges; + private volatile long[] mRedactRanges; private FileDescriptor mInner = null; private ParcelFileDescriptor mOuter = null; - private RedactingFileDescriptor(Context context, File file, long[] redactRanges) + private RedactingFileDescriptor(Context context, File file, int mode, long[] redactRanges) throws IOException { mRedactRanges = checkRangesArgument(redactRanges); try { try { - mInner = Os.open(file.getAbsolutePath(), OsConstants.O_RDONLY, 0); + mInner = Os.open(file.getAbsolutePath(), + FileUtils.translateModePfdToPosix(mode), 0); mOuter = context.getSystemService(StorageManager.class) - .openProxyFileDescriptor(ParcelFileDescriptor.MODE_READ_ONLY, mCallback); + .openProxyFileDescriptor(mode, mCallback); } catch (ErrnoException e) { throw e.rethrowAsIOException(); } @@ -78,16 +82,61 @@ public class RedactingFileDescriptor { /** * Open the given {@link File} and returns a {@link ParcelFileDescriptor} - * that offers a redacted, read-only view of the underlying data. + * that offers a redacted view of the underlying data. If a redacted region + * is written to, the newly written data can be read back correctly instead + * of continuing to be redacted. * * @param file The underlying file to open. + * @param mode The {@link ParcelFileDescriptor} mode to open with. * @param redactRanges List of file offsets that should be redacted, stored * as {@code [start1, end1, start2, end2, ...]}. Start values are * inclusive and end values are exclusive. */ - public static ParcelFileDescriptor open(Context context, File file, long[] redactRanges) - throws IOException { - return new RedactingFileDescriptor(context, file, redactRanges).mOuter; + public static ParcelFileDescriptor open(Context context, File file, int mode, + long[] redactRanges) throws IOException { + return new RedactingFileDescriptor(context, file, mode, redactRanges).mOuter; + } + + /** + * Update the given ranges argument to remove any references to the given + * offset and length. This is typically used when a caller has written over + * a previously redacted region. + */ + @VisibleForTesting + public static long[] removeRange(long[] ranges, long start, long end) { + if (start == end) { + return ranges; + } else if (start > end) { + throw new IllegalArgumentException(); + } + + long[] res = EmptyArray.LONG; + for (int i = 0; i < ranges.length; i += 2) { + if (start <= ranges[i] && end >= ranges[i + 1]) { + // Range entirely covered; remove it + } else if (start >= ranges[i] && end <= ranges[i + 1]) { + // Range partially covered; punch a hole + res = Arrays.copyOf(res, res.length + 4); + res[res.length - 4] = ranges[i]; + res[res.length - 3] = start; + res[res.length - 2] = end; + res[res.length - 1] = ranges[i + 1]; + } else { + // Range might covered; adjust edges if needed + res = Arrays.copyOf(res, res.length + 2); + if (end >= ranges[i] && end <= ranges[i + 1]) { + res[res.length - 2] = Math.max(ranges[i], end); + } else { + res[res.length - 2] = ranges[i]; + } + if (start >= ranges[i] && start <= ranges[i + 1]) { + res[res.length - 1] = Math.min(ranges[i + 1], start); + } else { + res[res.length - 1] = ranges[i + 1]; + } + } + } + return res; } private final ProxyFileDescriptorCallback mCallback = new ProxyFileDescriptorCallback() { @@ -126,7 +175,24 @@ public class RedactingFileDescriptor { @Override public int onWrite(long offset, int size, byte[] data) throws ErrnoException { - throw new ErrnoException(TAG, OsConstants.EBADF); + int n = 0; + while (n < size) { + try { + final int res = Os.pwrite(mInner, data, n, size - n, offset + n); + if (res == 0) { + break; + } else { + n += res; + } + } catch (InterruptedIOException e) { + n += e.bytesTransferred; + } + } + + // Clear any relevant redaction ranges before returning, since the + // writer should have access to see the data they just overwrote + mRedactRanges = removeRange(mRedactRanges, offset, offset + n); + return n; } @Override diff --git a/core/java/android/provider/FontsContract.java b/core/java/android/provider/FontsContract.java index 76607e9d42d2..8e37559001db 100644 --- a/core/java/android/provider/FontsContract.java +++ b/core/java/android/provider/FontsContract.java @@ -660,7 +660,22 @@ public class FontsContract { if (familyBuilder == null) { return null; } - return new Typeface.CustomFallbackBuilder(familyBuilder.build()).build(); + + final FontFamily family = familyBuilder.build(); + + final FontStyle normal = new FontStyle(FontStyle.FONT_WEIGHT_NORMAL, + FontStyle.FONT_SLANT_UPRIGHT); + Font bestFont = family.getFont(0); + int bestScore = normal.getMatchScore(bestFont.getStyle()); + for (int i = 1; i < family.getSize(); ++i) { + final Font candidate = family.getFont(i); + final int score = normal.getMatchScore(candidate.getStyle()); + if (score < bestScore) { + bestFont = candidate; + bestScore = score; + } + } + return new Typeface.CustomFallbackBuilder(family).setStyle(bestFont.getStyle()).build(); } /** diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index e0e4fe29f48a..ec8db1ca580e 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -121,6 +121,8 @@ public final class MediaStore { public static final String PARAM_INCLUDE_PENDING = "includePending"; /** {@hide} */ public static final String PARAM_PROGRESS = "progress"; + /** {@hide} */ + public static final String PARAM_REQUIRE_ORIGINAL = "requireOriginal"; /** * Activity Action: Launch a music player. @@ -478,6 +480,24 @@ public final class MediaStore { } /** + * Update the given {@link Uri} to indicate that the caller requires the + * original file contents when calling + * {@link ContentResolver#openFileDescriptor(Uri, String)}. + * <p> + * This can be useful when the caller wants to ensure they're backing up the + * exact bytes of the underlying media, without any Exif redaction being + * performed. + * <p> + * If the original file contents cannot be provided, a + * {@link UnsupportedOperationException} will be thrown when the returned + * {@link Uri} is used, such as when the caller doesn't hold + * {@link android.Manifest.permission#ACCESS_MEDIA_LOCATION}. + */ + public static @NonNull Uri setRequireOriginal(@NonNull Uri uri) { + return uri.buildUpon().appendQueryParameter(PARAM_REQUIRE_ORIGINAL, "1").build(); + } + + /** * Create a new pending media item using the given parameters. Pending items * are expected to have a short lifetime, and owners should either * {@link PendingSession#publish()} or {@link PendingSession#abandon()} a diff --git a/core/java/android/service/intelligence/SmartSuggestionsService.java b/core/java/android/service/intelligence/SmartSuggestionsService.java index 90f04ca66db7..0e29e70ecc3b 100644 --- a/core/java/android/service/intelligence/SmartSuggestionsService.java +++ b/core/java/android/service/intelligence/SmartSuggestionsService.java @@ -60,6 +60,7 @@ public abstract class SmartSuggestionsService extends Service { // TODO(b/111330312): STOPSHIP use dynamic value, or change to false static final boolean DEBUG = true; + static final boolean VERBOSE = false; /** * The {@link Intent} that must be declared as handled by the service. @@ -209,7 +210,11 @@ public abstract class SmartSuggestionsService extends Service { * @param sessionId the session's Id */ public void onCreateInteractionSession(@NonNull InteractionContext context, - @NonNull InteractionSessionId sessionId) {} + @NonNull InteractionSessionId sessionId) { + if (VERBOSE) { + Log.v(TAG, "onCreateInteractionSession(id=" + sessionId + ", ctx=" + context + ")"); + } + } /** * Notifies the service of {@link ContentCaptureEvent events} associated with a content capture @@ -319,7 +324,11 @@ public abstract class SmartSuggestionsService extends Service { * * @param sessionId the id of the session to destroy */ - public void onDestroyInteractionSession(@NonNull InteractionSessionId sessionId) {} + public void onDestroyInteractionSession(@NonNull InteractionSessionId sessionId) { + if (VERBOSE) { + Log.v(TAG, "onDestroyInteractionSession(id=" + sessionId + ")"); + } + } /** @hide */ static final class AutofillProxy { diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java index 8371c31b5ac5..0e2ae837a141 100644 --- a/core/java/android/service/notification/ZenModeConfig.java +++ b/core/java/android/service/notification/ZenModeConfig.java @@ -806,7 +806,7 @@ public class ZenModeConfig implements Parcelable { if (zenPolicy.isCategoryAllowed(ZenPolicy.PRIORITY_CATEGORY_CALLS, isPriorityCategoryEnabled(Policy.PRIORITY_CATEGORY_CALLS, defaultPolicy))) { priorityCategories |= Policy.PRIORITY_CATEGORY_CALLS; - messageSenders = getNotificationPolicySenders(zenPolicy.getPriorityCallSenders()); + callSenders = getNotificationPolicySenders(zenPolicy.getPriorityCallSenders()); } if (zenPolicy.isCategoryAllowed(ZenPolicy.PRIORITY_CATEGORY_REPEAT_CALLERS, diff --git a/core/java/android/service/notification/ZenPolicy.java b/core/java/android/service/notification/ZenPolicy.java index 43ab8dc07000..194147c2c154 100644 --- a/core/java/android/service/notification/ZenPolicy.java +++ b/core/java/android/service/notification/ZenPolicy.java @@ -859,6 +859,27 @@ public final class ZenPolicy implements Parcelable { /** * @hide */ + public boolean areValuesSet() { + return getPriorityCategoryReminders() != STATE_UNSET + || getPriorityCategoryEvents() != STATE_UNSET + || getPriorityCategoryMessages() != STATE_UNSET + || getPriorityCategoryCalls() != STATE_UNSET + || getPriorityCategoryRepeatCallers() != STATE_UNSET + || getPriorityCategoryAlarms() != STATE_UNSET + || getPriorityCategoryMedia() != STATE_UNSET + || getPriorityCategorySystem() != STATE_UNSET + || getVisualEffectFullScreenIntent() != STATE_UNSET + || getVisualEffectLights() != STATE_UNSET + || getVisualEffectPeek() != STATE_UNSET + || getVisualEffectStatusBar() != STATE_UNSET + || getVisualEffectBadge() != STATE_UNSET + || getVisualEffectAmbient() != STATE_UNSET + || getVisualEffectNotificationList() != STATE_UNSET; + } + + /** + * @hide + */ public void writeToProto(ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); diff --git a/core/java/android/text/style/SuggestionSpan.java b/core/java/android/text/style/SuggestionSpan.java index be47320b59bd..433483f717fa 100644 --- a/core/java/android/text/style/SuggestionSpan.java +++ b/core/java/android/text/style/SuggestionSpan.java @@ -369,10 +369,7 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan { /** * @return The color of the underline for that span, or 0 if there is no underline - * - * @hide */ - @UnsupportedAppUsage public int getUnderlineColor() { // The order here should match what is used in updateDrawState final boolean misspelled = (mFlags & FLAG_MISSPELLED) != 0; diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl index af41b6942a5e..5e6d3d19fa2f 100644 --- a/core/java/android/view/IWindow.aidl +++ b/core/java/android/view/IWindow.aidl @@ -25,6 +25,7 @@ import android.view.KeyEvent; import android.view.MotionEvent; import android.view.DisplayCutout; import android.view.InsetsState; +import android.view.InsetsSourceControl; import com.android.internal.os.IResultReceiver; import android.util.MergedConfiguration; @@ -60,6 +61,11 @@ oneway interface IWindow { */ void insetsChanged(in InsetsState insetsState); + /** + * Called when this window retrieved control over a specified set of inset sources. + */ + void insetsControlChanged(in InsetsState insetsState, in InsetsSourceControl[] activeControls); + void moved(int newX, int newY); void dispatchAppVisibility(boolean visible); void dispatchGetNewSurface(); diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index 7841d0417a2b..ba5340c826d3 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -16,17 +16,30 @@ package android.view; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.graphics.Rect; +import android.util.ArraySet; +import android.util.SparseArray; +import android.view.SurfaceControl.Transaction; +import android.view.WindowInsets.Type.InsetType; +import android.view.InsetsState.InternalInsetType; + +import com.android.internal.annotations.VisibleForTesting; import java.io.PrintWriter; /** * Implements {@link WindowInsetsController} on the client. + * @hide */ -class InsetsController { +public class InsetsController implements WindowInsetsController { private final InsetsState mState = new InsetsState(); private final Rect mFrame = new Rect(); + private final SparseArray<InsetsSourceConsumer> mSourceConsumers = new SparseArray<>(); + + private final SparseArray<InsetsSourceControl> mTmpControlArray = new SparseArray<>(); void onFrameChanged(Rect frame) { mFrame.set(frame); @@ -48,6 +61,61 @@ class InsetsController { return mState.calculateInsets(mFrame, isScreenRound, alwaysConsumeNavBar, cutout); } + /** + * Called when the server has dispatched us a new set of inset controls. + */ + public void onControlsChanged(InsetsSourceControl[] activeControls) { + if (activeControls != null) { + for (InsetsSourceControl activeControl : activeControls) { + mTmpControlArray.put(activeControl.getType(), activeControl); + } + } + + // Ensure to update all existing source consumers + for (int i = mSourceConsumers.size() - 1; i >= 0; i--) { + final InsetsSourceConsumer consumer = mSourceConsumers.valueAt(i); + final InsetsSourceControl control = mTmpControlArray.get(consumer.getType()); + + // control may be null, but we still need to update the control to null if it got + // revoked. + consumer.setControl(control); + } + + // Ensure to create source consumers if not available yet. + for (int i = mTmpControlArray.size() - 1; i >= 0; i--) { + final InsetsSourceControl control = mTmpControlArray.valueAt(i); + getSourceConsumer(control.getType()).setControl(control); + } + mTmpControlArray.clear(); + } + + @Override + public void show(@InsetType int types) { + final ArraySet<Integer> internalTypes = InsetsState.toInternalType(types); + for (int i = internalTypes.size() - 1; i >= 0; i--) { + getSourceConsumer(internalTypes.valueAt(i)).show(); + } + } + + @Override + public void hide(@InsetType int types) { + final ArraySet<Integer> internalTypes = InsetsState.toInternalType(types); + for (int i = internalTypes.size() - 1; i >= 0; i--) { + getSourceConsumer(internalTypes.valueAt(i)).hide(); + } + } + + @VisibleForTesting + public @NonNull InsetsSourceConsumer getSourceConsumer(@InternalInsetType int type) { + InsetsSourceConsumer controller = mSourceConsumers.get(type); + if (controller != null) { + return controller; + } + controller = new InsetsSourceConsumer(type, mState, Transaction::new); + mSourceConsumers.put(type, controller); + return controller; + } + void dump(String prefix, PrintWriter pw) { pw.println(prefix); pw.println("InsetsController:"); mState.dump(prefix + " ", pw); diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java new file mode 100644 index 000000000000..e74aa8dfcf4e --- /dev/null +++ b/core/java/android/view/InsetsSourceConsumer.java @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.view; + +import android.annotation.Nullable; +import android.view.SurfaceControl.Transaction; +import android.view.InsetsState.InternalInsetType; + +import com.android.internal.annotations.VisibleForTesting; + +import java.util.function.Supplier; + +/** + * Controls the visibility and animations of a single window insets source. + * @hide + */ +public class InsetsSourceConsumer { + + private final Supplier<Transaction> mTransactionSupplier; + private final @InternalInsetType int mType; + private final InsetsState mState; + private @Nullable InsetsSourceControl mControl; + private boolean mHidden; + + public InsetsSourceConsumer(@InternalInsetType int type, InsetsState state, + Supplier<Transaction> transactionSupplier) { + mType = type; + mState = state; + mTransactionSupplier = transactionSupplier; + } + + public void setControl(@Nullable InsetsSourceControl control) { + if (mControl == control) { + return; + } + mControl = control; + applyHiddenToControl(); + } + + @VisibleForTesting + public InsetsSourceControl getControl() { + return mControl; + } + + int getType() { + return mType; + } + + @VisibleForTesting + public void show() { + setHidden(false); + } + + @VisibleForTesting + public void hide() { + setHidden(true); + } + + private void setHidden(boolean hidden) { + if (mHidden == hidden) { + return; + } + mHidden = hidden; + applyHiddenToControl(); + } + + private void applyHiddenToControl() { + if (mControl == null) { + return; + } + + // TODO: Animation + final Transaction t = mTransactionSupplier.get(); + if (mHidden) { + t.hide(mControl.getLeash()); + } else { + t.show(mControl.getLeash()); + } + t.apply(); + } +} diff --git a/core/java/android/view/InsetsSourceControl.aidl b/core/java/android/view/InsetsSourceControl.aidl new file mode 100644 index 000000000000..755bf456658d --- /dev/null +++ b/core/java/android/view/InsetsSourceControl.aidl @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2018, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view; + +parcelable InsetsSourceControl; diff --git a/core/java/android/view/InsetsSourceControl.java b/core/java/android/view/InsetsSourceControl.java new file mode 100644 index 000000000000..9383e6c57854 --- /dev/null +++ b/core/java/android/view/InsetsSourceControl.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view; + +import android.graphics.Point; +import android.os.Parcel; +import android.os.Parcelable; +import android.view.InsetsState.InternalInsetType; + +/** + * Represents a parcelable object to allow controlling a single {@link InsetsSource}. + * @hide + */ +public class InsetsSourceControl implements Parcelable { + + private final @InternalInsetType int mType; + private final SurfaceControl mLeash; + + public InsetsSourceControl(@InternalInsetType int type, SurfaceControl leash) { + mType = type; + mLeash = leash; + } + + public int getType() { + return mType; + } + + public SurfaceControl getLeash() { + return mLeash; + } + + public InsetsSourceControl(Parcel in) { + mType = in.readInt(); + mLeash = in.readParcelable(null /* loader */); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(mType); + dest.writeParcelable(mLeash, 0 /* flags*/); + } + + public static final Creator<InsetsSourceControl> CREATOR + = new Creator<InsetsSourceControl>() { + public InsetsSourceControl createFromParcel(Parcel in) { + return new InsetsSourceControl(in); + } + + public InsetsSourceControl[] newArray(int size) { + return new InsetsSourceControl[size]; + } + }; +} diff --git a/core/java/android/view/InsetsState.java b/core/java/android/view/InsetsState.java index 9895adcad23a..689b14fe29c6 100644 --- a/core/java/android/view/InsetsState.java +++ b/core/java/android/view/InsetsState.java @@ -22,6 +22,9 @@ import android.graphics.Rect; import android.os.Parcel; import android.os.Parcelable; import android.util.ArrayMap; +import android.util.ArraySet; +import android.view.WindowInsets.Type; +import android.view.WindowInsets.Type.InsetType; import java.io.PrintWriter; import java.lang.annotation.Retention; @@ -148,6 +151,22 @@ public class InsetsState implements Parcelable { } } + public static @InternalInsetType ArraySet<Integer> toInternalType(@InsetType int insetTypes) { + final ArraySet<Integer> result = new ArraySet<>(); + if ((insetTypes & Type.TOP_BAR) != 0) { + result.add(TYPE_TOP_BAR); + } + if ((insetTypes & Type.SIDE_BARS) != 0) { + result.add(TYPE_SIDE_BAR_1); + result.add(TYPE_SIDE_BAR_2); + result.add(TYPE_SIDE_BAR_3); + } + if ((insetTypes & Type.IME) != 0) { + result.add(TYPE_IME); + } + return result; + } + public void dump(String prefix, PrintWriter pw) { pw.println(prefix + "InsetsState"); for (int i = mSources.size() - 1; i >= 0; i--) { diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 401e75c95a38..4b9cbff8c161 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -10341,6 +10341,20 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * Retrieves the single {@link WindowInsetsController} of the window this view is attached to. + * + * @return The {@link WindowInsetsController} or {@code null} if the view isn't attached to a + * a window. + * @hide pending unhide + */ + public @Nullable WindowInsetsController getWindowInsetsController() { + if (mAttachInfo != null) { + return mAttachInfo.mViewRootImpl.getInsetsController(); + } + return null; + } + + /** * @hide Compute the insets that should be consumed by this view and the ones * that should propagate to those under it. * diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 937e23813cec..cb4788624935 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -170,7 +170,12 @@ public final class ViewRootImpl implements ViewParent, * fully migrated over. */ private static final String USE_NEW_INSETS_PROPERTY = "persist.wm.new_insets"; - private static final boolean USE_NEW_INSETS = + + /** + * @see #USE_NEW_INSETS_PROPERTY + * @hide + */ + public static final boolean USE_NEW_INSETS = SystemProperties.getBoolean(USE_NEW_INSETS_PROPERTY, false); /** @@ -1847,6 +1852,10 @@ public final class ViewRootImpl implements ViewParent, host.dispatchApplyWindowInsets(insets); } + InsetsController getInsetsController() { + return mInsetsController; + } + private static boolean shouldUseDisplaySize(final WindowManager.LayoutParams lp) { return lp.type == TYPE_STATUS_BAR_PANEL || lp.type == TYPE_INPUT_METHOD @@ -1935,7 +1944,6 @@ public final class ViewRootImpl implements ViewParent, // PixelFormat.hasAlpha(lp.format) || lp.format == PixelFormat.RGBX_8888 // However, windows are now always 32 bits by default, so choose 32 bits mAttachInfo.mUse32BitDrawingCache = true; - mAttachInfo.mHasWindowFocus = false; mAttachInfo.mWindowVisibility = viewVisibility; mAttachInfo.mRecomputeGlobalAttributes = false; mLastConfigurationFromResources.setTo(config); @@ -4208,6 +4216,7 @@ public final class ViewRootImpl implements ViewParent, private final static int MSG_POINTER_CAPTURE_CHANGED = 28; private final static int MSG_DRAW_FINISHED = 29; private final static int MSG_INSETS_CHANGED = 30; + private final static int MSG_INSETS_CONTROL_CHANGED = 31; final class ViewRootHandler extends Handler { @Override @@ -4371,11 +4380,22 @@ public final class ViewRootImpl implements ViewParent, case MSG_INSETS_CHANGED: mPendingInsets = (InsetsState) msg.obj; - // TODO: Full traversal not needed here + // TODO: Full traversal not needed here. + if (USE_NEW_INSETS) { + requestLayout(); + } + break; + case MSG_INSETS_CONTROL_CHANGED: { + SomeArgs args = (SomeArgs) msg.obj; + mPendingInsets = (InsetsState) args.arg1; + mInsetsController.onControlsChanged((InsetsSourceControl[]) args.arg2); + + // TODO: Full traversal not necessarily needed here. if (USE_NEW_INSETS) { requestLayout(); } break; + } case MSG_WINDOW_MOVED: if (mAdded) { final int w = mWinFrame.width(); @@ -7116,6 +7136,14 @@ public final class ViewRootImpl implements ViewParent, mHandler.obtainMessage(MSG_INSETS_CHANGED, insetsState).sendToTarget(); } + private void dispatchInsetsControlChanged(InsetsState insetsState, + InsetsSourceControl[] activeControls) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = insetsState; + args.arg2 = activeControls; + mHandler.obtainMessage(MSG_INSETS_CONTROL_CHANGED, args).sendToTarget(); + } + public void dispatchMoved(int newX, int newY) { if (DEBUG_LAYOUT) Log.v(mTag, "Window moved " + this + ": newX=" + newX + " newY=" + newY); if (mTranslator != null) { @@ -8187,6 +8215,15 @@ public final class ViewRootImpl implements ViewParent, } @Override + public void insetsControlChanged(InsetsState insetsState, + InsetsSourceControl[] activeControls) { + final ViewRootImpl viewAncestor = mViewAncestor.get(); + if (viewAncestor != null) { + viewAncestor.dispatchInsetsControlChanged(insetsState, activeControls); + } + } + + @Override public void moved(int newX, int newY) { final ViewRootImpl viewAncestor = mViewAncestor.get(); if (viewAncestor != null) { diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index c1e94d8ff97e..58ab817c6faf 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -2410,4 +2410,11 @@ public abstract class Window { public boolean isCloseOnSwipeEnabled() { return mCloseOnSwipeEnabled; } + + /** + * @return The {@link WindowInsetsController} associated with this window + * @see View#getWindowInsetsController() + * @hide pending unhide + */ + public abstract @NonNull WindowInsetsController getInsetsController(); } diff --git a/core/java/android/view/WindowInsets.java b/core/java/android/view/WindowInsets.java index a8debbd623f5..572d33103cf4 100644 --- a/core/java/android/view/WindowInsets.java +++ b/core/java/android/view/WindowInsets.java @@ -18,13 +18,17 @@ package android.view; import android.annotation.NonNull; +import android.annotation.IntDef; import android.annotation.Nullable; import android.annotation.UnsupportedAppUsage; import android.graphics.Insets; import android.graphics.Rect; +import android.view.inputmethod.InputMethod; import com.android.internal.util.Preconditions; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Objects; /** @@ -807,4 +811,69 @@ public final class WindowInsets { mIsRound, mAlwaysConsumeNavBar, mDisplayCutout); } } + + /** + * Class that defines different types of sources causing window insets. + * @hide pending unhide + */ + public static final class Type { + + static final int TOP_BAR = 0x1; + static final int IME = 0x2; + static final int SIDE_BARS = 0x4; + static final int WINDOW_DECOR = 0x8; + + private Type() { + } + + /** @hide */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(flag = true, value = { TOP_BAR, IME, SIDE_BARS, WINDOW_DECOR }) + public @interface InsetType { + } + + /** + * @return An inset type representing the top bar of a window, which can be the status + * bar on handheld-like devices as well as a caption bar. + */ + public static @InsetType int topBar() { + return TOP_BAR; + } + + /** + * @return An inset type representing the window of an {@link InputMethod}. + */ + public static @InsetType int ime() { + return IME; + } + + /** + * @return An inset type representing any system bars that are not {@link #topBar()}. + */ + public static @InsetType int sideBars() { + return SIDE_BARS; + } + + /** + * @return An inset type representing decor that is being app-controlled. + */ + public static @InsetType int windowDecor() { + return WINDOW_DECOR; + } + + /** + * @return All system bars. Includes {@link #topBar()} as well as {@link #sideBars()}, but + * not {@link #ime()}. + */ + public static @InsetType int systemBars() { + return TOP_BAR | SIDE_BARS; + } + + /** + * @return All inset types combined. + */ + public static @InsetType int all() { + return 0xFFFFFFFF; + } + } } diff --git a/core/java/android/view/WindowInsetsController.java b/core/java/android/view/WindowInsetsController.java new file mode 100644 index 000000000000..7be5f2e7a0b0 --- /dev/null +++ b/core/java/android/view/WindowInsetsController.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view; + +import android.view.WindowInsets.Type.InsetType; + +/** + * Interface to control windows that generate insets. + * + * TODO Needs more information and examples once the API is more baked. + * @hide pending unhide + */ +public interface WindowInsetsController { + + /** + * Makes a set of windows that cause insets appear on screen. + * <p> + * Note that if the window currently doesn't have control over a certain type, it will apply the + * change as soon as the window gains control. The app can listen to the event by observing + * {@link View#onApplyWindowInsets} and checking visibility with "TODO at method" in + * {@link WindowInsets}. + * + * @param types A bitmask of {@link WindowInsets.Type.InsetType} specifying what windows the app + * would like to make appear on screen. + */ + void show(@InsetType int types); + + /** + * Makes a set of windows causing insets disappear. + * <p> + * Note that if the window currently doesn't have control over a certain type, it will apply the + * change as soon as the window gains control. The app can listen to the event by observing + * {@link View#onApplyWindowInsets} and checking visibility with "TODO at method" in + * {@link WindowInsets}. + * + * @param types A bitmask of {@link WindowInsets.Type.InsetType} specifying what windows the app + * would like to make disappear. + */ + void hide(@InsetType int types); +} diff --git a/core/java/android/view/intelligence/ContentCaptureManager.java b/core/java/android/view/intelligence/ContentCaptureManager.java index 9023cd08159a..45518d5e5943 100644 --- a/core/java/android/view/intelligence/ContentCaptureManager.java +++ b/core/java/android/view/intelligence/ContentCaptureManager.java @@ -189,7 +189,7 @@ public final class ContentCaptureManager { } } - private void handleSessionStarted(int resultCode) { + private void handleSessionStarted(int resultCode) { mState = resultCode; mDisabled.set(mState == STATE_DISABLED); if (VERBOSE) { diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 488b9912ee49..d8ee643e27f0 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -91,6 +91,7 @@ import android.view.ViewParent; import android.view.ViewRootImpl; import android.view.ViewRootImpl.ActivityConfigCallback; import android.view.Window; +import android.view.WindowInsetsController; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; @@ -3877,4 +3878,9 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { mDecor.updateLogTag(params); } } + + @Override + public WindowInsetsController getInsetsController() { + return mDecor.getWindowInsetsController(); + } } diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java index 36fe4fc5af49..c8834a889333 100644 --- a/core/java/com/android/internal/view/BaseIWindow.java +++ b/core/java/com/android/internal/view/BaseIWindow.java @@ -27,6 +27,7 @@ import android.view.DragEvent; import android.view.IWindow; import android.view.IWindowSession; import android.view.PointerIcon; +import android.view.InsetsSourceControl; import android.view.InsetsState; import com.android.internal.os.IResultReceiver; @@ -58,6 +59,11 @@ public class BaseIWindow extends IWindow.Stub { } @Override + public void insetsControlChanged(InsetsState insetsState, + InsetsSourceControl[] activeControls) throws RemoteException { + } + + @Override public void moved(int newX, int newY) { } diff --git a/core/jni/Android.bp b/core/jni/Android.bp index bdd5f83aa4ea..31bb1d57d702 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -34,7 +34,6 @@ cc_library_shared { ], cppflags: ["-Wno-conversion-null"], - cpp_std: "c++17", srcs: [ "AndroidRuntime.cpp", diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index bc1d5cc7e1c6..f9879ccc18c9 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -1056,12 +1056,18 @@ void AndroidRuntime::start(const char* className, const Vector<String8>& options if (rootDir == NULL) { rootDir = "/system"; if (!hasDir("/system")) { - LOG_FATAL("No root directory specified, and /android does not exist."); + LOG_FATAL("No root directory specified, and /system does not exist."); return; } setenv("ANDROID_ROOT", rootDir, 1); } + const char* runtimeRootDir = getenv("ANDROID_RUNTIME_ROOT"); + if (runtimeRootDir == NULL) { + LOG_FATAL("No runtime directory specified with ANDROID_RUNTIME_ROOT environment variable."); + return; + } + //const char* kernelHack = getenv("LD_ASSUME_KERNEL"); //ALOGD("Found LD_ASSUME_KERNEL='%s'\n", kernelHack); diff --git a/core/proto/android/service/runtime.proto b/core/proto/android/service/runtime.proto new file mode 100644 index 000000000000..ecbccef7a94c --- /dev/null +++ b/core/proto/android/service/runtime.proto @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2018 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. + */ + +syntax = "proto2"; +package android.service.runtime; + +import "frameworks/base/libs/incident/proto/android/privacy.proto"; + +option java_multiple_files = true; +option java_outer_classname = "RuntimeServiceProto"; + +// Represents dumpsys info from RuntimeService. +message RuntimeServiceInfoProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + // Generic debug information to include. + repeated DebugEntryProto debug_entry = 1; +} + +// A piece of key / value debug information. +message DebugEntryProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional string key = 1; + + optional string string_value = 2; +} diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 91b98694a623..83f30573fda8 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -4611,6 +4611,13 @@ </intent-filter> </receiver> + <receiver android:name="com.android.server.WallpaperUpdateReceiver" + android:permission="android.permission.RECEIVE_DEVICE_CUSTOMIZATION_READY"> + <intent-filter> + <action android:name="android.intent.action.DEVICE_CUSTOMIZATION_READY"/> + </intent-filter> + </receiver> + <service android:name="android.hardware.location.GeofenceHardwareService" android:permission="android.permission.LOCATION_HARDWARE" android:exported="false" /> diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml index 3b650e5ff777..46d4a4773389 100644 --- a/core/tests/coretests/AndroidManifest.xml +++ b/core/tests/coretests/AndroidManifest.xml @@ -91,6 +91,8 @@ <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" /> <uses-permission android:name="android.permission.KILL_UID" /> + <uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER" /> + <!-- location test permissions --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/> diff --git a/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java b/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java index c8bc35c976a2..9e1523165925 100644 --- a/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java +++ b/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java @@ -16,6 +16,10 @@ package android.os; +import static android.os.ParcelFileDescriptor.MODE_READ_ONLY; +import static android.os.ParcelFileDescriptor.MODE_READ_WRITE; +import static android.os.RedactingFileDescriptor.removeRange; + import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; @@ -58,8 +62,8 @@ public class RedactingFileDescriptorTest { @Test public void testSingleByte() throws Exception { - final FileDescriptor fd = RedactingFileDescriptor - .open(mContext, mFile, new long[] { 10, 11 }).getFileDescriptor(); + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_ONLY, + new long[] { 10, 11 }).getFileDescriptor(); final byte[] buf = new byte[1_000]; assertEquals(buf.length, Os.read(fd, buf, 0, buf.length)); @@ -74,8 +78,8 @@ public class RedactingFileDescriptorTest { @Test public void testRanges() throws Exception { - final FileDescriptor fd = RedactingFileDescriptor - .open(mContext, mFile, new long[] { 100, 200, 300, 400 }).getFileDescriptor(); + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_ONLY, + new long[] { 100, 200, 300, 400 }).getFileDescriptor(); final byte[] buf = new byte[10]; assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 90)); @@ -96,8 +100,8 @@ public class RedactingFileDescriptorTest { @Test public void testEntireFile() throws Exception { - final FileDescriptor fd = RedactingFileDescriptor - .open(mContext, mFile, new long[] { 0, 5_000_000 }).getFileDescriptor(); + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_ONLY, + new long[] { 0, 5_000_000 }).getFileDescriptor(); try (FileInputStream in = new FileInputStream(fd)) { int val; @@ -106,4 +110,61 @@ public class RedactingFileDescriptorTest { } } } + + @Test + public void testReadWrite() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 100, 200, 300, 400 }).getFileDescriptor(); + + // Redacted at first + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 95)); + assertArrayEquals(new byte[] { 64, 64, 64, 64, 64, 0, 0, 0, 0, 0 }, buf); + + // But we can see data that we've written + Os.pwrite(fd, new byte[] { 32, 32 }, 0, 2, 102); + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 95)); + assertArrayEquals(new byte[] { 64, 64, 64, 64, 64, 0, 0, 32, 32, 0 }, buf); + } + + @Test + public void testRemoveRange() throws Exception { + // Removing outside ranges should have no changes + assertArrayEquals(new long[] { 100, 200, 300, 400 }, + removeRange(new long[] { 100, 200, 300, 400 }, 0, 100)); + assertArrayEquals(new long[] { 100, 200, 300, 400 }, + removeRange(new long[] { 100, 200, 300, 400 }, 200, 300)); + assertArrayEquals(new long[] { 100, 200, 300, 400 }, + removeRange(new long[] { 100, 200, 300, 400 }, 400, 500)); + + // Removing full regions + assertArrayEquals(new long[] { 100, 200 }, + removeRange(new long[] { 100, 200, 300, 400 }, 300, 400)); + assertArrayEquals(new long[] { 100, 200 }, + removeRange(new long[] { 100, 200, 300, 400 }, 250, 450)); + assertArrayEquals(new long[] { 300, 400 }, + removeRange(new long[] { 100, 200, 300, 400 }, 50, 250)); + assertArrayEquals(new long[] { }, + removeRange(new long[] { 100, 200, 300, 400 }, 0, 5_000_000)); + } + + @Test + public void testRemoveRange_Partial() throws Exception { + assertArrayEquals(new long[] { 150, 200, 300, 400 }, + removeRange(new long[] { 100, 200, 300, 400 }, 50, 150)); + assertArrayEquals(new long[] { 100, 150, 300, 400 }, + removeRange(new long[] { 100, 200, 300, 400 }, 150, 250)); + assertArrayEquals(new long[] { 100, 150, 350, 400 }, + removeRange(new long[] { 100, 200, 300, 400 }, 150, 350)); + assertArrayEquals(new long[] { 100, 150 }, + removeRange(new long[] { 100, 200, 300, 400 }, 150, 500)); + } + + @Test + public void testRemoveRange_Hole() throws Exception { + assertArrayEquals(new long[] { 100, 125, 175, 200, 300, 400 }, + removeRange(new long[] { 100, 200, 300, 400 }, 125, 175)); + assertArrayEquals(new long[] { 100, 200 }, + removeRange(new long[] { 100, 200 }, 150, 150)); + } } diff --git a/core/tests/coretests/src/android/view/InsetsControllerTest.java b/core/tests/coretests/src/android/view/InsetsControllerTest.java new file mode 100644 index 000000000000..ed80cd7e375c --- /dev/null +++ b/core/tests/coretests/src/android/view/InsetsControllerTest.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.view; + +import static android.view.InsetsState.TYPE_TOP_BAR; +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNull; + +import android.platform.test.annotations.Presubmit; +import android.support.test.filters.FlakyTest; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@Presubmit +@FlakyTest(detail = "Promote once confirmed non-flaky") +@RunWith(AndroidJUnit4.class) +public class InsetsControllerTest { + + private InsetsController mController = new InsetsController(); + + private SurfaceSession mSession = new SurfaceSession(); + private SurfaceControl mLeash; + + @Before + public void setup() { + mLeash = new SurfaceControl.Builder(mSession) + .setName("testSurface") + .build(); + } + + @Test + public void testControlsChanged() { + InsetsSourceControl control = new InsetsSourceControl(TYPE_TOP_BAR, mLeash); + mController.onControlsChanged(new InsetsSourceControl[] { control }); + assertEquals(mLeash, + mController.getSourceConsumer(TYPE_TOP_BAR).getControl().getLeash()); + } + + @Test + public void testControlsRevoked() { + InsetsSourceControl control = new InsetsSourceControl(TYPE_TOP_BAR, mLeash); + mController.onControlsChanged(new InsetsSourceControl[] { control }); + mController.onControlsChanged(new InsetsSourceControl[0]); + assertNull(mController.getSourceConsumer(TYPE_TOP_BAR).getControl()); + } +} diff --git a/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java b/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java new file mode 100644 index 000000000000..5a20ba2522b1 --- /dev/null +++ b/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.view; + +import static android.view.InsetsState.TYPE_TOP_BAR; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; + +import android.platform.test.annotations.Presubmit; +import android.support.test.filters.FlakyTest; +import android.support.test.runner.AndroidJUnit4; +import android.view.SurfaceControl.Transaction; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@Presubmit +@FlakyTest(detail = "Promote once confirmed non-flaky") +@RunWith(AndroidJUnit4.class) +public class InsetsSourceConsumerTest { + + private InsetsSourceConsumer mConsumer; + + private SurfaceSession mSession = new SurfaceSession(); + private SurfaceControl mLeash; + @Mock Transaction mMockTransaction; + @Mock InsetsController mMockController; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mLeash = new SurfaceControl.Builder(mSession) + .setName("testSurface") + .build(); + mConsumer = new InsetsSourceConsumer(TYPE_TOP_BAR, new InsetsState(), + () -> mMockTransaction); + mConsumer.setControl(new InsetsSourceControl(TYPE_TOP_BAR, mLeash)); + } + + @Test + public void testHide() { + mConsumer.hide(); + verify(mMockTransaction).hide(eq(mLeash)); + } + + @Test + public void testShow() { + mConsumer.hide(); + mConsumer.show(); + verify(mMockTransaction, atLeastOnce()).show(eq(mLeash)); + } + + @Test + public void testRestore() { + mConsumer.setControl(null); + reset(mMockTransaction); + mConsumer.hide(); + verifyZeroInteractions(mMockTransaction); + mConsumer.setControl(new InsetsSourceControl(TYPE_TOP_BAR, mLeash)); + verify(mMockTransaction).hide(eq(mLeash)); + } +} diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java index dbe6e8f4eebb..9b86b77a9384 100644 --- a/graphics/java/android/graphics/Typeface.java +++ b/graphics/java/android/graphics/Typeface.java @@ -249,7 +249,22 @@ public class Typeface { if (familyBuilder == null) { return Typeface.DEFAULT; } - typeface = new Typeface.CustomFallbackBuilder(familyBuilder.build()).build(); + final FontFamily family = familyBuilder.build(); + final FontStyle normal = new FontStyle(FontStyle.FONT_WEIGHT_NORMAL, + FontStyle.FONT_SLANT_UPRIGHT); + Font bestFont = family.getFont(0); + int bestScore = normal.getMatchScore(bestFont.getStyle()); + for (int i = 1; i < family.getSize(); ++i) { + final Font candidate = family.getFont(i); + final int score = normal.getMatchScore(candidate.getStyle()); + if (score < bestScore) { + bestFont = candidate; + bestScore = score; + } + } + typeface = new Typeface.CustomFallbackBuilder(family) + .setStyle(bestFont.getStyle()) + .build(); } catch (IOException e) { typeface = Typeface.DEFAULT; } diff --git a/graphics/java/android/graphics/fonts/FontStyle.java b/graphics/java/android/graphics/fonts/FontStyle.java index 82fc7ac01772..af517d623b01 100644 --- a/graphics/java/android/graphics/fonts/FontStyle.java +++ b/graphics/java/android/graphics/fonts/FontStyle.java @@ -18,6 +18,7 @@ package android.graphics.fonts; import android.annotation.IntDef; import android.annotation.IntRange; +import android.annotation.NonNull; import android.annotation.Nullable; import com.android.internal.util.Preconditions; @@ -232,6 +233,16 @@ public final class FontStyle { return mSlant; } + /** + * Compute the matching score for another style. + * + * The smaller is better. + * @hide + */ + public int getMatchScore(@NonNull FontStyle o) { + return Math.abs((getWeight() - o.getWeight())) / 100 + (getSlant() == o.getSlant() ? 0 : 2); + } + @Override public boolean equals(@Nullable Object o) { if (o == this) { diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp index 4a5b61a2d6cd..da77b99e6e53 100644 --- a/libs/hwui/Android.bp +++ b/libs/hwui/Android.bp @@ -9,8 +9,6 @@ cc_defaults { "hwui_lto", ], - cpp_std: "c++17", - cflags: [ "-DEGL_EGLEXT_PROTOTYPES", "-DGL_GLEXT_PROTOTYPES", diff --git a/libs/hwui/CanvasTransform.cpp b/libs/hwui/CanvasTransform.cpp index 06e937ab66f4..0cfaa8c61279 100644 --- a/libs/hwui/CanvasTransform.cpp +++ b/libs/hwui/CanvasTransform.cpp @@ -146,4 +146,4 @@ bool transformPaint(ColorTransform transform, SkPaint* paint, BitmapPalette pale return shouldInvert; } -}; // namespace android::uirenderer
\ No newline at end of file +} // namespace android::uirenderer diff --git a/libs/hwui/DisplayList.h b/libs/hwui/DisplayList.h index a952cc23e1ef..dc63e5db4a70 100644 --- a/libs/hwui/DisplayList.h +++ b/libs/hwui/DisplayList.h @@ -31,5 +31,5 @@ typedef uirenderer::VectorDrawable::Tree VectorDrawableRoot; */ using DisplayList = skiapipeline::SkiaDisplayList; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/FrameMetricsObserver.h b/libs/hwui/FrameMetricsObserver.h index ba72e937095f..237fc622dd2e 100644 --- a/libs/hwui/FrameMetricsObserver.h +++ b/libs/hwui/FrameMetricsObserver.h @@ -26,5 +26,5 @@ public: virtual void notify(const int64_t* buffer); }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/FrameMetricsReporter.h b/libs/hwui/FrameMetricsReporter.h index d920a99f5ee3..75b8038c5040 100644 --- a/libs/hwui/FrameMetricsReporter.h +++ b/libs/hwui/FrameMetricsReporter.h @@ -56,5 +56,5 @@ private: std::vector<sp<FrameMetricsObserver> > mObservers; }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/GlFunctorLifecycleListener.h b/libs/hwui/GlFunctorLifecycleListener.h index 5d07b46919d4..5adc46961c8b 100644 --- a/libs/hwui/GlFunctorLifecycleListener.h +++ b/libs/hwui/GlFunctorLifecycleListener.h @@ -28,5 +28,5 @@ public: virtual void onGlFunctorReleased(Functor* functor) = 0; }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/HardwareBitmapUploader.cpp b/libs/hwui/HardwareBitmapUploader.cpp index 165fc4860fb2..a97c12cad9fd 100644 --- a/libs/hwui/HardwareBitmapUploader.cpp +++ b/libs/hwui/HardwareBitmapUploader.cpp @@ -256,4 +256,4 @@ sk_sp<Bitmap> HardwareBitmapUploader::allocateHardwareBitmap(const SkBitmap& sou return sk_sp<Bitmap>(new Bitmap(buffer.get(), bitmap.info(), Bitmap::computePalette(bitmap))); } -}; // namespace android::uirenderer +} // namespace android::uirenderer diff --git a/libs/hwui/HardwareBitmapUploader.h b/libs/hwui/HardwareBitmapUploader.h index c0113d81fefb..6298013bd263 100644 --- a/libs/hwui/HardwareBitmapUploader.h +++ b/libs/hwui/HardwareBitmapUploader.h @@ -25,4 +25,4 @@ public: static sk_sp<Bitmap> allocateHardwareBitmap(const SkBitmap& sourceBitmap); }; -}; // namespace android::uirenderer +} // namespace android::uirenderer diff --git a/libs/hwui/Layer.cpp b/libs/hwui/Layer.cpp index d0df200d2fa6..a15ff2235db2 100644 --- a/libs/hwui/Layer.cpp +++ b/libs/hwui/Layer.cpp @@ -54,5 +54,5 @@ SkBlendMode Layer::getMode() const { } } -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/Layer.h b/libs/hwui/Layer.h index 98600dbf1eea..ea3bfc9e80cb 100644 --- a/libs/hwui/Layer.h +++ b/libs/hwui/Layer.h @@ -144,5 +144,5 @@ private: }; // struct Layer -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/LayerUpdateQueue.h b/libs/hwui/LayerUpdateQueue.h index 6857999500f0..2c63af6aaab4 100644 --- a/libs/hwui/LayerUpdateQueue.h +++ b/libs/hwui/LayerUpdateQueue.h @@ -50,7 +50,7 @@ private: std::vector<Entry> mEntries; }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif // ANDROID_HWUI_LAYER_UPDATE_QUEUE_H diff --git a/libs/hwui/Lighting.h b/libs/hwui/Lighting.h index d972c2181aea..ccfbb93b00ef 100644 --- a/libs/hwui/Lighting.h +++ b/libs/hwui/Lighting.h @@ -34,5 +34,5 @@ struct LightInfo { uint8_t spotShadowAlpha; }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/Matrix.cpp b/libs/hwui/Matrix.cpp index d84ed321a4cb..d0dbff031e99 100644 --- a/libs/hwui/Matrix.cpp +++ b/libs/hwui/Matrix.cpp @@ -526,5 +526,5 @@ void Matrix4::dump(const char* label) const { ALOGD("]"); } -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/Matrix.h b/libs/hwui/Matrix.h index 1b5cb60ca4bd..b33cfe2ec511 100644 --- a/libs/hwui/Matrix.h +++ b/libs/hwui/Matrix.h @@ -245,5 +245,5 @@ private: typedef Matrix4 mat4; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/NinePatchUtils.h b/libs/hwui/NinePatchUtils.h index 082e95fb1440..86d3cb9a5b11 100644 --- a/libs/hwui/NinePatchUtils.h +++ b/libs/hwui/NinePatchUtils.h @@ -103,5 +103,5 @@ static inline void SetLatticeFlags(SkCanvas::Lattice* lattice, SkCanvas::Lattice } } -}; // namespace NinePatchUtils -}; // namespace android +} // namespace NinePatchUtils +} // namespace android diff --git a/libs/hwui/PathParser.cpp b/libs/hwui/PathParser.cpp index ad599e9ec316..808921d344da 100644 --- a/libs/hwui/PathParser.cpp +++ b/libs/hwui/PathParser.cpp @@ -304,5 +304,5 @@ void PathParser::parseAsciiStringForSkPath(SkPath* skPath, ParseResult* result, return; } -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/PathParser.h b/libs/hwui/PathParser.h index 474eb97b53c6..f5bebce605fb 100644 --- a/libs/hwui/PathParser.h +++ b/libs/hwui/PathParser.h @@ -46,6 +46,6 @@ public: static void validateVerbAndPoints(char verb, size_t points, ParseResult* result); }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif // ANDROID_HWUI_PATHPARSER_H diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp index 3f2c616eb8ff..4a3e10c54cef 100644 --- a/libs/hwui/Properties.cpp +++ b/libs/hwui/Properties.cpp @@ -223,5 +223,5 @@ void Properties::overrideRenderPipelineType(RenderPipelineType type) { sRenderPipelineType = type; } -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h index 542bc71f7c72..da53f6657ff7 100644 --- a/libs/hwui/Properties.h +++ b/libs/hwui/Properties.h @@ -289,7 +289,7 @@ private: static RenderPipelineType sRenderPipelineType; }; // class Caches -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif // ANDROID_HWUI_PROPERTIES_H diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp index f928de9b92a6..c63e449319dd 100644 --- a/libs/hwui/RecordingCanvas.cpp +++ b/libs/hwui/RecordingCanvas.cpp @@ -1028,5 +1028,5 @@ void RecordingCanvas::drawVectorDrawable(VectorDrawableRoot* tree) { fDL->drawVectorDrawable(tree); } -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/RecordingCanvas.h b/libs/hwui/RecordingCanvas.h index 099e0be433ea..08cfc6266f56 100644 --- a/libs/hwui/RecordingCanvas.h +++ b/libs/hwui/RecordingCanvas.h @@ -216,5 +216,5 @@ private: DisplayListData* fDL; }; -}; // namespace uirenderer -}; // namespace android
\ No newline at end of file +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/Rect.h b/libs/hwui/Rect.h index 0715187e19ea..d6362ef10aad 100644 --- a/libs/hwui/Rect.h +++ b/libs/hwui/Rect.h @@ -262,5 +262,5 @@ public: } }; // class Rect -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/UvMapper.h b/libs/hwui/UvMapper.h index b495e3394bc9..833ca4a79ce5 100644 --- a/libs/hwui/UvMapper.h +++ b/libs/hwui/UvMapper.h @@ -124,7 +124,7 @@ private: float mMaxV; }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif // ANDROID_HWUI_UV_MAPPER_H diff --git a/libs/hwui/Vector.h b/libs/hwui/Vector.h index d2c15ad872a5..e6eea1c5c0ca 100644 --- a/libs/hwui/Vector.h +++ b/libs/hwui/Vector.h @@ -113,7 +113,7 @@ public: } }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif // ANDROID_HWUI_VECTOR_H diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp index 6cf04bf5f811..dd62bbbdc84f 100644 --- a/libs/hwui/VectorDrawable.cpp +++ b/libs/hwui/VectorDrawable.cpp @@ -691,7 +691,7 @@ BitmapPalette Tree::computePalette() { return BitmapPalette::Unknown; } -}; // namespace VectorDrawable +} // namespace VectorDrawable -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/Vertex.h b/libs/hwui/Vertex.h index f0912777e3d8..28cabb9be0f1 100644 --- a/libs/hwui/Vertex.h +++ b/libs/hwui/Vertex.h @@ -73,7 +73,7 @@ struct TextureVertex { REQUIRE_COMPATIBLE_LAYOUT(TextureVertex); -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif // ANDROID_HWUI_VERTEX_H diff --git a/libs/hwui/VertexBuffer.h b/libs/hwui/VertexBuffer.h index 613cf4af64b2..6543a2251f7a 100644 --- a/libs/hwui/VertexBuffer.h +++ b/libs/hwui/VertexBuffer.h @@ -174,7 +174,7 @@ private: void (*mCleanupIndexMethod)(void*); }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif // ANDROID_HWUI_VERTEX_BUFFER_H diff --git a/libs/hwui/hwui/Canvas.h b/libs/hwui/hwui/Canvas.h index e99742bc2eba..a5f21d8e6d73 100644 --- a/libs/hwui/hwui/Canvas.h +++ b/libs/hwui/hwui/Canvas.h @@ -76,8 +76,8 @@ typedef uint32_t Flags; namespace uirenderer { namespace VectorDrawable { class Tree; -}; -}; +} +} typedef uirenderer::VectorDrawable::Tree VectorDrawableRoot; typedef std::function<void(uint16_t* text, float* positions)> ReadGlyphFunc; @@ -318,4 +318,4 @@ protected: friend class DrawTextOnPathFunctor; }; -}; // namespace android +} // namespace android diff --git a/libs/hwui/pipeline/skia/AnimatedDrawables.h b/libs/hwui/pipeline/skia/AnimatedDrawables.h index efef6de2a9e1..bf19655825b3 100644 --- a/libs/hwui/pipeline/skia/AnimatedDrawables.h +++ b/libs/hwui/pipeline/skia/AnimatedDrawables.h @@ -79,6 +79,6 @@ private: sp<uirenderer::CanvasPropertyPaint> mPaint; }; -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/pipeline/skia/DumpOpsCanvas.h b/libs/hwui/pipeline/skia/DumpOpsCanvas.h index e4ba13da709c..206219426bb0 100644 --- a/libs/hwui/pipeline/skia/DumpOpsCanvas.h +++ b/libs/hwui/pipeline/skia/DumpOpsCanvas.h @@ -172,6 +172,6 @@ private: std::string mIdent; }; -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/pipeline/skia/FunctorDrawable.h b/libs/hwui/pipeline/skia/FunctorDrawable.h index 162d13762e1a..af3a056864a7 100644 --- a/libs/hwui/pipeline/skia/FunctorDrawable.h +++ b/libs/hwui/pipeline/skia/FunctorDrawable.h @@ -48,6 +48,6 @@ protected: const SkRect mBounds; }; -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp b/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp index 90d5e715f8cd..4a87e7502c6f 100644 --- a/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp +++ b/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp @@ -216,6 +216,6 @@ void GLFunctorDrawable::onDraw(SkCanvas* canvas) { } } -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/pipeline/skia/GLFunctorDrawable.h b/libs/hwui/pipeline/skia/GLFunctorDrawable.h index b06f7f029f23..215979cba2e3 100644 --- a/libs/hwui/pipeline/skia/GLFunctorDrawable.h +++ b/libs/hwui/pipeline/skia/GLFunctorDrawable.h @@ -41,6 +41,6 @@ protected: void onDraw(SkCanvas* canvas) override; }; -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/pipeline/skia/LayerDrawable.cpp b/libs/hwui/pipeline/skia/LayerDrawable.cpp index 9b408fbc95ca..f08ac17e4082 100644 --- a/libs/hwui/pipeline/skia/LayerDrawable.cpp +++ b/libs/hwui/pipeline/skia/LayerDrawable.cpp @@ -145,6 +145,6 @@ bool LayerDrawable::DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer return layerImage != nullptr; } -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/pipeline/skia/LayerDrawable.h b/libs/hwui/pipeline/skia/LayerDrawable.h index 5c125908ffb2..95dc6d0cf096 100644 --- a/libs/hwui/pipeline/skia/LayerDrawable.h +++ b/libs/hwui/pipeline/skia/LayerDrawable.h @@ -45,6 +45,6 @@ private: sp<DeferredLayerUpdater> mLayerUpdater; }; -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp index d80cb6d1ab70..4494cb05df10 100644 --- a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp +++ b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp @@ -332,6 +332,6 @@ void RenderNodeDrawable::setViewProperties(const RenderProperties& properties, S } } -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/pipeline/skia/RenderNodeDrawable.h b/libs/hwui/pipeline/skia/RenderNodeDrawable.h index d746978b0a61..6ba8e599818c 100644 --- a/libs/hwui/pipeline/skia/RenderNodeDrawable.h +++ b/libs/hwui/pipeline/skia/RenderNodeDrawable.h @@ -150,6 +150,6 @@ private: SkiaDisplayList* mProjectedDisplayList = nullptr; }; -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp b/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp index dba97fe5ef9f..0a3c8f4347eb 100644 --- a/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp +++ b/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp @@ -211,6 +211,6 @@ void EndReorderBarrierDrawable::drawShadow(SkCanvas* canvas, RenderNodeDrawable* casterAlpha < 1.0f ? SkShadowFlags::kTransparentOccluder_ShadowFlag : 0); } -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/pipeline/skia/ReorderBarrierDrawables.h b/libs/hwui/pipeline/skia/ReorderBarrierDrawables.h index 26cfa908228c..cfc0f9b258da 100644 --- a/libs/hwui/pipeline/skia/ReorderBarrierDrawables.h +++ b/libs/hwui/pipeline/skia/ReorderBarrierDrawables.h @@ -74,6 +74,6 @@ private: StartReorderBarrierDrawable* mStartBarrier; }; -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/pipeline/skia/SkiaDisplayList.cpp b/libs/hwui/pipeline/skia/SkiaDisplayList.cpp index 38905138e332..ac6f6a3f776d 100644 --- a/libs/hwui/pipeline/skia/SkiaDisplayList.cpp +++ b/libs/hwui/pipeline/skia/SkiaDisplayList.cpp @@ -141,6 +141,6 @@ void SkiaDisplayList::output(std::ostream& output, uint32_t level) { mDisplayList.draw(&canvas); } -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/pipeline/skia/SkiaDisplayList.h b/libs/hwui/pipeline/skia/SkiaDisplayList.h index ac7bb7b0950c..d7879e722a29 100644 --- a/libs/hwui/pipeline/skia/SkiaDisplayList.h +++ b/libs/hwui/pipeline/skia/SkiaDisplayList.h @@ -36,7 +36,7 @@ class Outline; namespace VectorDrawable { class Tree; -}; +} typedef uirenderer::VectorDrawable::Tree VectorDrawableRoot; namespace skiapipeline { @@ -179,6 +179,6 @@ public: SkMatrix mParentMatrix; }; -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp index f5de1c8adfaf..b682ab0256dd 100644 --- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp +++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp @@ -259,6 +259,6 @@ double SkiaRecordingCanvas::drawAnimatedImage(AnimatedImageDrawable* animatedIma return 0; } -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h index 988728dfe23e..d6107a9d9969 100644 --- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h +++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h @@ -92,6 +92,6 @@ private: PaintCoW&& filterBitmap(PaintCoW&& paint, sk_sp<SkColorFilter> colorSpaceFilter); }; -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.cpp b/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.cpp index a594206a2dd9..004a558dd9d0 100644 --- a/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.cpp +++ b/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.cpp @@ -219,6 +219,6 @@ void VkInteropFunctorDrawable::syncFunctor() const { }); } -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.h b/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.h index 3269cfbb8fe3..8fe52c5ef700 100644 --- a/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.h +++ b/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.h @@ -51,6 +51,6 @@ private: SkImageInfo mFBInfo; }; -}; // namespace skiapipeline -}; // namespace uirenderer -}; // namespace android +} // namespace skiapipeline +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/private/hwui/DrawGlInfo.h b/libs/hwui/private/hwui/DrawGlInfo.h index efa9da27199d..9e1bb8e8e548 100644 --- a/libs/hwui/private/hwui/DrawGlInfo.h +++ b/libs/hwui/private/hwui/DrawGlInfo.h @@ -83,7 +83,7 @@ struct DrawGlInfo { }; }; // struct DrawGlInfo -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif // ANDROID_HWUI_DRAW_GL_INFO_H diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index f1a522ecd588..6869972b5e7f 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -323,25 +323,6 @@ void CanvasContext::prepareTree(TreeInfo& info, int64_t* uiFrameInfo, int64_t sy // the deadline for RT animations info.out.canDrawThisFrame = false; } - /* This logic exists to try and recover from a display latch miss, which essentially - * results in the bufferqueue being double-buffered instead of triple-buffered. - * SurfaceFlinger itself now tries to handle & recover from this situation, so this - * logic should no longer be necessary. As it's occasionally triggering when - * undesired disable it. - * TODO: Remove this entirely if the results are solid. - else if (vsyncDelta >= mRenderThread.timeLord().frameIntervalNanos() * 3 || - (latestVsync - mLastDropVsync) < 500_ms) { - // It's been several frame intervals, assume the buffer queue is fine - // or the last drop was too recent - info.out.canDrawThisFrame = true; - } else { - info.out.canDrawThisFrame = !isSwapChainStuffed(); - if (!info.out.canDrawThisFrame) { - // dropping frame - mLastDropVsync = mRenderThread.timeLord().latestVsync(); - } - } - */ } else { info.out.canDrawThisFrame = true; } diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index 6668c5840c3e..d9b789f28f8d 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -49,7 +49,7 @@ enum { Reset = 1 << 1, JankStats = 1 << 2, }; -}; +} /* * RenderProxy is strictly single threaded. All methods must be invoked on the owning diff --git a/libs/hwui/surfacetexture/EGLConsumer.cpp b/libs/hwui/surfacetexture/EGLConsumer.cpp index c8220c6cb0d4..85b3917809fa 100644 --- a/libs/hwui/surfacetexture/EGLConsumer.cpp +++ b/libs/hwui/surfacetexture/EGLConsumer.cpp @@ -672,4 +672,4 @@ EGLImageKHR EGLConsumer::EglImage::createImage(EGLDisplay dpy, return image; } -}; // namespace android +} // namespace android diff --git a/libs/hwui/surfacetexture/EGLConsumer.h b/libs/hwui/surfacetexture/EGLConsumer.h index eccb08298f6f..7dac3ef0f44a 100644 --- a/libs/hwui/surfacetexture/EGLConsumer.h +++ b/libs/hwui/surfacetexture/EGLConsumer.h @@ -308,4 +308,4 @@ protected: sp<EglImage> mReleasedTexImage; }; -}; // namespace android +} // namespace android diff --git a/libs/hwui/surfacetexture/ImageConsumer.h b/libs/hwui/surfacetexture/ImageConsumer.h index 5bab0ef58a9a..f0e55bbf19f8 100644 --- a/libs/hwui/surfacetexture/ImageConsumer.h +++ b/libs/hwui/surfacetexture/ImageConsumer.h @@ -97,4 +97,4 @@ private: ImageSlot mImageSlots[BufferQueueDefs::NUM_BUFFER_SLOTS]; }; -}; /* namespace android */ +} /* namespace android */ diff --git a/libs/hwui/surfacetexture/SurfaceTexture.cpp b/libs/hwui/surfacetexture/SurfaceTexture.cpp index 90f891265572..da094442684d 100644 --- a/libs/hwui/surfacetexture/SurfaceTexture.cpp +++ b/libs/hwui/surfacetexture/SurfaceTexture.cpp @@ -491,4 +491,4 @@ sk_sp<SkImage> SurfaceTexture::dequeueImage(SkMatrix& transformMatrix, bool* que return image; } -}; // namespace android +} // namespace android diff --git a/libs/hwui/surfacetexture/SurfaceTexture.h b/libs/hwui/surfacetexture/SurfaceTexture.h index 96afd82b0d40..b5d136ff3058 100644 --- a/libs/hwui/surfacetexture/SurfaceTexture.h +++ b/libs/hwui/surfacetexture/SurfaceTexture.h @@ -449,4 +449,4 @@ protected: }; // ---------------------------------------------------------------------------- -}; // namespace android +} // namespace android diff --git a/libs/hwui/tests/unit/LayerUpdateQueueTests.cpp b/libs/hwui/tests/unit/LayerUpdateQueueTests.cpp index 217d63f9c2e1..41714ebd84b1 100644 --- a/libs/hwui/tests/unit/LayerUpdateQueueTests.cpp +++ b/libs/hwui/tests/unit/LayerUpdateQueueTests.cpp @@ -81,5 +81,5 @@ TEST(LayerUpdateQueue, clear) { EXPECT_TRUE(queue.entries().empty()); } -}; -}; +} +} diff --git a/libs/hwui/tests/unit/VectorDrawableTests.cpp b/libs/hwui/tests/unit/VectorDrawableTests.cpp index 02f740cee096..ee6beba847a0 100644 --- a/libs/hwui/tests/unit/VectorDrawableTests.cpp +++ b/libs/hwui/tests/unit/VectorDrawableTests.cpp @@ -406,5 +406,5 @@ TEST(VectorDrawable, drawPathWithoutIncrementingShaderRefCount) { EXPECT_TRUE(shader->unique()); } -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/thread/Barrier.h b/libs/hwui/thread/Barrier.h index 8faeee6b391a..bb750ca0fa88 100644 --- a/libs/hwui/thread/Barrier.h +++ b/libs/hwui/thread/Barrier.h @@ -48,7 +48,7 @@ private: mutable Condition mCondition; }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif // ANDROID_HWUI_BARRIER_H diff --git a/libs/hwui/thread/Future.h b/libs/hwui/thread/Future.h index 45f3102492e3..df53348e58fb 100644 --- a/libs/hwui/thread/Future.h +++ b/libs/hwui/thread/Future.h @@ -53,7 +53,7 @@ private: T mResult; }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif // ANDROID_HWUI_FUTURE_H diff --git a/libs/hwui/thread/Signal.h b/libs/hwui/thread/Signal.h index ffcd4b675a85..6d33ac473ac4 100644 --- a/libs/hwui/thread/Signal.h +++ b/libs/hwui/thread/Signal.h @@ -53,7 +53,7 @@ private: mutable Condition mCondition; }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif // ANDROID_HWUI_SIGNAL_H diff --git a/libs/hwui/thread/Task.h b/libs/hwui/thread/Task.h index 276a22f941fe..228ce19a2fd5 100644 --- a/libs/hwui/thread/Task.h +++ b/libs/hwui/thread/Task.h @@ -48,7 +48,7 @@ private: sp<Future<T> > mFuture; }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif // ANDROID_HWUI_TASK_H diff --git a/libs/hwui/thread/TaskManager.cpp b/libs/hwui/thread/TaskManager.cpp index 54b55e472095..26ff6ebad3b4 100644 --- a/libs/hwui/thread/TaskManager.cpp +++ b/libs/hwui/thread/TaskManager.cpp @@ -129,5 +129,5 @@ void TaskManager::WorkerThread::exit() { mSignal.signal(); } -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/thread/TaskManager.h b/libs/hwui/thread/TaskManager.h index 29b4fcdbfde9..c4c1291e755c 100644 --- a/libs/hwui/thread/TaskManager.h +++ b/libs/hwui/thread/TaskManager.h @@ -101,7 +101,7 @@ private: std::vector<sp<WorkerThread> > mThreads; }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif // ANDROID_HWUI_TASK_MANAGER_H diff --git a/libs/hwui/utils/Blur.cpp b/libs/hwui/utils/Blur.cpp index 1bc5646993c9..763d1aa177b7 100644 --- a/libs/hwui/utils/Blur.cpp +++ b/libs/hwui/utils/Blur.cpp @@ -178,5 +178,5 @@ void Blur::vertical(float* weights, int32_t radius, const uint8_t* source, uint8 } } -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/utils/Blur.h b/libs/hwui/utils/Blur.h index bec3837106e8..d6b41b83def8 100644 --- a/libs/hwui/utils/Blur.h +++ b/libs/hwui/utils/Blur.h @@ -41,7 +41,7 @@ public: int32_t width, int32_t height); }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif // ANDROID_HWUI_BLUR_H diff --git a/libs/hwui/utils/Color.cpp b/libs/hwui/utils/Color.cpp index 3fb6a31a7d97..dc347f615d98 100644 --- a/libs/hwui/utils/Color.cpp +++ b/libs/hwui/utils/Color.cpp @@ -221,5 +221,5 @@ SkColor LabToSRGB(const Lab& lab, SkAlpha alpha) { static_cast<uint8_t>(rgb.b * 255)); } -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/utils/FatVector.h b/libs/hwui/utils/FatVector.h index eafe2f13c16d..8cc4d1010ab6 100644 --- a/libs/hwui/utils/FatVector.h +++ b/libs/hwui/utils/FatVector.h @@ -99,7 +99,7 @@ private: typename InlineStdAllocator<T, SIZE>::Allocation mAllocation; }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif // ANDROID_FAT_VECTOR_H diff --git a/libs/hwui/utils/GLUtils.cpp b/libs/hwui/utils/GLUtils.cpp index fcd036c451e9..c694e93f7e21 100644 --- a/libs/hwui/utils/GLUtils.cpp +++ b/libs/hwui/utils/GLUtils.cpp @@ -76,5 +76,5 @@ const char* GLUtils::getGLFramebufferError() { } } -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/utils/LinearAllocator.cpp b/libs/hwui/utils/LinearAllocator.cpp index 3e5021cd45d4..8baa4b770f85 100644 --- a/libs/hwui/utils/LinearAllocator.cpp +++ b/libs/hwui/utils/LinearAllocator.cpp @@ -249,5 +249,5 @@ void LinearAllocator::dumpMemoryStats(const char* prefix) { ALOGD("%sPages %zu (dedicated %zu)", prefix, mPageCount, mDedicatedPageCount); } -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/utils/LinearAllocator.h b/libs/hwui/utils/LinearAllocator.h index 03f685e8aca8..b401fcf58f76 100644 --- a/libs/hwui/utils/LinearAllocator.h +++ b/libs/hwui/utils/LinearAllocator.h @@ -201,7 +201,7 @@ public: : std::vector<T, LinearStdAllocator<T>>(allocator) {} }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif // ANDROID_LINEARALLOCATOR_H diff --git a/libs/hwui/utils/Pair.h b/libs/hwui/utils/Pair.h index 4bcd57629e0c..76f93cbfeb92 100644 --- a/libs/hwui/utils/Pair.h +++ b/libs/hwui/utils/Pair.h @@ -36,7 +36,7 @@ struct Pair { inline const S& getSecond() const { return second; } }; -}; // namespace uirenderer +} // namespace uirenderer template <typename F, typename S> struct trait_trivial_ctor<uirenderer::Pair<F, S> > { @@ -55,6 +55,6 @@ struct trait_trivial_move<uirenderer::Pair<F, S> > { enum { value = aggregate_traits<F, S>::has_trivial_move }; }; -}; // namespace android +} // namespace android #endif // ANDROID_HWUI_PAIR_H diff --git a/libs/hwui/utils/Result.h b/libs/hwui/utils/Result.h index 7f33f2e3424d..bd20ba66d8a7 100644 --- a/libs/hwui/utils/Result.h +++ b/libs/hwui/utils/Result.h @@ -51,4 +51,4 @@ private: std::variant<R, Error<E>> result; }; -}; // namespace android::uirenderer +} // namespace android::uirenderer diff --git a/libs/hwui/utils/RingBuffer.h b/libs/hwui/utils/RingBuffer.h index b3e893139cf8..081386a7f671 100644 --- a/libs/hwui/utils/RingBuffer.h +++ b/libs/hwui/utils/RingBuffer.h @@ -61,7 +61,7 @@ private: size_t mCount = 0; }; -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android #endif /* RINGBUFFER_H_ */ diff --git a/libs/hwui/utils/StringUtils.cpp b/libs/hwui/utils/StringUtils.cpp index 5304b762f3dc..304982e8e493 100644 --- a/libs/hwui/utils/StringUtils.cpp +++ b/libs/hwui/utils/StringUtils.cpp @@ -34,5 +34,5 @@ unordered_string_set StringUtils::split(const char* spacedList) { return set; } -}; // namespace uirenderer -}; // namespace android +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/utils/TypeLogic.h b/libs/hwui/utils/TypeLogic.h index dbdad33d8335..1689ccecd6b1 100644 --- a/libs/hwui/utils/TypeLogic.h +++ b/libs/hwui/utils/TypeLogic.h @@ -37,4 +37,4 @@ template <typename D, typename S> struct copy_cv { template <typename D, typename S> using same_cv = copy_cv<std::remove_cv_t<D>, S>; template <typename D, typename S> using same_cv_t = typename same_cv<D, S>::type; -}; // namespace android::uirenderer
\ No newline at end of file +} // namespace android::uirenderer diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index c226d49c6af7..71736dd38e91 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -2620,7 +2620,8 @@ public class AudioTrack extends PlayerBase * to the audio sink. * <BR>With {@link #WRITE_NON_BLOCKING}, the write will return immediately after * queuing as much audio data for playback as possible without blocking. - * @param timestamp The timestamp of the first decodable audio frame in the provided audioData. + * @param timestamp The timestamp, in nanoseconds, of the first decodable audio frame in the + * provided audioData. * @return zero or the positive number of bytes that were written, or one of the following * error codes. * <ul> diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java index 01a0cb619bf0..32c4643adad0 100644 --- a/media/java/android/media/ExifInterface.java +++ b/media/java/android/media/ExifInterface.java @@ -2635,13 +2635,18 @@ public class ExifInterface { if (size == 0) { return 0; } - // We don't allow read positions after the available bytes, - // the input stream won't be able to seek back then. - if (position < 0 || position >= in.available()) { + if (position < 0) { return -1; } try { if (mPosition != position) { + // We don't allow seek to positions after the available bytes, + // the input stream won't be able to seek back then. + // However, if we hit an exception before (mPosition set to -1), + // let it try the seek in hope it might recover. + if (mPosition >= 0 && position >= mPosition + in.available()) { + return -1; + } in.seek(position); mPosition = position; } @@ -2649,8 +2654,8 @@ public class ExifInterface { // If the read will cause us to go over the available bytes, // reduce the size so that we stay in the available range. // Otherwise the input stream may not be able to seek back. - if (mPosition + size > in.available()) { - size = in.available() - (int)mPosition; + if (size > in.available()) { + size = in.available(); } int bytesRead = in.read(buffer, offset, size); diff --git a/packages/CarSystemUI/res/xml/car_volume_items.xml b/packages/CarSystemUI/res/xml/car_volume_items.xml index 8715946aac26..922b1a79d45a 100644 --- a/packages/CarSystemUI/res/xml/car_volume_items.xml +++ b/packages/CarSystemUI/res/xml/car_volume_items.xml @@ -23,8 +23,8 @@ car:icon="@drawable/car_ic_music"/> <item car:usage="media" car:icon="@drawable/car_ic_music"/> - <item car:usage="voice_communication" - car:icon="@*android:drawable/ic_audio_ring_notif"/> + <item car:usage="assistance_navigation_guidance" + car:icon="@drawable/car_ic_navigation"/> <item car:usage="voice_communication_signalling" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="alarm" @@ -43,8 +43,8 @@ car:icon="@drawable/car_ic_notification"/> <item car:usage="assistance_accessibility" car:icon="@drawable/car_ic_notification"/> - <item car:usage="assistance_navigation_guidance" - car:icon="@drawable/car_ic_navigation"/> + <item car:usage="voice_communication" + car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="assistance_sonification" car:icon="@drawable/car_ic_notification"/> <item car:usage="game" diff --git a/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java b/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java index b2fc41783516..892267b22058 100644 --- a/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java +++ b/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java @@ -48,7 +48,7 @@ public class SmartActionsHelper { | Notification.FLAG_NO_CLEAR; private static final int MAX_ACTION_EXTRACTION_TEXT_LENGTH = 400; private static final int MAX_ACTIONS_PER_LINK = 1; - private static final int MAX_SMART_ACTIONS = Notification.MAX_ACTION_BUTTONS; + private static final int MAX_SMART_ACTIONS = 3; private static final int MAX_SUGGESTED_REPLIES = 3; private static final ConversationActions.TypeConfig TYPE_CONFIG = @@ -81,12 +81,9 @@ public class SmartActionsHelper { if (tcm == null) { return EMPTY_ACTION_LIST; } - Notification.Action[] actions = entry.getNotification().actions; - int numOfExistingActions = actions == null ? 0: actions.length; - int maxSmartActions = MAX_SMART_ACTIONS - numOfExistingActions; return suggestActionsFromText( tcm, - getMostSalientActionText(entry.getNotification()), maxSmartActions); + getMostSalientActionText(entry.getNotification()), MAX_SMART_ACTIONS); } ArrayList<CharSequence> suggestReplies( diff --git a/packages/PrintSpooler/res/layout/print_activity.xml b/packages/PrintSpooler/res/layout/print_activity.xml index 0ccf13e23aaf..9e16f5ef40a7 100644 --- a/packages/PrintSpooler/res/layout/print_activity.xml +++ b/packages/PrintSpooler/res/layout/print_activity.xml @@ -107,7 +107,7 @@ android:layout_height="wrap_content" android:layout_marginStart="16dip" android:elevation="@dimen/preview_controls_elevation" - android:tint="?android:attr/textColorPrimaryInverse" + android:tint="@android:color/white" android:background="@drawable/print_button"> </ImageButton> diff --git a/packages/SettingsLib/res/layout/preference_checkable_two_target.xml b/packages/SettingsLib/res/layout/preference_checkable_two_target.xml new file mode 100644 index 000000000000..1a47afc81d55 --- /dev/null +++ b/packages/SettingsLib/res/layout/preference_checkable_two_target.xml @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2018 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. + --> + +<!-- Based off preference_material_settings.xml except that ripple on only on the left side. --> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:settings="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="?android:attr/listPreferredItemHeightSmall" + android:gravity="center_vertical" + android:background="@android:color/transparent" + android:clipToPadding="false"> + + <LinearLayout + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="1" + android:background="?android:attr/selectableItemBackground" + android:gravity="start|center_vertical" + android:clipToPadding="false" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> + + <LinearLayout + android:id="@+id/checkbox_container" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="start|center_vertical" + android:minWidth="56dp" + android:orientation="horizontal" + android:clipToPadding="false" + android:paddingTop="4dp" + android:paddingBottom="4dp"> + <include layout="@layout/preference_widget_checkbox" /> + </LinearLayout> + + <RelativeLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:paddingTop="16dp" + android:paddingBottom="16dp"> + + <TextView + android:id="@android:id/title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:singleLine="true" + android:textAppearance="?android:attr/textAppearanceListItem" + android:ellipsize="marquee" /> + + <TextView + android:id="@android:id/summary" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@android:id/title" + android:layout_alignStart="@android:id/title" + android:textAppearance="?android:attr/textAppearanceListItemSecondary" + android:textColor="?android:attr/textColorSecondary" + android:maxLines="10" /> + + </RelativeLayout> + + </LinearLayout> + + <include layout="@layout/preference_two_target_divider" /> + + <!-- Preference should place its actual preference widget here. --> + <LinearLayout + android:id="@android:id/widget_frame" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:minWidth="64dp" + android:gravity="center" + android:orientation="vertical" /> + +</LinearLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/anim/dismiss_all_shape_animation_1.xml b/packages/SystemUI/res/anim/dismiss_all_shape_animation_1.xml deleted file mode 100644 index 3cc98d8f7ed9..000000000000 --- a/packages/SystemUI/res/anim/dismiss_all_shape_animation_1.xml +++ /dev/null @@ -1,22 +0,0 @@ -<!-- Copyright (C) 2014 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. ---> -<set xmlns:android="http://schemas.android.com/apk/res/android" > - <objectAnimator - android:duration="500" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:pathData="M 0,0 c 31.33333,0 156.66667,0 188,0 " - android:interpolator="@android:interpolator/fast_out_slow_in" /> -</set> diff --git a/packages/SystemUI/res/anim/dismiss_all_shape_animation_2.xml b/packages/SystemUI/res/anim/dismiss_all_shape_animation_2.xml deleted file mode 100644 index eda843d03ba2..000000000000 --- a/packages/SystemUI/res/anim/dismiss_all_shape_animation_2.xml +++ /dev/null @@ -1,30 +0,0 @@ -<!-- Copyright (C) 2014 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. ---> -<set xmlns:android="http://schemas.android.com/apk/res/android" > - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="33" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:pathData="M -12,18 L -12,18" /> - <objectAnimator - android:duration="500" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:pathData="M -12,18 c 31.33333,0 156.66667,0 188,0 " - android:interpolator="@android:interpolator/fast_out_slow_in" /> - </set> -</set> diff --git a/packages/SystemUI/res/anim/dismiss_all_shape_animation_3.xml b/packages/SystemUI/res/anim/dismiss_all_shape_animation_3.xml deleted file mode 100644 index cab3d5cc2367..000000000000 --- a/packages/SystemUI/res/anim/dismiss_all_shape_animation_3.xml +++ /dev/null @@ -1,30 +0,0 @@ -<!-- Copyright (C) 2014 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. ---> -<set xmlns:android="http://schemas.android.com/apk/res/android" > - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="67" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:pathData="M -24,36 L -24,36" /> - <objectAnimator - android:duration="500" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:pathData="M -24,36 c 31.33333,0 156.66667,0 188,0 " - android:interpolator="@android:interpolator/fast_out_slow_in" /> - </set> -</set> diff --git a/packages/SystemUI/res/anim/dismiss_all_shape_animation_rectangle_path_1.xml b/packages/SystemUI/res/anim/dismiss_all_shape_animation_rectangle_path_1.xml deleted file mode 100644 index e435d9a9a69e..000000000000 --- a/packages/SystemUI/res/anim/dismiss_all_shape_animation_rectangle_path_1.xml +++ /dev/null @@ -1,31 +0,0 @@ -<!-- Copyright (C) 2014 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. ---> -<set xmlns:android="http://schemas.android.com/apk/res/android" > - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="150" - android:propertyName="fillAlpha" - android:valueFrom="1" - android:valueTo="1" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="100" - android:propertyName="fillAlpha" - android:valueFrom="1" - android:valueTo="0" - android:interpolator="@android:interpolator/linear" /> - </set> -</set> diff --git a/packages/SystemUI/res/anim/dismiss_all_shape_animation_rectangle_path_1_1.xml b/packages/SystemUI/res/anim/dismiss_all_shape_animation_rectangle_path_1_1.xml deleted file mode 100644 index e31a7dbcebc5..000000000000 --- a/packages/SystemUI/res/anim/dismiss_all_shape_animation_rectangle_path_1_1.xml +++ /dev/null @@ -1,31 +0,0 @@ -<!-- Copyright (C) 2014 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. ---> -<set xmlns:android="http://schemas.android.com/apk/res/android" > - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="183" - android:propertyName="fillAlpha" - android:valueFrom="1" - android:valueTo="1" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="100" - android:propertyName="fillAlpha" - android:valueFrom="1" - android:valueTo="0" - android:interpolator="@android:interpolator/linear" /> - </set> -</set> diff --git a/packages/SystemUI/res/anim/dismiss_all_shape_animation_rectangle_path_1_2.xml b/packages/SystemUI/res/anim/dismiss_all_shape_animation_rectangle_path_1_2.xml deleted file mode 100644 index 2409612cb250..000000000000 --- a/packages/SystemUI/res/anim/dismiss_all_shape_animation_rectangle_path_1_2.xml +++ /dev/null @@ -1,31 +0,0 @@ -<!-- Copyright (C) 2014 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. ---> -<set xmlns:android="http://schemas.android.com/apk/res/android" > - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="217" - android:propertyName="fillAlpha" - android:valueFrom="1" - android:valueTo="1" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="100" - android:propertyName="fillAlpha" - android:valueFrom="1" - android:valueTo="0" - android:interpolator="@android:interpolator/linear" /> - </set> -</set> diff --git a/packages/SystemUI/res/anim/fab_elevation.xml b/packages/SystemUI/res/anim/fab_elevation.xml deleted file mode 100644 index 2c76a865a470..000000000000 --- a/packages/SystemUI/res/anim/fab_elevation.xml +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2015 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:state_enabled="true" android:state_pressed="true"> - <set> - <objectAnimator - android:duration="@android:integer/config_shortAnimTime" - android:propertyName="translationZ" - android:valueTo="@dimen/fab_press_translation_z" - android:valueType="floatType" /> - </set> - </item> - <item> - <set> - <objectAnimator - android:duration="@android:integer/config_shortAnimTime" - android:propertyName="translationZ" - android:valueTo="0" - android:valueType="floatType" /> - </set> - </item> -</selector> diff --git a/packages/SystemUI/res/anim/ic_landscape_to_rotate_arrows_animation.xml b/packages/SystemUI/res/anim/ic_landscape_to_rotate_arrows_animation.xml deleted file mode 100644 index 8fdad809f0d1..000000000000 --- a/packages/SystemUI/res/anim/ic_landscape_to_rotate_arrows_animation.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <objectAnimator - android:duration="616" - android:propertyName="rotation" - android:valueFrom="-90.0" - android:valueTo="0.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/fast_out_slow_in" /> -</set> diff --git a/packages/SystemUI/res/anim/ic_landscape_to_rotate_bottom_merged_animation.xml b/packages/SystemUI/res/anim/ic_landscape_to_rotate_bottom_merged_animation.xml deleted file mode 100644 index 3c3c131ef16b..000000000000 --- a/packages/SystemUI/res/anim/ic_landscape_to_rotate_bottom_merged_animation.xml +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="50" - android:propertyName="fillAlpha" - android:valueFrom="0.0" - android:valueTo="0.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="83" - android:propertyName="fillAlpha" - android:valueFrom="0.0" - android:valueTo="1.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - </set> -</set> diff --git a/packages/SystemUI/res/anim/ic_landscape_to_rotate_landscape_animation.xml b/packages/SystemUI/res/anim/ic_landscape_to_rotate_landscape_animation.xml deleted file mode 100644 index 57132e19dcc5..000000000000 --- a/packages/SystemUI/res/anim/ic_landscape_to_rotate_landscape_animation.xml +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <objectAnimator - android:duration="466" - android:propertyName="scaleX" - android:valueFrom="1.0" - android:valueTo="0.909" - android:valueType="floatType" - android:interpolator="@interpolator/ic_landscape_to_rotate_animation_interpolator_0" /> - <objectAnimator - android:duration="466" - android:propertyName="scaleY" - android:valueFrom="1.0" - android:valueTo="0.909" - android:valueType="floatType" - android:interpolator="@interpolator/ic_landscape_to_rotate_animation_interpolator_0" /> - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="50" - android:propertyName="rotation" - android:valueFrom="0.0" - android:valueTo="0.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="400" - android:propertyName="rotation" - android:valueFrom="0.0" - android:valueTo="45.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/fast_out_slow_in" /> - </set> -</set> diff --git a/packages/SystemUI/res/anim/ic_portrait_to_rotate_arrows_0_animation.xml b/packages/SystemUI/res/anim/ic_portrait_to_rotate_arrows_0_animation.xml deleted file mode 100644 index ad2a5fad5268..000000000000 --- a/packages/SystemUI/res/anim/ic_portrait_to_rotate_arrows_0_animation.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="116" - android:propertyName="scaleX" - android:valueFrom="1.0" - android:valueTo="1.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="333" - android:propertyName="scaleX" - android:valueFrom="1.0" - android:valueTo="0.9" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - </set> - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="116" - android:propertyName="scaleY" - android:valueFrom="1.0" - android:valueTo="1.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="333" - android:propertyName="scaleY" - android:valueFrom="1.0" - android:valueTo="0.9" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - </set> -</set> diff --git a/packages/SystemUI/res/anim/ic_portrait_to_rotate_arrows_animation.xml b/packages/SystemUI/res/anim/ic_portrait_to_rotate_arrows_animation.xml deleted file mode 100644 index cdb7890dc170..000000000000 --- a/packages/SystemUI/res/anim/ic_portrait_to_rotate_arrows_animation.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <objectAnimator - android:duration="616" - android:propertyName="rotation" - android:valueFrom="0.0" - android:valueTo="-221.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/fast_out_slow_in" /> -</set> diff --git a/packages/SystemUI/res/anim/ic_portrait_to_rotate_bottom_merged_animation.xml b/packages/SystemUI/res/anim/ic_portrait_to_rotate_bottom_merged_animation.xml deleted file mode 100644 index 46100b407831..000000000000 --- a/packages/SystemUI/res/anim/ic_portrait_to_rotate_bottom_merged_animation.xml +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="400" - android:propertyName="fillAlpha" - android:valueFrom="1.0" - android:valueTo="1.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="83" - android:propertyName="fillAlpha" - android:valueFrom="1.0" - android:valueTo="0.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - </set> -</set> diff --git a/packages/SystemUI/res/anim/ic_portrait_to_rotate_device_0_animation.xml b/packages/SystemUI/res/anim/ic_portrait_to_rotate_device_0_animation.xml deleted file mode 100644 index 8f6d24d0d61d..000000000000 --- a/packages/SystemUI/res/anim/ic_portrait_to_rotate_device_0_animation.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <objectAnimator - android:duration="400" - android:propertyName="rotation" - android:valueFrom="0.0" - android:valueTo="-135.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/fast_out_slow_in" /> -</set> diff --git a/packages/SystemUI/res/anim/ic_portrait_to_rotate_device_merged_animation.xml b/packages/SystemUI/res/anim/ic_portrait_to_rotate_device_merged_animation.xml deleted file mode 100644 index 300ed53052a8..000000000000 --- a/packages/SystemUI/res/anim/ic_portrait_to_rotate_device_merged_animation.xml +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="66" - android:propertyName="pathData" - android:valueFrom="M -3.5,-20.5 c -1.19999694824,-1.19999694824 -3.10000610352,-1.19999694824 -4.19999694824,0.0 c 0.0,0.0 -12.8000030518,12.6999969482 -12.8000030518,12.6999969482 c -1.19999694824,1.19999694824 -1.19999694824,3.10000610352 0.0,4.19999694824 c 0.0,0.0 24.0,24.0000152588 24.0,24.0000152588 c 1.19999694824,1.19999694824 3.10000610352,1.19999694824 4.19999694824,0.0 c 0.0,0.0 12.6999969482,-12.700012207 12.6999969482,-12.700012207 c 1.20001220703,-1.19999694824 1.20001220703,-3.09999084473 0.0,-4.19999694824 c 0.0,0.0 -23.8999938965,-24.0 -23.8999938965,-24.0 Z M 2.84999084473,15.5500183105 c 0.0,0.0 -18.6000061035,-18.5000457764 -18.6000061035,-18.5000457764 c 0.0,0.0 12.5999908447,-12.8000030518 12.5999908447,-12.8000030518 c 0.0,0.0 18.6000213623,18.5000457764 18.6000213623,18.5000457764 c 0.0,0.0 -12.6000061035,12.8000030518 -12.6000061035,12.8000030518 Z" - android:valueTo="M -3.5,-20.5 c -1.19999694824,-1.19999694824 -3.10000610352,-1.19999694824 -4.19999694824,0.0 c 0.0,0.0 -12.8000030518,12.6999969482 -12.8000030518,12.6999969482 c -1.19999694824,1.19999694824 -1.19999694824,3.10000610352 0.0,4.19999694824 c 0.0,0.0 24.0,24.0000152588 24.0,24.0000152588 c 1.19999694824,1.19999694824 3.10000610352,1.19999694824 4.19999694824,0.0 c 0.0,0.0 12.6999969482,-12.700012207 12.6999969482,-12.700012207 c 1.20001220703,-1.19999694824 1.20001220703,-3.09999084473 0.0,-4.19999694824 c 0.0,0.0 -23.8999938965,-24.0 -23.8999938965,-24.0 Z M 2.84999084473,15.5500183105 c 0.0,0.0 -18.6000061035,-18.5000457764 -18.6000061035,-18.5000457764 c 0.0,0.0 12.5999908447,-12.8000030518 12.5999908447,-12.8000030518 c 0.0,0.0 18.6000213623,18.5000457764 18.6000213623,18.5000457764 c 0.0,0.0 -12.6000061035,12.8000030518 -12.6000061035,12.8000030518 Z" - android:valueType="pathType" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="216" - android:propertyName="pathData" - android:valueFrom="M -3.5,-20.5 c -1.19999694824,-1.19999694824 -3.10000610352,-1.19999694824 -4.19999694824,0.0 c 0.0,0.0 -12.8000030518,12.6999969482 -12.8000030518,12.6999969482 c -1.19999694824,1.19999694824 -1.19999694824,3.10000610352 0.0,4.19999694824 c 0.0,0.0 24.0,24.0000152588 24.0,24.0000152588 c 1.19999694824,1.19999694824 3.10000610352,1.19999694824 4.19999694824,0.0 c 0.0,0.0 12.6999969482,-12.700012207 12.6999969482,-12.700012207 c 1.20001220703,-1.19999694824 1.20001220703,-3.09999084473 0.0,-4.19999694824 c 0.0,0.0 -23.8999938965,-24.0 -23.8999938965,-24.0 Z M 2.84999084473,15.5500183105 c 0.0,0.0 -18.6000061035,-18.5000457764 -18.6000061035,-18.5000457764 c 0.0,0.0 12.5999908447,-12.8000030518 12.5999908447,-12.8000030518 c 0.0,0.0 18.6000213623,18.5000457764 18.6000213623,18.5000457764 c 0.0,0.0 -12.6000061035,12.8000030518 -12.6000061035,12.8000030518 Z" - android:valueTo="M -3.34053039551,-22.9980926514 c -1.3207244873,-1.3207244873 -3.46876525879,-1.26383972168 -4.74829101563,0.125762939453 c 0.0,0.0 -14.8512420654,14.7411804199 -14.8512420654,14.7411804199 c -1.39259338379,1.392578125 -1.44947814941,3.54061889648 -0.125762939453,4.74827575684 c 0.0,0.0 26.4143981934,26.4144134521 26.4143981934,26.4144134521 c 1.3207244873,1.3207244873 3.46876525879,1.26382446289 4.74829101562,-0.125762939453 c 0.0,0.0 14.7381896973,-14.7381896973 14.7381896973,-14.7381896973 c 1.392578125,-1.39259338379 1.44947814941,-3.54061889648 0.125762939453,-4.74829101562 c 0.0,0.0 -26.3013458252,-26.417388916 -26.3013458252,-26.417388916 Z M 2.87156677246,16.9857940674 c 0.0,0.0 -19.7573547363,-19.7573699951 -19.7573547363,-19.7573699951 c 0.0,0.0 14.0142059326,-14.2142181396 14.0142059326,-14.2142181396 c 0.0,0.0 19.7573699951,19.7573699951 19.7573699951,19.7573699951 c 0.0,0.0 -14.0142211914,14.2142181396 -14.0142211914,14.2142181396 Z" - android:valueType="pathType" - android:interpolator="@android:interpolator/fast_out_slow_in" /> - </set> -</set> diff --git a/packages/SystemUI/res/anim/ic_rotate_to_landscape_arrows_0_animation.xml b/packages/SystemUI/res/anim/ic_rotate_to_landscape_arrows_0_animation.xml deleted file mode 100644 index ad2a5fad5268..000000000000 --- a/packages/SystemUI/res/anim/ic_rotate_to_landscape_arrows_0_animation.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="116" - android:propertyName="scaleX" - android:valueFrom="1.0" - android:valueTo="1.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="333" - android:propertyName="scaleX" - android:valueFrom="1.0" - android:valueTo="0.9" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - </set> - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="116" - android:propertyName="scaleY" - android:valueFrom="1.0" - android:valueTo="1.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="333" - android:propertyName="scaleY" - android:valueFrom="1.0" - android:valueTo="0.9" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - </set> -</set> diff --git a/packages/SystemUI/res/anim/ic_rotate_to_landscape_arrows_animation.xml b/packages/SystemUI/res/anim/ic_rotate_to_landscape_arrows_animation.xml deleted file mode 100644 index c1521520c427..000000000000 --- a/packages/SystemUI/res/anim/ic_rotate_to_landscape_arrows_animation.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <objectAnimator - android:duration="616" - android:propertyName="rotation" - android:valueFrom="0.0" - android:valueTo="-180.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/fast_out_slow_in" /> -</set> diff --git a/packages/SystemUI/res/anim/ic_rotate_to_landscape_bottom_merged_animation.xml b/packages/SystemUI/res/anim/ic_rotate_to_landscape_bottom_merged_animation.xml deleted file mode 100644 index b2c1eb8b93a3..000000000000 --- a/packages/SystemUI/res/anim/ic_rotate_to_landscape_bottom_merged_animation.xml +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="200" - android:propertyName="fillAlpha" - android:valueFrom="1.0" - android:valueTo="1.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="83" - android:propertyName="fillAlpha" - android:valueFrom="1.0" - android:valueTo="0.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - </set> -</set> diff --git a/packages/SystemUI/res/anim/ic_rotate_to_landscape_landscape_animation.xml b/packages/SystemUI/res/anim/ic_rotate_to_landscape_landscape_animation.xml deleted file mode 100644 index 2a9bbe32975e..000000000000 --- a/packages/SystemUI/res/anim/ic_rotate_to_landscape_landscape_animation.xml +++ /dev/null @@ -1,60 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="116" - android:propertyName="scaleX" - android:valueFrom="0.909" - android:valueTo="0.909" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="166" - android:propertyName="scaleX" - android:valueFrom="0.909" - android:valueTo="1.0" - android:valueType="floatType" - android:interpolator="@interpolator/ic_rotate_to_landscape_animation_interpolator_0" /> - </set> - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="116" - android:propertyName="scaleY" - android:valueFrom="0.909" - android:valueTo="0.909" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="166" - android:propertyName="scaleY" - android:valueFrom="0.909" - android:valueTo="1.0" - android:valueType="floatType" - android:interpolator="@interpolator/ic_rotate_to_landscape_animation_interpolator_0" /> - </set> - <objectAnimator - android:duration="616" - android:propertyName="rotation" - android:valueFrom="45.0" - android:valueTo="0.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/fast_out_slow_in" /> -</set> diff --git a/packages/SystemUI/res/anim/ic_rotate_to_portrait_arrows_0_animation.xml b/packages/SystemUI/res/anim/ic_rotate_to_portrait_arrows_0_animation.xml deleted file mode 100644 index ce267704dac5..000000000000 --- a/packages/SystemUI/res/anim/ic_rotate_to_portrait_arrows_0_animation.xml +++ /dev/null @@ -1,33 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <objectAnimator - android:duration="466" - android:propertyName="scaleX" - android:valueFrom="0.9" - android:valueTo="1.0" - android:valueType="floatType" - android:interpolator="@interpolator/ic_rotate_to_portrait_animation_interpolator_0" /> - <objectAnimator - android:duration="466" - android:propertyName="scaleY" - android:valueFrom="0.9" - android:valueTo="1.0" - android:valueType="floatType" - android:interpolator="@interpolator/ic_rotate_to_portrait_animation_interpolator_0" /> -</set> diff --git a/packages/SystemUI/res/anim/ic_rotate_to_portrait_arrows_animation.xml b/packages/SystemUI/res/anim/ic_rotate_to_portrait_arrows_animation.xml deleted file mode 100644 index 6e8941d608cd..000000000000 --- a/packages/SystemUI/res/anim/ic_rotate_to_portrait_arrows_animation.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <objectAnimator - android:duration="616" - android:propertyName="rotation" - android:valueFrom="-221.0" - android:valueTo="0.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/fast_out_slow_in" /> -</set> diff --git a/packages/SystemUI/res/anim/ic_rotate_to_portrait_bottom_merged_animation.xml b/packages/SystemUI/res/anim/ic_rotate_to_portrait_bottom_merged_animation.xml deleted file mode 100644 index 3c3c131ef16b..000000000000 --- a/packages/SystemUI/res/anim/ic_rotate_to_portrait_bottom_merged_animation.xml +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="50" - android:propertyName="fillAlpha" - android:valueFrom="0.0" - android:valueTo="0.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="83" - android:propertyName="fillAlpha" - android:valueFrom="0.0" - android:valueTo="1.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - </set> -</set> diff --git a/packages/SystemUI/res/anim/ic_rotate_to_portrait_device_0_animation.xml b/packages/SystemUI/res/anim/ic_rotate_to_portrait_device_0_animation.xml deleted file mode 100644 index fd8e4f881160..000000000000 --- a/packages/SystemUI/res/anim/ic_rotate_to_portrait_device_0_animation.xml +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="50" - android:propertyName="rotation" - android:valueFrom="-135.0" - android:valueTo="-135.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="400" - android:propertyName="rotation" - android:valueFrom="-135.0" - android:valueTo="0.0" - android:valueType="floatType" - android:interpolator="@android:interpolator/fast_out_slow_in" /> - </set> -</set> diff --git a/packages/SystemUI/res/anim/ic_rotate_to_portrait_device_merged_animation.xml b/packages/SystemUI/res/anim/ic_rotate_to_portrait_device_merged_animation.xml deleted file mode 100644 index a77a536e46c0..000000000000 --- a/packages/SystemUI/res/anim/ic_rotate_to_portrait_device_merged_animation.xml +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<set - xmlns:android="http://schemas.android.com/apk/res/android" > - <set - android:ordering="sequentially" > - <objectAnimator - android:duration="50" - android:propertyName="pathData" - android:valueFrom="M -3.34053039551,-22.9980926514 c -1.3207244873,-1.3207244873 -3.46876525879,-1.26383972168 -4.74829101563,0.125762939453 c 0.0,0.0 -14.8512420654,14.7411804199 -14.8512420654,14.7411804199 c -1.39259338379,1.392578125 -1.44947814941,3.54061889648 -0.125762939453,4.74827575684 c 0.0,0.0 26.4143981934,26.4144134521 26.4143981934,26.4144134521 c 1.3207244873,1.3207244873 3.46876525879,1.26382446289 4.74829101562,-0.125762939453 c 0.0,0.0 14.7381896973,-14.7381896973 14.7381896973,-14.7381896973 c 1.392578125,-1.39259338379 1.44947814941,-3.54061889648 0.125762939453,-4.74829101562 c 0.0,0.0 -26.3013458252,-26.417388916 -26.3013458252,-26.417388916 Z M 2.87156677246,16.9857940674 c 0.0,0.0 -19.7573547363,-19.7573699951 -19.7573547363,-19.7573699951 c 0.0,0.0 14.0142059326,-14.2142181396 14.0142059326,-14.2142181396 c 0.0,0.0 19.7573699951,19.7573699951 19.7573699951,19.7573699951 c 0.0,0.0 -14.0142211914,14.2142181396 -14.0142211914,14.2142181396 Z" - android:valueTo="M -3.34053039551,-22.9980926514 c -1.3207244873,-1.3207244873 -3.46876525879,-1.26383972168 -4.74829101563,0.125762939453 c 0.0,0.0 -14.8512420654,14.7411804199 -14.8512420654,14.7411804199 c -1.39259338379,1.392578125 -1.44947814941,3.54061889648 -0.125762939453,4.74827575684 c 0.0,0.0 26.4143981934,26.4144134521 26.4143981934,26.4144134521 c 1.3207244873,1.3207244873 3.46876525879,1.26382446289 4.74829101562,-0.125762939453 c 0.0,0.0 14.7381896973,-14.7381896973 14.7381896973,-14.7381896973 c 1.392578125,-1.39259338379 1.44947814941,-3.54061889648 0.125762939453,-4.74829101562 c 0.0,0.0 -26.3013458252,-26.417388916 -26.3013458252,-26.417388916 Z M 2.87156677246,16.9857940674 c 0.0,0.0 -19.7573547363,-19.7573699951 -19.7573547363,-19.7573699951 c 0.0,0.0 14.0142059326,-14.2142181396 14.0142059326,-14.2142181396 c 0.0,0.0 19.7573699951,19.7573699951 19.7573699951,19.7573699951 c 0.0,0.0 -14.0142211914,14.2142181396 -14.0142211914,14.2142181396 Z" - android:valueType="pathType" - android:interpolator="@android:interpolator/linear" /> - <objectAnimator - android:duration="500" - android:propertyName="pathData" - android:valueFrom="M -3.34053039551,-22.9980926514 c -1.3207244873,-1.3207244873 -3.46876525879,-1.26383972168 -4.74829101563,0.125762939453 c 0.0,0.0 -14.8512420654,14.7411804199 -14.8512420654,14.7411804199 c -1.39259338379,1.392578125 -1.44947814941,3.54061889648 -0.125762939453,4.74827575684 c 0.0,0.0 26.4143981934,26.4144134521 26.4143981934,26.4144134521 c 1.3207244873,1.3207244873 3.46876525879,1.26382446289 4.74829101562,-0.125762939453 c 0.0,0.0 14.7381896973,-14.7381896973 14.7381896973,-14.7381896973 c 1.392578125,-1.39259338379 1.44947814941,-3.54061889648 0.125762939453,-4.74829101562 c 0.0,0.0 -26.3013458252,-26.417388916 -26.3013458252,-26.417388916 Z M 2.87156677246,16.9857940674 c 0.0,0.0 -19.7573547363,-19.7573699951 -19.7573547363,-19.7573699951 c 0.0,0.0 14.0142059326,-14.2142181396 14.0142059326,-14.2142181396 c 0.0,0.0 19.7573699951,19.7573699951 19.7573699951,19.7573699951 c 0.0,0.0 -14.0142211914,14.2142181396 -14.0142211914,14.2142181396 Z" - android:valueTo="M -3.5,-20.5 c -1.19999694824,-1.19999694824 -3.10000610352,-1.19999694824 -4.19999694824,0.0 c 0.0,0.0 -12.8000030518,12.6999969482 -12.8000030518,12.6999969482 c -1.19999694824,1.19999694824 -1.19999694824,3.10000610352 0.0,4.19999694824 c 0.0,0.0 24.0,24.0000152588 24.0,24.0000152588 c 1.19999694824,1.19999694824 3.10000610352,1.19999694824 4.19999694824,0.0 c 0.0,0.0 12.6999969482,-12.700012207 12.6999969482,-12.700012207 c 1.20001220703,-1.19999694824 1.20001220703,-3.09999084473 0.0,-4.19999694824 c 0.0,0.0 -23.8999938965,-24.0 -23.8999938965,-24.0 Z M 2.84999084473,15.5500183105 c 0.0,0.0 -18.6000061035,-18.5000457764 -18.6000061035,-18.5000457764 c 0.0,0.0 12.5999908447,-12.8000030518 12.5999908447,-12.8000030518 c 0.0,0.0 18.6000213623,18.5000457764 18.6000213623,18.5000457764 c 0.0,0.0 -12.6000061035,12.8000030518 -12.6000061035,12.8000030518 Z" - android:valueType="pathType" - android:interpolator="@android:interpolator/fast_out_slow_in" /> - </set> -</set> diff --git a/packages/SystemUI/res/anim/ic_signal_blink_1.xml b/packages/SystemUI/res/anim/ic_signal_blink_1.xml deleted file mode 100644 index 64580d189c0d..000000000000 --- a/packages/SystemUI/res/anim/ic_signal_blink_1.xml +++ /dev/null @@ -1,38 +0,0 @@ -<!-- - Copyright (C) 2015 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. ---> -<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" - android:interpolator="@android:anim/linear_interpolator" - android:duration="@integer/carrier_network_change_anim_time" - android:repeatCount="-1"> - - <propertyValuesHolder - android:propertyName="fillColor" - android:valueType="colorType"> - <keyframe - android:fraction="0.0" - android:value="?attr/fillColor"/> - <keyframe - android:fraction="0.32" - android:value="?attr/fillColor"/> - <keyframe - android:fraction="0.33" - android:value="?attr/backgroundColor"/> - <keyframe - android:fraction="1.0" - android:value="?attr/backgroundColor"/> - </propertyValuesHolder> - -</objectAnimator> diff --git a/packages/SystemUI/res/anim/ic_signal_blink_2.xml b/packages/SystemUI/res/anim/ic_signal_blink_2.xml deleted file mode 100644 index f055cd078558..000000000000 --- a/packages/SystemUI/res/anim/ic_signal_blink_2.xml +++ /dev/null @@ -1,44 +0,0 @@ -<!-- - Copyright (C) 2015 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. ---> -<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" - android:interpolator="@android:anim/linear_interpolator" - android:duration="@integer/carrier_network_change_anim_time" - android:repeatCount="-1"> - - <propertyValuesHolder - android:propertyName="fillColor" - android:valueType="colorType"> - <keyframe - android:fraction="0.0" - android:value="?attr/backgroundColor"/> - <keyframe - android:fraction="0.32" - android:value="?attr/backgroundColor"/> - <keyframe - android:fraction="0.33" - android:value="?attr/fillColor"/> - <keyframe - android:fraction="0.66" - android:value="?attr/fillColor"/> - <keyframe - android:fraction="0.67" - android:value="?attr/backgroundColor"/> - <keyframe - android:fraction="1.0" - android:value="?attr/backgroundColor"/> - </propertyValuesHolder> - -</objectAnimator> diff --git a/packages/SystemUI/res/anim/ic_signal_blink_3.xml b/packages/SystemUI/res/anim/ic_signal_blink_3.xml deleted file mode 100644 index abcd77410220..000000000000 --- a/packages/SystemUI/res/anim/ic_signal_blink_3.xml +++ /dev/null @@ -1,38 +0,0 @@ -<!-- - Copyright (C) 2015 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. ---> -<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" - android:interpolator="@android:anim/linear_interpolator" - android:duration="@integer/carrier_network_change_anim_time" - android:repeatCount="-1"> - - <propertyValuesHolder - android:propertyName="fillColor" - android:valueType="colorType"> - <keyframe - android:fraction="0.0" - android:value="?attr/backgroundColor"/> - <keyframe - android:fraction="0.66" - android:value="?attr/backgroundColor"/> - <keyframe - android:fraction="0.67" - android:value="?attr/fillColor"/> - <keyframe - android:fraction="1.0" - android:value="?attr/fillColor"/> - </propertyValuesHolder> - -</objectAnimator> diff --git a/packages/SystemUI/res/anim/system_in.xml b/packages/SystemUI/res/anim/system_in.xml deleted file mode 100644 index 630fd72189cd..000000000000 --- a/packages/SystemUI/res/anim/system_in.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 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. ---> - -<set xmlns:android="http://schemas.android.com/apk/res/android" - > - <alpha android:fromAlpha="0.0" android:toAlpha="1.0" - android:duration="@android:integer/config_longAnimTime" - /> -</set> diff --git a/packages/SystemUI/res/anim/system_out.xml b/packages/SystemUI/res/anim/system_out.xml deleted file mode 100644 index 4717e47784b9..000000000000 --- a/packages/SystemUI/res/anim/system_out.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 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. ---> - -<set xmlns:android="http://schemas.android.com/apk/res/android" - > - <alpha android:toAlpha="0.0" android:fromAlpha="1.0" - android:duration="@android:integer/config_longAnimTime" - /> -</set> diff --git a/packages/SystemUI/res/drawable/dismiss_all_shape_animation.xml b/packages/SystemUI/res/drawable/dismiss_all_shape_animation.xml deleted file mode 100644 index 9e71cbeebea4..000000000000 --- a/packages/SystemUI/res/drawable/dismiss_all_shape_animation.xml +++ /dev/null @@ -1,21 +0,0 @@ -<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" - android:drawable="@drawable/dismiss_all_shape" > - <target - android:name="3" - android:animation="@anim/dismiss_all_shape_animation_3" /> - <target - android:name="rectangle_path_1_2" - android:animation="@anim/dismiss_all_shape_animation_rectangle_path_1_2" /> - <target - android:name="2" - android:animation="@anim/dismiss_all_shape_animation_2" /> - <target - android:name="rectangle_path_1_1" - android:animation="@anim/dismiss_all_shape_animation_rectangle_path_1_1" /> - <target - android:name="1" - android:animation="@anim/dismiss_all_shape_animation_1" /> - <target - android:name="rectangle_path_1" - android:animation="@anim/dismiss_all_shape_animation_rectangle_path_1" /> -</animated-vector> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java index a5e7f04be281..8821679aadf1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java @@ -33,7 +33,7 @@ import com.android.systemui.statusbar.notification.row.NotificationInflater.Infl * dozing and/or in AOD. The pulse uses the notification's ambient view and pops in briefly * before automatically dismissing the alert. */ -public final class AmbientPulseManager extends AlertingNotificationManager { +public class AmbientPulseManager extends AlertingNotificationManager { protected final ArraySet<OnAmbientChangedListener> mListeners = new ArraySet<>(); @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 626e68850c12..5d640e0216e0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -18,6 +18,8 @@ package com.android.systemui.statusbar.notification.stack; import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator .ExpandAnimationParameters; +import static com.android.systemui.statusbar.notification.stack.StackStateAnimator + .ANIMATION_DURATION_SWIPE; import static com.android.systemui.statusbar.phone.NotificationIconAreaController.LOW_PRIORITY; import android.animation.Animator; @@ -5093,7 +5095,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd if (i == 0) { endRunnable = animationFinishAction; } - dismissViewAnimated(view, endRunnable, totalDelay, 260); + dismissViewAnimated(view, endRunnable, totalDelay, ANIMATION_DURATION_SWIPE); currentDelay = Math.max(50, currentDelay - rowDelayDecrement); totalDelay += currentDelay; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java index fef28cf1393e..d6905478a043 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java @@ -44,6 +44,7 @@ public class StackStateAnimator { public static final int ANIMATION_DURATION_WAKEUP = 500; public static final int ANIMATION_DURATION_GO_TO_FULL_SHADE = 448; public static final int ANIMATION_DURATION_APPEAR_DISAPPEAR = 464; + public static final int ANIMATION_DURATION_SWIPE = 260; public static final int ANIMATION_DURATION_DIMMED_ACTIVATED = 220; public static final int ANIMATION_DURATION_CLOSE_REMOTE_INPUT = 150; public static final int ANIMATION_DURATION_HEADS_UP_APPEAR = 550; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationGestureAction.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationGestureAction.java index 83067f6cff87..a8d00c454548 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationGestureAction.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationGestureAction.java @@ -127,6 +127,15 @@ public abstract class NavigationGestureAction { } /** + * Decide if the controller should not send the current motion event to launcher via + * {@link OverviewProxyService} + * @return if controller should not proxy + */ + public boolean disableProxyEvents() { + return false; + } + + /** * Tell if action is enabled. Compared to {@link #canPerformAction()} this is based on settings * if the action is disabled for a particular gesture. For example a back action can be enabled * however if there is nothing to back to then {@link #canPerformAction()} should return false. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickScrubAction.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickScrubAction.java index 74744f1408fb..2b202eb83431 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickScrubAction.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickScrubAction.java @@ -212,6 +212,11 @@ public class QuickScrubAction extends NavigationGestureAction { } @Override + public boolean disableProxyEvents() { + return true; + } + + @Override protected void onGestureStart(MotionEvent event) { updateHighlight(); ObjectAnimator trackAnimator = ObjectAnimator.ofPropertyValuesHolder(this, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java index 43e86d66b8be..2cbf27c6e61c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java @@ -275,25 +275,21 @@ public class QuickStepController implements GestureHelper { if (mDragVPositive ? (posV < touchDownV) : (posV > touchDownV)) { // Swiping up gesture tryToStartGesture(mGestureActions[ACTION_SWIPE_UP_INDEX], - false /* alignedWithNavBar */, false /* positiveDirection */, - event); + false /* alignedWithNavBar */, event); } else { // Swiping down gesture tryToStartGesture(mGestureActions[ACTION_SWIPE_DOWN_INDEX], - false /* alignedWithNavBar */, true /* positiveDirection */, - event); + false /* alignedWithNavBar */, event); } } else if (exceededSwipeHorizontalTouchSlop) { if (mDragHPositive ? (posH < touchDownH) : (posH > touchDownH)) { // Swiping left (ltr) gesture tryToStartGesture(mGestureActions[ACTION_SWIPE_LEFT_INDEX], - true /* alignedWithNavBar */, false /* positiveDirection */, - event); + true /* alignedWithNavBar */, event); } else { // Swiping right (ltr) gesture tryToStartGesture(mGestureActions[ACTION_SWIPE_RIGHT_INDEX], - true /* alignedWithNavBar */, true /* positiveDirection */, - event); + true /* alignedWithNavBar */, event); } } } @@ -306,7 +302,6 @@ public class QuickStepController implements GestureHelper { case MotionEvent.ACTION_UP: if (mCurrentAction != null) { mCurrentAction.endGesture(); - mCurrentAction = null; } // Return the hit target back to its original position @@ -329,6 +324,11 @@ public class QuickStepController implements GestureHelper { if (shouldProxyEvents(action)) { proxyMotionEvents(event); } + + // Clear action when gesture and event proxy finishes + if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) { + mCurrentAction = null; + } return mCurrentAction != null || deadZoneConsumed; } @@ -354,8 +354,7 @@ public class QuickStepController implements GestureHelper { private boolean shouldProxyEvents(int action) { final boolean actionValid = (mCurrentAction == null - || (mGestureActions[ACTION_SWIPE_UP_INDEX] != null - && mGestureActions[ACTION_SWIPE_UP_INDEX].isActive())); + || !mCurrentAction.disableProxyEvents()); if (actionValid && !mIsInScreenPinning) { // Allow down, cancel and up events, move and other events are passed if notifications // are not showing and disabled gestures (such as long press) are not executed @@ -455,7 +454,7 @@ public class QuickStepController implements GestureHelper { } private void tryToStartGesture(NavigationGestureAction action, boolean alignedWithNavBar, - boolean positiveDirection, MotionEvent event) { + MotionEvent event) { if (action == null) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index 978a72dcb4b7..53e461db3dd1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -49,6 +49,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.Window; +import android.view.WindowInsetsController; import android.widget.FrameLayout; import com.android.internal.annotations.VisibleForTesting; @@ -785,6 +786,11 @@ public class StatusBarWindowView extends FrameLayout { @Override public void reportActivityRelaunched() { } + + @Override + public WindowInsetsController getInsetsController() { + return null; + } }; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStepControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStepControllerTest.java index 4177cd16c8bf..8fc15b247ab9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStepControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStepControllerTest.java @@ -38,12 +38,12 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import android.content.Context; import com.android.systemui.R; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.SysuiTestCase; +import android.content.Context; import android.content.res.Resources; import android.support.test.filters.SmallTest; import android.testing.AndroidTestingRunner; @@ -395,6 +395,7 @@ public class QuickStepControllerTest extends SysuiTestCase { verify(mProxy, times(1)).onQuickScrubStart(); verify(mProxyService, times(1)).notifyQuickScrubStarted(); verify(mNavigationBarView, times(1)).updateSlippery(); + verify(mProxy, never()).onMotionEvent(moveEvent1); // Move again for scrub MotionEvent moveEvent2 = event(MotionEvent.ACTION_MOVE, 200, y); @@ -402,6 +403,7 @@ public class QuickStepControllerTest extends SysuiTestCase { assertEquals(action, mController.getCurrentAction()); verify(action, times(1)).onGestureMove(200, y); verify(mProxy, times(1)).onQuickScrubProgress(1f / 2); + verify(mProxy, never()).onMotionEvent(moveEvent2); // Action up MotionEvent upEvent = event(MotionEvent.ACTION_UP, 1, y); @@ -409,6 +411,7 @@ public class QuickStepControllerTest extends SysuiTestCase { assertNull(mController.getCurrentAction()); verify(action, times(1)).onGestureEnd(); verify(mProxy, times(1)).onQuickScrubEnd(); + verify(mProxy, never()).onMotionEvent(upEvent); } @Test diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java index 9aa9d7c52818..af6575954842 100644 --- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java +++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java @@ -40,9 +40,9 @@ import android.service.autofill.SaveRequest; import android.text.format.DateUtils; import android.util.Slog; -import com.android.server.AbstractRemoteService; +import com.android.server.AbstractSinglePendingRequestRemoteService; -final class RemoteFillService extends AbstractRemoteService { +final class RemoteFillService extends AbstractSinglePendingRequestRemoteService<RemoteFillService> { private static final long TIMEOUT_IDLE_BIND_MILLIS = 5 * DateUtils.SECOND_IN_MILLIS; private static final long TIMEOUT_REMOTE_REQUEST_MILLIS = 5 * DateUtils.SECOND_IN_MILLIS; @@ -69,8 +69,8 @@ final class RemoteFillService extends AbstractRemoteService { mCallbacks = callbacks; } - @Override - protected void onConnectedStateChanged(boolean state) { + @Override // from AbstractRemoteService + protected void handleOnConnectedStateChanged(boolean state) { if (mAutoFillService == null) { Slog.w(mTag, "onConnectedStateChanged(): null service"); return; @@ -82,18 +82,18 @@ final class RemoteFillService extends AbstractRemoteService { } } - @Override + @Override // from AbstractRemoteService protected IInterface getServiceInterface(IBinder service) { mAutoFillService = IAutoFillService.Stub.asInterface(service); return mAutoFillService; } - @Override + @Override // from AbstractRemoteService protected long getTimeoutIdleBindMillis() { return TIMEOUT_IDLE_BIND_MILLIS; } - @Override + @Override // from AbstractRemoteService protected long getRemoteRequestMillis() { return TIMEOUT_REMOTE_REQUEST_MILLIS; } @@ -136,6 +136,19 @@ final class RemoteFillService extends AbstractRemoteService { scheduleRequest(new PendingSaveRequest(request, this)); } + private boolean handleResponseCallbackCommon( + @NonNull PendingRequest<RemoteFillService> pendingRequest) { + if (isDestroyed()) return false; + + if (mPendingRequest == pendingRequest) { + mPendingRequest = null; + } + if (mPendingRequest == null) { + scheduleUnbind(); + } + return true; + } + private void dispatchOnFillRequestSuccess(@NonNull PendingFillRequest pendingRequest, @Nullable FillResponse response, int requestFlags) { mHandler.post(() -> { diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 8676f7f5bea0..4c645076eb95 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -902,7 +902,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // VultureCallback @Override - public void onServiceDied(AbstractRemoteService service) { + public void onServiceDied(AbstractRemoteService<? extends AbstractRemoteService<?>> service) { Slog.w(TAG, "removing session because service died"); forceRemoveSelfLocked(); } diff --git a/services/core/java/com/android/server/AbstractMultiplePendingRequestsRemoteService.java b/services/core/java/com/android/server/AbstractMultiplePendingRequestsRemoteService.java new file mode 100644 index 000000000000..f532b22cb8d4 --- /dev/null +++ b/services/core/java/com/android/server/AbstractMultiplePendingRequestsRemoteService.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2018 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; + +import android.annotation.NonNull; +import android.content.ComponentName; +import android.content.Context; +import android.util.Slog; + +import java.io.PrintWriter; +import java.util.ArrayList; + +/** + * Base class representing a remote service that can queue multiple pending requests while not + * bound. + * + * @param <S> the concrete remote service class + * + * @hide + */ +public abstract class AbstractMultiplePendingRequestsRemoteService< + S extends AbstractMultiplePendingRequestsRemoteService<S>> + extends AbstractRemoteService<S> { + + private final int mInitialCapacity; + + protected ArrayList<PendingRequest<S>> mPendingRequests; + + public AbstractMultiplePendingRequestsRemoteService(@NonNull Context context, + @NonNull String serviceInterface, @NonNull ComponentName componentName, int userId, + @NonNull VultureCallback callback, boolean bindInstantServiceAllowed, boolean verbose, + int initialCapacity) { + super(context, serviceInterface, componentName, userId, callback, bindInstantServiceAllowed, + verbose); + mInitialCapacity = initialCapacity; + } + + @Override // from AbstractRemoteService + void handlePendingRequests() { + if (mPendingRequests != null) { + final int size = mPendingRequests.size(); + if (mVerbose) Slog.v(mTag, "Sending " + size + " pending requests"); + for (int i = 0; i < size; i++) { + mPendingRequests.get(i).run(); + } + mPendingRequests = null; + } + } + + @Override // from AbstractRemoteService + protected void handleOnDestroy() { + if (mPendingRequests != null) { + final int size = mPendingRequests.size(); + if (mVerbose) Slog.v(mTag, "Canceling " + size + " pending requests"); + for (int i = 0; i < size; i++) { + mPendingRequests.get(i).cancel(); + } + mPendingRequests = null; + } + } + + @Override // from AbstractRemoteService + public void dump(@NonNull String prefix, @NonNull PrintWriter pw) { + super.dump(prefix, pw); + + pw.append(prefix).append("initialCapacity=").append(String.valueOf(mInitialCapacity)) + .println(); + final int size = mPendingRequests == null ? 0 : mPendingRequests.size(); + pw.append(prefix).append("pendingRequests=").append(String.valueOf(size)).println(); + } + + @Override // from AbstractRemoteService + void handlePendingRequestWhileUnBound(@NonNull PendingRequest<S> pendingRequest) { + if (mPendingRequests == null) { + mPendingRequests = new ArrayList<>(mInitialCapacity); + } + mPendingRequests.add(pendingRequest); + if (mVerbose) { + Slog.v(mTag, "queued " + mPendingRequests.size() + " requests; last=" + pendingRequest); + } + } +} diff --git a/services/core/java/com/android/server/AbstractRemoteService.java b/services/core/java/com/android/server/AbstractRemoteService.java index 0d4cf6b01ba8..f636487c666b 100644 --- a/services/core/java/com/android/server/AbstractRemoteService.java +++ b/services/core/java/com/android/server/AbstractRemoteService.java @@ -45,13 +45,20 @@ import java.lang.ref.WeakReference; * * <p>All state of this class is modified on a handler thread. * + * <p><b>NOTE: </b>this class should not be extended directly, you should extend either + * {@link AbstractSinglePendingRequestRemoteService} or + * {@link AbstractMultiplePendingRequestsRemoteService}. + * * <p>See {@code com.android.server.autofill.RemoteFillService} for a concrete * (no pun intended) example of how to use it. * + * @param <S> the concrete remote service class + * * @hide */ //TODO(b/117779333): improve javadoc above instead of using Autofill as an example -public abstract class AbstractRemoteService implements DeathRecipient { +public abstract class AbstractRemoteService<S extends AbstractRemoteService<S>> + implements DeathRecipient { private static final int MSG_UNBIND = 1; @@ -64,8 +71,6 @@ public abstract class AbstractRemoteService implements DeathRecipient { protected final Handler mHandler; protected final ComponentName mComponentName; - protected PendingRequest<? extends AbstractRemoteService> mPendingRequest; - private final Context mContext; private final Intent mIntent; private final VultureCallback mVultureCallback; @@ -88,10 +93,11 @@ public abstract class AbstractRemoteService implements DeathRecipient { * * @param service service that died! */ - void onServiceDied(AbstractRemoteService service); + void onServiceDied(AbstractRemoteService<? extends AbstractRemoteService<?>> service); } - public AbstractRemoteService(@NonNull Context context, @NonNull String serviceInterface, + // NOTE: must be package-protected so this class is not extend outside + AbstractRemoteService(@NonNull Context context, @NonNull String serviceInterface, @NonNull ComponentName componentName, int userId, @NonNull VultureCallback callback, boolean bindInstantServiceAllowed, boolean verbose) { mContext = context; @@ -118,12 +124,25 @@ public abstract class AbstractRemoteService implements DeathRecipient { return mDestroyed; } + private void handleOnConnectedStateChangedInternal(boolean connected) { + if (connected) { + handlePendingRequests(); + } + handleOnConnectedStateChanged(connected); + } + + /** + * Handles the pending requests when the connection it bounds to the remote service. + */ + abstract void handlePendingRequests(); + /** - * Callback called when the system connected / disconnected to the service. + * Callback called when the system connected / disconnected to the service and the pending + * requests have been handled. * * @param state {@code true} when connected, {@code false} when disconnected. */ - protected void onConnectedStateChanged(boolean state) { + protected void handleOnConnectedStateChanged(boolean state) { } /** @@ -144,14 +163,18 @@ public abstract class AbstractRemoteService implements DeathRecipient { private void handleDestroy() { if (checkIfDestroyed()) return; - if (mPendingRequest != null) { - mPendingRequest.cancel(); - mPendingRequest = null; - } - ensureUnbound(); + handleOnDestroy(); + handleEnsureUnbound(); mDestroyed = true; } + /** + * Clears the state when this object is destroyed. + * + * <p>Typically used to cancel the pending requests. + */ + protected abstract void handleOnDestroy(); + @Override // from DeathRecipient public void binderDied() { mHandler.sendMessage(obtainMessage(AbstractRemoteService::handleBinderDied, this)); @@ -183,9 +206,7 @@ public abstract class AbstractRemoteService implements DeathRecipient { pw.append(prefix).append(tab).append("destroyed=") .append(String.valueOf(mDestroyed)).println(); pw.append(prefix).append(tab).append("bound=") - .append(String.valueOf(isBound())).println(); - pw.append(prefix).append(tab).append("hasPendingRequest=") - .append(String.valueOf(mPendingRequest != null)).println(); + .append(String.valueOf(handleIsBound())).println(); pw.append(prefix).append("mBindInstantServiceAllowed=").println(mBindInstantServiceAllowed); pw.append(prefix).append("idleTimeout=") .append(Long.toString(getTimeoutIdleBindMillis() / 1000)).append("s").println(); @@ -194,7 +215,7 @@ public abstract class AbstractRemoteService implements DeathRecipient { pw.println(); } - protected void scheduleRequest(PendingRequest<? extends AbstractRemoteService> pendingRequest) { + protected void scheduleRequest(@NonNull PendingRequest<S> pendingRequest) { mHandler.sendMessage(obtainMessage( AbstractRemoteService::handlePendingRequest, this, pendingRequest)); } @@ -215,19 +236,20 @@ public abstract class AbstractRemoteService implements DeathRecipient { private void handleUnbind() { if (checkIfDestroyed()) return; - ensureUnbound(); + handleEnsureUnbound(); } - private void handlePendingRequest( - PendingRequest<? extends AbstractRemoteService> pendingRequest) { + /** + * Handles a request, either processing it right now when bound, or saving it to be handled when + * bound. + */ + protected final void handlePendingRequest(@NonNull PendingRequest<S> pendingRequest) { if (checkIfDestroyed() || mCompleted) return; - if (!isBound()) { - if (mPendingRequest != null) { - mPendingRequest.cancel(); - } - mPendingRequest = pendingRequest; - ensureBound(); + if (!handleIsBound()) { + if (mVerbose) Slog.v(mTag, "handlePendingRequest(): queuing" + pendingRequest); + handlePendingRequestWhileUnBound(pendingRequest); + handleEnsureBound(); } else { if (mVerbose) Slog.v(mTag, "handlePendingRequest(): " + pendingRequest); pendingRequest.run(); @@ -237,12 +259,17 @@ public abstract class AbstractRemoteService implements DeathRecipient { } } - private boolean isBound() { + /** + * Defines what to do with a request that arrives while not bound to the service. + */ + abstract void handlePendingRequestWhileUnBound(@NonNull PendingRequest<S> pendingRequest); + + private boolean handleIsBound() { return mServiceInterface != null; } - private void ensureBound() { - if (isBound() || mBinding) return; + private void handleEnsureBound() { + if (handleIsBound() || mBinding) return; if (mVerbose) Slog.v(mTag, "ensureBound()"); mBinding = true; @@ -265,13 +292,13 @@ public abstract class AbstractRemoteService implements DeathRecipient { } } - private void ensureUnbound() { - if (!isBound() && !mBinding) return; + private void handleEnsureUnbound() { + if (!handleIsBound() && !mBinding) return; if (mVerbose) Slog.v(mTag, "ensureUnbound()"); mBinding = false; - if (isBound()) { - onConnectedStateChanged(false); + if (handleIsBound()) { + handleOnConnectedStateChangedInternal(false); if (mServiceInterface != null) { mServiceInterface.asBinder().unlinkToDeath(this, 0); mServiceInterface = null; @@ -283,6 +310,7 @@ public abstract class AbstractRemoteService implements DeathRecipient { private class RemoteServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { + if (mVerbose) Slog.v(mTag, "onServiceConnected()"); if (mDestroyed || !mBinding) { // This is abnormal. Unbinding the connection has been requested already. Slog.wtf(mTag, "onServiceConnected() was dispatched after unbindService."); @@ -296,15 +324,7 @@ public abstract class AbstractRemoteService implements DeathRecipient { handleBinderDied(); return; } - onConnectedStateChanged(true); - - if (mPendingRequest != null) { - final PendingRequest<? extends AbstractRemoteService> pendingRequest = - mPendingRequest; - mPendingRequest = null; - handlePendingRequest(pendingRequest); - } - + handleOnConnectedStateChangedInternal(true); mServiceDied = false; } @@ -325,25 +345,12 @@ public abstract class AbstractRemoteService implements DeathRecipient { return mDestroyed; } - protected boolean handleResponseCallbackCommon( - PendingRequest<? extends AbstractRemoteService> pendingRequest) { - if (isDestroyed()) return false; - - if (mPendingRequest == pendingRequest) { - mPendingRequest = null; - } - if (mPendingRequest == null) { - scheduleUnbind(); - } - return true; - } - /** * Base class for the requests serviced by the remote service. * * @param <S> the remote service class */ - public abstract static class PendingRequest<S extends AbstractRemoteService> + public abstract static class PendingRequest<S extends AbstractRemoteService<S>> implements Runnable { protected final String mTag = getClass().getSimpleName(); protected final Object mLock = new Object(); diff --git a/services/core/java/com/android/server/AbstractSinglePendingRequestRemoteService.java b/services/core/java/com/android/server/AbstractSinglePendingRequestRemoteService.java new file mode 100644 index 000000000000..8e1f540a4d5e --- /dev/null +++ b/services/core/java/com/android/server/AbstractSinglePendingRequestRemoteService.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2018 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; + +import android.annotation.NonNull; +import android.content.ComponentName; +import android.content.Context; +import android.util.Slog; + +import java.io.PrintWriter; + +/** + * Base class representing a remote service that can have only one pending requests while not bound. + * + * <p>If another request is received while not bound, the previous one will be canceled. + * + * @param <S> the concrete remote service class + * + * @hide + */ +public abstract class AbstractSinglePendingRequestRemoteService< + S extends AbstractSinglePendingRequestRemoteService<S>> extends AbstractRemoteService<S> { + + protected PendingRequest<S> mPendingRequest; + + public AbstractSinglePendingRequestRemoteService(@NonNull Context context, + @NonNull String serviceInterface, @NonNull ComponentName componentName, int userId, + @NonNull VultureCallback callback, boolean bindInstantServiceAllowed, + boolean verbose) { + super(context, serviceInterface, componentName, userId, callback, bindInstantServiceAllowed, + verbose); + } + + @Override // from AbstractRemoteService + void handlePendingRequests() { + if (mPendingRequest != null) { + final PendingRequest<S> pendingRequest = mPendingRequest; + mPendingRequest = null; + handlePendingRequest(pendingRequest); + } + } + + @Override // from AbstractRemoteService + protected void handleOnDestroy() { + if (mPendingRequest != null) { + mPendingRequest.cancel(); + mPendingRequest = null; + } + } + + @Override // from AbstractRemoteService + public void dump(@NonNull String prefix, @NonNull PrintWriter pw) { + super.dump(prefix, pw); + pw.append(prefix).append("hasPendingRequest=") + .append(String.valueOf(mPendingRequest != null)).println(); + } + + @Override // from AbstractRemoteService + void handlePendingRequestWhileUnBound(@NonNull PendingRequest<S> pendingRequest) { + if (mPendingRequest != null) { + if (mVerbose) { + Slog.v(mTag, "handlePendingRequestWhileUnBound(): cancelling " + mPendingRequest); + } + mPendingRequest.cancel(); + } + mPendingRequest = pendingRequest; + } +} diff --git a/services/core/java/com/android/server/BinderCallsStatsService.java b/services/core/java/com/android/server/BinderCallsStatsService.java index 98203213e996..01716a0ea40a 100644 --- a/services/core/java/com/android/server/BinderCallsStatsService.java +++ b/services/core/java/com/android/server/BinderCallsStatsService.java @@ -98,7 +98,7 @@ public class BinderCallsStatsService extends Binder { mBinderCallsStats.setSamplingInterval(mParser.getInt( SETTINGS_SAMPLING_INTERVAL_KEY, BinderCallsStats.PERIODIC_SAMPLING_INTERVAL_DEFAULT)); - mBinderCallsStats.setSamplingInterval(mParser.getInt( + mBinderCallsStats.setMaxBinderCallStats(mParser.getInt( SETTINGS_MAX_CALL_STATS_KEY, BinderCallsStats.MAX_BINDER_CALL_STATS_COUNT_DEFAULT)); diff --git a/services/core/java/com/android/server/RuntimeService.java b/services/core/java/com/android/server/RuntimeService.java new file mode 100644 index 000000000000..ccfac80d22a7 --- /dev/null +++ b/services/core/java/com/android/server/RuntimeService.java @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2018 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; + +import android.content.Context; +import android.os.Binder; +import android.service.runtime.DebugEntryProto; +import android.service.runtime.RuntimeServiceInfoProto; +import android.util.Slog; +import android.util.proto.ProtoOutputStream; + +import libcore.timezone.TimeZoneDataFiles; +import libcore.util.CoreLibraryDebug; +import libcore.util.DebugInfo; + +import com.android.internal.util.DumpUtils; +import com.android.timezone.distro.DistroException; +import com.android.timezone.distro.DistroVersion; +import com.android.timezone.distro.FileUtils; +import com.android.timezone.distro.TimeZoneDistro; + +import java.io.File; +import java.io.FileDescriptor; +import java.io.IOException; +import java.io.PrintWriter; + +/** + * This service exists only as a "dumpsys" target which reports information about the status of the + * runtime and related libraries. + */ +public class RuntimeService extends Binder { + + private static final String TAG = "RuntimeService"; + + private final Context mContext; + + public RuntimeService(Context context) { + mContext = context; + } + + @Override + protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) { + return; + } + + boolean protoFormat = hasOption(args, "--proto"); + ProtoOutputStream proto = null; + + DebugInfo coreLibraryDebugInfo = CoreLibraryDebug.getDebugInfo(); + addTimeZoneApkDebugInfo(coreLibraryDebugInfo); + + if (protoFormat) { + proto = new ProtoOutputStream(fd); + reportTimeZoneInfoProto(coreLibraryDebugInfo, proto); + } else { + reportTimeZoneInfo(coreLibraryDebugInfo, pw); + } + + if (protoFormat) { + proto.flush(); + } + } + + /** Returns {@code true} if {@code args} contains {@code arg}. */ + private static boolean hasOption(String[] args, String arg) { + for (String opt : args) { + if (arg.equals(opt)) { + return true; + } + } + return false; + } + + /** + * Add information to {@link DebugInfo} about the time zone data supplied by the + * "Time zone updates via APK" feature. + */ + private static void addTimeZoneApkDebugInfo(DebugInfo coreLibraryDebugInfo) { + // Add /data tz data set using the DistroVersion class (which libcore cannot use). + // This update mechanism will be removed after the time zone APEX is launched so this + // untidiness will disappear with it. + String debugKeyPrefix = "core_library.timezone.data_"; + String versionFileName = TimeZoneDataFiles.getDataTimeZoneFile( + TimeZoneDistro.DISTRO_VERSION_FILE_NAME); + addDistroVersionDebugInfo(versionFileName, debugKeyPrefix, coreLibraryDebugInfo); + } + + /** + * Prints {@code coreLibraryDebugInfo} to {@code pw}. + * + * <p>If you change this method, make sure to modify + * {@link #reportTimeZoneInfoProto(DebugInfo, ProtoOutputStream)} as well. + */ + private static void reportTimeZoneInfo(DebugInfo coreLibraryDebugInfo, + PrintWriter pw) { + pw.println("Core Library Debug Info: "); + for (DebugInfo.DebugEntry debugEntry : coreLibraryDebugInfo.getDebugEntries()) { + pw.print(debugEntry.getKey()); + pw.print(": \""); + pw.print(debugEntry.getStringValue()); + pw.println("\""); + } + } + + /** + * Adds {@code coreLibraryDebugInfo} to {@code protoStream}. + * + * <p>If you change this method, make sure to modify + * {@link #reportTimeZoneInfo(DebugInfo, PrintWriter)}. + */ + private static void reportTimeZoneInfoProto( + DebugInfo coreLibraryDebugInfo, ProtoOutputStream protoStream) { + for (DebugInfo.DebugEntry debugEntry : coreLibraryDebugInfo.getDebugEntries()) { + long entryToken = protoStream.start(RuntimeServiceInfoProto.DEBUG_ENTRY); + protoStream.write(DebugEntryProto.KEY, debugEntry.getKey()); + protoStream.write(DebugEntryProto.STRING_VALUE, debugEntry.getStringValue()); + protoStream.end(entryToken); + } + } + + /** + * Adds version information to {@code debugInfo} from the distro_version file that may exist + * at {@code distroVersionFileName}. If the file does not exist or cannot be read this is + * reported as debug information too. + */ + private static void addDistroVersionDebugInfo(String distroVersionFileName, + String debugKeyPrefix, DebugInfo debugInfo) { + File file = new File(distroVersionFileName); + String statusKey = debugKeyPrefix + "status"; + if (file.exists()) { + try { + byte[] versionBytes = + FileUtils.readBytes(file, DistroVersion.DISTRO_VERSION_FILE_LENGTH); + DistroVersion distroVersion = DistroVersion.fromBytes(versionBytes); + String formatVersionString = distroVersion.formatMajorVersion + "." + + distroVersion.formatMinorVersion; + debugInfo.addStringEntry(statusKey, "OK") + .addStringEntry(debugKeyPrefix + "formatVersion", formatVersionString) + .addStringEntry(debugKeyPrefix + "rulesVersion", + distroVersion.rulesVersion) + .addStringEntry(debugKeyPrefix + "revision", + distroVersion.revision); + } catch (IOException | DistroException e) { + debugInfo.addStringEntry(statusKey, "ERROR"); + debugInfo.addStringEntry(debugKeyPrefix + "exception_class", + e.getClass().getName()); + debugInfo.addStringEntry(debugKeyPrefix + "exception_msg", e.getMessage()); + logMessage("Error reading " + file, e); + } + } else { + debugInfo.addStringEntry(statusKey, "NOT_FOUND"); + } + } + + private static void logMessage(String msg, Throwable t) { + Slog.v(TAG, msg, t); + } +} diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index f0b472be1472..a2cbfaa02bfb 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -47,6 +47,7 @@ import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import android.telephony.emergency.EmergencyNumber; import android.util.LocalLog; import android.util.StatsLog; @@ -1664,6 +1665,14 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } @Override + public void notifyEmergencyNumberList(List<EmergencyNumber> emergencyNumberList) { + // TODO checkPermission, modify Listener constent documentation + // TODO implement multisim emergency number list update in listener + // TODO implement PhoneStateListenerTest + } + + + @Override public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); diff --git a/services/core/java/com/android/server/WallpaperUpdateReceiver.java b/services/core/java/com/android/server/WallpaperUpdateReceiver.java new file mode 100644 index 000000000000..629e88250a11 --- /dev/null +++ b/services/core/java/com/android/server/WallpaperUpdateReceiver.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2018 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; + +import android.app.ActivityThread; +import android.app.WallpaperManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.os.AsyncTask; +import android.util.Slog; + +/** + * Receiver responsible for updating the wallpaper when the device + * configuration has changed. + * + * @hide + */ +public class WallpaperUpdateReceiver extends BroadcastReceiver { + + private static final String TAG = "WallpaperUpdateReceiver"; + private static final boolean DEBUG = false; + + @Override + public void onReceive(final Context context, final Intent intent) { + if (DEBUG) Slog.d(TAG, "onReceive: " + intent); + + if (intent != null && Intent.ACTION_DEVICE_CUSTOMIZATION_READY.equals(intent.getAction())) { + AsyncTask.execute(this::updateWallpaper); + } + } + + private void updateWallpaper() { + try { + ActivityThread currentActivityThread = ActivityThread.currentActivityThread(); + Context uiContext = currentActivityThread.getSystemUiContext(); + WallpaperManager wallpaperManager = WallpaperManager.getInstance(uiContext); + if (DEBUG) Slog.d(TAG, "Set customized default_wallpaper."); + Bitmap blank = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8); + // set a blank wallpaper to force a redraw of default_wallpaper + wallpaperManager.setBitmap(blank); + wallpaperManager.setResource(com.android.internal.R.drawable.default_wallpaper); + } catch (Exception e) { + Slog.w(TAG, "Failed to customize system wallpaper." + e); + } + } +} diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 0e354d515eef..562e80d906b1 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -666,16 +666,50 @@ public class ActivityManagerService extends IActivityManager.Stub final class PidMap { private final SparseArray<ProcessRecord> mPidMap = new SparseArray<>(); + /** + * Puts the process record in the map. + * <p>NOTE: Callers should avoid acquiring the mPidsSelfLocked lock before calling this + * method. + */ void put(int key, ProcessRecord value) { - mPidMap.put(key, value); + synchronized (this) { + mPidMap.put(key, value); + } mAtmInternal.onProcessMapped(key, value.getWindowProcessController()); } + /** + * Removes the process record from the map. + * <p>NOTE: Callers should avoid acquiring the mPidsSelfLocked lock before calling this + * method. + */ void remove(int pid) { - mPidMap.remove(pid); + synchronized (this) { + mPidMap.remove(pid); + } mAtmInternal.onProcessUnMapped(pid); } + /** + * Removes the process record from the map if it has a thread. + * <p>NOTE: Callers should avoid acquiring the mPidsSelfLocked lock before calling this + * method. + */ + boolean removeIfNoThread(int pid) { + boolean removed = false; + synchronized (this) { + final ProcessRecord app = get(pid); + if (app != null && app.thread == null) { + mPidMap.remove(pid); + removed = true; + } + } + if (removed) { + mAtmInternal.onProcessUnMapped(pid); + } + return removed; + } + ProcessRecord get(int pid) { return mPidMap.get(pid); } @@ -1889,9 +1923,7 @@ public class ActivityManagerService extends IActivityManager.Stub app.getWindowProcessController().setPid(MY_PID); app.maxAdj = ProcessList.SYSTEM_ADJ; app.makeActive(mSystemThread.getApplicationThread(), mProcessStats); - synchronized (mPidsSelfLocked) { - mPidsSelfLocked.put(app.pid, app); - } + mPidsSelfLocked.put(app.pid, app); mProcessList.updateLruProcessLocked(app, false, null); updateOomAdjLocked(); } @@ -4254,14 +4286,7 @@ public class ActivityManagerService extends IActivityManager.Stub private final void processStartTimedOutLocked(ProcessRecord app) { final int pid = app.pid; - boolean gone = false; - synchronized (mPidsSelfLocked) { - ProcessRecord knownApp = mPidsSelfLocked.get(pid); - if (knownApp != null && knownApp.thread == null) { - mPidsSelfLocked.remove(pid); - gone = true; - } - } + boolean gone = mPidsSelfLocked.removeIfNoThread(pid); if (gone) { Slog.w(TAG, "Process " + app + " failed to attach"); @@ -13113,11 +13138,8 @@ public class ActivityManagerService extends IActivityManager.Stub return true; } else if (app.pid > 0 && app.pid != MY_PID) { // Goodbye! - boolean removed; - synchronized (mPidsSelfLocked) { - mPidsSelfLocked.remove(app.pid); - mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); - } + mPidsSelfLocked.remove(app.pid); + mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); mBatteryStatsService.noteProcessFinish(app.processName, app.info.uid); if (app.isolated) { mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java index 2541352b6daa..24543b7974df 100644 --- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java +++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java @@ -25,10 +25,12 @@ import android.net.wifi.IWifiManager; import android.net.wifi.WifiActivityEnergyInfo; import android.os.BatteryStats; import android.os.Parcelable; +import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SynchronousResultReceiver; import android.os.SystemClock; +import android.os.ThreadLocalWorkSource; import android.telephony.ModemActivityInfo; import android.telephony.TelephonyManager; import android.util.IntArray; @@ -43,11 +45,9 @@ import com.android.internal.util.function.pooled.PooledLambda; import libcore.util.EmptyArray; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -74,7 +74,12 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync { private final ScheduledExecutorService mExecutorService = Executors.newSingleThreadScheduledExecutor( (ThreadFactory) r -> { - Thread t = new Thread(r, "batterystats-worker"); + Thread t = new Thread( + () -> { + ThreadLocalWorkSource.setUid(Process.myUid()); + r.run(); + }, + "batterystats-worker"); t.setPriority(Thread.NORM_PRIORITY); return t; }); diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 7991783e08c8..62f100926581 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -1246,10 +1246,8 @@ public final class ProcessList { long startTime = SystemClock.elapsedRealtime(); if (app.pid > 0 && app.pid != ActivityManagerService.MY_PID) { checkSlow(startTime, "startProcess: removing from pids map"); - synchronized (mService.mPidsSelfLocked) { - mService.mPidsSelfLocked.remove(app.pid); - mService.mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); - } + mService.mPidsSelfLocked.remove(app.pid); + mService.mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); checkSlow(startTime, "startProcess: done removing from pids map"); app.setPid(0); } @@ -1767,8 +1765,8 @@ public final class ProcessList { mService.cleanUpApplicationRecordLocked(oldApp, false, false, -1, true /*replacingPid*/); } + mService.mPidsSelfLocked.put(pid, app); synchronized (mService.mPidsSelfLocked) { - mService.mPidsSelfLocked.put(pid, app); if (!procAttached) { Message msg = mService.mHandler.obtainMessage(PROC_START_TIMEOUT_MSG); msg.obj = app; @@ -1928,10 +1926,8 @@ public final class ProcessList { .pendingStart)) { int pid = app.pid; if (pid > 0) { - synchronized (mService.mPidsSelfLocked) { - mService.mPidsSelfLocked.remove(pid); - mService.mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); - } + mService.mPidsSelfLocked.remove(pid); + mService.mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); mService.mBatteryStatsService.noteProcessFinish(app.processName, app.info.uid); if (app.isolated) { mService.mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java index c2f4406c615d..bf95210195b7 100644 --- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java +++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java @@ -313,6 +313,7 @@ public class NetworkMonitor extends StateMachine { private final State mCaptivePortalState = new CaptivePortalState(); private final State mEvaluatingPrivateDnsState = new EvaluatingPrivateDnsState(); private final State mProbingState = new ProbingState(); + private final State mWaitingForNextProbeState = new WaitingForNextProbeState(); private CustomIntentReceiver mLaunchCaptivePortalAppBroadcastReceiver = null; @@ -368,6 +369,7 @@ public class NetworkMonitor extends StateMachine { addState(mMaybeNotifyState, mDefaultState); addState(mEvaluatingState, mMaybeNotifyState); addState(mProbingState, mEvaluatingState); + addState(mWaitingForNextProbeState, mEvaluatingState); addState(mCaptivePortalState, mMaybeNotifyState); addState(mEvaluatingPrivateDnsState, mDefaultState); addState(mValidatedState, mDefaultState); @@ -877,6 +879,11 @@ public class NetworkMonitor extends StateMachine { @Override public void enter() { + if (mEvaluateAttempts >= BLAME_FOR_EVALUATION_ATTEMPTS) { + //Don't continue to blame UID forever. + TrafficStats.clearThreadStatsUid(); + } + final int token = ++mProbeToken; mThread = new Thread(() -> sendMessage(obtainMessage(CMD_PROBE_COMPLETE, token, 0, isCaptivePortal()))); @@ -904,29 +911,16 @@ public class NetworkMonitor extends StateMachine { mLastPortalProbeResult = probeResult; transitionTo(mCaptivePortalState); } else { - final Message msg = obtainMessage(CMD_REEVALUATE, ++mReevaluateToken, 0); - sendMessageDelayed(msg, mReevaluateDelayMs); logNetworkEvent(NetworkEvent.NETWORK_VALIDATION_FAILED); notifyNetworkTestResultInvalid(probeResult.redirectUrl); - if (mEvaluateAttempts >= BLAME_FOR_EVALUATION_ATTEMPTS) { - // Don't continue to blame UID forever. - TrafficStats.clearThreadStatsUid(); - } - mReevaluateDelayMs *= 2; - if (mReevaluateDelayMs > MAX_REEVALUATE_DELAY_MS) { - mReevaluateDelayMs = MAX_REEVALUATE_DELAY_MS; - } + transitionTo(mWaitingForNextProbeState); } return HANDLED; - case CMD_REEVALUATE: - // Leave the event to EvaluatingState. Defer this message will result in reset - // of mReevaluateDelayMs and mEvaluateAttempts. - case CMD_NETWORK_DISCONNECTED: case EVENT_DNS_NOTIFICATION: + // Leave the event to DefaultState to record correct dns timestamp. return NOT_HANDLED; default: - // TODO: Some events may able to handle in this state, instead of deferring to - // next state. + // Wait for probe result and defer events to next state by default. deferMessage(message); return HANDLED; } @@ -941,6 +935,29 @@ public class NetworkMonitor extends StateMachine { } } + // Being in the WaitingForNextProbeState indicates that evaluating probes failed and state is + // transited from ProbingState. This ensures that the state machine is only in ProbingState + // while a probe is in progress, not while waiting to perform the next probe. That allows + // ProbingState to defer most messages until the probe is complete, which keeps the code simple + // and matches the pre-Q behaviour where probes were a blocking operation performed on the state + // machine thread. + private class WaitingForNextProbeState extends State { + @Override + public void enter() { + final Message msg = obtainMessage(CMD_REEVALUATE, ++mReevaluateToken, 0); + sendMessageDelayed(msg, mReevaluateDelayMs); + mReevaluateDelayMs *= 2; + if (mReevaluateDelayMs > MAX_REEVALUATE_DELAY_MS) { + mReevaluateDelayMs = MAX_REEVALUATE_DELAY_MS; + } + } + + @Override + public boolean processMessage(Message message) { + return NOT_HANDLED; + } + } + // Limits the list of IP addresses returned by getAllByName or tried by openConnection to at // most one per address family. This ensures we only wait up to 20 seconds for TCP connections // to complete, regardless of how many IP addresses a host has. diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index f1d77b9961cf..581cec928334 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -2834,6 +2834,9 @@ public class DisplayPolicy { return 0; } + mDisplayContent.getInsetsStateController().onBarControllingWindowChanged( + mTopFullscreenOpaqueWindowState); + int tmpVisibility = PolicyControl.getSystemUiVisibility(win, null) & ~mResettingSystemUiFlags & ~mForceClearedSystemUiFlags; diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java index e96f0b1c4416..282838f7d58b 100644 --- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java @@ -18,11 +18,18 @@ package com.android.server.wm; import android.annotation.NonNull; import android.annotation.Nullable; +import android.graphics.Point; import android.graphics.Rect; +import android.util.proto.ProtoOutputStream; +import android.view.SurfaceControl; +import android.view.SurfaceControl.Transaction; import android.view.InsetsSource; +import android.view.InsetsSourceControl; import com.android.internal.util.function.TriConsumer; -import com.android.server.policy.WindowManagerPolicy; +import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback; + +import java.io.PrintWriter; /** * Controller for a specific inset source on the server. It's called provider as it provides the @@ -32,11 +39,19 @@ class InsetsSourceProvider { private final Rect mTmpRect = new Rect(); private final @NonNull InsetsSource mSource; + private final DisplayContent mDisplayContent; + private final InsetsStateController mStateController; + private @Nullable InsetsSourceControl mControl; + private @Nullable WindowState mControllingWin; + private @Nullable ControlAdapter mAdapter; private WindowState mWin; private TriConsumer<DisplayFrames, WindowState, Rect> mFrameProvider; - InsetsSourceProvider(InsetsSource source) { + InsetsSourceProvider(InsetsSource source, InsetsStateController stateController, + DisplayContent displayContent) { mSource = source; + mDisplayContent = displayContent; + mStateController = stateController; } InsetsSource getSource() { @@ -84,4 +99,81 @@ class InsetsSourceProvider { mSource.setVisible(mWin.isVisible() && !mWin.mGivenInsetsPending); } + + void updateControlForTarget(@Nullable WindowState target) { + if (target == mControllingWin) { + return; + } + if (target == null) { + revokeControl(); + return; + } + mAdapter = new ControlAdapter(); + mWin.startAnimation(mDisplayContent.getPendingTransaction(), mAdapter, + false /* TODO hidden */); + mControllingWin = target; + mControl = new InsetsSourceControl(mSource.getType(), mAdapter.mCapturedLeash); + } + + InsetsSourceControl getControl() { + return mControl; + } + + void revokeControl() { + if (mControllingWin != null) { + + // Cancelling the animation will invoke onAnimationCancelled, resetting all the fields. + mWin.cancelAnimation(); + } + } + + private class ControlAdapter implements AnimationAdapter { + + private SurfaceControl mCapturedLeash; + + @Override + public boolean getShowWallpaper() { + return false; + } + + @Override + public int getBackgroundColor() { + return 0; + } + + @Override + public void startAnimation(SurfaceControl animationLeash, Transaction t, + OnAnimationFinishedCallback finishCallback) { + mCapturedLeash = animationLeash; + t.setPosition(mCapturedLeash, mSource.getFrame().left, mSource.getFrame().top); + } + + @Override + public void onAnimationCancelled(SurfaceControl animationLeash) { + if (mAdapter == this) { + mStateController.notifyControlRevoked(mControllingWin, InsetsSourceProvider.this); + mControl = null; + mControllingWin = null; + mAdapter = null; + } + } + + @Override + public long getDurationHint() { + return 0; + } + + @Override + public long getStatusBarTransitionsStartTime() { + return 0; + } + + @Override + public void dump(PrintWriter pw, String prefix) { + } + + @Override + public void writeToProto(ProtoOutputStream proto) { + } + }; } diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java index 1189ee660605..592b7fba4bfd 100644 --- a/services/core/java/com/android/server/wm/InsetsStateController.java +++ b/services/core/java/com/android/server/wm/InsetsStateController.java @@ -20,10 +20,17 @@ import static android.view.InsetsState.TYPE_IME; import static android.view.InsetsState.TYPE_NAVIGATION_BAR; import static android.view.InsetsState.TYPE_TOP_BAR; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.util.ArrayMap; +import android.util.ArraySet; +import android.util.SparseArray; +import android.view.InsetsSourceControl; import android.view.InsetsState; +import android.view.ViewRootImpl; import java.io.PrintWriter; +import java.util.ArrayList; import java.util.function.Consumer; /** @@ -34,7 +41,11 @@ class InsetsStateController { private final InsetsState mLastState = new InsetsState(); private final InsetsState mState = new InsetsState(); private final DisplayContent mDisplayContent; - private ArrayMap<Integer, InsetsSourceProvider> mControllers = new ArrayMap<>(); + + private final ArrayMap<Integer, InsetsSourceProvider> mControllers = new ArrayMap<>(); + private final ArrayMap<WindowState, ArrayList<Integer>> mWinControlTypeMap = new ArrayMap<>(); + private final SparseArray<WindowState> mTypeWinControlMap = new SparseArray<>(); + private final ArraySet<WindowState> mPendingControlChanged = new ArraySet<>(); private final Consumer<WindowState> mDispatchInsetsChanged = w -> { if (w.isVisible()) { @@ -72,12 +83,25 @@ class InsetsStateController { return state; } + @Nullable InsetsSourceControl[] getControlsForDispatch(WindowState target) { + ArrayList<Integer> controlled = mWinControlTypeMap.get(target); + if (controlled == null) { + return null; + } + final int size = controlled.size(); + final InsetsSourceControl[] result = new InsetsSourceControl[size]; + for (int i = 0; i < size; i++) { + result[i] = mControllers.get(controlled.get(i)).getControl(); + } + return result; + } + /** * @return The provider of a specific type. */ InsetsSourceProvider getSourceProvider(int type) { return mControllers.computeIfAbsent(type, - key -> new InsetsSourceProvider(mState.getSource(key))); + key -> new InsetsSourceProvider(mState.getSource(key), this, mDisplayContent)); } /** @@ -93,6 +117,84 @@ class InsetsStateController { } } + void onImeTargetChanged(@Nullable WindowState imeTarget) { + onControlChanged(TYPE_IME, imeTarget); + notifyPendingInsetsControlChanged(); + } + + /** + * Called when the top opaque fullscreen window that is able to control the system bars changes. + * + * @param controllingWindow The window that is now able to control the system bars appearance + * and visibility. + */ + void onBarControllingWindowChanged(@Nullable WindowState controllingWindow) { + // TODO: Apply policy that determines whether controllingWindow is able to control system + // bars + + // TODO: Depending on the form factor, mapping is different + onControlChanged(TYPE_TOP_BAR, controllingWindow); + onControlChanged(TYPE_NAVIGATION_BAR, controllingWindow); + notifyPendingInsetsControlChanged(); + } + + void notifyControlRevoked(@NonNull WindowState previousControllingWin, + InsetsSourceProvider provider) { + removeFromControlMaps(previousControllingWin, provider.getSource().getType()); + } + + private void onControlChanged(int type, @Nullable WindowState win) { + if (!ViewRootImpl.USE_NEW_INSETS) { + return; + } + final WindowState previous = mTypeWinControlMap.get(type); + if (win == previous) { + return; + } + final InsetsSourceProvider controller = mControllers.get(type); + if (controller == null) { + return; + } + controller.updateControlForTarget(win); + if (previous != null) { + removeFromControlMaps(previous, type); + mPendingControlChanged.add(previous); + } + if (win != null) { + addToControlMaps(win, type); + mPendingControlChanged.add(win); + } + } + + private void removeFromControlMaps(@NonNull WindowState win, int type) { + final ArrayList<Integer> array = mWinControlTypeMap.get(win); + if (array == null) { + return; + } + array.remove((Integer) type); + if (array.isEmpty()) { + mWinControlTypeMap.remove(win); + } + mTypeWinControlMap.remove(type); + } + + private void addToControlMaps(@NonNull WindowState win, int type) { + final ArrayList<Integer> array = mWinControlTypeMap.computeIfAbsent(win, + key -> new ArrayList<>()); + array.add(type); + mTypeWinControlMap.put(type, win); + } + + private void notifyPendingInsetsControlChanged() { + mDisplayContent.mWmService.mAnimator.addAfterPrepareSurfacesRunnable(() -> { + for (int i = mPendingControlChanged.size() - 1; i >= 0; i--) { + final WindowState controllingWin = mPendingControlChanged.valueAt(i); + controllingWin.notifyInsetsControlChanged(); + } + mPendingControlChanged.clear(); + }); + } + private void notifyInsetsChanged() { mDisplayContent.forAllWindows(mDispatchInsetsChanged, true /* traverseTopToBottom */); } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index cdf911881395..ef22bb84decc 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2972,6 +2972,17 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } } + void notifyInsetsControlChanged() { + final InsetsStateController stateController = + getDisplayContent().getInsetsStateController(); + try { + mClient.insetsControlChanged(stateController.getInsetsForDispatch(this), + stateController.getControlsForDispatch(this)); + } catch (RemoteException e) { + Slog.w(TAG, "Failed to deliver inset state change", e); + } + } + Rect getBackdropFrame(Rect frame) { // When the task is docked, we send fullscreen sized backDropFrame as soon as resizing // start even if we haven't received the relayout window, so that the client requests diff --git a/services/intelligence/java/com/android/server/intelligence/IntelligencePerUserService.java b/services/intelligence/java/com/android/server/intelligence/IntelligencePerUserService.java index 84e06b04768c..e3b09c630499 100644 --- a/services/intelligence/java/com/android/server/intelligence/IntelligencePerUserService.java +++ b/services/intelligence/java/com/android/server/intelligence/IntelligencePerUserService.java @@ -200,7 +200,7 @@ final class IntelligencePerUserService return; } if (mMaster.verbose) { - Slog.v(TAG, "sendEvents(): id=" + sessionId + "; events =" + events.size()); + Slog.v(TAG, "sendEvents(): id=" + sessionId + ", events=" + events.size()); } session.sendEventsLocked(events); } diff --git a/services/intelligence/java/com/android/server/intelligence/RemoteIntelligenceService.java b/services/intelligence/java/com/android/server/intelligence/RemoteIntelligenceService.java index 5ebb99eeddcf..d9f4f20dc971 100644 --- a/services/intelligence/java/com/android/server/intelligence/RemoteIntelligenceService.java +++ b/services/intelligence/java/com/android/server/intelligence/RemoteIntelligenceService.java @@ -36,12 +36,13 @@ import android.view.autofill.IAutoFillManagerClient; import android.view.intelligence.ContentCaptureEvent; import com.android.internal.os.IResultReceiver; -import com.android.server.AbstractRemoteService; +import com.android.server.AbstractMultiplePendingRequestsRemoteService; import java.util.List; //TODO(b/111276913): rename once the final name is defined -final class RemoteIntelligenceService extends AbstractRemoteService { +final class RemoteIntelligenceService + extends AbstractMultiplePendingRequestsRemoteService<RemoteIntelligenceService> { private static final String TAG = "RemoteIntelligenceService"; @@ -56,7 +57,7 @@ final class RemoteIntelligenceService extends AbstractRemoteService { RemoteIntelligenceServiceCallbacks callbacks, boolean bindInstantServiceAllowed, boolean verbose) { super(context, serviceInterface, componentName, userId, callbacks, - bindInstantServiceAllowed, verbose); + bindInstantServiceAllowed, verbose, /* initialCapacity= */ 2); mCallbacks = callbacks; } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 56f7cff565af..f3704d818b30 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1503,6 +1503,14 @@ public final class SystemServer { } traceEnd(); + traceBeginAndSlog("RuntimeService"); + try { + ServiceManager.addService("runtime", new RuntimeService(context)); + } catch (Throwable e) { + reportWtf("starting RuntimeService", e); + } + traceEnd(); + // timezone.RulesManagerService will prevent a device starting up if the chain of trust // required for safe time zone updates might be broken. RuleManagerService cannot do // this check when mOnlyCore == true, so we don't enable the service in this case. diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java index b94f472965ab..845a09f44b82 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java @@ -95,308 +95,340 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase { } @Test - public void layoutWindowLw_appDrawsBars() { + public void addingWindow_doesNotTamperWithSysuiFlags() { mWindow.mAttrs.flags |= FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; addWindow(mWindow); - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); - - assertInsetByTopBottom(mWindow.getParentFrame(), 0, 0); - assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getDecorFrame(), 0, 0); - assertInsetBy(mWindow.getDisplayFrameLw(), 0, 0, 0, 0); + assertEquals(0, mWindow.mAttrs.systemUiVisibility); + assertEquals(0, mWindow.mAttrs.subtreeSystemUiVisibility); } @Test - public void layoutWindowLw_appWontDrawBars() { - mWindow.mAttrs.flags &= ~FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; - addWindow(mWindow); - - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); - - assertInsetByTopBottom(mWindow.getParentFrame(), 0, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getDecorFrame(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getDisplayFrameLw(), 0, NAV_BAR_HEIGHT); + public void layoutWindowLw_appDrawsBars() { + synchronized (mWm.mGlobalLock) { + mWindow.mAttrs.flags |= FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; + addWindow(mWindow); + + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + + assertInsetByTopBottom(mWindow.getParentFrame(), 0, 0); + assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getDecorFrame(), 0, 0); + assertInsetBy(mWindow.getDisplayFrameLw(), 0, 0, 0, 0); + } } @Test - public void layoutWindowLw_appWontDrawBars_forceStatus() throws Exception { - mWindow.mAttrs.flags &= ~FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; - mWindow.mAttrs.privateFlags |= PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND; - addWindow(mWindow); - - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); - - assertInsetByTopBottom(mWindow.getParentFrame(), 0, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getDecorFrame(), 0, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getDisplayFrameLw(), 0, NAV_BAR_HEIGHT); + public void layoutWindowLw_appWontDrawBars() { + synchronized (mWm.mGlobalLock) { + mWindow.mAttrs.flags &= ~FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; + addWindow(mWindow); + + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + + assertInsetByTopBottom(mWindow.getParentFrame(), 0, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getDecorFrame(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getDisplayFrameLw(), 0, NAV_BAR_HEIGHT); + } } @Test - public void addingWindow_doesNotTamperWithSysuiFlags() { - mWindow.mAttrs.flags |= FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; - addWindow(mWindow); - - assertEquals(0, mWindow.mAttrs.systemUiVisibility); - assertEquals(0, mWindow.mAttrs.subtreeSystemUiVisibility); + public void layoutWindowLw_appWontDrawBars_forceStatus() throws Exception { + synchronized (mWm.mGlobalLock) { + mWindow.mAttrs.flags &= ~FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; + mWindow.mAttrs.privateFlags |= PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND; + addWindow(mWindow); + + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + + assertInsetByTopBottom(mWindow.getParentFrame(), 0, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getDecorFrame(), 0, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getDisplayFrameLw(), 0, NAV_BAR_HEIGHT); + } } @Test public void layoutWindowLw_withDisplayCutout() { - addDisplayCutout(); + synchronized (mWm.mGlobalLock) { + addDisplayCutout(); - addWindow(mWindow); + addWindow(mWindow); - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); - assertInsetByTopBottom(mWindow.getParentFrame(), 0, 0); - assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getDecorFrame(), 0, 0); - assertInsetByTopBottom(mWindow.getDisplayFrameLw(), 0, 0); + assertInsetByTopBottom(mWindow.getParentFrame(), 0, 0); + assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getDecorFrame(), 0, 0); + assertInsetByTopBottom(mWindow.getDisplayFrameLw(), 0, 0); + } } @Test public void layoutWindowLw_withDisplayCutout_never() { - addDisplayCutout(); + synchronized (mWm.mGlobalLock) { + addDisplayCutout(); - mWindow.mAttrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER; - addWindow(mWindow); + mWindow.mAttrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER; + addWindow(mWindow); - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); - assertInsetByTopBottom(mWindow.getParentFrame(), STATUS_BAR_HEIGHT, 0); - assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getDecorFrame(), 0, 0); - assertInsetByTopBottom(mWindow.getDisplayFrameLw(), STATUS_BAR_HEIGHT, 0); + assertInsetByTopBottom(mWindow.getParentFrame(), STATUS_BAR_HEIGHT, 0); + assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getDecorFrame(), 0, 0); + assertInsetByTopBottom(mWindow.getDisplayFrameLw(), STATUS_BAR_HEIGHT, 0); + } } @Test public void layoutWindowLw_withDisplayCutout_layoutFullscreen() { - addDisplayCutout(); + synchronized (mWm.mGlobalLock) { + addDisplayCutout(); - mWindow.mAttrs.subtreeSystemUiVisibility |= SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; - addWindow(mWindow); + mWindow.mAttrs.subtreeSystemUiVisibility |= SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; + addWindow(mWindow); - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); - assertInsetByTopBottom(mWindow.getParentFrame(), 0, 0); - assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getDecorFrame(), 0, 0); - assertInsetBy(mWindow.getDisplayFrameLw(), 0, 0, 0, 0); + assertInsetByTopBottom(mWindow.getParentFrame(), 0, 0); + assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getDecorFrame(), 0, 0); + assertInsetBy(mWindow.getDisplayFrameLw(), 0, 0, 0, 0); + } } @Test public void layoutWindowLw_withDisplayCutout_fullscreen() { - addDisplayCutout(); + synchronized (mWm.mGlobalLock) { + addDisplayCutout(); - mWindow.mAttrs.subtreeSystemUiVisibility |= SYSTEM_UI_FLAG_FULLSCREEN; - addWindow(mWindow); + mWindow.mAttrs.subtreeSystemUiVisibility |= SYSTEM_UI_FLAG_FULLSCREEN; + addWindow(mWindow); - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); - assertInsetByTopBottom(mWindow.getParentFrame(), STATUS_BAR_HEIGHT, 0); - assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getDecorFrame(), 0, 0); - assertInsetByTopBottom(mWindow.getDisplayFrameLw(), STATUS_BAR_HEIGHT, 0); + assertInsetByTopBottom(mWindow.getParentFrame(), STATUS_BAR_HEIGHT, 0); + assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getDecorFrame(), 0, 0); + assertInsetByTopBottom(mWindow.getDisplayFrameLw(), STATUS_BAR_HEIGHT, 0); + } } @Test public void layoutWindowLw_withDisplayCutout_fullscreenInCutout() { - addDisplayCutout(); - - mWindow.mAttrs.subtreeSystemUiVisibility |= SYSTEM_UI_FLAG_FULLSCREEN; - mWindow.mAttrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; - addWindow(mWindow); - - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); - - assertInsetByTopBottom(mWindow.getParentFrame(), 0, 0); - assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getDecorFrame(), 0, 0); - assertInsetByTopBottom(mWindow.getDisplayFrameLw(), 0, 0); + synchronized (mWm.mGlobalLock) { + addDisplayCutout(); + + mWindow.mAttrs.subtreeSystemUiVisibility |= SYSTEM_UI_FLAG_FULLSCREEN; + mWindow.mAttrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; + addWindow(mWindow); + + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + + assertInsetByTopBottom(mWindow.getParentFrame(), 0, 0); + assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getDecorFrame(), 0, 0); + assertInsetByTopBottom(mWindow.getDisplayFrameLw(), 0, 0); + } } @Test public void layoutWindowLw_withDisplayCutout_landscape() { - addDisplayCutout(); - setRotation(ROTATION_90); - addWindow(mWindow); - - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); - - assertInsetBy(mWindow.getParentFrame(), DISPLAY_CUTOUT_HEIGHT, 0, 0, 0); - assertInsetBy(mWindow.getStableFrameLw(), 0, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); - assertInsetBy(mWindow.getContentFrameLw(), - DISPLAY_CUTOUT_HEIGHT, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); - assertInsetBy(mWindow.getDecorFrame(), 0, 0, 0, 0); - assertInsetBy(mWindow.getDisplayFrameLw(), DISPLAY_CUTOUT_HEIGHT, 0, 0, 0); + synchronized (mWm.mGlobalLock) { + addDisplayCutout(); + setRotation(ROTATION_90); + addWindow(mWindow); + + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + + assertInsetBy(mWindow.getParentFrame(), DISPLAY_CUTOUT_HEIGHT, 0, 0, 0); + assertInsetBy(mWindow.getStableFrameLw(), 0, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); + assertInsetBy(mWindow.getContentFrameLw(), + DISPLAY_CUTOUT_HEIGHT, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); + assertInsetBy(mWindow.getDecorFrame(), 0, 0, 0, 0); + assertInsetBy(mWindow.getDisplayFrameLw(), DISPLAY_CUTOUT_HEIGHT, 0, 0, 0); + } } @Test public void layoutWindowLw_withDisplayCutout_seascape() { - addDisplayCutout(); - setRotation(ROTATION_270); - addWindow(mWindow); - - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); - - assertInsetBy(mWindow.getParentFrame(), 0, 0, DISPLAY_CUTOUT_HEIGHT, 0); - assertInsetBy(mWindow.getStableFrameLw(), NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, 0, 0); - assertInsetBy(mWindow.getContentFrameLw(), - NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, DISPLAY_CUTOUT_HEIGHT, 0); - assertInsetBy(mWindow.getDecorFrame(), 0, 0, 0, 0); - assertInsetBy(mWindow.getDisplayFrameLw(), 0, 0, DISPLAY_CUTOUT_HEIGHT, 0); + synchronized (mWm.mGlobalLock) { + addDisplayCutout(); + setRotation(ROTATION_270); + addWindow(mWindow); + + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + + assertInsetBy(mWindow.getParentFrame(), 0, 0, DISPLAY_CUTOUT_HEIGHT, 0); + assertInsetBy(mWindow.getStableFrameLw(), NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, 0, 0); + assertInsetBy(mWindow.getContentFrameLw(), + NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, DISPLAY_CUTOUT_HEIGHT, 0); + assertInsetBy(mWindow.getDecorFrame(), 0, 0, 0, 0); + assertInsetBy(mWindow.getDisplayFrameLw(), 0, 0, DISPLAY_CUTOUT_HEIGHT, 0); + } } @Test public void layoutWindowLw_withDisplayCutout_fullscreen_landscape() { - addDisplayCutout(); - setRotation(ROTATION_90); - - mWindow.mAttrs.subtreeSystemUiVisibility |= SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; - addWindow(mWindow); - - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); - - assertInsetBy(mWindow.getParentFrame(), DISPLAY_CUTOUT_HEIGHT, 0, 0, 0); - assertInsetBy(mWindow.getStableFrameLw(), 0, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); - assertInsetBy(mWindow.getContentFrameLw(), - DISPLAY_CUTOUT_HEIGHT, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); - assertInsetBy(mWindow.getDecorFrame(), 0, 0, 0, 0); + synchronized (mWm.mGlobalLock) { + addDisplayCutout(); + setRotation(ROTATION_90); + + mWindow.mAttrs.subtreeSystemUiVisibility |= SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; + addWindow(mWindow); + + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + + assertInsetBy(mWindow.getParentFrame(), DISPLAY_CUTOUT_HEIGHT, 0, 0, 0); + assertInsetBy(mWindow.getStableFrameLw(), 0, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); + assertInsetBy(mWindow.getContentFrameLw(), + DISPLAY_CUTOUT_HEIGHT, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); + assertInsetBy(mWindow.getDecorFrame(), 0, 0, 0, 0); + } } @Test public void layoutWindowLw_withDisplayCutout_floatingInScreen() { - addDisplayCutout(); + synchronized (mWm.mGlobalLock) { + addDisplayCutout(); - mWindow.mAttrs.flags = FLAG_LAYOUT_IN_SCREEN; - mWindow.mAttrs.type = TYPE_APPLICATION_OVERLAY; - mWindow.mAttrs.width = DISPLAY_WIDTH; - mWindow.mAttrs.height = DISPLAY_HEIGHT; - addWindow(mWindow); + mWindow.mAttrs.flags = FLAG_LAYOUT_IN_SCREEN; + mWindow.mAttrs.type = TYPE_APPLICATION_OVERLAY; + mWindow.mAttrs.width = DISPLAY_WIDTH; + mWindow.mAttrs.height = DISPLAY_HEIGHT; + addWindow(mWindow); - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); - assertInsetByTopBottom(mWindow.getParentFrame(), 0, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getDisplayFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getParentFrame(), 0, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mWindow.getDisplayFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + } } @Test public void layoutWindowLw_withDisplayCutout_fullscreenInCutout_landscape() { - addDisplayCutout(); - setRotation(ROTATION_90); - - mWindow.mAttrs.subtreeSystemUiVisibility |= SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; - mWindow.mAttrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; - addWindow(mWindow); - - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); - - assertInsetBy(mWindow.getParentFrame(), 0, 0, 0, 0); - assertInsetBy(mWindow.getStableFrameLw(), 0, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); - assertInsetBy(mWindow.getContentFrameLw(), - DISPLAY_CUTOUT_HEIGHT, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); - assertInsetBy(mWindow.getDecorFrame(), 0, 0, 0, 0); + synchronized (mWm.mGlobalLock) { + addDisplayCutout(); + setRotation(ROTATION_90); + + mWindow.mAttrs.subtreeSystemUiVisibility |= SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; + mWindow.mAttrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; + addWindow(mWindow); + + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + + assertInsetBy(mWindow.getParentFrame(), 0, 0, 0, 0); + assertInsetBy(mWindow.getStableFrameLw(), 0, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); + assertInsetBy(mWindow.getContentFrameLw(), + DISPLAY_CUTOUT_HEIGHT, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); + assertInsetBy(mWindow.getDecorFrame(), 0, 0, 0, 0); + } } @Test public void layoutHint_appWindow() { - // Initialize DisplayFrames - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - - final Rect outFrame = new Rect(); - final Rect outContentInsets = new Rect(); - final Rect outStableInsets = new Rect(); - final Rect outOutsets = new Rect(); - final DisplayCutout.ParcelableWrapper outDisplayCutout = - new DisplayCutout.ParcelableWrapper(); - - mDisplayPolicy.getLayoutHintLw(mWindow.mAttrs, null, mFrames, - false /* floatingStack */, outFrame, outContentInsets, outStableInsets, outOutsets, - outDisplayCutout); - - assertThat(outFrame, is(mFrames.mUnrestricted)); - assertThat(outContentInsets, is(new Rect(0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT))); - assertThat(outStableInsets, is(new Rect(0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT))); - assertThat(outOutsets, is(new Rect())); - assertThat(outDisplayCutout, is(new DisplayCutout.ParcelableWrapper())); + synchronized (mWm.mGlobalLock) { + // Initialize DisplayFrames + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + + final Rect outFrame = new Rect(); + final Rect outContentInsets = new Rect(); + final Rect outStableInsets = new Rect(); + final Rect outOutsets = new Rect(); + final DisplayCutout.ParcelableWrapper outDisplayCutout = + new DisplayCutout.ParcelableWrapper(); + + mDisplayPolicy.getLayoutHintLw(mWindow.mAttrs, null, mFrames, + false /* floatingStack */, outFrame, outContentInsets, outStableInsets, + outOutsets, outDisplayCutout); + + assertThat(outFrame, is(mFrames.mUnrestricted)); + assertThat(outContentInsets, is(new Rect(0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT))); + assertThat(outStableInsets, is(new Rect(0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT))); + assertThat(outOutsets, is(new Rect())); + assertThat(outDisplayCutout, is(new DisplayCutout.ParcelableWrapper())); + } } @Test public void layoutHint_appWindowInTask() { - // Initialize DisplayFrames - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - - final Rect taskBounds = new Rect(100, 100, 200, 200); - - final Rect outFrame = new Rect(); - final Rect outContentInsets = new Rect(); - final Rect outStableInsets = new Rect(); - final Rect outOutsets = new Rect(); - final DisplayCutout.ParcelableWrapper outDisplayCutout = - new DisplayCutout.ParcelableWrapper(); - - mDisplayPolicy.getLayoutHintLw(mWindow.mAttrs, taskBounds, mFrames, - false /* floatingStack */, outFrame, outContentInsets, outStableInsets, outOutsets, - outDisplayCutout); - - assertThat(outFrame, is(taskBounds)); - assertThat(outContentInsets, is(new Rect())); - assertThat(outStableInsets, is(new Rect())); - assertThat(outOutsets, is(new Rect())); - assertThat(outDisplayCutout, is(new DisplayCutout.ParcelableWrapper())); + synchronized (mWm.mGlobalLock) { + // Initialize DisplayFrames + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + + final Rect taskBounds = new Rect(100, 100, 200, 200); + + final Rect outFrame = new Rect(); + final Rect outContentInsets = new Rect(); + final Rect outStableInsets = new Rect(); + final Rect outOutsets = new Rect(); + final DisplayCutout.ParcelableWrapper outDisplayCutout = + new DisplayCutout.ParcelableWrapper(); + + mDisplayPolicy.getLayoutHintLw(mWindow.mAttrs, taskBounds, mFrames, + false /* floatingStack */, outFrame, outContentInsets, outStableInsets, + outOutsets, outDisplayCutout); + + assertThat(outFrame, is(taskBounds)); + assertThat(outContentInsets, is(new Rect())); + assertThat(outStableInsets, is(new Rect())); + assertThat(outOutsets, is(new Rect())); + assertThat(outDisplayCutout, is(new DisplayCutout.ParcelableWrapper())); + } } @Test public void layoutHint_appWindowInTask_outsideContentFrame() { - // Initialize DisplayFrames - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - - // Task is in the nav bar area (usually does not happen, but this is similar enough to the - // possible overlap with the IME) - final Rect taskBounds = new Rect(100, mFrames.mContent.bottom + 1, - 200, mFrames.mContent.bottom + 10); - - final Rect outFrame = new Rect(); - final Rect outContentInsets = new Rect(); - final Rect outStableInsets = new Rect(); - final Rect outOutsets = new Rect(); - final DisplayCutout.ParcelableWrapper outDisplayCutout = - new DisplayCutout.ParcelableWrapper(); - - mDisplayPolicy.getLayoutHintLw(mWindow.mAttrs, taskBounds, mFrames, - true /* floatingStack */, outFrame, outContentInsets, outStableInsets, outOutsets, - outDisplayCutout); - - assertThat(outFrame, is(taskBounds)); - assertThat(outContentInsets, is(new Rect())); - assertThat(outStableInsets, is(new Rect())); - assertThat(outOutsets, is(new Rect())); - assertThat(outDisplayCutout, is(new DisplayCutout.ParcelableWrapper())); + synchronized (mWm.mGlobalLock) { + // Initialize DisplayFrames + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + + // Task is in the nav bar area (usually does not happen, but this is similar enough to + // the possible overlap with the IME) + final Rect taskBounds = new Rect(100, mFrames.mContent.bottom + 1, + 200, mFrames.mContent.bottom + 10); + + final Rect outFrame = new Rect(); + final Rect outContentInsets = new Rect(); + final Rect outStableInsets = new Rect(); + final Rect outOutsets = new Rect(); + final DisplayCutout.ParcelableWrapper outDisplayCutout = + new DisplayCutout.ParcelableWrapper(); + + mDisplayPolicy.getLayoutHintLw(mWindow.mAttrs, taskBounds, mFrames, + true /* floatingStack */, outFrame, outContentInsets, outStableInsets, + outOutsets, outDisplayCutout); + + assertThat(outFrame, is(taskBounds)); + assertThat(outContentInsets, is(new Rect())); + assertThat(outStableInsets, is(new Rect())); + assertThat(outOutsets, is(new Rect())); + assertThat(outDisplayCutout, is(new DisplayCutout.ParcelableWrapper())); + } } /** diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java index c11e606386e6..8821544903c1 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java @@ -29,6 +29,7 @@ import android.view.InsetsSource; import androidx.test.filters.FlakyTest; import androidx.test.filters.SmallTest; +import org.junit.Before; import org.junit.Test; @SmallTest @@ -36,8 +37,15 @@ import org.junit.Test; @Presubmit public class InsetsSourceProviderTest extends WindowTestsBase { - private InsetsSourceProvider mProvider = new InsetsSourceProvider( - new InsetsSource(TYPE_TOP_BAR)); + private InsetsSource mSource = new InsetsSource(TYPE_TOP_BAR); + private InsetsSourceProvider mProvider; + + @Before + public void setUp() throws Exception { + mSource.setVisible(true); + mProvider = new InsetsSourceProvider(mSource, + mDisplayContent.getInsetsStateController(), mDisplayContent); + } @Test public void testPostLayout() { diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java index 331622ce22a5..11526a85aafb 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java @@ -23,8 +23,10 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import android.platform.test.annotations.Presubmit; +import android.view.InsetsSourceControl; import android.view.InsetsState; import androidx.test.filters.FlakyTest; @@ -41,12 +43,9 @@ public class InsetsStateControllerTest extends WindowTestsBase { public void testStripForDispatch_notOwn() { final WindowState topBar = createWindow(null, TYPE_APPLICATION, "parentWindow"); final WindowState app = createWindow(null, TYPE_APPLICATION, "parentWindow"); - mDisplayContent.getInsetsStateController().getSourceProvider(TYPE_TOP_BAR) - .setWindow(topBar, null); - topBar.setInsetProvider( - mDisplayContent.getInsetsStateController().getSourceProvider(TYPE_TOP_BAR)); - assertNotNull(mDisplayContent.getInsetsStateController().getInsetsForDispatch(app) - .getSource(TYPE_TOP_BAR)); + getController().getSourceProvider(TYPE_TOP_BAR).setWindow(topBar, null); + topBar.setInsetProvider(getController().getSourceProvider(TYPE_TOP_BAR)); + assertNotNull(getController().getInsetsForDispatch(app).getSource(TYPE_TOP_BAR)); } @Test @@ -54,10 +53,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { final WindowState topBar = createWindow(null, TYPE_APPLICATION, "parentWindow"); mDisplayContent.getInsetsStateController().getSourceProvider(TYPE_TOP_BAR) .setWindow(topBar, null); - topBar.setInsetProvider( - mDisplayContent.getInsetsStateController().getSourceProvider(TYPE_TOP_BAR)); - assertEquals(new InsetsState(), - mDisplayContent.getInsetsStateController().getInsetsForDispatch(topBar)); + topBar.setInsetProvider(getController().getSourceProvider(TYPE_TOP_BAR)); + assertEquals(new InsetsState(), getController().getInsetsForDispatch(topBar)); } @Test @@ -65,13 +62,47 @@ public class InsetsStateControllerTest extends WindowTestsBase { final WindowState navBar = createWindow(null, TYPE_APPLICATION, "parentWindow"); final WindowState topBar = createWindow(null, TYPE_APPLICATION, "parentWindow"); final WindowState ime = createWindow(null, TYPE_APPLICATION, "parentWindow"); - mDisplayContent.getInsetsStateController().getSourceProvider(TYPE_TOP_BAR) - .setWindow(topBar, null); - mDisplayContent.getInsetsStateController().getSourceProvider(TYPE_NAVIGATION_BAR) - .setWindow(navBar, null); - mDisplayContent.getInsetsStateController().getSourceProvider(TYPE_IME) - .setWindow(ime, null); - assertEquals(new InsetsState(), - mDisplayContent.getInsetsStateController().getInsetsForDispatch(navBar)); + getController().getSourceProvider(TYPE_TOP_BAR).setWindow(topBar, null); + getController().getSourceProvider(TYPE_NAVIGATION_BAR).setWindow(navBar, null); + getController().getSourceProvider(TYPE_IME).setWindow(ime, null); + assertEquals(new InsetsState(), getController().getInsetsForDispatch(navBar)); + } + + @Test + public void testBarControllingWinChanged() { + final WindowState navBar = createWindow(null, TYPE_APPLICATION, "parentWindow"); + final WindowState topBar = createWindow(null, TYPE_APPLICATION, "parentWindow"); + final WindowState app = createWindow(null, TYPE_APPLICATION, "parentWindow"); + getController().getSourceProvider(TYPE_TOP_BAR).setWindow(topBar, null); + getController().getSourceProvider(TYPE_NAVIGATION_BAR).setWindow(navBar, null); + getController().onBarControllingWindowChanged(app); + InsetsSourceControl[] controls = getController().getControlsForDispatch(app); + assertEquals(2, controls.length); + } + + @Test + public void testControlRevoked() { + final WindowState topBar = createWindow(null, TYPE_APPLICATION, "parentWindow"); + final WindowState app = createWindow(null, TYPE_APPLICATION, "parentWindow"); + getController().getSourceProvider(TYPE_TOP_BAR).setWindow(topBar, null); + getController().onBarControllingWindowChanged(app); + assertNotNull(getController().getControlsForDispatch(app)); + getController().onBarControllingWindowChanged(null); + assertNull(getController().getControlsForDispatch(app)); + } + + @Test + public void testControlRevoked_animation() { + final WindowState topBar = createWindow(null, TYPE_APPLICATION, "parentWindow"); + final WindowState app = createWindow(null, TYPE_APPLICATION, "parentWindow"); + getController().getSourceProvider(TYPE_TOP_BAR).setWindow(topBar, null); + getController().onBarControllingWindowChanged(app); + assertNotNull(getController().getControlsForDispatch(app)); + topBar.cancelAnimation(); + assertNull(getController().getControlsForDispatch(app)); + } + + private InsetsStateController getController() { + return mDisplayContent.getInsetsStateController(); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java b/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java index 432af0d7a469..29738ff2a63d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java @@ -24,6 +24,7 @@ import android.util.MergedConfiguration; import android.view.DisplayCutout; import android.view.DragEvent; import android.view.IWindow; +import android.view.InsetsSourceControl; import android.view.InsetsState; import com.android.internal.os.IResultReceiver; @@ -40,11 +41,17 @@ public class TestIWindow extends IWindow.Stub { Rect backDropFrame, boolean forceLayout, boolean alwaysConsumeNavBar, int displayId, DisplayCutout.ParcelableWrapper displayCutout) throws RemoteException { } + @Override public void insetsChanged(InsetsState insetsState) throws RemoteException { } @Override + public void insetsControlChanged(InsetsState insetsState, InsetsSourceControl[] activeControls) + throws RemoteException { + } + + @Override public void moved(int newX, int newY) throws RemoteException { } diff --git a/startop/view_compiler/Android.bp b/startop/view_compiler/Android.bp index 0c40a6b5fa84..de40e0df48e7 100644 --- a/startop/view_compiler/Android.bp +++ b/startop/view_compiler/Android.bp @@ -24,7 +24,6 @@ cc_defaults { "libdexfile", "slicer", ], - cppflags: ["-std=c++17"], } cc_library_host_static { diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl index 923ab066ef0f..76e7509c1094 100644 --- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -25,6 +25,7 @@ import android.telephony.PhoneCapability; import android.telephony.PhysicalChannelConfig; import android.telephony.ServiceState; import android.telephony.SignalStrength; +import android.telephony.emergency.EmergencyNumber; import com.android.internal.telephony.IPhoneStateListener; import com.android.internal.telephony.IOnSubscriptionsChangedListener; @@ -80,4 +81,5 @@ interface ITelephonyRegistry { void notifyPhoneCapabilityChanged(in PhoneCapability capability); void notifyPreferredDataSubIdChanged(int preferredSubId); void notifyRadioPowerStateChanged(in int state); + void notifyEmergencyNumberList(in List<EmergencyNumber> emergencyNumberList); } diff --git a/tools/hiddenapi/generate_hiddenapi_lists.py b/tools/hiddenapi/generate_hiddenapi_lists.py index 2f1e53ca5065..01728fa1a0db 100755 --- a/tools/hiddenapi/generate_hiddenapi_lists.py +++ b/tools/hiddenapi/generate_hiddenapi_lists.py @@ -26,6 +26,7 @@ FLAG_WHITELIST = "whitelist" FLAG_GREYLIST = "greylist" FLAG_BLACKLIST = "blacklist" FLAG_GREYLIST_MAX_O = "greylist-max-o" +FLAG_GREYLIST_MAX_P = "greylist-max-p" # List of all known flags. FLAGS = [ @@ -33,6 +34,7 @@ FLAGS = [ FLAG_GREYLIST, FLAG_BLACKLIST, FLAG_GREYLIST_MAX_O, + FLAG_GREYLIST_MAX_P, ] FLAGS_SET = set(FLAGS) |