diff options
271 files changed, 2111 insertions, 5748 deletions
diff --git a/Android.bp b/Android.bp index 685c69df6823..acf86a0cfa2d 100644 --- a/Android.bp +++ b/Android.bp @@ -67,6 +67,7 @@ filegroup { name: "framework-non-updatable-sources", srcs: [ // Java/AIDL sources under frameworks/base + ":framework-annotations", ":framework-blobstore-sources", ":framework-core-sources", ":framework-drm-sources", @@ -388,47 +389,6 @@ platform_compat_config { } filegroup { - name: "framework-annotations", - srcs: [ - "core/java/android/annotation/AnyThread.java", - "core/java/android/annotation/AppIdInt.java", - "core/java/android/annotation/BytesLong.java", - "core/java/android/annotation/CallbackExecutor.java", - "core/java/android/annotation/CallSuper.java", - "core/java/android/annotation/CheckResult.java", - "core/java/android/annotation/CurrentTimeMillisLong.java", - "core/java/android/annotation/CurrentTimeSecondsLong.java", - "core/java/android/annotation/DrawableRes.java", - "core/java/android/annotation/DurationMillisLong.java", - "core/java/android/annotation/Hide.java", - "core/java/android/annotation/IntDef.java", - "core/java/android/annotation/IntRange.java", - "core/java/android/annotation/LongDef.java", - "core/java/android/annotation/MainThread.java", - "core/java/android/annotation/NonNull.java", - "core/java/android/annotation/Nullable.java", - "core/java/android/annotation/RequiresNoPermission.java", - "core/java/android/annotation/RequiresPermission.java", - "core/java/android/annotation/SdkConstant.java", - "core/java/android/annotation/StringDef.java", - "core/java/android/annotation/SystemApi.java", - "core/java/android/annotation/SystemService.java", - "core/java/android/annotation/TestApi.java", - "core/java/android/annotation/UserIdInt.java", - "core/java/android/annotation/WorkerThread.java", - "core/java/com/android/internal/annotations/GuardedBy.java", - "core/java/com/android/internal/annotations/Immutable.java", - "core/java/com/android/internal/annotations/VisibleForTesting.java", - ], -} - -java_library { - name: "framework-annotations-lib", - srcs: [":framework-annotations"], - sdk_version: "core_current", -} - -filegroup { name: "framework-ike-shared-srcs", visibility: ["//packages/modules/IPsec"], srcs: [ diff --git a/core/api/current.txt b/core/api/current.txt index b257f5eea9d7..989ca3427453 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -11920,6 +11920,7 @@ package android.content.pm { method public int getGwpAsanMode(); method public int getMemtagMode(); method public int getNativeHeapZeroInitialized(); + method public int getRequestRawExternalStorageAccess(); method public boolean isProfileable(); method public boolean isProfileableByShell(); method public boolean isResourceOverlay(); @@ -11975,6 +11976,9 @@ package android.content.pm { field public static final int MEMTAG_DEFAULT = -1; // 0xffffffff field public static final int MEMTAG_OFF = 0; // 0x0 field public static final int MEMTAG_SYNC = 2; // 0x2 + field public static final int RAW_EXTERNAL_STORAGE_ACCESS_DEFAULT = 0; // 0x0 + field public static final int RAW_EXTERNAL_STORAGE_ACCESS_NOT_REQUESTED = 2; // 0x2 + field public static final int RAW_EXTERNAL_STORAGE_ACCESS_REQUESTED = 1; // 0x1 field public static final int ZEROINIT_DEFAULT = -1; // 0xffffffff field public static final int ZEROINIT_DISABLED = 0; // 0x0 field public static final int ZEROINIT_ENABLED = 1; // 0x1 diff --git a/core/api/system-current.txt b/core/api/system-current.txt index c7960dd406ed..990f43de5ec5 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -2520,7 +2520,6 @@ package android.content.om { package android.content.pm { public class ApplicationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable { - method @Nullable public Boolean hasRequestRawExternalStorageAccess(); method public boolean isEncryptionAware(); method public boolean isInstantApp(); method public boolean isOem(); diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 35767b3acb8c..1330234f6521 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1810,6 +1810,7 @@ package android.os { public class VintfObject { method public static String[] getHalNamesAndVersions(); + method @NonNull public static String getPlatformSepolicyVersion(); method public static String getSepolicyVersion(); method public static Long getTargetFrameworkCompatibilityMatrixVersion(); method public static java.util.Map<java.lang.String,java.lang.String[]> getVndkSnapshots(); diff --git a/core/java/Android.bp b/core/java/Android.bp index c8a8d36a1b20..793d0ef164fa 100644 --- a/core/java/Android.bp +++ b/core/java/Android.bp @@ -46,44 +46,6 @@ filegroup { "android/accounts/AccountsException.java", "android/accounts/AuthenticatorException.java", "android/accounts/OperationCanceledException.java", - "android/annotation/AnimatorRes.java", - "android/annotation/AnimRes.java", - "android/annotation/AnyRes.java", - "android/annotation/ArrayRes.java", - "android/annotation/AttrRes.java", - "android/annotation/BoolRes.java", - "android/annotation/BroadcastBehavior.java", - "android/annotation/CallbackExecutor.java", - "android/annotation/CallSuper.java", - "android/annotation/CheckResult.java", - "android/annotation/ColorInt.java", - "android/annotation/ColorRes.java", - "android/annotation/DimenRes.java", - "android/annotation/DrawableRes.java", - "android/annotation/FontRes.java", - "android/annotation/FractionRes.java", - "android/annotation/IntDef.java", - "android/annotation/IntegerRes.java", - "android/annotation/IntRange.java", - "android/annotation/LayoutRes.java", - "android/annotation/NonNull.java", - "android/annotation/Nullable.java", - "android/annotation/PluralsRes.java", - "android/annotation/RawRes.java", - "android/annotation/RequiresNoPermission.java", - "android/annotation/RequiresPermission.java", - "android/annotation/SdkConstant.java", - "android/annotation/Size.java", - "android/annotation/StringDef.java", - "android/annotation/StringRes.java", - "android/annotation/StyleableRes.java", - "android/annotation/StyleRes.java", - "android/annotation/SuppressLint.java", - "android/annotation/SystemApi.java", - "android/annotation/SystemService.java", - "android/annotation/TestApi.java", - "android/annotation/UserIdInt.java", - "android/annotation/XmlRes.java", "android/app/Application.java", "android/app/IApplicationThread.aidl", "android/app/IServiceConnection.aidl", @@ -124,7 +86,6 @@ filegroup { "android/util/AndroidException.java", "android/view/DisplayAdjustments.java", "android/view/ViewDebug.java", - "com/android/internal/annotations/VisibleForTesting.java", ], visibility: ["//frameworks/base/test-mock"], } diff --git a/core/java/android/annotation/AnimRes.java b/core/java/android/annotation/AnimRes.java deleted file mode 100644 index 56f8acf82313..000000000000 --- a/core/java/android/annotation/AnimRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be an anim resource reference (e.g. {@link android.R.anim#fade_in}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface AnimRes { -} diff --git a/core/java/android/annotation/AnimatorRes.java b/core/java/android/annotation/AnimatorRes.java deleted file mode 100644 index cd4c189b7531..000000000000 --- a/core/java/android/annotation/AnimatorRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be an animator resource reference (e.g. {@link android.R.animator#fade_in}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface AnimatorRes { -} diff --git a/core/java/android/annotation/AnyRes.java b/core/java/android/annotation/AnyRes.java deleted file mode 100644 index 44411a04a8e7..000000000000 --- a/core/java/android/annotation/AnyRes.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a resource reference of any type. If the specific type is known, use - * one of the more specific annotations instead, such as {@link StringRes} or - * {@link DrawableRes}. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface AnyRes { -} diff --git a/core/java/android/annotation/AnyThread.java b/core/java/android/annotation/AnyThread.java deleted file mode 100644 index ee36a42b3fc6..000000000000 --- a/core/java/android/annotation/AnyThread.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2016 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.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that the annotated method can be called from any thread (e.g. it is - * "thread safe".) If the annotated element is a class, then all methods in the - * class can be called from any thread. - * <p> - * The main purpose of this method is to indicate that you believe a method can - * be called from any thread; static tools can then check that nothing you call - * from within this method or class have more strict threading requirements. - * <p> - * Example: - * - * <pre> - * <code> - * @AnyThread - * public void deliverResult(D data) { ... } - * </code> - * </pre> - * - * @memberDoc This method is safe to call from any thread. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER}) -public @interface AnyThread { -} diff --git a/core/java/android/annotation/AppIdInt.java b/core/java/android/annotation/AppIdInt.java deleted file mode 100644 index 29838dd5bd7c..000000000000 --- a/core/java/android/annotation/AppIdInt.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2016 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that the annotated element is a multi-user application ID. This is - * <em>not</em> the same as a UID. - * - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface AppIdInt { -} diff --git a/core/java/android/annotation/ArrayRes.java b/core/java/android/annotation/ArrayRes.java deleted file mode 100644 index 1407af1d1422..000000000000 --- a/core/java/android/annotation/ArrayRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be an array resource reference (e.g. {@link android.R.array#phoneTypes}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface ArrayRes { -} diff --git a/core/java/android/annotation/AttrRes.java b/core/java/android/annotation/AttrRes.java deleted file mode 100644 index 285b80ce45ca..000000000000 --- a/core/java/android/annotation/AttrRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be an attribute reference (e.g. {@link android.R.attr#action}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface AttrRes { -} diff --git a/core/java/android/annotation/BinderThread.java b/core/java/android/annotation/BinderThread.java deleted file mode 100644 index ca5e14c2adb9..000000000000 --- a/core/java/android/annotation/BinderThread.java +++ /dev/null @@ -1,43 +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. - */ -package android.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated method should only be called on the binder thread. - * If the annotated element is a class, then all methods in the class should be called - * on the binder thread. - * <p> - * Example: - * <pre><code> - * @BinderThread - * public BeamShareData createBeamShareData() { ... } - * </code></pre> - * - * {@hide} - */ -@Retention(SOURCE) -@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER}) -public @interface BinderThread { -}
\ No newline at end of file diff --git a/core/java/android/annotation/BoolRes.java b/core/java/android/annotation/BoolRes.java deleted file mode 100644 index f50785b1e1cf..000000000000 --- a/core/java/android/annotation/BoolRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a boolean resource reference. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface BoolRes { -} diff --git a/core/java/android/annotation/BroadcastBehavior.java b/core/java/android/annotation/BroadcastBehavior.java deleted file mode 100644 index 70d82cb5151b..000000000000 --- a/core/java/android/annotation/BroadcastBehavior.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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. - */ - -package android.annotation; - -import android.content.Intent; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Description of how the annotated broadcast action behaves. - * - * @hide - */ -@Target({ ElementType.FIELD }) -@Retention(RetentionPolicy.SOURCE) -public @interface BroadcastBehavior { - /** - * This broadcast will only be delivered to an explicit target. - * - * @see Intent#setPackage(String) - * @see Intent#setComponent(android.content.ComponentName) - */ - boolean explicitOnly() default false; - - /** - * This broadcast will only be delivered to registered receivers. - * - * @see Intent#FLAG_RECEIVER_REGISTERED_ONLY - */ - boolean registeredOnly() default false; - - /** - * This broadcast will include all {@code AndroidManifest.xml} receivers - * regardless of process state. - * - * @see Intent#FLAG_RECEIVER_INCLUDE_BACKGROUND - */ - boolean includeBackground() default false; - - /** - * This broadcast is protected and can only be sent by the OS. - */ - boolean protectedBroadcast() default false; -} diff --git a/core/java/android/annotation/BytesLong.java b/core/java/android/annotation/BytesLong.java deleted file mode 100644 index f5e1a9c5f7fd..000000000000 --- a/core/java/android/annotation/BytesLong.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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. - */ - -package android.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * @memberDoc Value is a non-negative number of bytes. - * @paramDoc Value is a non-negative number of bytes. - * @returnDoc Value is a non-negative number of bytes. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface BytesLong { -} diff --git a/core/java/android/annotation/CallSuper.java b/core/java/android/annotation/CallSuper.java deleted file mode 100644 index c16b51161cac..000000000000 --- a/core/java/android/annotation/CallSuper.java +++ /dev/null @@ -1,43 +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. - */ -package android.annotation; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that any overriding methods should invoke this method as well. - * <p> - * Example: - * - * <pre> - * <code> - * @CallSuper - * public abstract void onFocusLost(); - * </code> - * </pre> - * - * @memberDoc If you override this method you <em>must</em> call through to the - * superclass implementation. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD}) -public @interface CallSuper { -} diff --git a/core/java/android/annotation/CallbackExecutor.java b/core/java/android/annotation/CallbackExecutor.java deleted file mode 100644 index 4258f730eb16..000000000000 --- a/core/java/android/annotation/CallbackExecutor.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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. - */ - -package android.annotation; - -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; -import java.util.concurrent.Executor; - -/** - * @paramDoc Callback and listener events are dispatched through this - * {@link Executor}, providing an easy way to control which thread is - * used. To dispatch events through the main thread of your - * application, you can use - * {@link android.content.Context#getMainExecutor() Context.getMainExecutor()}. - * To dispatch events through a shared thread pool, you can use - * {@link android.os.AsyncTask#THREAD_POOL_EXECUTOR AsyncTask#THREAD_POOL_EXECUTOR}. - * @hide - */ -@Retention(SOURCE) -@Target(PARAMETER) -public @interface CallbackExecutor { -} diff --git a/core/java/android/annotation/CheckResult.java b/core/java/android/annotation/CheckResult.java deleted file mode 100644 index 97d031a760a6..000000000000 --- a/core/java/android/annotation/CheckResult.java +++ /dev/null @@ -1,58 +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. - */ -package android.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated method returns a result that it typically is - * an error to ignore. This is usually used for methods that have no side effect, - * so calling it without actually looking at the result usually means the developer - * has misunderstood what the method does. - * <p> - * Example: - * <pre>{@code - * public @CheckResult String trim(String s) { return s.trim(); } - * ... - * s.trim(); // this is probably an error - * s = s.trim(); // ok - * }</pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({METHOD}) -public @interface CheckResult { - /** Defines the name of the suggested method to use instead, if applicable (using - * the same signature format as javadoc.) If there is more than one possibility, - * list them all separated by commas. - * <p> - * For example, ProcessBuilder has a method named {@code redirectErrorStream()} - * which sounds like it might redirect the error stream. It does not. It's just - * a getter which returns whether the process builder will redirect the error stream, - * and to actually set it, you must call {@code redirectErrorStream(boolean)}. - * In that case, the method should be defined like this: - * <pre> - * @CheckResult(suggest="#redirectErrorStream(boolean)") - * public boolean redirectErrorStream() { ... } - * </pre> - */ - String suggest() default ""; -}
\ No newline at end of file diff --git a/core/java/android/annotation/ColorInt.java b/core/java/android/annotation/ColorInt.java deleted file mode 100644 index 4671b1b9f887..000000000000 --- a/core/java/android/annotation/ColorInt.java +++ /dev/null @@ -1,42 +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. - */ -package android.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated element represents a packed color - * int, {@code AARRGGBB}. If applied to an int array, every element - * in the array represents a color integer. - * <p> - * Example: - * <pre>{@code - * public abstract void setTextColor(@ColorInt int color); - * }</pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({PARAMETER,METHOD,LOCAL_VARIABLE,FIELD}) -public @interface ColorInt { -}
\ No newline at end of file diff --git a/core/java/android/annotation/ColorLong.java b/core/java/android/annotation/ColorLong.java deleted file mode 100644 index 9b19c76802c9..000000000000 --- a/core/java/android/annotation/ColorLong.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2016 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.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * <p>Denotes that the annotated element represents a packed color - * long. If applied to a long array, every element in the array - * represents a color long. For more information on how colors - * are packed in a long, please refer to the documentation of - * the {@link android.graphics.Color} class.</p> - * - * <p>Example:</p> - * - * <pre>{@code - * public void setFillColor(@ColorLong long color); - * }</pre> - * - * @see android.graphics.Color - * - * @hide - */ -@Retention(SOURCE) -@Target({PARAMETER,METHOD,LOCAL_VARIABLE,FIELD}) -public @interface ColorLong { -} diff --git a/core/java/android/annotation/ColorRes.java b/core/java/android/annotation/ColorRes.java deleted file mode 100644 index 061faa05c738..000000000000 --- a/core/java/android/annotation/ColorRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a color resource reference (e.g. {@link android.R.color#black}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface ColorRes { -} diff --git a/core/java/android/annotation/Condemned.java b/core/java/android/annotation/Condemned.java deleted file mode 100644 index 186409b3e204..000000000000 --- a/core/java/android/annotation/Condemned.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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. - */ - -package android.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PACKAGE; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * A program element annotated @Condemned is one that programmers are - * blocked from using, typically because it's about to be completely destroyed. - * <p> - * This is a stronger version of @Deprecated, and it's typically used to - * mark APIs that only existed temporarily in a preview SDK, and which only - * continue to exist temporarily to support binary compatibility. - * - * @hide - */ -@Retention(SOURCE) -@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE}) -public @interface Condemned { -} diff --git a/core/java/android/annotation/CurrentTimeMillisLong.java b/core/java/android/annotation/CurrentTimeMillisLong.java deleted file mode 100644 index 355bb5a2f960..000000000000 --- a/core/java/android/annotation/CurrentTimeMillisLong.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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. - */ - -package android.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * @memberDoc Value is a non-negative timestamp measured as the number of - * milliseconds since 1970-01-01T00:00:00Z. - * @paramDoc Value is a non-negative timestamp measured as the number of - * milliseconds since 1970-01-01T00:00:00Z. - * @returnDoc Value is a non-negative timestamp measured as the number of - * milliseconds since 1970-01-01T00:00:00Z. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface CurrentTimeMillisLong { -} diff --git a/core/java/android/annotation/CurrentTimeSecondsLong.java b/core/java/android/annotation/CurrentTimeSecondsLong.java deleted file mode 100644 index 2b4ffd77ad34..000000000000 --- a/core/java/android/annotation/CurrentTimeSecondsLong.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * @memberDoc Value is a non-negative timestamp measured as the number of - * seconds since 1970-01-01T00:00:00Z. - * @paramDoc Value is a non-negative timestamp measured as the number of - * seconds since 1970-01-01T00:00:00Z. - * @returnDoc Value is a non-negative timestamp measured as the number of - * seconds since 1970-01-01T00:00:00Z. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface CurrentTimeSecondsLong { -} diff --git a/core/java/android/annotation/DimenRes.java b/core/java/android/annotation/DimenRes.java deleted file mode 100644 index 02ae00c6868c..000000000000 --- a/core/java/android/annotation/DimenRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a dimension resource reference (e.g. {@link android.R.dimen#app_icon_size}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface DimenRes { -} diff --git a/core/java/android/annotation/Dimension.java b/core/java/android/annotation/Dimension.java deleted file mode 100644 index 5f705ad52d9b..000000000000 --- a/core/java/android/annotation/Dimension.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2016 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that a numeric parameter, field or method return value is expected - * to represent a dimension. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE,ANNOTATION_TYPE}) -public @interface Dimension { - @Unit - int unit() default PX; - - int DP = 0; - int PX = 1; - int SP = 2; - - @IntDef({PX, DP, SP}) - @Retention(SOURCE) - @interface Unit {} -} diff --git a/core/java/android/annotation/DisplayContext.java b/core/java/android/annotation/DisplayContext.java deleted file mode 100644 index e6b464ac237a..000000000000 --- a/core/java/android/annotation/DisplayContext.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2020 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import android.app.Activity; -import android.app.WallpaperManager; -import android.content.Context; -import android.os.Bundle; -import android.view.Display; -import android.view.LayoutInflater; -import android.view.WindowManager; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes a {@link Context} that is tied to a {@link Display} and can be used to obtain one - * via {@link Context#getDisplay}, but <b>may not</b> be able to obtain {@link WindowManager}, - * {@link LayoutInflater} or {@link WallpaperManager} via {@link Context#getSystemService(String)}. - * If the UI services mentioned above are required, please use contexts which are marked as - * {@link UiContext}. - * <p> - * {@link Activity}, and the result of {@link Context#createWindowContext(int, Bundle)} or - * {@link Context#createDisplayContext(Display)} can be - * used where a {@link DisplayContext} is required. - * <p> - * This is a marker annotation and has no specific attributes. - * - * @see Context#getDisplay() - * @see Context#getSystemService(String) - * @see Context#getSystemService(Class) - * @see Context#createDisplayContext(Display) - * @see Context#createWindowContext(int, Bundle) - * @see UiContext - * @hide - */ -@Retention(SOURCE) -@Target({TYPE, METHOD, PARAMETER, FIELD}) -public @interface DisplayContext { -} diff --git a/core/java/android/annotation/DrawableRes.java b/core/java/android/annotation/DrawableRes.java deleted file mode 100644 index ebefa1d78ab1..000000000000 --- a/core/java/android/annotation/DrawableRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a drawable resource reference (e.g. {@link android.R.attr#alertDialogIcon}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface DrawableRes { -} diff --git a/core/java/android/annotation/DurationMillisLong.java b/core/java/android/annotation/DurationMillisLong.java deleted file mode 100644 index ce77532a6c6e..000000000000 --- a/core/java/android/annotation/DurationMillisLong.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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. - */ - -package android.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * @memberDoc Value is a non-negative duration in milliseconds. - * @paramDoc Value is a non-negative duration in milliseconds. - * @returnDoc Value is a non-negative duration in milliseconds. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface DurationMillisLong { -} diff --git a/core/java/android/annotation/ElapsedRealtimeLong.java b/core/java/android/annotation/ElapsedRealtimeLong.java deleted file mode 100644 index f77ff72062a6..000000000000 --- a/core/java/android/annotation/ElapsedRealtimeLong.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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. - */ - -package android.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import android.os.SystemClock; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * @memberDoc Value is a non-negative timestamp in the - * {@link SystemClock#elapsedRealtime()} time base. - * @paramDoc Value is a non-negative timestamp in the - * {@link SystemClock#elapsedRealtime()} time base. - * @returnDoc Value is a non-negative timestamp in the - * {@link SystemClock#elapsedRealtime()} time base. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface ElapsedRealtimeLong { -} diff --git a/core/java/android/annotation/FloatRange.java b/core/java/android/annotation/FloatRange.java deleted file mode 100644 index 05b51680b1b0..000000000000 --- a/core/java/android/annotation/FloatRange.java +++ /dev/null @@ -1,55 +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. - */ -package android.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated element should be a float or double in the given range - * <p> - * Example: - * <pre><code> - * @FloatRange(from=0.0,to=1.0) - * public float getAlpha() { - * ... - * } - * </code></pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE}) -public @interface FloatRange { - /** Smallest value. Whether it is inclusive or not is determined - * by {@link #fromInclusive} */ - double from() default Double.NEGATIVE_INFINITY; - /** Largest value. Whether it is inclusive or not is determined - * by {@link #toInclusive} */ - double to() default Double.POSITIVE_INFINITY; - - /** Whether the from value is included in the range */ - boolean fromInclusive() default true; - - /** Whether the to value is included in the range */ - boolean toInclusive() default true; -}
\ No newline at end of file diff --git a/core/java/android/annotation/FontRes.java b/core/java/android/annotation/FontRes.java deleted file mode 100644 index dbacb5876dce..000000000000 --- a/core/java/android/annotation/FontRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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. - */ -package android.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a Font resource reference (e.g. R.font.myfont). - * - * @hide - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface FontRes { -} diff --git a/core/java/android/annotation/FractionRes.java b/core/java/android/annotation/FractionRes.java deleted file mode 100644 index fd84d3e85fdf..000000000000 --- a/core/java/android/annotation/FractionRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a fraction resource reference. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface FractionRes { -} diff --git a/core/java/android/annotation/HalfFloat.java b/core/java/android/annotation/HalfFloat.java deleted file mode 100644 index 256008c5e31f..000000000000 --- a/core/java/android/annotation/HalfFloat.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2016 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.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * <p>Denotes that the annotated element represents a half-precision floating point - * value. Such values are stored in short data types and can be manipulated with - * the {@link android.util.Half} class. If applied to an array of short, every - * element in the array represents a half-precision float.</p> - * - * <p>Example:</p> - * - * <pre>{@code - * public abstract void setPosition(@HalfFloat short x, @HalfFloat short y, @HalfFloat short z); - * }</pre> - * - * @see android.util.Half - * @see android.util.Half#toHalf(float) - * @see android.util.Half#toFloat(short) - * - * @hide - */ -@Retention(SOURCE) -@Target({PARAMETER, METHOD, LOCAL_VARIABLE, FIELD}) -public @interface HalfFloat { -} diff --git a/core/java/android/annotation/Hide.java b/core/java/android/annotation/Hide.java deleted file mode 100644 index c8e5a4a97ae7..000000000000 --- a/core/java/android/annotation/Hide.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.annotation; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PACKAGE; -import static java.lang.annotation.ElementType.TYPE; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Indicates that an API is hidden by default, in a similar fashion to the - * <pre>@hide</pre> javadoc tag. - * - * <p>Note that, in order for this to work, metalava has to be invoked with - * the flag {@code --hide-annotation android.annotation.Hide}. - * @hide - */ -@Target({TYPE, FIELD, METHOD, CONSTRUCTOR, ANNOTATION_TYPE, PACKAGE}) -@Retention(RetentionPolicy.CLASS) -public @interface Hide { -} diff --git a/core/java/android/annotation/IdRes.java b/core/java/android/annotation/IdRes.java deleted file mode 100644 index b286965c99d9..000000000000 --- a/core/java/android/annotation/IdRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be an id resource reference (e.g. {@link android.R.id#copy}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface IdRes { -} diff --git a/core/java/android/annotation/IntDef.java b/core/java/android/annotation/IntDef.java deleted file mode 100644 index f84a67655dc3..000000000000 --- a/core/java/android/annotation/IntDef.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated element of integer type, represents - * a logical type and that its value should be one of the explicitly - * named constants. If the {@link #flag()} attribute is set to true, - * multiple constants can be combined. - * <p> - * <pre><code> - * @Retention(SOURCE) - * @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS}) - * public @interface NavigationMode {} - * public static final int NAVIGATION_MODE_STANDARD = 0; - * public static final int NAVIGATION_MODE_LIST = 1; - * public static final int NAVIGATION_MODE_TABS = 2; - * ... - * public abstract void setNavigationMode(@NavigationMode int mode); - * @NavigationMode - * public abstract int getNavigationMode(); - * </code></pre> - * For a flag, set the flag attribute: - * <pre><code> - * @IntDef( - * flag = true, - * value = {NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS}) - * </code></pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({ANNOTATION_TYPE}) -public @interface IntDef { - /** Defines the constant prefix for this element */ - String[] prefix() default {}; - /** Defines the constant suffix for this element */ - String[] suffix() default {}; - - /** Defines the allowed constants for this element */ - int[] value() default {}; - - /** Defines whether the constants can be used as a flag, or just as an enum (the default) */ - boolean flag() default false; -} diff --git a/core/java/android/annotation/IntRange.java b/core/java/android/annotation/IntRange.java deleted file mode 100644 index c043e2db6a98..000000000000 --- a/core/java/android/annotation/IntRange.java +++ /dev/null @@ -1,48 +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. - */ -package android.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated element should be an int or long in the given range - * <p> - * Example: - * <pre><code> - * @IntRange(from=0,to=255) - * public int getAlpha() { - * ... - * } - * </code></pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE,ANNOTATION_TYPE}) -public @interface IntRange { - /** Smallest value, inclusive */ - long from() default Long.MIN_VALUE; - /** Largest value, inclusive */ - long to() default Long.MAX_VALUE; -}
\ No newline at end of file diff --git a/core/java/android/annotation/IntegerRes.java b/core/java/android/annotation/IntegerRes.java deleted file mode 100644 index 5313f4adf46e..000000000000 --- a/core/java/android/annotation/IntegerRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be an integer resource reference (e.g. {@link android.R.integer#config_shortAnimTime}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface IntegerRes { -} diff --git a/core/java/android/annotation/InterpolatorRes.java b/core/java/android/annotation/InterpolatorRes.java deleted file mode 100644 index 8877a5f9a4f1..000000000000 --- a/core/java/android/annotation/InterpolatorRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be an interpolator resource reference (e.g. {@link android.R.interpolator#cycle}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface InterpolatorRes { -} diff --git a/core/java/android/annotation/LayoutRes.java b/core/java/android/annotation/LayoutRes.java deleted file mode 100644 index 15ba86f98159..000000000000 --- a/core/java/android/annotation/LayoutRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a layout resource reference (e.g. {@link android.R.layout#list_content}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface LayoutRes { -} diff --git a/core/java/android/annotation/LongDef.java b/core/java/android/annotation/LongDef.java deleted file mode 100644 index 8723eef86328..000000000000 --- a/core/java/android/annotation/LongDef.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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. - */ -package android.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated long element represents - * a logical type and that its value should be one of the explicitly - * named constants. If the {@link #flag()} attribute is set to true, - * multiple constants can be combined. - * <p> - * <pre><code> - * @Retention(SOURCE) - * @LongDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS}) - * public @interface NavigationMode {} - * public static final long NAVIGATION_MODE_STANDARD = 0; - * public static final long NAVIGATION_MODE_LIST = 1; - * public static final long NAVIGATION_MODE_TABS = 2; - * ... - * public abstract void setNavigationMode(@NavigationMode long mode); - * @NavigationMode - * public abstract long getNavigationMode(); - * </code></pre> - * For a flag, set the flag attribute: - * <pre><code> - * @LongDef( - * flag = true, - * value = {NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS}) - * </code></pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({ANNOTATION_TYPE}) -public @interface LongDef { - /** Defines the constant prefix for this element */ - String[] prefix() default ""; - - /** Defines the allowed constants for this element */ - long[] value() default {}; - - /** Defines whether the constants can be used as a flag, or just as an enum (the default) */ - boolean flag() default false; -} diff --git a/core/java/android/annotation/MainThread.java b/core/java/android/annotation/MainThread.java deleted file mode 100644 index a070246e5ef3..000000000000 --- a/core/java/android/annotation/MainThread.java +++ /dev/null @@ -1,47 +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. - */ -package android.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that the annotated method should only be called on the main thread. - * If the annotated element is a class, then all methods in the class should be - * called on the main thread. - * <p> - * Example: - * - * <pre> - * <code> - * @MainThread - * public void deliverResult(D data) { ... } - * </code> - * </pre> - * - * @memberDoc This method must be called from the main thread of your app. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER}) -public @interface MainThread { -} diff --git a/core/java/android/annotation/MenuRes.java b/core/java/android/annotation/MenuRes.java deleted file mode 100644 index b6dcc4604cfb..000000000000 --- a/core/java/android/annotation/MenuRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a menu resource reference. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface MenuRes { -} diff --git a/core/java/android/annotation/NavigationRes.java b/core/java/android/annotation/NavigationRes.java deleted file mode 100644 index 3af5ecff84a6..000000000000 --- a/core/java/android/annotation/NavigationRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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. - */ -package android.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a navigation resource reference (e.g. {@code R.navigation.flow}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface NavigationRes { -} diff --git a/core/java/android/annotation/NonNull.java b/core/java/android/annotation/NonNull.java deleted file mode 100644 index 20472bacf6ad..000000000000 --- a/core/java/android/annotation/NonNull.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that a parameter, field or method return value can never be null. - * <p> - * This is a marker annotation and it has no specific attributes. - * - * @paramDoc This value cannot be {@code null}. - * @returnDoc This value cannot be {@code null}. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface NonNull { -} diff --git a/core/java/android/annotation/NonUiContext.java b/core/java/android/annotation/NonUiContext.java deleted file mode 100644 index c119ca20ba11..000000000000 --- a/core/java/android/annotation/NonUiContext.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2020 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import android.app.WallpaperManager; -import android.content.Context; -import android.view.Display; -import android.view.LayoutInflater; -import android.view.WindowManager; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes a {@link Context} that <b>can not</b> be used to obtain a {@link Display} via - * {@link Context#getDisplay} nor to obtain a {@link WindowManager}, {@link LayoutInflater} or - * {@link WallpaperManager} via {@link Context#getSystemService(String)}. - * <p> - * This is a marker annotation and has no specific attributes. - * - * @see Context#getDisplay() - * @see Context#getSystemService(String) - * @see Context#getSystemService(Class) - * @hide - */ -@Retention(SOURCE) -@Target({TYPE, METHOD, PARAMETER, FIELD}) -public @interface NonUiContext { -} diff --git a/core/java/android/annotation/Nullable.java b/core/java/android/annotation/Nullable.java deleted file mode 100644 index b8473e750c95..000000000000 --- a/core/java/android/annotation/Nullable.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that a parameter, field or method return value can be null. - * <p> - * When decorating a method call parameter, this denotes that the parameter can - * legitimately be null and the method will gracefully deal with it. Typically - * used on optional parameters. - * <p> - * When decorating a method, this denotes the method might legitimately return - * null. - * <p> - * This is a marker annotation and it has no specific attributes. - * - * @paramDoc This value may be {@code null}. - * @returnDoc This value may be {@code null}. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface Nullable { -} diff --git a/core/java/android/annotation/OWNERS b/core/java/android/annotation/OWNERS deleted file mode 100644 index e1ef54460b56..000000000000 --- a/core/java/android/annotation/OWNERS +++ /dev/null @@ -1,3 +0,0 @@ -tnorbye@google.com -aurimas@google.com -per-file UnsupportedAppUsage.java = mathewi@google.com, satayev@google.com, andreionea@google.com diff --git a/core/java/android/annotation/PluralsRes.java b/core/java/android/annotation/PluralsRes.java deleted file mode 100644 index 31ac729aaa47..000000000000 --- a/core/java/android/annotation/PluralsRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a plurals resource reference. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface PluralsRes { -} diff --git a/core/java/android/annotation/Px.java b/core/java/android/annotation/Px.java deleted file mode 100644 index cec7f80405d3..000000000000 --- a/core/java/android/annotation/Px.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2016 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that a numeric parameter, field or method return value is expected - * to represent a pixel dimension. - * - * @memberDoc This units of this value are pixels. - * @paramDoc This units of this value are pixels. - * @returnDoc This units of this value are pixels. - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE}) -@Dimension(unit = Dimension.PX) -public @interface Px { -} diff --git a/core/java/android/annotation/RawRes.java b/core/java/android/annotation/RawRes.java deleted file mode 100644 index 39970b36fd95..000000000000 --- a/core/java/android/annotation/RawRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a raw resource reference. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface RawRes { -} diff --git a/core/java/android/annotation/RequiresFeature.java b/core/java/android/annotation/RequiresFeature.java deleted file mode 100644 index 08861d42be39..000000000000 --- a/core/java/android/annotation/RequiresFeature.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import android.content.pm.PackageManager; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that the annotated element requires one or more device features. This - * is used to auto-generate documentation. - * - * @hide - */ -@Retention(SOURCE) -@Target({TYPE,FIELD,METHOD,CONSTRUCTOR}) -public @interface RequiresFeature { - /** - * The name of the device feature that is required. - */ - String value(); - - /** - * Defines the name of the method that should be called to check whether the feature is - * available, using the same signature format as javadoc. The feature checking method can have - * multiple parameters, but the feature name parameter must be of type String and must also be - * the first String-type parameter. - * <p> - * By default, the enforcement is {@link PackageManager#hasSystemFeature(String)}. - */ - String enforcement() default("android.content.pm.PackageManager#hasSystemFeature"); -} diff --git a/core/java/android/annotation/RequiresNoPermission.java b/core/java/android/annotation/RequiresNoPermission.java deleted file mode 100644 index cdbf36ec20dd..000000000000 --- a/core/java/android/annotation/RequiresNoPermission.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package android.annotation; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.CLASS; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that the annotated element requires no permissions. - * <p> - * This explicit annotation helps distinguish which of three states that an - * element may exist in: - * <ul> - * <li>Annotated with {@link RequiresPermission}, indicating that an element - * requires (or may require) one or more permissions. - * <li>Annotated with {@link RequiresNoPermission}, indicating that an element - * requires no permissions. - * <li>Neither annotation, indicating that no explicit declaration about - * permissions has been made for that element. - * </ul> - * - * @see RequiresPermission - * @hide - */ -@Retention(CLASS) -@Target({ANNOTATION_TYPE,METHOD,CONSTRUCTOR,FIELD,PARAMETER}) -public @interface RequiresNoPermission { -} diff --git a/core/java/android/annotation/RequiresPermission.java b/core/java/android/annotation/RequiresPermission.java deleted file mode 100644 index 0379d303ab92..000000000000 --- a/core/java/android/annotation/RequiresPermission.java +++ /dev/null @@ -1,137 +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. - */ -package android.annotation; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.CLASS; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that the annotated element requires (or may require) one or more permissions. - * <p/> - * Example of requiring a single permission: - * <pre>{@code - * {@literal @}RequiresPermission(Manifest.permission.SET_WALLPAPER) - * public abstract void setWallpaper(Bitmap bitmap) throws IOException; - * - * {@literal @}RequiresPermission(ACCESS_COARSE_LOCATION) - * public abstract Location getLastKnownLocation(String provider); - * }</pre> - * Example of requiring at least one permission from a set: - * <pre>{@code - * {@literal @}RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - * public abstract Location getLastKnownLocation(String provider); - * }</pre> - * Example of requiring multiple permissions: - * <pre>{@code - * {@literal @}RequiresPermission(allOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - * public abstract Location getLastKnownLocation(String provider); - * }</pre> - * Example of requiring separate read and write permissions for a content provider: - * <pre>{@code - * {@literal @}RequiresPermission.Read(@RequiresPermission(READ_HISTORY_BOOKMARKS)) - * {@literal @}RequiresPermission.Write(@RequiresPermission(WRITE_HISTORY_BOOKMARKS)) - * public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks"); - * }</pre> - * <p> - * When specified on a parameter, the annotation indicates that the method requires - * a permission which depends on the value of the parameter. For example, consider - * {@link android.app.Activity#startActivity(android.content.Intent) - * Activity#startActivity(Intent)}: - * <pre>{@code - * public void startActivity(@RequiresPermission Intent intent) { ... } - * }</pre> - * Notice how there are no actual permission names listed in the annotation. The actual - * permissions required will depend on the particular intent passed in. For example, - * the code may look like this: - * <pre>{@code - * Intent intent = new Intent(Intent.ACTION_CALL); - * startActivity(intent); - * }</pre> - * and the actual permission requirement for this particular intent is described on - * the Intent name itself: - * <pre>{@code - * {@literal @}RequiresPermission(Manifest.permission.CALL_PHONE) - * public static final String ACTION_CALL = "android.intent.action.CALL"; - * }</pre> - * - * @see RequiresNoPermission - * @hide - */ -@Retention(CLASS) -@Target({ANNOTATION_TYPE,METHOD,CONSTRUCTOR,FIELD,PARAMETER}) -public @interface RequiresPermission { - /** - * The name of the permission that is required, if precisely one permission - * is required. If more than one permission is required, specify either - * {@link #allOf()} or {@link #anyOf()} instead. - * <p> - * If specified, {@link #anyOf()} and {@link #allOf()} must both be null. - */ - String value() default ""; - - /** - * Specifies a list of permission names that are all required. - * <p> - * If specified, {@link #anyOf()} and {@link #value()} must both be null. - */ - String[] allOf() default {}; - - /** - * Specifies a list of permission names where at least one is required - * <p> - * If specified, {@link #allOf()} and {@link #value()} must both be null. - */ - String[] anyOf() default {}; - - /** - * If true, the permission may not be required in all cases (e.g. it may only be - * enforced on certain platforms, or for certain call parameters, etc. - */ - boolean conditional() default false; - - /** - * Specifies that the given permission is required for read operations. - * <p> - * When specified on a parameter, the annotation indicates that the method requires - * a permission which depends on the value of the parameter (and typically - * the corresponding field passed in will be one of a set of constants which have - * been annotated with a <code>@RequiresPermission</code> annotation.) - */ - @Target({FIELD, METHOD, PARAMETER}) - @interface Read { - RequiresPermission value() default @RequiresPermission; - } - - /** - * Specifies that the given permission is required for write operations. - * <p> - * When specified on a parameter, the annotation indicates that the method requires - * a permission which depends on the value of the parameter (and typically - * the corresponding field passed in will be one of a set of constants which have - * been annotated with a <code>@RequiresPermission</code> annotation.) - */ - @Target({FIELD, METHOD, PARAMETER}) - @interface Write { - RequiresPermission value() default @RequiresPermission; - } -} diff --git a/core/java/android/annotation/SdkConstant.java b/core/java/android/annotation/SdkConstant.java deleted file mode 100644 index 0a5318609847..000000000000 --- a/core/java/android/annotation/SdkConstant.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2008 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.annotation; - -import java.lang.annotation.Target; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * Indicates a constant field value should be exported to be used in the SDK tools. - * @hide - */ -@Target({ ElementType.FIELD }) -@Retention(RetentionPolicy.SOURCE) -public @interface SdkConstant { - public static enum SdkConstantType { - ACTIVITY_INTENT_ACTION, BROADCAST_INTENT_ACTION, SERVICE_ACTION, INTENT_CATEGORY, FEATURE; - } - - SdkConstantType value(); -} diff --git a/core/java/android/annotation/Size.java b/core/java/android/annotation/Size.java deleted file mode 100644 index 7c3e70f658e9..000000000000 --- a/core/java/android/annotation/Size.java +++ /dev/null @@ -1,52 +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. - */ -package android.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated element should have a given size or length. - * Note that "-1" means "unset". Typically used with a parameter or - * return value of type array or collection. - * <p> - * Example: - * <pre>{@code - * public void getLocationInWindow(@Size(2) int[] location) { - * ... - * } - * }</pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({PARAMETER,LOCAL_VARIABLE,METHOD,FIELD}) -public @interface Size { - /** An exact size (or -1 if not specified) */ - long value() default -1; - /** A minimum size, inclusive */ - long min() default Long.MIN_VALUE; - /** A maximum size, inclusive */ - long max() default Long.MAX_VALUE; - /** The size must be a multiple of this factor */ - long multiple() default 1; -}
\ No newline at end of file diff --git a/core/java/android/annotation/StringDef.java b/core/java/android/annotation/StringDef.java deleted file mode 100644 index a37535b9c98e..000000000000 --- a/core/java/android/annotation/StringDef.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated String element, represents a logical - * type and that its value should be one of the explicitly named constants. - * <p> - * Example: - * <pre><code> - * @Retention(SOURCE) - * @StringDef({ - * POWER_SERVICE, - * WINDOW_SERVICE, - * LAYOUT_INFLATER_SERVICE - * }) - * public @interface ServiceName {} - * public static final String POWER_SERVICE = "power"; - * public static final String WINDOW_SERVICE = "window"; - * public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater"; - * ... - * public abstract Object getSystemService(@ServiceName String name); - * </code></pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({ANNOTATION_TYPE}) -public @interface StringDef { - /** Defines the constant prefix for this element */ - String[] prefix() default {}; - /** Defines the constant suffix for this element */ - String[] suffix() default {}; - - /** Defines the allowed constants for this element */ - String[] value() default {}; -} diff --git a/core/java/android/annotation/StringRes.java b/core/java/android/annotation/StringRes.java deleted file mode 100644 index 190b68a9960b..000000000000 --- a/core/java/android/annotation/StringRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a String resource reference (e.g. {@link android.R.string#ok}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface StringRes { -} diff --git a/core/java/android/annotation/StyleRes.java b/core/java/android/annotation/StyleRes.java deleted file mode 100644 index 4453b8d89153..000000000000 --- a/core/java/android/annotation/StyleRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that a integer parameter, field or method return value is expected - * to be a style resource reference (e.g. {@link android.R.style#TextAppearance}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface StyleRes { -} diff --git a/core/java/android/annotation/StyleableRes.java b/core/java/android/annotation/StyleableRes.java deleted file mode 100644 index 3c1895e6dce9..000000000000 --- a/core/java/android/annotation/StyleableRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that a integer parameter, field or method return value is expected - * to be a styleable resource reference (e.g. {@link android.R.styleable#TextView_text}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface StyleableRes { -} diff --git a/core/java/android/annotation/SuppressAutoDoc.java b/core/java/android/annotation/SuppressAutoDoc.java deleted file mode 100644 index e34e03bcee29..000000000000 --- a/core/java/android/annotation/SuppressAutoDoc.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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. - */ - -package android.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that any automatically generated documentation should be suppressed - * for the annotated method, parameter, or field. - * - * @hide - */ -@Retention(SOURCE) -@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) -public @interface SuppressAutoDoc { -} diff --git a/core/java/android/annotation/SuppressLint.java b/core/java/android/annotation/SuppressLint.java deleted file mode 100644 index 2d3456b0ea46..000000000000 --- a/core/java/android/annotation/SuppressLint.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2012 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.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** Indicates that Lint should ignore the specified warnings for the annotated element. */ -@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) -@Retention(RetentionPolicy.CLASS) -public @interface SuppressLint { - /** - * The set of warnings (identified by the lint issue id) that should be - * ignored by lint. It is not an error to specify an unrecognized name. - */ - String[] value(); -} diff --git a/core/java/android/annotation/SystemApi.java b/core/java/android/annotation/SystemApi.java deleted file mode 100644 index a468439c8e74..000000000000 --- a/core/java/android/annotation/SystemApi.java +++ /dev/null @@ -1,80 +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. - */ - -package android.annotation; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PACKAGE; -import static java.lang.annotation.ElementType.TYPE; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Indicates an API is exposed for use by bundled system applications. - * <p> - * These APIs are not guaranteed to remain consistent release-to-release, - * and are not for use by apps linking against the Android SDK. - * </p><p> - * This annotation should only appear on API that is already marked <pre>@hide</pre>. - * </p> - * - * @hide - */ -@Target({TYPE, FIELD, METHOD, CONSTRUCTOR, ANNOTATION_TYPE, PACKAGE}) -@Retention(RetentionPolicy.RUNTIME) -public @interface SystemApi { - enum Client { - /** - * Specifies that the intended clients of a SystemApi are privileged apps. - * This is the default value for {@link #client}. - */ - PRIVILEGED_APPS, - - /** - * Specifies that the intended clients of a SystemApi are used by classes in - * <pre>BOOTCLASSPATH</pre> in mainline modules. Mainline modules can also expose - * this type of system APIs too when they're used only by the non-updatable - * platform code. - */ - MODULE_LIBRARIES, - - /** - * Specifies that the system API is available only in the system server process. - * Use this to expose APIs from code loaded by the system server process <em>but</em> - * not in <pre>BOOTCLASSPATH</pre>. - */ - SYSTEM_SERVER - } - - /** - * The intended client of this SystemAPI. - */ - Client client() default android.annotation.SystemApi.Client.PRIVILEGED_APPS; - - /** - * Container for {@link SystemApi} that allows it to be applied repeatedly to types. - */ - @Retention(RetentionPolicy.RUNTIME) - @Target(TYPE) - @interface Container { - SystemApi[] value(); - } -} diff --git a/core/java/android/annotation/SystemService.java b/core/java/android/annotation/SystemService.java deleted file mode 100644 index c05c1bab06d2..000000000000 --- a/core/java/android/annotation/SystemService.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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. - */ - -package android.annotation; - -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Description of a system service available through - * {@link android.content.Context#getSystemService(Class)}. This is used to auto-generate - * documentation explaining how to obtain a reference to the service. - * - * @hide - */ -@Retention(SOURCE) -@Target(TYPE) -public @interface SystemService { - /** - * The string name of the system service that can be passed to - * {@link android.content.Context#getSystemService(String)}. - * - * @see android.content.Context#getSystemServiceName(Class) - */ - String value(); -} diff --git a/core/java/android/annotation/TargetApi.java b/core/java/android/annotation/TargetApi.java deleted file mode 100644 index 975318e4de67..000000000000 --- a/core/java/android/annotation/TargetApi.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2012 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.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.TYPE; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** Indicates that Lint should treat this type as targeting a given API level, no matter what the - project target is. */ -@Target({TYPE, METHOD, CONSTRUCTOR, FIELD}) -@Retention(RetentionPolicy.CLASS) -public @interface TargetApi { - /** - * This sets the target api level for the type.. - */ - int value(); -} diff --git a/core/java/android/annotation/TestApi.java b/core/java/android/annotation/TestApi.java deleted file mode 100644 index 0e9ed3751246..000000000000 --- a/core/java/android/annotation/TestApi.java +++ /dev/null @@ -1,42 +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. - */ - -package android.annotation; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PACKAGE; -import static java.lang.annotation.ElementType.TYPE; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Indicates an API is exposed for use by CTS. - * <p> - * These APIs are not guaranteed to remain consistent release-to-release, - * and are not for use by apps linking against the Android SDK. - * </p> - * - * @hide - */ -@Target({TYPE, FIELD, METHOD, CONSTRUCTOR, ANNOTATION_TYPE, PACKAGE}) -@Retention(RetentionPolicy.SOURCE) -public @interface TestApi { -} diff --git a/core/java/android/annotation/TransitionRes.java b/core/java/android/annotation/TransitionRes.java deleted file mode 100644 index 06bac74984a5..000000000000 --- a/core/java/android/annotation/TransitionRes.java +++ /dev/null @@ -1,37 +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. - */ -package android.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a transition resource reference. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface TransitionRes { -} diff --git a/core/java/android/annotation/UiContext.java b/core/java/android/annotation/UiContext.java deleted file mode 100644 index 47becc08c2f3..000000000000 --- a/core/java/android/annotation/UiContext.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2020 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import android.app.Activity; -import android.app.WallpaperManager; -import android.content.Context; -import android.os.Bundle; -import android.view.Display; -import android.view.LayoutInflater; -import android.view.WindowManager; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes a {@link Context} that can be used to create UI, meaning that it can provide a - * {@link Display} via {@link Context#getDisplay} and can be used to obtain a {@link WindowManager}, - * {@link LayoutInflater} or {@link WallpaperManager} via {@link Context#getSystemService(String)}. - * A {@link Context} which is marked as {@link UiContext} implies that the {@link Context} is also - * a {@link DisplayContext}. - * <p> - * This kind of {@link Context} is usually an {@link Activity} or - * created via {@link Context#createWindowContext(int, Bundle)}. - * </p> - * This is a marker annotation and has no specific attributes. - * - * @see Context#getDisplay() - * @see Context#getSystemService(String) - * @see Context#getSystemService(Class) - * @see Context#createWindowContext(int, Bundle) - * @see DisplayContext - * @hide - */ -@Retention(SOURCE) -@Target({TYPE, METHOD, PARAMETER, FIELD}) -public @interface UiContext { -} diff --git a/core/java/android/annotation/UiThread.java b/core/java/android/annotation/UiThread.java deleted file mode 100644 index 6d7eedc7d2e2..000000000000 --- a/core/java/android/annotation/UiThread.java +++ /dev/null @@ -1,51 +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. - */ -package android.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import android.os.Looper; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that the annotated method or constructor should only be called on the - * UI thread. If the annotated element is a class, then all methods in the class - * should be called on the UI thread. - * <p> - * Example: - * - * <pre> - * <code> - * @UiThread - * public abstract void setText(@NonNull String text) { ... } - * </code> - * </pre> - * - * @memberDoc This method must be called on the thread that originally created - * this UI element. This is typically the - * {@linkplain Looper#getMainLooper() main thread} of your app. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER}) -public @interface UiThread { -} diff --git a/core/java/android/annotation/UptimeMillisLong.java b/core/java/android/annotation/UptimeMillisLong.java deleted file mode 100644 index 8946eea0249c..000000000000 --- a/core/java/android/annotation/UptimeMillisLong.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2020 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import android.os.SystemClock; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * @memberDoc Value is a non-negative timestamp in the - * {@link SystemClock#uptimeMillis()} time base. - * @paramDoc Value is a non-negative timestamp in the - * {@link SystemClock#uptimeMillis()} time base. - * @returnDoc Value is a non-negative timestamp in the - * {@link SystemClock#uptimeMillis()} time base. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface UptimeMillisLong { -} diff --git a/core/java/android/annotation/UserHandleAware.java b/core/java/android/annotation/UserHandleAware.java deleted file mode 100644 index 7d3d20b31b2a..000000000000 --- a/core/java/android/annotation/UserHandleAware.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package android.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PACKAGE; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Indicates an API that uses {@code context.getUser} or {@code context.getUserId} - * to operate across users (as the user associated with the context) - * <p> - * To create a {@link android.content.Context} associated with a different user, - * use {@link android.content.Context#createContextAsUser} or - * {@link android.content.Context#createPackageContextAsUser} - * <p> - * Example: - * <pre>{@code - * {@literal @}UserHandleAware - * public abstract PackageInfo getPackageInfo({@literal @}NonNull String packageName, - * {@literal @}PackageInfoFlags int flags) throws NameNotFoundException; - * }</pre> - * - * @memberDoc This method uses {@linkplain android.content.Context#getUser} - * or {@linkplain android.content.Context#getUserId} to execute across users. - * @hide - */ -@Retention(SOURCE) -@Target({TYPE, METHOD, CONSTRUCTOR, PACKAGE}) -public @interface UserHandleAware { -} diff --git a/core/java/android/annotation/UserIdInt.java b/core/java/android/annotation/UserIdInt.java deleted file mode 100644 index 7b9ce25e3f1a..000000000000 --- a/core/java/android/annotation/UserIdInt.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2016 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that the annotated element is a multi-user user ID. This is - * <em>not</em> the same as a UID. - * - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface UserIdInt { -} diff --git a/core/java/android/annotation/Widget.java b/core/java/android/annotation/Widget.java deleted file mode 100644 index 6756cd73c5fe..000000000000 --- a/core/java/android/annotation/Widget.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2008 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.annotation; - -import java.lang.annotation.Target; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * Indicates a class is a widget usable by application developers to create UI. - * <p> - * This must be used in cases where: - * <ul> - * <li>The widget is not in the package <code>android.widget</code></li> - * <li>The widget extends <code>android.view.ViewGroup</code></li> - * </ul> - * @hide - */ -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.SOURCE) -public @interface Widget { -} diff --git a/core/java/android/annotation/WorkerThread.java b/core/java/android/annotation/WorkerThread.java deleted file mode 100644 index 8c2a4d381ab1..000000000000 --- a/core/java/android/annotation/WorkerThread.java +++ /dev/null @@ -1,48 +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. - */ -package android.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated method should only be called on a worker thread. - * If the annotated element is a class, then all methods in the class should be - * called on a worker thread. - * <p> - * Example: - * - * <pre> - * <code> - * @WorkerThread - * protected abstract FilterResults performFiltering(CharSequence constraint); - * </code> - * </pre> - * - * @memberDoc This method may take several seconds to complete, so it should - * only be called from a worker thread. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER}) -public @interface WorkerThread { -} diff --git a/core/java/android/annotation/XmlRes.java b/core/java/android/annotation/XmlRes.java deleted file mode 100644 index 5fb8a4a47127..000000000000 --- a/core/java/android/annotation/XmlRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be an XML resource reference. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface XmlRes { -} diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index dba62b9d3b63..5a70f925fc02 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -881,7 +881,7 @@ public class ApplicationPackageManager extends PackageManager { @Override public void requestChecksums(@NonNull String packageName, boolean includeSplits, - @Checksum.Type int required, @NonNull List<Certificate> trustedInstallers, + @Checksum.TypeMask int required, @NonNull List<Certificate> trustedInstallers, @NonNull OnChecksumsReadyListener onChecksumsReadyListener) throws CertificateEncodingException, NameNotFoundException { Objects.requireNonNull(packageName); diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java index 114ad874d0c4..7e1df1b0e59c 100644 --- a/core/java/android/content/ContentProvider.java +++ b/core/java/android/content/ContentProvider.java @@ -1885,9 +1885,9 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall * in {@link android.provider.MediaStore.MediaColumns}.</p> * * @param uri The URI whose file is to be opened. - * @param mode The string representation of the file mode. Can be "r", "w", - * "wt", "wa", "rw" or "rwt". See - * {@link ParcelFileDescriptor#parseMode} for more details. + * @param mode Access mode for the file. May be "r" for read-only access, + * "rw" for read and write access, or "rwt" for read and write access + * that truncates any existing file. * * @return Returns a new ParcelFileDescriptor which you can use to access * the file. @@ -1948,9 +1948,10 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall * in {@link android.provider.MediaStore.MediaColumns}.</p> * * @param uri The URI whose file is to be opened. - * @param mode The string representation of the file mode. Can be "r", "w", - * "wt", "wa", "rw" or "rwt". See - * {@link ParcelFileDescriptor#parseMode} for more details. + * @param mode Access mode for the file. May be "r" for read-only access, + * "w" for write-only access, "rw" for read and write access, or + * "rwt" for read and write access that truncates any existing + * file. * @param signal A signal to cancel the operation in progress, or * {@code null} if none. For example, if you are downloading a * file from the network to service a "rw" mode request, you @@ -2010,9 +2011,11 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall * containing at least the columns specified by {@link android.provider.OpenableColumns}.</p> * * @param uri The URI whose file is to be opened. - * @param mode The string representation of the file mode. Can be "r", "w", - * "wt", "wa", "rw" or "rwt". See - * {@link ParcelFileDescriptor#parseMode} for more details. + * @param mode Access mode for the file. May be "r" for read-only access, + * "w" for write-only access (erasing whatever data is currently in + * the file), "wa" for write-only access to append to any existing data, + * "rw" for read and write access on any existing data, and "rwt" for read + * and write access that truncates any existing file. * * @return Returns a new AssetFileDescriptor which you can use to access * the file. @@ -2065,9 +2068,11 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall * containing at least the columns specified by {@link android.provider.OpenableColumns}.</p> * * @param uri The URI whose file is to be opened. - * @param mode The string representation of the file mode. Can be "r", "w", - * "wt", "wa", "rw" or "rwt". See - * {@link ParcelFileDescriptor#parseMode} for more details. + * @param mode Access mode for the file. May be "r" for read-only access, + * "w" for write-only access (erasing whatever data is currently in + * the file), "wa" for write-only access to append to any existing data, + * "rw" for read and write access on any existing data, and "rwt" for read + * and write access that truncates any existing file. * @param signal A signal to cancel the operation in progress, or * {@code null} if none. For example, if you are downloading a * file from the network to service a "rw" mode request, you @@ -2098,9 +2103,11 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall * by looking up a column named "_data" at the given URI. * * @param uri The URI to be opened. - * @param mode The string representation of the file mode. Can be "r", "w", - * "wt", "wa", "rw" or "rwt". See - * {@link ParcelFileDescriptor#parseMode} for more details. + * @param mode The file mode. May be "r" for read-only access, + * "w" for write-only access (erasing whatever data is currently in + * the file), "wa" for write-only access to append to any existing data, + * "rw" for read and write access on any existing data, and "rwt" for read + * and write access that truncates any existing file. * * @return Returns a new ParcelFileDescriptor that can be used by the * client to access the file. diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index 1132991a57f8..aec39da973f0 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -63,9 +63,7 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.os.UserHandle; -import android.system.ErrnoException; import android.system.Int64Ref; -import android.system.Os; import android.text.TextUtils; import android.util.EventLog; import android.util.Log; @@ -78,10 +76,8 @@ import com.android.internal.util.MimeIconUtils; import dalvik.system.CloseGuard; import java.io.File; -import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -868,20 +864,6 @@ public abstract class ContentResolver implements ContentInterface { return wrap((ContentInterface) wrapped); } - /** - * Offer to locally truncate the given file when opened using the write-only - * mode. This is typically used to preserve legacy compatibility behavior. - */ - private static void maybeTruncate(FileDescriptor fd, String mode) throws FileNotFoundException { - if ("w".equals(mode)) { - try { - Os.ftruncate(fd, 0); - } catch (ErrnoException e) { - throw new FileNotFoundException("Failed to truncate: " + e.getMessage()); - } - } - } - /** @hide */ @SuppressWarnings("HiddenAbstractMethod") @UnsupportedAppUsage @@ -1543,20 +1525,8 @@ public abstract class ContentResolver implements ContentInterface { } /** - * Open a stream on to the content associated with a content URI. If there - * is no data associated with the URI, FileNotFoundException is thrown. - * - * <h5>Accepts the following URI schemes:</h5> - * <ul> - * <li>content ({@link #SCHEME_CONTENT})</li> - * <li>file ({@link #SCHEME_FILE})</li> - * </ul> - * - * <p>See {@link #openAssetFileDescriptor(Uri, String)} for more information - * on these schemes. - * - * <p>This method behaves like {@link FileOutputStream} and automatically - * truncates any existing contents. + * Synonym for {@link #openOutputStream(Uri, String) + * openOutputStream(uri, "w")}. * * @param uri The desired URI. * @return an OutputStream or {@code null} if the provider recently crashed. @@ -1564,16 +1534,7 @@ public abstract class ContentResolver implements ContentInterface { */ public final @Nullable OutputStream openOutputStream(@NonNull Uri uri) throws FileNotFoundException { - AssetFileDescriptor fd = openAssetFileDescriptor(uri, "w", null); - if (fd == null) return null; - try { - final FileOutputStream res = fd.createOutputStream(); - // Unconditionally truncate to mirror FileOutputStream behavior - maybeTruncate(res.getFD(), "w"); - return res; - } catch (IOException e) { - throw new FileNotFoundException("Unable to create stream"); - } + return openOutputStream(uri, "w"); } /** @@ -1590,9 +1551,7 @@ public abstract class ContentResolver implements ContentInterface { * on these schemes. * * @param uri The desired URI. - * @param mode The string representation of the file mode. Can be "r", "w", - * "wt", "wa", "rw" or "rwt". See - * {@link ParcelFileDescriptor#parseMode} for more details. + * @param mode May be "w", "wa", "rw", or "rwt". * @return an OutputStream or {@code null} if the provider recently crashed. * @throws FileNotFoundException if the provided URI could not be opened. * @see #openAssetFileDescriptor(Uri, String) @@ -1600,14 +1559,8 @@ public abstract class ContentResolver implements ContentInterface { public final @Nullable OutputStream openOutputStream(@NonNull Uri uri, @NonNull String mode) throws FileNotFoundException { AssetFileDescriptor fd = openAssetFileDescriptor(uri, mode, null); - if (fd == null) return null; try { - final FileOutputStream res = fd.createOutputStream(); - // Preserve legacy behavior by offering to truncate - if (mTargetSdkVersion < Build.VERSION_CODES.Q) { - maybeTruncate(res.getFD(), mode); - } - return res; + return fd != null ? fd.createOutputStream() : null; } catch (IOException e) { throw new FileNotFoundException("Unable to create stream"); } @@ -1654,9 +1607,8 @@ public abstract class ContentResolver implements ContentInterface { * provider, use {@link ParcelFileDescriptor#closeWithError(String)}. * * @param uri The desired URI to open. - * @param mode The string representation of the file mode. Can be "r", "w", - * "wt", "wa", "rw" or "rwt". See - * {@link ParcelFileDescriptor#parseMode} for more details. + * @param mode The file mode to use, as per {@link ContentProvider#openFile + * ContentProvider.openFile}. * @return Returns a new ParcelFileDescriptor pointing to the file or {@code null} if the * provider recently crashed. You own this descriptor and are responsible for closing it * when done. @@ -1698,9 +1650,8 @@ public abstract class ContentResolver implements ContentInterface { * provider, use {@link ParcelFileDescriptor#closeWithError(String)}. * * @param uri The desired URI to open. - * @param mode The string representation of the file mode. Can be "r", "w", - * "wt", "wa", "rw" or "rwt". See - * {@link ParcelFileDescriptor#parseMode} for more details. + * @param mode The file mode to use, as per {@link ContentProvider#openFile + * ContentProvider.openFile}. * @param cancellationSignal A signal to cancel the operation in progress, * or null if none. If the operation is canceled, then * {@link OperationCanceledException} will be thrown. @@ -1793,9 +1744,8 @@ public abstract class ContentResolver implements ContentInterface { * from any built-in data conversion that a provider implements. * * @param uri The desired URI to open. - * @param mode The string representation of the file mode. Can be "r", "w", - * "wt", "wa", "rw" or "rwt". See - * {@link ParcelFileDescriptor#parseMode} for more details. + * @param mode The file mode to use, as per {@link ContentProvider#openAssetFile + * ContentProvider.openAssetFile}. * @return Returns a new ParcelFileDescriptor pointing to the file or {@code null} if the * provider recently crashed. You own this descriptor and are responsible for closing it * when done. @@ -1848,9 +1798,8 @@ public abstract class ContentResolver implements ContentInterface { * from any built-in data conversion that a provider implements. * * @param uri The desired URI to open. - * @param mode The string representation of the file mode. Can be "r", "w", - * "wt", "wa", "rw" or "rwt". See - * {@link ParcelFileDescriptor#parseMode} for more details. + * @param mode The file mode to use, as per {@link ContentProvider#openAssetFile + * ContentProvider.openAssetFile}. * @param cancellationSignal A signal to cancel the operation in progress, or null if * none. If the operation is canceled, then * {@link OperationCanceledException} will be thrown. @@ -1886,10 +1835,6 @@ public abstract class ContentResolver implements ContentInterface { } else if (SCHEME_FILE.equals(scheme)) { ParcelFileDescriptor pfd = ParcelFileDescriptor.open( new File(uri.getPath()), ParcelFileDescriptor.parseMode(mode)); - // Preserve legacy behavior by offering to truncate - if (mTargetSdkVersion < Build.VERSION_CODES.Q) { - maybeTruncate(pfd.getFileDescriptor(), mode); - } return new AssetFileDescriptor(pfd, 0, -1); } else { if ("r".equals(mode)) { @@ -1947,11 +1892,6 @@ public abstract class ContentResolver implements ContentInterface { // ParcelFileDescriptorInner do that when it is closed. stableProvider = null; - // Preserve legacy behavior by offering to truncate - if (mTargetSdkVersion < Build.VERSION_CODES.Q) { - maybeTruncate(pfd.getFileDescriptor(), mode); - } - return new AssetFileDescriptor(pfd, fd.getStartOffset(), fd.getDeclaredLength()); diff --git a/core/java/android/content/pm/ApkChecksum.java b/core/java/android/content/pm/ApkChecksum.java index eca48eca9e4b..d550f411f6f7 100644 --- a/core/java/android/content/pm/ApkChecksum.java +++ b/core/java/android/content/pm/ApkChecksum.java @@ -118,7 +118,7 @@ public final class ApkChecksum implements Parcelable { - // Code below generated by codegen v1.0.15. + // Code below generated by codegen v1.0.23. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code @@ -235,8 +235,8 @@ public final class ApkChecksum implements Parcelable { }; @DataClass.Generated( - time = 1601589269293L, - codegenVersion = "1.0.15", + time = 1619810171079L, + codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/content/pm/ApkChecksum.java", inputSignatures = "private final @android.annotation.Nullable java.lang.String mSplitName\nprivate final @android.annotation.NonNull android.content.pm.Checksum mChecksum\nprivate final @android.annotation.Nullable java.lang.String mInstallerPackageName\nprivate final @android.annotation.Nullable byte[] mInstallerCertificate\npublic @android.content.pm.Checksum.Type int getType()\npublic @android.annotation.NonNull byte[] getValue()\npublic @android.annotation.Nullable byte[] getInstallerCertificateBytes()\npublic @android.annotation.Nullable java.security.cert.Certificate getInstallerCertificate()\nclass ApkChecksum extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genHiddenConstructor=true)") @Deprecated diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index e302f9e404fb..a3e0473e39cc 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -2141,22 +2141,57 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { } /** + * Use default value for + * {@link android.R.styleable#AndroidManifestApplication_requestRawExternalStorageAccess}. + */ + public static final int RAW_EXTERNAL_STORAGE_ACCESS_DEFAULT = 0; + + /** + * Raw external storage was requested by this app. + */ + public static final int RAW_EXTERNAL_STORAGE_ACCESS_REQUESTED = 1; + + /** + * Raw external storage was not requested by this app. + */ + public static final int RAW_EXTERNAL_STORAGE_ACCESS_NOT_REQUESTED = 2; + + /** + * These constants need to match the value of + * {@link android.R.styleable#AndroidManifestApplication_requestRawExternalStorageAccess}. + * in application manifest. + * @hide + */ + @IntDef(prefix = {"RAW_EXTERNAL_STORAGE_"}, value = { + RAW_EXTERNAL_STORAGE_ACCESS_DEFAULT, + RAW_EXTERNAL_STORAGE_ACCESS_REQUESTED, + RAW_EXTERNAL_STORAGE_ACCESS_NOT_REQUESTED, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface RawExternalStorage {} + + /** * @return * <ul> - * <li>{@code true} if this app requested raw external storage access - * <li>{@code false} if this app requests to disable raw external storage access. - * <li>{@code null} if the app didn't specify + * <li>{@link ApplicationInfo#RAW_EXTERNAL_STORAGE_ACCESS_DEFAULT} if app didn't specify * {@link android.R.styleable#AndroidManifestApplication_requestRawExternalStorageAccess} - * in its manifest file. - * </ul> - * - * @hide + * attribute in the manifest. + * <li>{@link ApplicationInfo#RAW_EXTERNAL_STORAGE_ACCESS_REQUESTED} if this app requested raw + * external storage access. + * <li>{@link ApplicationInfo#RAW_EXTERNAL_STORAGE_ACCESS_NOT_REQUESTED} if this app requests to + * disable raw external storage access + * </ul + * <p> + * Note that this doesn't give any hints on whether the app gets raw external storage access or + * not. Also, apps may get raw external storage access by default in some cases, see + * {@link android.R.styleable#AndroidManifestApplication_requestRawExternalStorageAccess}. */ - @SuppressWarnings("AutoBoxing") - @SystemApi - @Nullable - public Boolean hasRequestRawExternalStorageAccess() { - return requestRawExternalStorageAccess; + public @RawExternalStorage int getRequestRawExternalStorageAccess() { + if (requestRawExternalStorageAccess == null) { + return RAW_EXTERNAL_STORAGE_ACCESS_DEFAULT; + } + return requestRawExternalStorageAccess ? RAW_EXTERNAL_STORAGE_ACCESS_REQUESTED + : RAW_EXTERNAL_STORAGE_ACCESS_NOT_REQUESTED; } /** diff --git a/core/java/android/content/pm/Checksum.java b/core/java/android/content/pm/Checksum.java index 4f4898af278b..ff17496c7457 100644 --- a/core/java/android/content/pm/Checksum.java +++ b/core/java/android/content/pm/Checksum.java @@ -113,7 +113,7 @@ public final class Checksum implements Parcelable { public static final int TYPE_PARTIAL_MERKLE_ROOT_1M_SHA512 = 0x00000040; /** @hide */ - @IntDef(flag = true, prefix = {"TYPE_"}, value = { + @IntDef(prefix = {"TYPE_"}, value = { TYPE_WHOLE_MERKLE_ROOT_4K_SHA256, TYPE_WHOLE_MD5, TYPE_WHOLE_SHA1, @@ -125,6 +125,19 @@ public final class Checksum implements Parcelable { @Retention(RetentionPolicy.SOURCE) public @interface Type {} + /** @hide */ + @IntDef(flag = true, prefix = {"TYPE_"}, value = { + TYPE_WHOLE_MERKLE_ROOT_4K_SHA256, + TYPE_WHOLE_MD5, + TYPE_WHOLE_SHA1, + TYPE_WHOLE_SHA256, + TYPE_WHOLE_SHA512, + TYPE_PARTIAL_MERKLE_ROOT_1M_SHA256, + TYPE_PARTIAL_MERKLE_ROOT_1M_SHA512, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface TypeMask {} + /** * Serialize checksum to the stream in binary format. * @hide @@ -163,7 +176,7 @@ public final class Checksum implements Parcelable { - // Code below generated by codegen v1.0.22. + // Code below generated by codegen v1.0.23. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code @@ -263,8 +276,8 @@ public final class Checksum implements Parcelable { }; @DataClass.Generated( - time = 1611601571576L, - codegenVersion = "1.0.22", + time = 1619810358402L, + codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/content/pm/Checksum.java", inputSignatures = "public static final int TYPE_WHOLE_MERKLE_ROOT_4K_SHA256\npublic static final @java.lang.Deprecated int TYPE_WHOLE_MD5\npublic static final @java.lang.Deprecated int TYPE_WHOLE_SHA1\npublic static final @java.lang.Deprecated int TYPE_WHOLE_SHA256\npublic static final @java.lang.Deprecated int TYPE_WHOLE_SHA512\npublic static final int TYPE_PARTIAL_MERKLE_ROOT_1M_SHA256\npublic static final int TYPE_PARTIAL_MERKLE_ROOT_1M_SHA512\nprivate final @android.content.pm.Checksum.Type int mType\nprivate final @android.annotation.NonNull byte[] mValue\npublic static void writeToStream(java.io.DataOutputStream,android.content.pm.Checksum)\npublic static @android.annotation.NonNull android.content.pm.Checksum readFromStream(java.io.DataInputStream)\nclass Checksum extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstDefs=false)") @Deprecated diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 07d8478da553..a1d419e82174 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -8711,7 +8711,7 @@ public abstract class PackageManager { * @throws NameNotFoundException if a package with the given name cannot be found on the system. */ public void requestChecksums(@NonNull String packageName, boolean includeSplits, - @Checksum.Type int required, @NonNull List<Certificate> trustedInstallers, + @Checksum.TypeMask int required, @NonNull List<Certificate> trustedInstallers, @NonNull OnChecksumsReadyListener onChecksumsReadyListener) throws CertificateEncodingException, NameNotFoundException { throw new UnsupportedOperationException("requestChecksums not implemented in subclass"); diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java index a06a8577a56a..f3e0ce9cd19e 100644 --- a/core/java/android/os/FileUtils.java +++ b/core/java/android/os/FileUtils.java @@ -1470,7 +1470,7 @@ public final class FileUtils { return MediaStore.getOriginalMediaFormatFileDescriptor(context, ParcelFileDescriptor.dup(fd)); } catch (Exception e) { - Log.w(TAG, "Failed to convert to modern format file descriptor", e); + Log.d(TAG, "Failed to convert to modern format file descriptor", e); return null; } } diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java index 0c9ad1b17a7e..c0847872a45a 100644 --- a/core/java/android/os/ParcelFileDescriptor.java +++ b/core/java/android/os/ParcelFileDescriptor.java @@ -31,7 +31,6 @@ import static android.system.OsConstants.S_ISLNK; import static android.system.OsConstants.S_ISREG; import static android.system.OsConstants.S_IWOTH; -import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SuppressLint; import android.annotation.SystemApi; @@ -64,8 +63,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InterruptedIOException; import java.io.UncheckedIOException; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.net.DatagramSocket; import java.net.Socket; import java.nio.ByteOrder; @@ -113,20 +110,6 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { private final CloseGuard mGuard = CloseGuard.get(); - /** @hide */ - @IntDef(prefix = {"MODE_"}, value = { - MODE_WORLD_READABLE, - MODE_WORLD_WRITEABLE, - MODE_READ_ONLY, - MODE_WRITE_ONLY, - MODE_READ_WRITE, - MODE_CREATE, - MODE_TRUNCATE, - MODE_APPEND, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface Mode { } - /** * For use with {@link #open}: if {@link #MODE_CREATE} has been supplied and * this file doesn't already exist, then create the file with permissions @@ -244,8 +227,7 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * be opened with the requested mode. * @see #parseMode(String) */ - public static ParcelFileDescriptor open(File file, @Mode int mode) - throws FileNotFoundException { + public static ParcelFileDescriptor open(File file, int mode) throws FileNotFoundException { final FileDescriptor fd = openInternal(file, mode); if (fd == null) return null; @@ -277,7 +259,7 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { // We can't accept a generic Executor here, since we need to use // MessageQueue.addOnFileDescriptorEventListener() @SuppressLint("ExecutorRegistration") - public static ParcelFileDescriptor open(File file, @Mode int mode, Handler handler, + public static ParcelFileDescriptor open(File file, int mode, Handler handler, final OnCloseListener listener) throws IOException { if (handler == null) { throw new IllegalArgumentException("Handler must not be null"); @@ -348,8 +330,7 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { return pfd; } - private static FileDescriptor openInternal(File file, @Mode int mode) - throws FileNotFoundException { + private static FileDescriptor openInternal(File file, int mode) throws FileNotFoundException { final int flags = FileUtils.translateModePfdToPosix(mode) | ifAtLeastQ(O_CLOEXEC); int realMode = S_IRWXU | S_IRWXG; @@ -642,36 +623,15 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { } /** - * Converts a string representing a file mode, such as "rw", into a bitmask - * suitable for use with {@link #open}. + * Converts a string representing a file mode, such as "rw", into a bitmask suitable for use + * with {@link #open}. * <p> - * The argument must define at least one of the following base access modes: - * <ul> - * <li>"r" indicates the file should be opened in read-only mode, equivalent - * to {@link OsConstants#O_RDONLY}. - * <li>"w" indicates the file should be opened in write-only mode, - * equivalent to {@link OsConstants#O_WRONLY}. - * <li>"rw" indicates the file should be opened in read-write mode, - * equivalent to {@link OsConstants#O_RDWR}. - * </ul> - * In addition to a base access mode, the following additional modes may - * requested: - * <ul> - * <li>"a" indicates the file should be opened in append mode, equivalent to - * {@link OsConstants#O_APPEND}. Before each write, the file offset is - * positioned at the end of the file. - * <li>"t" indicates the file should be opened in truncate mode, equivalent - * to {@link OsConstants#O_TRUNC}. If the file already exists and is a - * regular file and is opened for writing, it will be truncated to length 0. - * </ul> - * - * @param mode The string representation of the file mode. Can be "r", "w", - * "wt", "wa", "rw" or "rwt". + * @param mode The string representation of the file mode. Can be "r", "w", "wt", "wa", "rw" + * or "rwt". * @return A bitmask representing the given file mode. - * @throws IllegalArgumentException if the given string does not match a - * known file mode. + * @throws IllegalArgumentException if the given string does not match a known file mode. */ - public static @Mode int parseMode(String mode) { + public static int parseMode(String mode) { return FileUtils.translateModePosixToPfd(FileUtils.translateModeStringToPosix(mode)); } diff --git a/core/java/android/os/VintfObject.java b/core/java/android/os/VintfObject.java index 7af8f71aa4aa..bf0b655fe574 100644 --- a/core/java/android/os/VintfObject.java +++ b/core/java/android/os/VintfObject.java @@ -16,6 +16,7 @@ package android.os; +import android.annotation.NonNull; import android.annotation.TestApi; import android.util.Slog; @@ -112,6 +113,15 @@ public class VintfObject { public static native String getSepolicyVersion(); /** + * @return the PLATFORM_SEPOLICY_VERSION build flag available in framework + * compatibility matrix. + * + * @hide + */ + @TestApi + public static native @NonNull String getPlatformSepolicyVersion(); + + /** * @return a list of VNDK snapshots supported by the framework, as * specified in framework manifest. For example, * [("27", ["libjpeg.so", "libbase.so"]), diff --git a/core/java/com/android/internal/annotations/CompositeRWLock.java b/core/java/com/android/internal/annotations/CompositeRWLock.java deleted file mode 100644 index b6ddfc4d2cc4..000000000000 --- a/core/java/com/android/internal/annotations/CompositeRWLock.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.annotations; - -import static java.lang.annotation.ElementType.FIELD; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Specifies a list of locks which are required for read/write operations on a data field. - * - * <p> - * To annotate methods accessing the data field with the annotation {@link CompositeRWLock}, - * use {@link GuardedBy#value} to annotate method w/ write and/or read access to the data field, - * use {@link GuardedBy#anyOf} to annotate method w/ read only access to the data field. - * </p> - * - * <p> - * When its {@link #value()} consists of multiple locks: - * <ul> - * <li>To write to the protected data, acquire <b>all</b> of the locks - * in the order of the appearance in the {@link #value}.</li> - * <li>To read from the protected data, acquire any of the locks in the {@link #value}.</li> - * </ul> - * </p> - */ -@Target({FIELD}) -@Retention(RetentionPolicy.CLASS) -public @interface CompositeRWLock { - String[] value() default {}; -} diff --git a/core/java/com/android/internal/annotations/GuardedBy.java b/core/java/com/android/internal/annotations/GuardedBy.java deleted file mode 100644 index c05c4abd10e4..000000000000 --- a/core/java/com/android/internal/annotations/GuardedBy.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2012 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.internal.annotations; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Annotation type used to mark a method or field that can only be accessed when - * holding the referenced locks. - */ -@Target({FIELD, METHOD}) -@Retention(RetentionPolicy.CLASS) -public @interface GuardedBy { - /** - * Specifies a list of locks to be held in order to access the field/method - * annotated with this; when used in conjunction with the {@link CompositeRWLock}, locks - * should be acquired in the order of the appearance in the {@link #value} here. - * - * <p> - * If specified, {@link #anyOf()} must be null. - * </p> - * - * @see CompositeRWLock - */ - String[] value() default {}; - - /** - * Specifies a list of locks where at least one of them must be held in order to access - * the field/method annotated with this; it should be <em>only</em> used in the conjunction - * with the {@link CompositeRWLock}. - * - * <p> - * If specified, {@link #allOf()} must be null. - * </p> - * - * @see CompositeRWLock - */ - String[] anyOf() default {}; -} diff --git a/core/java/com/android/internal/annotations/Immutable.java b/core/java/com/android/internal/annotations/Immutable.java deleted file mode 100644 index b424275f7a86..000000000000 --- a/core/java/com/android/internal/annotations/Immutable.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2012 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.internal.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Annotation type used to mark a class which is immutable. - */ -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.CLASS) -public @interface Immutable { -} diff --git a/core/java/com/android/internal/annotations/VisibleForNative.java b/core/java/com/android/internal/annotations/VisibleForNative.java deleted file mode 100644 index e6a3fc67b7d3..000000000000 --- a/core/java/com/android/internal/annotations/VisibleForNative.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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.internal.annotations; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * Denotes that the class, method or field has its visibility relaxed so - * that native code can access it. - */ -@Retention(RetentionPolicy.CLASS) -public @interface VisibleForNative { -} diff --git a/core/java/com/android/internal/annotations/VisibleForTesting.java b/core/java/com/android/internal/annotations/VisibleForTesting.java deleted file mode 100644 index 99512ac68d5d..000000000000 --- a/core/java/com/android/internal/annotations/VisibleForTesting.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2012 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.internal.annotations; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * Denotes that the class, method or field has its visibility relaxed so - * that unit tests can access it. - * <p/> - * The <code>visibility</code> argument can be used to specific what the original - * visibility should have been if it had not been made public or package-private for testing. - * The default is to consider the element private. - */ -@Retention(RetentionPolicy.CLASS) -public @interface VisibleForTesting { - /** - * Intended visibility if the element had not been made public or package-private for - * testing. - */ - enum Visibility { - /** The element should be considered protected. */ - PROTECTED, - /** The element should be considered package-private. */ - PACKAGE, - /** The element should be considered private. */ - PRIVATE - } - - /** - * Intended visibility if the element had not been made public or package-private for testing. - * If not specified, one should assume the element originally intended to be private. - */ - Visibility visibility() default Visibility.PRIVATE; -} diff --git a/core/jni/android_media_AudioAttributes.cpp b/core/jni/android_media_AudioAttributes.cpp index b616ffc111a3..f1ae268f4c16 100644 --- a/core/jni/android_media_AudioAttributes.cpp +++ b/core/jni/android_media_AudioAttributes.cpp @@ -171,10 +171,6 @@ jint JNIAudioAttributeHelper::getJavaArray( /* * JNI registration. */ -static const JNINativeMethod gMethods[] = { - // n/a -}; - int register_android_media_AudioAttributes(JNIEnv *env) { jclass audioAttributesClass = FindClassOrDie(env, kClassPathName); @@ -218,5 +214,5 @@ int register_android_media_AudioAttributes(JNIEnv *env) env->DeleteLocalRef(audioAttributesClass); - return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods)); + return 0; } diff --git a/core/jni/android_os_VintfObject.cpp b/core/jni/android_os_VintfObject.cpp index 4bd33a9cbd3b..1baea2aecc3c 100644 --- a/core/jni/android_os_VintfObject.cpp +++ b/core/jni/android_os_VintfObject.cpp @@ -37,11 +37,13 @@ static jmethodID gLongValueOf; namespace android { +using vintf::CompatibilityMatrix; using vintf::HalManifest; using vintf::Level; using vintf::SchemaType; using vintf::to_string; using vintf::toXml; +using vintf::Version; using vintf::VintfObject; using vintf::Vndk; @@ -119,6 +121,28 @@ static jstring android_os_VintfObject_getSepolicyVersion(JNIEnv* env, jclass) { return env->NewStringUTF(cString.c_str()); } +static jstring android_os_VintfObject_getPlatformSepolicyVersion(JNIEnv* env, jclass) { + std::shared_ptr<const CompatibilityMatrix> matrix = + VintfObject::GetFrameworkCompatibilityMatrix(); + if (matrix == nullptr || matrix->type() != SchemaType::FRAMEWORK) { + jniThrowRuntimeException(env, "Cannot get framework compatibility matrix"); + return nullptr; + } + + auto versions = matrix->getSepolicyVersions(); + if (versions.empty()) { + jniThrowRuntimeException(env, + "sepolicy_version in framework compatibility matrix is empty"); + return nullptr; + } + + Version latest; + for (const auto& range : versions) { + latest = std::max(latest, range.maxVer()); + } + return env->NewStringUTF(to_string(latest).c_str()); +} + static jobject android_os_VintfObject_getVndkSnapshots(JNIEnv* env, jclass) { std::shared_ptr<const HalManifest> manifest = VintfObject::GetFrameworkHalManifest(); if (manifest == nullptr || manifest->type() != SchemaType::FRAMEWORK) { @@ -145,12 +169,17 @@ static jobject android_os_VintfObject_getTargetFrameworkCompatibilityMatrixVersi // ---------------------------------------------------------------------------- static const JNINativeMethod gVintfObjectMethods[] = { - {"report", "()[Ljava/lang/String;", (void*)android_os_VintfObject_report}, - {"verifyWithoutAvb", "()I", (void*)android_os_VintfObject_verifyWithoutAvb}, - {"getHalNamesAndVersions", "()[Ljava/lang/String;", (void*)android_os_VintfObject_getHalNamesAndVersions}, - {"getSepolicyVersion", "()Ljava/lang/String;", (void*)android_os_VintfObject_getSepolicyVersion}, - {"getVndkSnapshots", "()Ljava/util/Map;", (void*)android_os_VintfObject_getVndkSnapshots}, - {"getTargetFrameworkCompatibilityMatrixVersion", "()Ljava/lang/Long;", (void*)android_os_VintfObject_getTargetFrameworkCompatibilityMatrixVersion}, + {"report", "()[Ljava/lang/String;", (void*)android_os_VintfObject_report}, + {"verifyWithoutAvb", "()I", (void*)android_os_VintfObject_verifyWithoutAvb}, + {"getHalNamesAndVersions", "()[Ljava/lang/String;", + (void*)android_os_VintfObject_getHalNamesAndVersions}, + {"getSepolicyVersion", "()Ljava/lang/String;", + (void*)android_os_VintfObject_getSepolicyVersion}, + {"getPlatformSepolicyVersion", "()Ljava/lang/String;", + (void*)android_os_VintfObject_getPlatformSepolicyVersion}, + {"getVndkSnapshots", "()Ljava/util/Map;", (void*)android_os_VintfObject_getVndkSnapshots}, + {"getTargetFrameworkCompatibilityMatrixVersion", "()Ljava/lang/Long;", + (void*)android_os_VintfObject_getTargetFrameworkCompatibilityMatrixVersion}, }; const char* const kVintfObjectPathName = "android/os/VintfObject"; diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 182fddce11b0..ff07d9b7ad7b 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -2287,8 +2287,6 @@ <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"এপ্লিকেশ্বনৰ ব্ৰেণ্ডৰ প্ৰতিচ্ছবি"</string> <string name="view_and_control_notification_title" msgid="4300765399209912240">"এক্সেছৰ ছেটিং পৰীক্ষা কৰক"</string> <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g>এ আপোনাৰ স্ক্ৰীনখন চাব আৰু পৰিচালনা কৰিব পাৰে। পৰ্যালোচনা কৰিবলৈ টিপক।"</string> - <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) --> - <skip /> - <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) --> - <skip /> + <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> অনুবাদ কৰা হ’ল।"</string> + <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"বাৰ্তাটো <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>ৰ পৰা <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>লৈ অনুবাদ কৰা হ’ল।"</string> </resources> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index a265821e5b09..a065f19e0b44 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -2287,8 +2287,6 @@ <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"অ্যাপের ব্র্যান্ড ছবি"</string> <string name="view_and_control_notification_title" msgid="4300765399209912240">"অ্যাক্সেস করার সেটিংস চেক করুন"</string> <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> আপনার স্ক্রিন দেখতে ও কন্ট্রোল করতে পারবে। পর্যালোচনা করতে ট্যাপ করুন।"</string> - <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) --> - <skip /> - <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) --> - <skip /> + <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> অনুবাদ করা হয়েছে।"</string> + <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"মেসেজ <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> থেকে <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> ভাষাতে অনুবাদ করা হয়েছে।"</string> </resources> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 6a33a0a52f53..d277a80fe440 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -2287,8 +2287,6 @@ <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"App-Branding-Hintergrundbild"</string> <string name="view_and_control_notification_title" msgid="4300765399209912240">"Zugriffseinstellungen prüfen"</string> <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> kann deinen Bildschirm sehen und steuern. Zum Prüfen tippen."</string> - <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) --> - <skip /> - <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) --> - <skip /> + <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"„<xliff:g id="MESSAGE">%1$s</xliff:g>“ wurde übersetzt."</string> + <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Nachricht wurde von <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> auf <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> übersetzt."</string> </resources> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 17cff18dcd23..b7ecc0eb4676 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -2287,8 +2287,6 @@ <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ઍપ્લિકેશનની બ્રાંડિંગ છબી"</string> <string name="view_and_control_notification_title" msgid="4300765399209912240">"ઍક્સેસના સેટિંગ ચેક કરો"</string> <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> તમારી સ્ક્રીન જોઈ અને નિયંત્રિત કરી શકે છે. રિવ્યૂ કરવા માટે ટૅપ કરો."</string> - <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) --> - <skip /> - <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) --> - <skip /> + <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g>નો અનુવાદ કર્યો."</string> + <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>થી <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>માં સંદેશનો અનુવાદ કરવામાં આવ્યો."</string> </resources> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index aecd79bd6527..dd96815dc551 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -2355,8 +2355,6 @@ <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"תדמית המותג של האפליקציה"</string> <string name="view_and_control_notification_title" msgid="4300765399209912240">"בדיקה של הגדרות הגישה"</string> <string name="view_and_control_notification_content" msgid="8003766498562604034">"לשירות <xliff:g id="SERVICE_NAME">%s</xliff:g> יש הרשאה להצגת המסך ושליטה בו. אפשר להקיש כדי לבדוק."</string> - <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) --> - <skip /> - <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) --> - <skip /> + <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"ההודעה <xliff:g id="MESSAGE">%1$s</xliff:g> תורגמה."</string> + <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"ההודעה תורגמה מ<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> ל<xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string> </resources> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 3a2a2b569f27..330147d6a131 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -2285,7 +2285,7 @@ <string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"सेन्सरसम्बन्धी गोपनीयता"</string> <string name="splash_screen_view_icon_description" msgid="180638751260598187">"एप जनाउने आइकन"</string> <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"एपको ब्रान्डिङ फोटो"</string> - <string name="view_and_control_notification_title" msgid="4300765399209912240">"हेराइ र नियन्त्रणसम्बन्धी सेटिङ जाँच्नुहोस्"</string> + <string name="view_and_control_notification_title" msgid="4300765399209912240">"भ्यु र नियन्त्रणसम्बन्धी सेटिङ जाँच्नुहोस्"</string> <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> तपाईंको स्क्रिन हेर्न र नियन्त्रण गर्न सक्छ। सेटिङ मिलाउन ट्याप गर्नुहोस्।"</string> <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) --> <skip /> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 5aa16e7e22de..cdd9f52aa322 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -2287,8 +2287,6 @@ <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ଆପ୍ଲିକେସନ୍ ବ୍ରାଣ୍ଡିଂ ଛବି"</string> <string name="view_and_control_notification_title" msgid="4300765399209912240">"ଆକ୍ସେସ୍ ସେଟିଂସକୁ ଯାଞ୍ଚ କରନ୍ତୁ"</string> <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ଦେଖିପାରିବ ଏବଂ ନିୟନ୍ତ୍ରଣ କରିପାରିବ। ସମୀକ୍ଷା କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string> - <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) --> - <skip /> - <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) --> - <skip /> + <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> ଅନୁବାଦ କରାଯାଇଛି।"</string> + <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"ମେସେଜ୍, <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>ରୁ <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>କୁ ଅନୁବାଦ କରାଯାଇଛି।"</string> </resources> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 6cc4f1998183..afd9c0c12496 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -2287,8 +2287,6 @@ <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ਐਪਲੀਕੇਸ਼ਨ ਦਾ ਬ੍ਰਾਂਡ ਵਾਲਾ ਚਿੱਤਰ"</string> <string name="view_and_control_notification_title" msgid="4300765399209912240">"ਪਹੁੰਚ ਸੈਟਿੰਗਾਂ ਦੀ ਜਾਂਚ ਕਰੋ"</string> <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ਸੇਵਾ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਨੂੰ ਦੇਖ ਅਤੇ ਕੰਟਰੋਲ ਕਰ ਸਕਦੀ ਹੈ। ਸਮੀਖਿਆ ਲਈ ਟੈਪ ਕਰੋ।"</string> - <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) --> - <skip /> - <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) --> - <skip /> + <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> ਦਾ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ।"</string> + <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"ਸੁਨੇਹੇ ਦਾ <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> ਤੋਂ <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> ਵਿੱਚ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ।"</string> </resources> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 49ea3638a160..e1998ddf0dfe 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -2287,8 +2287,6 @@ <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"యాప్ బ్రాండింగ్ ఇమేజ్"</string> <string name="view_and_control_notification_title" msgid="4300765399209912240">"యాక్సెస్ సెట్టింగ్లను చెక్ చేయండి"</string> <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> మీ స్క్రీన్ను చూడవచ్చు, కంట్రోల్ చేయవచ్చు. రివ్యూ చేయడానికి ట్యాప్ చేయండి."</string> - <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) --> - <skip /> - <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) --> - <skip /> + <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> అనువదించబడింది."</string> + <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"మెసేజ్ <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> నుండి <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>కు అనువదించబడింది."</string> </resources> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 48208ac677cc..6d99dfb4563c 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -2287,8 +2287,6 @@ <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"ایپلیکیشن کی برانڈنگ تصویر"</string> <string name="view_and_control_notification_title" msgid="4300765399209912240">"رسائی کی ترتیبات چیک کریں"</string> <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> آپ کی اسکرین کو دیکھ اور کنٹرول کر سکتی ہیں۔ جائزے کے لیے تھپتھپائیں۔"</string> - <!-- no translation found for ui_translation_accessibility_translated_text (3197547218178944544) --> - <skip /> - <!-- no translation found for ui_translation_accessibility_translation_finished (3057830947610088465) --> - <skip /> + <string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> کا ترجمہ کیا گیا۔"</string> + <string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"پیغام کا ترجمہ <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> سے<xliff:g id="TO_LANGUAGE">%2$s</xliff:g> میں کیا گیا۔"</string> </resources> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java index 1971ca97d426..55dfc12966a9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java @@ -15,6 +15,7 @@ */ package com.android.wm.shell.bubbles; +import static android.graphics.Paint.ANTI_ALIAS_FLAG; import static android.graphics.Paint.DITHER_FLAG; import static android.graphics.Paint.FILTER_BITMAP_FLAG; @@ -22,10 +23,10 @@ import android.annotation.Nullable; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Paint; import android.graphics.PaintFlagsDrawFilter; import android.graphics.Path; import android.graphics.Rect; -import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.PathParser; import android.widget.ImageView; @@ -75,13 +76,13 @@ public class BadgedImageView extends ImageView { private BubbleViewProvider mBubble; private BubblePositioner mPositioner; + private boolean mOnLeft; private DotRenderer mDotRenderer; private DotRenderer.DrawParams mDrawParams; - private boolean mOnLeft; - private int mDotColor; + private Paint mPaint = new Paint(ANTI_ALIAS_FLAG); private Rect mTempBounds = new Rect(); public BadgedImageView(Context context) { @@ -305,7 +306,7 @@ public class BadgedImageView extends ImageView { } void showBadge() { - Drawable badge = mBubble.getAppBadge(); + Bitmap badge = mBubble.getAppBadge(); if (badge == null) { setImageBitmap(mBubble.getBubbleIcon()); return; @@ -318,13 +319,13 @@ public class BadgedImageView extends ImageView { bubbleCanvas.setBitmap(bubble); final int bubbleSize = bubble.getWidth(); final int badgeSize = (int) (ICON_BADGE_SCALE * bubbleSize); + Rect dest = new Rect(); if (mOnLeft) { - badge.setBounds(0, bubbleSize - badgeSize, badgeSize, bubbleSize); + dest.set(0, bubbleSize - badgeSize, badgeSize, bubbleSize); } else { - badge.setBounds(bubbleSize - badgeSize, bubbleSize - badgeSize, - bubbleSize, bubbleSize); + dest.set(bubbleSize - badgeSize, bubbleSize - badgeSize, bubbleSize, bubbleSize); } - badge.draw(bubbleCanvas); + bubbleCanvas.drawBitmap(badge, null /* src */, dest, mPaint); bubbleCanvas.setBitmap(null); setImageBitmap(bubble); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java index f6e92ef0e8ea..afb40d1ff95c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java @@ -104,9 +104,10 @@ public class Bubble implements BubbleViewProvider { } private FlyoutMessage mFlyoutMessage; - private Drawable mBadgeDrawable; - // Bitmap with no badge, no dot + // The developer provided image for the bubble private Bitmap mBubbleBitmap; + // The app badge for the bubble + private Bitmap mBadgeBitmap; private int mDotColor; private Path mDotPath; private int mFlags; @@ -242,8 +243,8 @@ public class Bubble implements BubbleViewProvider { } @Override - public Drawable getAppBadge() { - return mBadgeDrawable; + public Bitmap getAppBadge() { + return mBadgeBitmap; } @Override @@ -398,7 +399,7 @@ public class Bubble implements BubbleViewProvider { mAppName = info.appName; mFlyoutMessage = info.flyoutMessage; - mBadgeDrawable = info.badgeDrawable; + mBadgeBitmap = info.badgeBitmap; mBubbleBitmap = info.bubbleBitmap; mDotColor = info.dotColor; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java index 696f705782c0..d8ec6508d77c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java @@ -395,7 +395,6 @@ public class BubbleExpandedView extends LinearLayout { mPointerView.setBackground(mCurrentPointer); } - private String getBubbleKey() { return mBubble != null ? mBubble.getKey() : "null"; } @@ -519,16 +518,11 @@ public class BubbleExpandedView extends LinearLayout { + " bubble=" + getBubbleKey()); } mIsContentVisible = visibility; - - final float alpha = visibility ? 1f : 0f; - - mPointerView.setAlpha(alpha); if (mTaskView != null && !mIsAlphaAnimating) { - mTaskView.setAlpha(alpha); + mTaskView.setAlpha(visibility ? 1f : 0f); } } - @Nullable TaskView getTaskView() { return mTaskView; @@ -673,26 +667,48 @@ public class BubbleExpandedView extends LinearLayout { } /** - * Set the position that the tip of the triangle should point to. + * Sets the position of the pointer. + * + * When bubbles are showing "vertically" they display along the left / right sides of the + * screen with the expanded view beside them. + * + * If they aren't showing vertically they're positioned along the top of the screen with the + * expanded view below them. + * + * @param bubblePosition the x position of the bubble if showing on top, the y position of + * the bubble if showing vertically. + * @param onLeft whether the stack was on the left side of the screen when expanded. */ - public void setPointerPosition(float x, float y, boolean isLandscape, boolean onLeft) { + public void setPointerPosition(float bubblePosition, boolean onLeft) { // Pointer gets drawn in the padding - int paddingLeft = (isLandscape && onLeft) ? mPointerHeight : 0; - int paddingRight = (isLandscape && !onLeft) ? mPointerHeight : 0; - int paddingTop = isLandscape ? 0 : mExpandedViewPadding; + final boolean showVertically = mPositioner.showBubblesVertically(); + final int paddingLeft = (showVertically && onLeft) ? mPointerHeight : 0; + final int paddingRight = (showVertically && !onLeft) ? mPointerHeight : 0; + final int paddingTop = showVertically ? 0 : mExpandedViewPadding; setPadding(paddingLeft, paddingTop, paddingRight, 0); - if (isLandscape) { - // TODO: why setY vs setTranslationY ? linearlayout? - mPointerView.setY(y - (mPointerWidth / 2f)); - mPointerView.setTranslationX(onLeft ? -mPointerHeight : x - mExpandedViewPadding); - } else { - mPointerView.setTranslationY(0f); - mPointerView.setTranslationX(x - mExpandedViewPadding - (mPointerWidth / 2f)); - } - mCurrentPointer = isLandscape ? onLeft ? mLeftPointer : mRightPointer : mTopPointer; - updatePointerView(); - mPointerView.setVisibility(VISIBLE); + final float expandedViewY = mPositioner.getExpandedViewY(); + final float bubbleSize = mPositioner.getBubbleBitmapSize(); + final float bubbleCenter = showVertically + ? bubblePosition + (bubbleSize / 2f) - expandedViewY + : bubblePosition + (bubbleSize / 2f); + // Post because we need the width of the view + post(() -> { + float pointerY; + float pointerX; + if (showVertically) { + pointerY = bubbleCenter - (mPointerWidth / 2f); + pointerX = onLeft ? -mPointerHeight : getWidth() - mPaddingRight; + } else { + pointerY = 0; + pointerX = bubbleCenter - mPaddingLeft - (mPointerWidth / 2f); + } + mPointerView.setTranslationY(pointerY); + mPointerView.setTranslationX(pointerX); + mCurrentPointer = showVertically ? onLeft ? mLeftPointer : mRightPointer : mTopPointer; + updatePointerView(); + mPointerView.setVisibility(VISIBLE); + }); } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java index e64ed6a0836c..b83feeedbf21 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java @@ -101,6 +101,12 @@ public class BubbleIconFactory extends BaseIconFactory { userBadgedBitmap.getHeight(), userBadgedBitmap.getConfig()); Canvas c = new Canvas(badgeAndRing); + Paint ringPaint = new Paint(); + ringPaint.setStyle(Paint.Style.FILL); + ringPaint.setColor(importantConversationColor); + ringPaint.setAntiAlias(true); + c.drawCircle(c.getWidth() / 2, c.getHeight() / 2, c.getWidth() / 2, ringPaint); + final int bitmapTop = (int) ringStrokeWidth; final int bitmapLeft = (int) ringStrokeWidth; final int bitmapWidth = c.getWidth() - 2 * (int) ringStrokeWidth; @@ -110,14 +116,6 @@ public class BubbleIconFactory extends BaseIconFactory { bitmapHeight, /* filter */ true); c.drawBitmap(scaledBitmap, bitmapTop, bitmapLeft, /* paint */null); - Paint ringPaint = new Paint(); - ringPaint.setStyle(Paint.Style.STROKE); - ringPaint.setColor(importantConversationColor); - ringPaint.setAntiAlias(true); - ringPaint.setStrokeWidth(ringStrokeWidth); - c.drawCircle(c.getWidth() / 2, c.getHeight() / 2, c.getWidth() / 2 - ringStrokeWidth, - ringPaint); - shadowGenerator.recreateIcon(Bitmap.createBitmap(badgeAndRing), c); return createIconBitmap(badgeAndRing); } else { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt index 51d63cff385a..36908b854842 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt @@ -24,7 +24,6 @@ import android.graphics.Matrix import android.graphics.Path import android.graphics.drawable.AdaptiveIconDrawable import android.graphics.drawable.ColorDrawable -import android.graphics.drawable.Drawable import android.graphics.drawable.InsetDrawable import android.util.PathParser import android.util.TypedValue @@ -151,7 +150,7 @@ class BubbleOverflow( return dotColor } - override fun getAppBadge(): Drawable? { + override fun getAppBadge(): Bitmap? { return null } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java index c4d33877f17d..07d16b57d675 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java @@ -2487,7 +2487,7 @@ public class BubbleStackView extends FrameLayout // name and icon. if (show && mBubbleData.hasBubbleInStackWithKey(mExpandedBubble.getKey())) { final Bubble bubble = mBubbleData.getBubbleInStackWithKey(mExpandedBubble.getKey()); - mManageSettingsIcon.setImageDrawable(bubble.getAppBadge()); + mManageSettingsIcon.setImageBitmap(bubble.getAppBadge()); mManageSettingsText.setText(getResources().getString( R.string.bubbles_app_settings, bubble.getAppName())); } @@ -2683,7 +2683,7 @@ public class BubbleStackView extends FrameLayout Log.d(TAG, "updateExpandedView: mIsExpanded=" + mIsExpanded); } boolean isOverflowExpanded = mExpandedBubble != null - && mBubbleOverflow.KEY.equals(mExpandedBubble.getKey()); + && BubbleOverflow.KEY.equals(mExpandedBubble.getKey()); int[] paddings = mPositioner.getExpandedViewPadding( mStackAnimationController.isStackOnLeftSide(), isOverflowExpanded); mExpandedViewContainer.setPadding(paddings[0], 0, paddings[1], 0); @@ -2695,6 +2695,7 @@ public class BubbleStackView extends FrameLayout mExpandedViewContainer.setTranslationX(0f); mExpandedBubble.getExpandedView().updateView( mExpandedViewContainer.getLocationOnScreen()); + updatePointerPosition(); } mStackOnLeftOrWillBe = mStackAnimationController.isStackOnLeftSide(); @@ -2732,27 +2733,7 @@ public class BubbleStackView extends FrameLayout return; } float bubblePosition = mExpandedAnimationController.getBubbleXOrYForOrientation(index); - float expandedViewY = mPositioner.getExpandedViewY(); - if (mPositioner.showBubblesVertically()) { - float x = mStackOnLeftOrWillBe - ? mPositioner.getAvailableRect().left - : mPositioner.getAvailableRect().right - - mExpandedViewContainer.getPaddingRight() - - mPointerHeight; - float bubbleCenter = bubblePosition - expandedViewY + (mBubbleSize / 2f); - mExpandedBubble.getExpandedView().setPointerPosition( - x, - bubbleCenter, - true, - mStackOnLeftOrWillBe); - } else { - float bubbleCenter = bubblePosition + (mBubbleSize / 2f); - mExpandedBubble.getExpandedView().setPointerPosition( - bubbleCenter, - expandedViewY, - false, - mStackOnLeftOrWillBe); - } + mExpandedBubble.getExpandedView().setPointerPosition(bubblePosition, mStackOnLeftOrWillBe); } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java index fc53ef26dbd9..932f879caef8 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java @@ -126,7 +126,7 @@ public class BubbleViewInfoTask extends AsyncTask<Void, Void, BubbleViewInfoTask ShortcutInfo shortcutInfo; String appName; Bitmap bubbleBitmap; - Drawable badgeDrawable; + Bitmap badgeBitmap; int dotColor; Path dotPath; Bubble.FlyoutMessage flyoutMessage; @@ -188,7 +188,7 @@ public class BubbleViewInfoTask extends AsyncTask<Void, Void, BubbleViewInfoTask BitmapInfo badgeBitmapInfo = iconFactory.getBadgeBitmap(badgedIcon, b.isImportantConversation()); - info.badgeDrawable = badgedIcon; + info.badgeBitmap = badgeBitmapInfo.icon; info.bubbleBitmap = iconFactory.createBadgedIconBitmap(bubbleDrawable, null /* user */, true /* shrinkNonAdaptiveIcons */).icon; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewProvider.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewProvider.java index da4259c42558..38b3ba9dfda0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewProvider.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewProvider.java @@ -18,7 +18,6 @@ package com.android.wm.shell.bubbles; import android.graphics.Bitmap; import android.graphics.Path; -import android.graphics.drawable.Drawable; import android.view.View; import androidx.annotation.Nullable; @@ -48,7 +47,7 @@ public interface BubbleViewProvider { Bitmap getBubbleIcon(); /** App badge drawable to draw above bubble icon. */ - @Nullable Drawable getAppBadge(); + @Nullable Bitmap getAppBadge(); /** Path of normalized bubble icon to draw dot on. */ Path getDotPath(); diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index 8b226c926c99..4f587ebba89c 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -50,13 +50,6 @@ java_library { srcs: ["src/com/android/systemui/EventLogTags.logtags"], } -java_library { - name: "SystemUI-sensors", - srcs: [ - "src/com/android/systemui/util/sensors/ThresholdSensor.java", - ], -} - android_library { name: "SystemUI-core", srcs: [ diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 173e95954014..d6989753f16e 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -62,11 +62,13 @@ <!-- Networking and telephony --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> - <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"/> - <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> - <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> + <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" + android:usesPermissionFlags="neverForLocation" /> + <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" + android:usesPermissionFlags="neverForLocation" /> + <uses-permission android:name="android.permission.BLUETOOTH_SCAN" + android:usesPermissionFlags="neverForLocation" /> <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" /> - <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" /> diff --git a/packages/SystemUI/animation/Android.bp b/packages/SystemUI/animation/Android.bp index ab9ab831157c..1b15d20d2c52 100644 --- a/packages/SystemUI/animation/Android.bp +++ b/packages/SystemUI/animation/Android.bp @@ -36,7 +36,6 @@ android_library { static_libs: [ "PluginCoreLib", - "SystemUI-sensors", ], manifest: "AndroidManifest.xml", diff --git a/packages/SystemUI/plugin/Android.bp b/packages/SystemUI/plugin/Android.bp index 9f02fdbf3ec9..cafaaf854eed 100644 --- a/packages/SystemUI/plugin/Android.bp +++ b/packages/SystemUI/plugin/Android.bp @@ -34,7 +34,6 @@ java_library { static_libs: [ "androidx.annotation_annotation", "PluginCoreLib", - "SystemUI-sensors", "SystemUIAnimationLib", ], diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java index b75252b46785..5ac8961aceeb 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java @@ -21,7 +21,6 @@ import android.net.Uri; import android.view.MotionEvent; import com.android.systemui.plugins.annotations.ProvidesInterface; -import com.android.systemui.util.sensors.ThresholdSensor; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -118,7 +117,7 @@ public interface FalsingManager { void cleanup(); /** Call to report a ProximityEvent to the FalsingManager. */ - void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent); + void onProximityEvent(ProximityEvent proximityEvent); /** Adds a {@link FalsingBeliefListener}. */ void addFalsingBeliefListener(FalsingBeliefListener listener); @@ -141,4 +140,13 @@ public interface FalsingManager { interface FalsingTapListener { void onDoubleTapRequired(); } + + /** Passed to {@link FalsingManager#onProximityEvent}. */ + interface ProximityEvent { + /** Returns true when the proximity sensor was covered. */ + boolean getCovered(); + + /** Returns when the proximity sensor was covered in nanoseconds. */ + long getTimestampNs(); + } } diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_pattern_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_pattern_view.xml index 1a38585ea78d..ce63082868bb 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_pattern_view.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_pattern_view.xml @@ -40,7 +40,7 @@ android:clipToPadding="false"> <LinearLayout - android:id="@+id/container" + android:id="@+id/pattern_container" android:layout_height="wrap_content" android:layout_width="wrap_content" android:orientation="vertical" diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml index 50ffbc802a7d..c64afd307f23 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml @@ -27,7 +27,7 @@ android:orientation="vertical" > <LinearLayout - android:id="@+id/container" + android:id="@+id/pin_container" android:layout_width="match_parent" android:layout_height="0dp" android:orientation="vertical" diff --git a/packages/SystemUI/res/drawable/ic_qs_no_calling_sms.xml b/packages/SystemUI/res/drawable/ic_qs_no_calling_sms.xml index 0e308d2f5bfb..da581061370b 100644 --- a/packages/SystemUI/res/drawable/ic_qs_no_calling_sms.xml +++ b/packages/SystemUI/res/drawable/ic_qs_no_calling_sms.xml @@ -1,12 +1,24 @@ +<!-- + Copyright (C) 2021 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> + android:width="16dp" + android:height="16dp" + android:viewportWidth="16.0" + android:viewportHeight="16.0"> <path android:fillColor="#FF000000" - android:pathData="M20.17,14.84l-3.26,-0.65c-0.33,-0.07 -0.67,0.04 -0.9,0.27l-2.62,2.62c-2.75,-1.49 -5.01,-3.75 -6.5,-6.5l2.62,-2.62c0.24,-0.24 0.34,-0.58 0.27,-0.9L9.13,3.8C9.04,3.34 8.63,3 8.15,3H4C3.44,3 2.97,3.47 3,4.03c0.17,2.91 1.04,5.63 2.43,8.01c1.57,2.69 3.81,4.93 6.5,6.5c2.38,1.39 5.1,2.26 8.01,2.43c0.56,0.03 1.03,-0.44 1.03,-1v-4.15C20.97,15.34 20.64,14.93 20.17,14.84z"/> - <path - android:fillColor="#FF000000" - android:pathData="M22,3.41L20.59,2L18.5,4.09L16.41,2L15,3.41l2.09,2.09L15,7.59L16.41,9l2.09,-2.08L20.59,9L22,7.59L19.92,5.5L22,3.41z"/> + android:pathData="M6.52,11.37c0.46,0.37 0.94,0.7 1.45,0.99c1.59,0.93 3.4,1.51 5.34,1.62C13.69,14 14,13.69 14,13.31v-2.77c0,-0.32 -0.23,-0.59 -0.53,-0.65l-2.17,-0.43c-0.22,-0.05 -0.45,0.03 -0.6,0.18l-1.75,1.75c-0.52,-0.28 -1.01,-0.61 -1.48,-0.97l7.61,-7.61l-0.95,-0.94L1.87,14.13l0.94,0.94L6.52,11.37L6.52,11.37zM5.59,8.55C5.22,8.08 4.89,7.58 4.61,7.05l1.75,-1.75c0.16,-0.16 0.23,-0.39 0.18,-0.6L6.1,2.53C6.04,2.23 5.77,2 5.45,2H2.68C2.31,2 1.99,2.31 2.01,2.69c0.11,1.94 0.69,3.75 1.62,5.34c0.3,0.51 0.64,1.01 1.01,1.47L5.59,8.55L5.59,8.55z"/> </vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/qs_media_button_background.xml b/packages/SystemUI/res/drawable/qs_media_button_background.xml index 2241abf130e3..ed9bd263a79d 100644 --- a/packages/SystemUI/res/drawable/qs_media_button_background.xml +++ b/packages/SystemUI/res/drawable/qs_media_button_background.xml @@ -26,4 +26,5 @@ android:right="16dp" android:top="8dp" android:bottom="8dp" /> + <solid android:color="@android:color/transparent" /> </shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/media_carousel.xml b/packages/SystemUI/res/layout/media_carousel.xml index 95cee66af536..87acfd088939 100644 --- a/packages/SystemUI/res/layout/media_carousel.xml +++ b/packages/SystemUI/res/layout/media_carousel.xml @@ -22,7 +22,7 @@ android:layout_height="wrap_content" android:clipChildren="false" android:clipToPadding="false" - > + android:theme="@style/MediaPlayer"> <com.android.systemui.media.MediaScrollView android:id="@+id/media_carousel_scroller" android:layout_width="match_parent" @@ -47,7 +47,7 @@ android:layout_width="wrap_content" android:layout_height="48dp" android:layout_marginBottom="4dp" - android:tint="?android:attr/textColorPrimary" + android:tint="?android:attr/textColor" android:forceHasOverlappingRendering="false" /> </FrameLayout> diff --git a/packages/SystemUI/res/layout/media_smartspace_recommendations.xml b/packages/SystemUI/res/layout/media_smartspace_recommendations.xml index 85354266f228..8c54e2c1cec4 100644 --- a/packages/SystemUI/res/layout/media_smartspace_recommendations.xml +++ b/packages/SystemUI/res/layout/media_smartspace_recommendations.xml @@ -19,7 +19,6 @@ <com.android.systemui.util.animation.TransitionLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:id="@+id/media_recommendations" android:layout_width="match_parent" android:layout_height="wrap_content" @@ -28,7 +27,8 @@ android:clipChildren="false" android:clipToPadding="false" android:forceHasOverlappingRendering="false" - android:background="@drawable/qs_media_background"> + android:background="@drawable/qs_media_background" + android:theme="@style/MediaPlayer"> <androidx.constraintlayout.widget.Guideline android:id="@+id/media_vertical_start_guideline" @@ -49,7 +49,7 @@ android:layout_width="@dimen/qs_aa_media_rec_header_icon_size" android:layout_height="@dimen/qs_aa_media_rec_header_icon_size" android:src="@drawable/ic_headset" - android:tint="?android:attr/colorPrimary" /> + android:tint="?android:attr/textColor" /> <TextView android:id="@+id/recommendation_card_text" @@ -58,7 +58,6 @@ android:singleLine="true" android:text="@string/controls_media_smartspace_rec_title" android:fontFamily="google-sans-medium" - android:textColor="?android:attr/colorPrimary" android:textDirection="locale" android:textSize="@dimen/qq_aa_media_rec_header_text_size" /> @@ -68,7 +67,7 @@ android:layout_height="@dimen/qs_aa_media_rec_album_size" android:adjustViewBounds="true" android:background="@drawable/bg_smartspace_media_item" - android:backgroundTint="?androidprv:attr/colorAccentSecondary" + style="@style/MediaPlayer.Album" android:clipToOutline="true" android:scaleType="centerCrop"/> @@ -76,7 +75,7 @@ android:id="@+id/media_logo1" android:layout_width="@dimen/qs_media_icon_size" android:layout_height="@dimen/qs_media_icon_size" - android:background="@drawable/qs_media_icon_background" /> + style="@style/MediaPlayer.AppIcon" /> <ImageView android:id="@+id/media_cover2" @@ -84,7 +83,7 @@ android:layout_height="@dimen/qs_aa_media_rec_album_size" android:adjustViewBounds="true" android:background="@drawable/bg_smartspace_media_item" - android:backgroundTint="?androidprv:attr/colorAccentSecondary" + style="@style/MediaPlayer.Album" android:clipToOutline="true" android:scaleType="centerCrop"/> @@ -92,7 +91,7 @@ android:id="@+id/media_logo2" android:layout_width="@dimen/qs_media_icon_size" android:layout_height="@dimen/qs_media_icon_size" - android:background="@drawable/qs_media_icon_background" /> + style="@style/MediaPlayer.AppIcon" /> <ImageView android:id="@+id/media_cover3" @@ -100,7 +99,7 @@ android:layout_height="@dimen/qs_aa_media_rec_album_size" android:adjustViewBounds="true" android:background="@drawable/bg_smartspace_media_item" - android:backgroundTint="?androidprv:attr/colorAccentSecondary" + style="@style/MediaPlayer.Album" android:clipToOutline="true" android:scaleType="centerCrop"/> @@ -108,7 +107,7 @@ android:id="@+id/media_logo3" android:layout_width="@dimen/qs_media_icon_size" android:layout_height="@dimen/qs_media_icon_size" - android:background="@drawable/qs_media_icon_background" /> + style="@style/MediaPlayer.AppIcon" /> <ImageView android:id="@+id/media_cover4" @@ -116,7 +115,7 @@ android:layout_height="@dimen/qs_aa_media_rec_album_size" android:adjustViewBounds="true" android:background="@drawable/bg_smartspace_media_item" - android:backgroundTint="?androidprv:attr/colorAccentSecondary" + style="@style/MediaPlayer.Album" android:clipToOutline="true" android:scaleType="centerCrop"/> @@ -124,7 +123,7 @@ android:id="@+id/media_logo4" android:layout_width="@dimen/qs_media_icon_size" android:layout_height="@dimen/qs_media_icon_size" - android:background="@drawable/qs_media_icon_background" /> + style="@style/MediaPlayer.AppIcon" /> <ImageView android:id="@+id/media_cover5" @@ -132,7 +131,7 @@ android:layout_height="@dimen/qs_aa_media_rec_album_size" android:adjustViewBounds="true" android:background="@drawable/bg_smartspace_media_item" - android:backgroundTint="?androidprv:attr/colorAccentSecondary" + style="@style/MediaPlayer.Album" android:clipToOutline="true" android:scaleType="centerCrop"/> @@ -140,7 +139,7 @@ android:id="@+id/media_logo5" android:layout_width="@dimen/qs_media_icon_size" android:layout_height="@dimen/qs_media_icon_size" - android:background="@drawable/qs_media_icon_background" /> + style="@style/MediaPlayer.AppIcon" /> <ImageView android:id="@+id/media_cover6" @@ -148,7 +147,7 @@ android:layout_height="@dimen/qs_aa_media_rec_album_size" android:adjustViewBounds="true" android:background="@drawable/bg_smartspace_media_item" - android:backgroundTint="?androidprv:attr/colorAccentSecondary" + style="@style/MediaPlayer.Album" android:clipToOutline="true" android:scaleType="centerCrop"/> @@ -156,7 +155,7 @@ android:id="@+id/media_logo6" android:layout_width="@dimen/qs_media_icon_size" android:layout_height="@dimen/qs_media_icon_size" - android:background="@drawable/qs_media_icon_background" /> + style="@style/MediaPlayer.AppIcon" /> <!-- Long press menu --> <TextView @@ -168,7 +167,6 @@ android:id="@+id/remove_text" android:fontFamily="@*android:string/config_headlineFontFamily" android:singleLine="true" - android:textColor="?android:attr/textColorPrimary" android:text="@string/controls_media_close_session" android:gravity="center_horizontal|top" app:layout_constraintTop_toTopOf="parent" @@ -193,9 +191,7 @@ android:layout_gravity="bottom" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/qs_media_button_background" - android:fontFamily="@*android:string/config_headlineFontFamilyMedium" - android:textColor="?android:attr/textColorPrimary" + style="@style/MediaPlayer.OutlineButton" android:text="@string/controls_media_settings_button" /> </FrameLayout> @@ -216,9 +212,7 @@ android:layout_gravity="bottom" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/qs_media_button_background" - android:fontFamily="@*android:string/config_headlineFontFamilyMedium" - android:textColor="?android:attr/textColorPrimary" + style="@style/MediaPlayer.OutlineButton" android:text="@string/cancel" /> </FrameLayout> @@ -239,9 +233,7 @@ android:layout_gravity="bottom" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/qs_media_button_background" - android:fontFamily="@*android:string/config_headlineFontFamilyMedium" - android:textColor="?android:attr/textColorPrimary" + style="@style/MediaPlayer.OutlineButton" android:text="@string/controls_media_dismiss_button" /> </FrameLayout> diff --git a/packages/SystemUI/res/layout/media_view.xml b/packages/SystemUI/res/layout/media_view.xml index cdced5a1be71..e9a24e284601 100644 --- a/packages/SystemUI/res/layout/media_view.xml +++ b/packages/SystemUI/res/layout/media_view.xml @@ -18,7 +18,6 @@ <!-- Layout for media controls inside QSPanel carousel --> <com.android.systemui.util.animation.TransitionLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:id="@+id/qs_media_controls" android:layout_width="match_parent" android:layout_height="wrap_content" @@ -26,7 +25,8 @@ android:clipToPadding="false" android:gravity="center_horizontal|fill_vertical" android:forceHasOverlappingRendering="false" - android:background="@drawable/qs_media_background"> + android:background="@drawable/qs_media_background" + android:theme="@style/MediaPlayer"> <androidx.constraintlayout.widget.Guideline android:id="@+id/center_vertical_guideline" @@ -55,7 +55,6 @@ android:layout_height="wrap_content" android:layout_alignParentStart="true" android:fontFamily="@*android:string/config_bodyFontFamily" - android:textColor="?android:attr/textColorPrimary" android:gravity="start" android:textSize="12sp" /> @@ -65,7 +64,6 @@ android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:fontFamily="@*android:string/config_bodyFontFamily" - android:textColor="?android:attr/textColorPrimary" android:gravity="end" android:textSize="12sp" /> </FrameLayout> @@ -86,31 +84,31 @@ <ImageButton android:id="@+id/action0" - style="@style/MediaPlayer.Button" + style="@style/MediaPlayer.Action" android:layout_width="48dp" android:layout_height="48dp" /> <ImageButton android:id="@+id/action1" - style="@style/MediaPlayer.Button" + style="@style/MediaPlayer.Action" android:layout_width="48dp" android:layout_height="48dp" /> <ImageButton android:id="@+id/action2" - style="@style/MediaPlayer.Button" + style="@style/MediaPlayer.Action" android:layout_width="48dp" android:layout_height="48dp" /> <ImageButton android:id="@+id/action3" - style="@style/MediaPlayer.Button" + style="@style/MediaPlayer.Action" android:layout_width="48dp" android:layout_height="48dp" /> <ImageButton android:id="@+id/action4" - style="@style/MediaPlayer.Button" + style="@style/MediaPlayer.Action" android:layout_width="48dp" android:layout_height="48dp" /> @@ -120,8 +118,8 @@ android:layout_width="@dimen/qs_media_album_size" android:layout_height="@dimen/qs_media_album_size" android:layout_gravity="center_vertical" + style="@style/MediaPlayer.Album" android:background="@drawable/qs_media_art_background" - android:backgroundTint="?androidprv:attr/colorAccentSecondary" android:clipToOutline="true" /> <!-- Seamless Output Switcher --> @@ -138,6 +136,7 @@ <LinearLayout android:layout_width="wrap_content" android:layout_height="@dimen/qs_seamless_height" + android:theme="@style/MediaPlayer.SolidButton" android:background="@drawable/qs_media_seamless_background" android:orientation="horizontal" android:contentDescription="@string/quick_settings_media_device_label"> @@ -146,7 +145,6 @@ android:layout_width="@dimen/qs_seamless_icon_size" android:layout_height="@dimen/qs_seamless_icon_size" android:layout_gravity="center" - android:tint="?android:attr/colorPrimary" android:src="@*android:drawable/ic_media_seamless" /> <TextView android:id="@+id/media_seamless_text" @@ -157,7 +155,6 @@ android:fontFamily="@*android:string/config_headlineFontFamily" android:singleLine="true" android:text="@*android:string/ext_media_seamless_action" - android:textColor="?android:attr/colorPrimary" android:textDirection="locale" android:textSize="12sp" /> </LinearLayout> @@ -171,7 +168,7 @@ android:layout_marginBottom="@dimen/qs_media_padding" android:layout_marginStart="@dimen/qs_center_guideline_padding" android:layout_marginEnd="@dimen/qs_seamless_fallback_margin" - android:tint="?android:attr/textColorPrimary" + android:tint="?android:attr/textColor" android:src="@drawable/ic_cast_connected" android:forceHasOverlappingRendering="false" /> @@ -179,17 +176,13 @@ <!-- As per Material Design on Biderectionality, this is forced to LTR in code --> <SeekBar android:id="@+id/media_progress_bar" - style="@android:style/Widget.ProgressBar.Horizontal" + style="@style/MediaPlayer.ProgressBar" android:layout_width="0dp" android:layout_height="wrap_content" - android:clickable="true" android:maxHeight="@dimen/qs_media_enabled_seekbar_height" android:paddingTop="@dimen/qs_media_enabled_seekbar_vertical_padding" android:layout_marginTop="-22dp" android:paddingBottom="0dp" - android:thumbTint="?android:attr/textColorPrimary" - android:progressTint="?android:attr/textColorPrimary" - android:progressBackgroundTint="?android:attr/textColorTertiary" android:splitTrack="false" /> <!-- Song name --> @@ -199,7 +192,6 @@ android:layout_height="wrap_content" android:fontFamily="@*android:string/config_headlineFontFamilyMedium" android:singleLine="true" - android:textColor="?android:attr/textColorPrimary" android:textSize="16sp" /> <!-- Artist name --> @@ -209,16 +201,14 @@ android:layout_height="wrap_content" android:fontFamily="@*android:string/config_headlineFontFamily" android:singleLine="true" - android:textColor="?android:attr/textColorSecondary" + style="@style/MediaPlayer.Subtitle" android:textSize="14sp" /> <com.android.internal.widget.CachingIconView android:id="@+id/icon" - android:tint="?android:attr/colorAccent" + style="@style/MediaPlayer.AppIcon" android:layout_width="@dimen/qs_media_icon_size" - android:layout_height="@dimen/qs_media_icon_size" - android:background="@drawable/qs_media_icon_background" - /> + android:layout_height="@dimen/qs_media_icon_size" /> <!-- Long press menu --> <TextView @@ -230,7 +220,6 @@ android:id="@+id/remove_text" android:fontFamily="@*android:string/config_headlineFontFamily" android:singleLine="true" - android:textColor="?android:attr/textColorPrimary" android:text="@string/controls_media_close_session" android:gravity="center_horizontal|top" app:layout_constraintTop_toTopOf="parent" @@ -255,9 +244,7 @@ android:layout_gravity="bottom" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/qs_media_button_background" - android:fontFamily="@*android:string/config_headlineFontFamilyMedium" - android:textColor="?android:attr/textColorPrimary" + style="@style/MediaPlayer.OutlineButton" android:text="@string/controls_media_settings_button" /> </FrameLayout> @@ -278,9 +265,7 @@ android:layout_gravity="bottom" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/qs_media_button_background" - android:fontFamily="@*android:string/config_headlineFontFamilyMedium" - android:textColor="?android:attr/textColorPrimary" + style="@style/MediaPlayer.OutlineButton" android:text="@string/cancel" /> </FrameLayout> @@ -301,9 +286,7 @@ android:layout_gravity="bottom" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/qs_media_button_background" - android:fontFamily="@*android:string/config_headlineFontFamilyMedium" - android:textColor="?android:attr/textColorPrimary" + style="@style/MediaPlayer.OutlineButton" android:text="@string/controls_media_dismiss_button" /> </FrameLayout> diff --git a/packages/SystemUI/res/layout/notification_conversation_info.xml b/packages/SystemUI/res/layout/notification_conversation_info.xml index ea644cfca68a..c332f4cf7a39 100644 --- a/packages/SystemUI/res/layout/notification_conversation_info.xml +++ b/packages/SystemUI/res/layout/notification_conversation_info.xml @@ -254,7 +254,6 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/notification_importance_button_description_top_margin" android:visibility="gone" - android:text="@string/notification_channel_summary_priority" android:clickable="false" android:focusable="false" android:ellipsize="end" diff --git a/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml b/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml deleted file mode 100644 index 3f0e514a9af2..000000000000 --- a/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml +++ /dev/null @@ -1,166 +0,0 @@ -<!-- - ~ Copyright (C) 2020 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 - --> - -<FrameLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/onboarding_half_shell_container" - android:orientation="vertical" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal|bottom" - android:paddingStart="4dp" - android:paddingEnd="4dp" - > - - <LinearLayout - android:id="@+id/half_shell" - android:layout_width="@dimen/qs_panel_width" - android:layout_height="wrap_content" - android:paddingTop="16dp" - android:paddingStart="16dp" - android:paddingEnd="16dp" - android:orientation="vertical" - android:gravity="bottom" - android:layout_gravity="center_horizontal|bottom" - android:background="@drawable/rounded_bg_full" - > - - <FrameLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:clipChildren="false" - android:clipToPadding="false" - android:padding="12dp" - android:layout_gravity="center_horizontal" - > - - <!-- Big icon: 52x52, 12dp padding left + top, 16dp padding right --> - <ImageView - android:id="@+id/conversation_icon" - android:layout_width="@*android:dimen/conversation_avatar_size" - android:layout_height="@*android:dimen/conversation_avatar_size" - android:scaleType="centerCrop" - android:importantForAccessibility="no" - /> - - <FrameLayout - android:id="@+id/conversation_icon_badge" - android:layout_width="@*android:dimen/conversation_icon_size_badged" - android:layout_height="@*android:dimen/conversation_icon_size_badged" - android:layout_marginLeft="@*android:dimen/conversation_badge_side_margin" - android:layout_marginTop="@*android:dimen/conversation_badge_side_margin" - android:clipChildren="false" - android:clipToPadding="false" - > - <ImageView - android:id="@+id/conversation_icon_badge_bg" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_gravity="center" - android:src="@*android:drawable/conversation_badge_background" - android:forceHasOverlappingRendering="false" - /> - <ImageView - android:id="@+id/icon" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_margin="4dp" - android:layout_gravity="center" - android:forceHasOverlappingRendering="false" - /> - <ImageView - android:id="@+id/conversation_icon_badge_ring" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:src="@*android:drawable/conversation_badge_ring" - android:forceHasOverlappingRendering="false" - android:clipToPadding="false" - android:scaleType="center" - /> - </FrameLayout> - </FrameLayout> - - <TextView - android:id="@+id/title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center_horizontal" - android:layout_marginTop="16dp" - android:text="@string/priority_onboarding_title" - style="@style/TextAppearance.NotificationImportanceChannel" - /> - - <View - android:id="@+id/divider" - android:layout_width="match_parent" - android:layout_height="0.5dp" - android:layout_marginTop="20dp" - android:layout_marginBottom="20dp" - android:background="@color/material_grey_300" /> - - <TextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="start" - android:text="@string/priority_onboarding_behavior" - style="@style/TextAppearance.NotificationImportanceChannelGroup" - /> - - <TextView - android:id="@+id/behaviors" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="start" - android:layout_marginTop="8dp" - style="@style/TextAppearance.NotificationImportanceChannelGroup" - /> - - <!-- Bottom button container --> - <RelativeLayout - android:id="@+id/button_container" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="32dp" - android:orientation="horizontal" - > - <TextView - android:id="@+id/settings_button" - android:text="@string/priority_onboarding_settings_button_title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentStart="true" - android:gravity="start|center_vertical" - android:minWidth="@dimen/notification_importance_toggle_size" - android:minHeight="@dimen/notification_importance_toggle_size" - android:maxWidth="125dp" - style="@style/TextAppearance.NotificationInfo.Button"/> - <TextView - android:id="@+id/done_button" - android:text="@string/priority_onboarding_done_button_title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentEnd="true" - android:gravity="end|center_vertical" - android:minWidth="@dimen/notification_importance_toggle_size" - android:minHeight="@dimen/notification_importance_toggle_size" - android:maxWidth="125dp" - style="@style/TextAppearance.NotificationInfo.Button"/> - - </RelativeLayout> - - </LinearLayout> -</FrameLayout> diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml index 5bf691928300..bb540990ccb7 100644 --- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml +++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml @@ -36,7 +36,7 @@ <include layout="@layout/quick_status_bar_header_date_privacy"/> <RelativeLayout - android:id="@+id/container" + android:id="@+id/qs_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index b94e9e8ae1c3..f17067a58b69 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Beweeg na regs onder"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Beweeg na rand en versteek"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Beweeg weg van rand en wys"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"wissel"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Toestelkontroles"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Voeg kontroles vir jou gekoppelde toestelle by"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Stel toestelkontroles op"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Maak toe"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Hervat"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Instellings"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Speel"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Onaktief, gaan program na"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Fout, probeer tans weer …"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Nie gekry nie"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index d2ee53d54a46..d2ecd78df75c 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"ታችኛውን ቀኝ አንቀሳቅስ"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"ወደ ጠርዝ አንቀሳቅስ እና ደደብቅ"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"ጠርዙን ወደ ውጭ አንቀሳቅስ እና አሳይ"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ቀያይር"</string> <string name="quick_controls_title" msgid="6839108006171302273">"የመሣሪያ መቆጣጠሪያዎች"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"ለእርስዎ የተገናኙ መሣሪያዎች መቆጣጠሪያዎችን ያክሉ"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"የመሣሪያ መቆጣጠሪያዎችን ያቀናብሩ"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"አሰናብት"</string> <string name="controls_media_resume" msgid="1933520684481586053">"ከቆመበት ቀጥል"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"ቅንብሮች"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"አጫውት"</string> <string name="controls_error_timeout" msgid="794197289772728958">"ንቁ ያልኾነ፣ መተግበሪያን ይፈትሹ"</string> <string name="controls_error_retryable" msgid="864025882878378470">"ስህተት፣ እንደገና በመሞከር ላይ…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"አልተገኘም"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index a32a55ce8101..bceb6c9250ae 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"তলৰ সোঁফালে নিয়ক"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"কাষলৈ নিয়ক আৰু লুকুৱাওক"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"কাষৰ বাহিৰলৈ নিয়ক আৰু দেখুৱাওক"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ট’গল কৰক"</string> <string name="quick_controls_title" msgid="6839108006171302273">"ডিভাইচৰ নিয়ন্ত্ৰণসমূহ"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"আপোনাৰ সংযোজিত ডিভাইচৰ বাবে নিয়ন্ত্ৰণ যোগ কৰক"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"ডিভাইচৰ নিয়ন্ত্ৰণসমূহ ছেট আপ কৰক"</string> @@ -1087,15 +1086,12 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"অধিক চাবলৈ ছোৱাইপ কৰক"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"চুপাৰিছসমূহ ল’ড কৰি থকা হৈছে"</string> <string name="controls_media_title" msgid="1746947284862928133">"মিডিয়া"</string> - <!-- no translation found for controls_media_close_session (1193000643003066508) --> - <skip /> - <!-- no translation found for controls_media_active_session (3146882316024153337) --> - <skip /> + <string name="controls_media_close_session" msgid="1193000643003066508">"এই মিডিয়াৰ ছেশ্বনটো লুকুৱাবনে?"</string> + <string name="controls_media_active_session" msgid="3146882316024153337">"বৰ্তমানৰ মিডিয়াৰ ছেশ্বনটো লুকুৱাব নোৱাৰি।"</string> <string name="controls_media_dismiss_button" msgid="9081375542265132213">"অগ্ৰাহ্য কৰক"</string> <string name="controls_media_resume" msgid="1933520684481586053">"পুনৰ আৰম্ভ কৰক"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"ছেটিংসমূহ"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"প্লে’ কৰক"</string> <string name="controls_error_timeout" msgid="794197289772728958">"সক্ৰিয় নহয়, এপ্টো পৰীক্ষা কৰক"</string> <string name="controls_error_retryable" msgid="864025882878378470">"আসোঁৱাহ, পুনৰ চেষ্টা কৰি আছে…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"বিচাৰি পোৱা নগ’ল"</string> @@ -1156,6 +1152,5 @@ <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰ অক্ষম হৈ আছে"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"বিশ্বাসযোগ্যতা প্ৰমাণ কৰক"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"ডিভাইচ আনলক কৰক"</string> - <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) --> - <skip /> + <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"খুলিবলৈ ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰক"</string> </resources> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 9318906f4a49..466d24ef491d 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Aşağıya sağa köçürün"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"İçəri keçirib gizlədin"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Kənara daşıyıb göstərin"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"keçirin"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Cihaz idarəetmələri"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Qoşulmuş cihazlarınız üçün nizamlayıcılar əlavə edin"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Cihaz idarəetmələrini ayarlayın"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"İmtina edin"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Davam edin"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Ayarlar"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Oxudun"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Aktiv deyil, tətbiqi yoxlayın"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Xəta, yenidən cəhd edilir…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Tapılmadı"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index eeb3061fe8e7..f1303ce06190 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -1049,8 +1049,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Premesti dole desno"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Premesti do ivice i sakrij"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Premesti izvan ivice i prikaži"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"uključite/isključite"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Kontrole uređaja"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodajte kontrole za povezane uređaje"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Podesite kontrole uređaja"</string> @@ -1098,8 +1097,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Odbaci"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Nastavi"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Podešavanja"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Pusti"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Neaktivno. Vidite aplikaciju"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Greška, pokušava se ponovo…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Nije pronađeno"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 44f6ff96d323..e857489eff56 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Преместване долу вдясно"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Преместване в края и скриване"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Преместване в края и показване"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"превключване"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Контроли за устройството"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Добавяне на контроли за свързаните ви устройства"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Настройване на контролите за устройството"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Отхвърляне"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Възобновяване"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Настройки"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Google Play"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Неактивно, проверете прилож."</string> <string name="controls_error_retryable" msgid="864025882878378470">"Грешка. Извършва се нов опит…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Не е намерено"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 959f07b36b92..8f9953ba2a6d 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -1087,10 +1087,8 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"আরও দেখতে সোয়াইপ করুন"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"সাজেশন লোড করা হচ্ছে"</string> <string name="controls_media_title" msgid="1746947284862928133">"মিডিয়া"</string> - <!-- no translation found for controls_media_close_session (1193000643003066508) --> - <skip /> - <!-- no translation found for controls_media_active_session (3146882316024153337) --> - <skip /> + <string name="controls_media_close_session" msgid="1193000643003066508">"এই মিডিয়া সেশন লুকিয়ে রাখতে চান?"</string> + <string name="controls_media_active_session" msgid="3146882316024153337">"বর্তমান মিডিয়া সেশন লুকিয়ে রাখা যাবে না।"</string> <string name="controls_media_dismiss_button" msgid="9081375542265132213">"খারিজ করুন"</string> <string name="controls_media_resume" msgid="1933520684481586053">"আবার চালু করুন"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"সেটিংস"</string> @@ -1156,6 +1154,5 @@ <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"ফিঙ্গারপ্রিন্ট সেন্সর বন্ধ করা আছে"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"যাচাই করিয়ে নিন"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"ডিভাইস আনলক করুন"</string> - <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) --> - <skip /> + <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"খুলতে ফিঙ্গারপ্রিন্ট ব্যবহার করুন"</string> </resources> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 674f049849b0..482c8ad816f9 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -1049,8 +1049,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Pomjeranje dolje desno"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Pomjeranje do ivice i sakrivanje"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Pomjeranje izvan ivice i prikaz"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"aktiviranje/deaktiviranje"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Kontrole uređaja"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodajte kontrole za povezane uređaje"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Postavite kontrole uređaja"</string> @@ -1098,8 +1097,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Odbaci"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Nastavi"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Postavke"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Pokrenite"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Neaktivno, vidite aplikaciju"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Greška, ponovni pokušaj…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Nije pronađeno"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index b9e01021df59..ac86cfbba09e 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mou a baix a la dreta"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mou dins de les vores i amaga"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mou fora de les vores i mostra"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"commuta"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Controls de dispositius"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Afegeix controls per als teus dispositius connectats"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configura els controls de dispositius"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Ignora"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Reprèn"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Configuració"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Reprodueix"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Inactiu; comprova l\'aplicació"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Error. S\'està tornant a provar…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"No s\'ha trobat"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 123b09fc1816..bf969a19d21e 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -1054,8 +1054,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Přesunout vpravo dolů"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Přesunout k okraji a skrýt"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Přesunout okraj ven a zobrazit"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"přepnout"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Ovládání zařízení"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Přidejte si ovládací prvky pro připojená zařízení"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Nastavení ovládání zařízení"</string> @@ -1104,8 +1103,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Zavřít"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Pokračovat"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Nastavení"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Přehrát"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Neaktivní, zkontrolujte aplikaci"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Chyba. Nový pokus…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Nenalezeno"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 5ccdbf38680a..abcb89e0de39 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Flyt ned til højre"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Flyt ud til kanten, og skjul"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Flyt ud til kanten, og vis"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"slå til/fra"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Enhedsstyring"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Tilføj styring af dine tilsluttede enheder"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurer enhedsstyring"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Luk"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Genoptag"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Indstillinger"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Afspil"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Inaktiv. Tjek appen"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Fejl. Prøver igen…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Ikke fundet"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 6885380b2cc5..2bc8a0392261 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -1087,10 +1087,8 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Wischen, um weitere zu sehen"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Empfehlungen werden geladen"</string> <string name="controls_media_title" msgid="1746947284862928133">"Medien"</string> - <!-- no translation found for controls_media_close_session (1193000643003066508) --> - <skip /> - <!-- no translation found for controls_media_active_session (3146882316024153337) --> - <skip /> + <string name="controls_media_close_session" msgid="1193000643003066508">"Diese Mediensitzung ausblenden?"</string> + <string name="controls_media_active_session" msgid="3146882316024153337">"Die Mediensitzung kann nicht ausgeblendet werden."</string> <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Ablehnen"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Fortsetzen"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Einstellungen"</string> @@ -1156,6 +1154,5 @@ <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"Fingerabdrucksensor ist deaktiviert"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"zu authentifizieren"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"das Gerät einzugeben"</string> - <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) --> - <skip /> + <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Mit Fingerabdruck öffnen"</string> </resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index f8420271d256..545d822c50ac 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Μετακίνηση κάτω δεξιά"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Μετακίν. στο άκρο και απόκρυψη"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Μετακ. εκτός άκρου και εμφάν."</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"εναλλαγή"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Στοιχεία ελέγχου συσκευής"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Προσθήκη στοιχείων ελέγχου για τις συνδεδεμένες συσκευές σας."</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Ρύθμιση στοιχείων ελέγχου συσκευής"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Παράβλεψη"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Συνέχιση"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Ρυθμίσεις"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Play"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Ανενεργό, έλεγχος εφαρμογής"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Προέκυψε σφάλμα. Επανάληψη…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Δεν βρέθηκε."</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 21ed95421f1f..5292f8741446 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mover abajo a la derecha"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mover fuera de borde y ocultar"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mover fuera de borde y mostrar"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"activar o desactivar"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Controles de dispositivos"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Agrega controles para los dispositivos conectados"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles de dispositivos"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Descartar"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Reanudar"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Configuración"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Reproducir"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Inactivo. Verifica la app"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Hubo un error. Reintentando…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"No se encontró"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index eaeaf0b6fbf8..d23f073d387f 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mover abajo a la derecha"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mover al borde y ocultar"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mover al borde y mostrar"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"activar/desactivar"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Control de dispositivos"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Añade controles para tus dispositivos conectados"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar control de dispositivos"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Cerrar"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Reanudar"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Ajustes"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Reproducir"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Inactivo, comprobar aplicación"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Error; reintentando…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"No se ha encontrado"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index ceaf3fcadb96..d227dcbfd225 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Teisalda alla paremale"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Teisalda serva ja kuva"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Teisalda servast eemale ja kuva"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"lülita"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Seadmete juhikud"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Lisage juhtelemendid ühendatud seadmete jaoks"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Seadmete juhtimisvidinate seadistamine"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Loobu"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Jätka"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Seaded"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Esitamine"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Passiivne, vaadake rakendust"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Viga, proovitakse uuesti …"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Ei leitud"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 3cb0b4398f4e..199107c2be56 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Eraman behealdera, eskuinetara"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Eraman ertzera eta ezkutatu"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Atera ertzetik eta erakutsi"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"aldatu"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Gailuak kontrolatzeko widgetak"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Gehitu konektatutako gailuak kontrolatzeko widgetak"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfiguratu gailuak kontrolatzeko widgetak"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Baztertu"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Berrekin"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Ezarpenak"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Erreproduzitu"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Inaktibo; egiaztatu aplikazioa"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Errorea. Berriro saiatzen…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Ez da aurkitu"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 7e9dabb4089a..d6b018df10b7 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"انتقال به پایین سمت چپ"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"انتقال به لبه و پنهان کردن"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"انتقال به خارج از لبه و نمایش"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"روشن/ خاموش کردن"</string> <string name="quick_controls_title" msgid="6839108006171302273">"کنترلهای دستگاه"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"افزودن کنترلها برای دستگاههای متصل"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"تنظیم کنترلهای دستگاه"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"رد کردن"</string> <string name="controls_media_resume" msgid="1933520684481586053">"ازسرگیری"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"تنظیمات"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"پخش"</string> <string name="controls_error_timeout" msgid="794197289772728958">"غیرفعال، برنامه را بررسی کنید"</string> <string name="controls_error_retryable" msgid="864025882878378470">"خطا، درحال تلاش مجدد…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"پیدا نشد"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 89566a6e6e29..d4da4597d56c 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Déplacer dans coin inf. droit"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Éloigner du bord et masquer"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Éloigner du bord et afficher"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"basculer"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Commandes des appareils"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Ajoutez des commandes pour vos appareils connectés"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurer les commandes des appareils"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Fermer"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Reprendre"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Paramètres"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Faire jouer"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Délai expiré, vérifiez l\'appli"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Erreur, nouvelle tentative…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Introuvable"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 7f73bab04817..c17bf8ffe906 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Déplacer en bas à droite"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Rapprocher du bord et masquer"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Éloigner du bord et afficher"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"activer/désactiver"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Commandes des appareils"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Ajouter des commandes pour vos appareils connectés"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurer les commandes des appareils"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Fermer"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Reprendre"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Paramètres"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Lire"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Délai expiré, vérifier l\'appli"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Erreur. Nouvelle tentative…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Introuvable"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 4a2a93ef0ec1..73d2de64d194 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mover á parte inferior dereita"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mover ao bordo e ocultar"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mover fóra do bordo e mostrar"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"activar/desactivar"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Control de dispositivos"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Engade controis para os dispositivos conectados"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar o control de dispositivos"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Ignorar"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Retomar"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Configuración"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Reproducir"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Inactivo. Comproba a app"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Erro. Tentando de novo…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Non se atopou"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 25eb4163d3e9..4c5308bfc2fd 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -137,8 +137,7 @@ <string name="accessibility_phone_button" msgid="4256353121703100427">"ફોન"</string> <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"વૉઇસ સહાય"</string> <string name="accessibility_unlock_button" msgid="122785427241471085">"અનલૉક કરો"</string> - <!-- no translation found for accessibility_lock_icon (661492842417875775) --> - <skip /> + <string name="accessibility_lock_icon" msgid="661492842417875775">"ડિવાઇસ લૉક કરેલું છે"</string> <string name="accessibility_waiting_for_fingerprint" msgid="5209142744692162598">"ફિંગરપ્રિન્ટની રાહ જોઈ રહ્યાં છીએ"</string> <string name="accessibility_unlock_without_fingerprint" msgid="1811563723195375298">"તમારી ફિંગરપ્રિન્ટનો ઉપયોગ કર્યા વગર અનલૉક કરો"</string> <string name="accessibility_scanning_face" msgid="3093828357921541387">"ચહેરો સ્કૅન કરવો"</string> @@ -1088,10 +1087,8 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"વધુ જોવા માટે સ્વાઇપ કરો"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"સુઝાવ લોડ કરી રહ્યાં છીએ"</string> <string name="controls_media_title" msgid="1746947284862928133">"મીડિયા"</string> - <!-- no translation found for controls_media_close_session (1193000643003066508) --> - <skip /> - <!-- no translation found for controls_media_active_session (3146882316024153337) --> - <skip /> + <string name="controls_media_close_session" msgid="1193000643003066508">"શું આ મીડિયા સત્ર છુપાવીએ?"</string> + <string name="controls_media_active_session" msgid="3146882316024153337">"હાલનું મીડિયા સત્ર છુપાવી શકાતું નથી."</string> <string name="controls_media_dismiss_button" msgid="9081375542265132213">"છોડી દો"</string> <string name="controls_media_resume" msgid="1933520684481586053">"ફરી શરૂ કરો"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"સેટિંગ"</string> @@ -1153,14 +1150,9 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"તમારું બૅટરી મીટર વાંચવામાં સમસ્યા આવી"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"વધુ માહિતી માટે ટૅપ કરો"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"કોઈ અલાર્મ સેટ નથી"</string> - <!-- no translation found for accessibility_fingerprint_label (5255731221854153660) --> - <skip /> - <!-- no translation found for accessibility_udfps_disabled_button (4284034245130239384) --> - <skip /> - <!-- no translation found for accessibility_authenticate_hint (798914151813205721) --> - <skip /> - <!-- no translation found for accessibility_enter_hint (2617864063504824834) --> - <skip /> - <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) --> - <skip /> + <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"ફિંગરપ્રિન્ટ સેન્સર"</string> + <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"ફિંગરપ્રિન્ટ સેન્સર બંધ કરેલું છે"</string> + <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ખાતરી કરો"</string> + <string name="accessibility_enter_hint" msgid="2617864063504824834">"ડિવાઇસ અનલૉક કરો"</string> + <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ખોલવા માટે ફિંગરપ્રિન્ટનો ઉપયોગ કરો"</string> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 02e4a45751a8..6b03458b0f73 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"सबसे नीचे दाईं ओर ले जाएं"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"एज पर ले जाएं और छिपाएं"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"एज से निकालें और दिखाएं"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"टॉगल करें"</string> <string name="quick_controls_title" msgid="6839108006171302273">"डिवाइस कंट्रोल"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"कनेक्ट किए गए डिवाइस के लिए कंट्रोल जोड़ें"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"डिवाइस कंट्रोल सेट अप करें"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"खारिज करें"</string> <string name="controls_media_resume" msgid="1933520684481586053">"फिर से शुरू करें"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"सेटिंग"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"चलाएं"</string> <string name="controls_error_timeout" msgid="794197289772728958">"काम नहीं कर रहा, ऐप जांचें"</string> <string name="controls_error_retryable" msgid="864025882878378470">"कोई गड़बड़ी हुई, फिर से कोशिश की जा रही है…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"कंट्रोल नहीं है"</string> @@ -1153,6 +1151,6 @@ <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"फ़िंगरप्रिंट सेंसर"</string> <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"फ़िंगरप्रिंट सेंसर बंद है"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"पुष्टि करें"</string> - <string name="accessibility_enter_hint" msgid="2617864063504824834">"डिवाइस अनलॉक करें"</string> + <string name="accessibility_enter_hint" msgid="2617864063504824834">"डिवाइस की होम स्क्रीन पर जाएं"</string> <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"खोलने के लिए, फ़िंगरप्रिंट का इस्तेमाल करें"</string> </resources> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 39e628296126..3b4d034c8039 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -1049,8 +1049,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Premjesti u donji desni kut"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Premjesti na rub i sakrij"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Ukloni s ruba i prikaži"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"promijeni"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Kontrole uređaja"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodajte kontrole za povezane uređaje"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Postavljanje kontrola uređaja"</string> @@ -1098,8 +1097,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Odbaci"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Nastavi"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Postavke"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Reprodukcija"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Neaktivno, provjerite aplik."</string> <string name="controls_error_retryable" msgid="864025882878378470">"Pogreška, pokušavamo ponovo…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Nije pronađeno"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 906b45fe13e9..1940cd5ef2ea 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Áthelyezés le és jobbra"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Áthelyezés a szélen kívül és elrejtés"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Áthelyezés a szélen kívül és mutatás"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"váltás"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Eszközvezérlők"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Vezérlők hozzáadása a csatlakoztatott eszközökhöz"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Eszközvezérlők beállítása"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Elvetés"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Folytatás"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Beállítások"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Játék"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Inaktív, ellenőrizze az appot"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Hiba, újrapróbálkozás…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Nem található"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 630792f1ec4f..aaf2b5d8c31a 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Færa neðst til hægri"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Færa að jaðri og fela"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Færa að jaðri og birta"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"kveikja/slökkva"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Tækjastjórnun"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Bæta við stýringum fyrir tengd tæki"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Setja upp tækjastjórnun"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Hunsa"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Halda áfram"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Stillingar"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Spila"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Óvirkt, athugaðu forrit"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Villa, reynir aftur…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Fannst ekki"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 0fd51ec1ad09..40294d5a32fe 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Sposta in basso a destra"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Sposta fino a bordo e nascondi"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Sposta fuori da bordo e mostra"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"attiva/disattiva"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Controllo dei dispositivi"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Aggiungi controlli per i dispositivi connessi"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configura il controllo dei dispositivi"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Ignora"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Riprendi"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Impostazioni"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Riproduci"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Inattivo, controlla l\'app"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Errore. Nuovo tentativo…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Controllo non trovato"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 98ae9d1ae9d4..0a9cceb32c5b 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -1099,10 +1099,8 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"יש להחליק כדי להציג עוד פריטים"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"ההמלצות בטעינה"</string> <string name="controls_media_title" msgid="1746947284862928133">"מדיה"</string> - <!-- no translation found for controls_media_close_session (1193000643003066508) --> - <skip /> - <!-- no translation found for controls_media_active_session (3146882316024153337) --> - <skip /> + <string name="controls_media_close_session" msgid="1193000643003066508">"להסתיר את סשן המדיה?"</string> + <string name="controls_media_active_session" msgid="3146882316024153337">"לא ניתן להסתיר את סשן המדיה הנוכחי."</string> <string name="controls_media_dismiss_button" msgid="9081375542265132213">"סגירה"</string> <string name="controls_media_resume" msgid="1933520684481586053">"המשך"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"הגדרות"</string> @@ -1168,6 +1166,5 @@ <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"חיישן טביעות האצבע מושבת"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"אימות"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"הזנת מכשיר"</string> - <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) --> - <skip /> + <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"שימוש בטביעת אצבע כדי לפתוח"</string> </resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index c3475017a066..97d94ab4d41c 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"右下に移動"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"端に移動して非表示"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"端から移動して表示"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"切り替え"</string> <string name="quick_controls_title" msgid="6839108006171302273">"デバイス コントロール"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"コネクテッド デバイスのコントロールを追加します"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"デバイス コントロールの設定"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"閉じる"</string> <string name="controls_media_resume" msgid="1933520684481586053">"再開"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"設定"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"再生"</string> <string name="controls_error_timeout" msgid="794197289772728958">"無効: アプリをご確認ください"</string> <string name="controls_error_retryable" msgid="864025882878378470">"エラー。再試行しています…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"見つかりませんでした"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index bc8abd42c929..0a181b43d1e7 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Төменгі оң жаққа жылжыту"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Шетке жылжыту және жасыру"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Шетке жылжыту және көрсету"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ауыстыру"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Құрылғыны басқару элементтері"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Жалғанған құрылғылар үшін басқару элементтерін қосу"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Құрылғыны басқару элементтерін реттеу"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Жабу"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Жалғастыру"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Параметрлер"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Ойнату"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Өшірулі. Қолданба тексеріңіз."</string> <string name="controls_error_retryable" msgid="864025882878378470">"Қате, әрекет қайталануда…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Табылмады"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 48b80f684471..f872660aa1c8 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"ផ្លាស់ទីទៅខាងក្រោមផ្នែកខាងស្ដាំ"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"ផ្លាស់ទីទៅផ្នែកខាងចុង រួចលាក់"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"ផ្លាស់ទីចេញពីផ្នែកខាងចុង រួចបង្ហាញ"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"បិទ/បើក"</string> <string name="quick_controls_title" msgid="6839108006171302273">"ផ្ទាំងគ្រប់គ្រងឧបករណ៍"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"បញ្ចូលផ្ទាំងគ្រប់គ្រងសម្រាប់ឧបករណ៍ដែលអ្នកបានភ្ជាប់"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"រៀបចំផ្ទាំងគ្រប់គ្រងឧបករណ៍"</string> @@ -1094,8 +1093,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"ច្រានចោល"</string> <string name="controls_media_resume" msgid="1933520684481586053">"បន្ត"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"ការកំណត់"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"ចាក់"</string> <string name="controls_error_timeout" msgid="794197289772728958">"អសកម្ម ពិនិត្យមើលកម្មវិធី"</string> <string name="controls_error_retryable" msgid="864025882878378470">"បញ្ហា កំពុងព្យាយាមម្ដងទៀត…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"រកមិនឃើញទេ"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index f35c3b28b103..ffc634adbe4f 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -137,8 +137,7 @@ <string name="accessibility_phone_button" msgid="4256353121703100427">"ಫೋನ್"</string> <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"ಧ್ವನಿ ಸಹಾಯಕ"</string> <string name="accessibility_unlock_button" msgid="122785427241471085">"ಅನ್ಲಾಕ್"</string> - <!-- no translation found for accessibility_lock_icon (661492842417875775) --> - <skip /> + <string name="accessibility_lock_icon" msgid="661492842417875775">"ಸಾಧನ ಲಾಕ್ ಆಗಿದೆ"</string> <string name="accessibility_waiting_for_fingerprint" msgid="5209142744692162598">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ಗಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ"</string> <string name="accessibility_unlock_without_fingerprint" msgid="1811563723195375298">"ನಿಮ್ಮ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಬಳಸದೆಯೇ ಅನ್ಲಾಕ್ ಮಾಡಿ"</string> <string name="accessibility_scanning_face" msgid="3093828357921541387">"ಮುಖವನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string> @@ -1153,14 +1152,10 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ನಿಮ್ಮ ಬ್ಯಾಟರಿ ಮೀಟರ್ ಓದುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ಅಲಾರಾಂ ಸೆಟ್ ಆಗಿಲ್ಲ"</string> - <!-- no translation found for accessibility_fingerprint_label (5255731221854153660) --> - <skip /> - <!-- no translation found for accessibility_udfps_disabled_button (4284034245130239384) --> - <skip /> - <!-- no translation found for accessibility_authenticate_hint (798914151813205721) --> - <skip /> - <!-- no translation found for accessibility_enter_hint (2617864063504824834) --> - <skip /> + <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್"</string> + <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> + <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ದೃಢೀಕರಿಸಿ"</string> + <string name="accessibility_enter_hint" msgid="2617864063504824834">"ಸಾಧನವನ್ನು ಪ್ರವೇಶಿಸಿ"</string> <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) --> <skip /> </resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 3c61f44beff2..7d27acba2fd0 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"오른쪽 하단으로 이동"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"가장자리로 옮겨서 숨기기"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"가장자리 바깥으로 옮겨서 표시"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"전환"</string> <string name="quick_controls_title" msgid="6839108006171302273">"기기 컨트롤"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"연결된 기기의 컨트롤을 추가하세요."</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"기기 컨트롤 설정"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"닫기"</string> <string name="controls_media_resume" msgid="1933520684481586053">"다시 시작"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"설정"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"재생"</string> <string name="controls_error_timeout" msgid="794197289772728958">"비활성. 앱을 확인하세요."</string> <string name="controls_error_retryable" msgid="864025882878378470">"오류 발생, 다시 시도 중…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"찾을 수 없음"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index a0d460b40599..54310c102821 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Баруун доош зөөх"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Ирмэг рүү зөөж, нуух"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Ирмэгээс гаргаж, харуулах"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"асаах/унтраах"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Төхөөрөмжийн хяналт"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Холбогдсон төхөөрөмжүүд дээрээ хяналт нэмэх"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Төхөөрөмжийн хяналтыг тохируулах"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Хаах"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Үргэлжлүүлэх"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Тохиргоо"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Тоглуулах"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Идэвхгүй байна, аппыг шалгана уу"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Алдаа, дахин оролдож байна…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Олдсонгүй"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 6bbeb52da831..3945370ca7b7 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Alihkan ke bawah sebelah kanan"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Alihkan ke tepi dan sorokkan"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Alihkan ke tepi dan tunjukkan"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"togol"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Kawalan peranti"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Tambah kawalan untuk peranti yang disambungkan"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Sediakan kawalan peranti"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Tolak"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Sambung semula"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Tetapan"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Main"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Tidak aktif, semak apl"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Ralat, mencuba semula…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Tidak ditemukan"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 649d7c509c65..3dcea65e7701 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Flytt til nederst til høyre"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Flytt til kanten og skjul"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Flytt ut kanten og vis"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"slå av/på"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Enhetsstyring"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Legg til kontroller for de tilkoblede enhetene dine"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurer enhetsstyring"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Lukk"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Gjenoppta"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Innstillinger"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Spill av"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Inaktiv. Sjekk appen"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Feil. Prøver igjen …"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Ikke funnet"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 6258e4590a71..cd87cd5401d6 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -137,8 +137,7 @@ <string name="accessibility_phone_button" msgid="4256353121703100427">"फोन"</string> <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"आवाज सहायता"</string> <string name="accessibility_unlock_button" msgid="122785427241471085">"खोल्नुहोस्"</string> - <!-- no translation found for accessibility_lock_icon (661492842417875775) --> - <skip /> + <string name="accessibility_lock_icon" msgid="661492842417875775">"यन्त्र लक गरिएको छ"</string> <string name="accessibility_waiting_for_fingerprint" msgid="5209142744692162598">"फिंगरप्रिन्ट कुर्दै"</string> <string name="accessibility_unlock_without_fingerprint" msgid="1811563723195375298">"आफ्नो फिंगरप्रिन्ट बिना नै अनलक गर्नुहोस्"</string> <string name="accessibility_scanning_face" msgid="3093828357921541387">"अनुहार स्क्यान गर्दै"</string> @@ -1153,14 +1152,10 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"डिभाइसको ब्याट्रीको मिटर रिडिङ क्रममा समस्या भयो"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"थप जानकारी प्राप्त गर्न ट्याप गर्नुहोस्"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"अलार्म राखिएको छैन"</string> - <!-- no translation found for accessibility_fingerprint_label (5255731221854153660) --> - <skip /> - <!-- no translation found for accessibility_udfps_disabled_button (4284034245130239384) --> - <skip /> - <!-- no translation found for accessibility_authenticate_hint (798914151813205721) --> - <skip /> - <!-- no translation found for accessibility_enter_hint (2617864063504824834) --> - <skip /> + <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"फिंगरप्रिन्ट सेन्सर"</string> + <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"फिंगरप्रिन्ट सेन्सर असक्षम पारिएको छ"</string> + <string name="accessibility_authenticate_hint" msgid="798914151813205721">"प्रमाणित गर्नुहोस्"</string> + <string name="accessibility_enter_hint" msgid="2617864063504824834">"डिभाइस हाल्नुहोस्"</string> <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) --> <skip /> </resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 0bd3cd589401..d5d094684dd0 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Naar rechtsonder verplaatsen"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Naar rand verplaatsen en verbergen"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Over rand verplaatsen en tonen"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"schakelen"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Apparaatbediening"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Voeg bedieningselementen voor je gekoppelde apparaten toe"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Apparaatbediening instellen"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Sluiten"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Hervatten"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Instellingen"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Afspelen"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Inactief, check de app"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Fout. Opnieuw proberen…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Niet gevonden"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index e9371c60af14..95f1d3589ca4 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"ନିମ୍ନ ଡାହାଣକୁ ମୁଭ୍ କରନ୍ତୁ"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"ଧାରକୁ ମୁଭ୍ କରି ଲୁଚାନ୍ତୁ"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"ଧାର ବାହାରକୁ ମୁଭ୍ କରି ଦେଖାନ୍ତୁ"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ଟୋଗଲ୍ କରନ୍ତୁ"</string> <string name="quick_controls_title" msgid="6839108006171302273">"ଡିଭାଇସ୍ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"ଆପଣଙ୍କ ସଂଯୁକ୍ତ ଡିଭାଇସଗୁଡ଼ିକ ପାଇଁ ନିୟନ୍ତ୍ରଣ ଯୋଗ କରନ୍ତୁ"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"ଡିଭାଇସ୍ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକୁ ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string> @@ -1087,15 +1086,12 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"ଅଧିକ ଦେଖିବାକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"ସୁପାରିଶଗୁଡ଼ିକ ଲୋଡ୍ କରାଯାଉଛି"</string> <string name="controls_media_title" msgid="1746947284862928133">"ମିଡିଆ"</string> - <!-- no translation found for controls_media_close_session (1193000643003066508) --> - <skip /> - <!-- no translation found for controls_media_active_session (3146882316024153337) --> - <skip /> + <string name="controls_media_close_session" msgid="1193000643003066508">"ଏହି ମିଡିଆ ସେସନକୁ ଲୁଚାଇବେ?"</string> + <string name="controls_media_active_session" msgid="3146882316024153337">"ବର୍ତ୍ତମାନର ମିଡିଆ ସେସନକୁ ଲୁଚାଯାଇପାରିବ ନାହିଁ।"</string> <string name="controls_media_dismiss_button" msgid="9081375542265132213">"ଖାରଜ କରନ୍ତୁ"</string> <string name="controls_media_resume" msgid="1933520684481586053">"ପୁଣି ଆରମ୍ଭ କରନ୍ତୁ"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"ସେଟିଂସ୍"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"ଚଲାନ୍ତୁ"</string> <string name="controls_error_timeout" msgid="794197289772728958">"ନିଷ୍କ୍ରିୟ ଅଛି, ଆପ ଯାଞ୍ଚ କରନ୍ତୁ"</string> <string name="controls_error_retryable" msgid="864025882878378470">"ତ୍ରୁଟି, ପୁଣି ଚେଷ୍ଟା କରୁଛି…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"ମିଳିଲା ନାହିଁ"</string> @@ -1156,6 +1152,5 @@ <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"ଟିପଚିହ୍ନ ସେନ୍ସରକୁ ଅକ୍ଷମ କରାଯାଇଛି"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ପ୍ରମାଣୀକରଣ କରନ୍ତୁ"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"ଡିଭାଇସ୍ ବିଷୟରେ ସୂଚନା ଲେଖନ୍ତୁ"</string> - <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) --> - <skip /> + <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ଖୋଲିବାକୁ ଟିପଚିହ୍ନ ବ୍ୟବହାର କରନ୍ତୁ"</string> </resources> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index fdc20266c18a..e0e1b4f2f119 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -1087,10 +1087,8 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"ਹੋਰ ਦੇਖਣ ਲਈ ਸਵਾਈਪ ਕਰੋ"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"ਸਿਫ਼ਾਰਸ਼ਾਂ ਲੋਡ ਹੋ ਰਹੀਆਂ ਹਨ"</string> <string name="controls_media_title" msgid="1746947284862928133">"ਮੀਡੀਆ"</string> - <!-- no translation found for controls_media_close_session (1193000643003066508) --> - <skip /> - <!-- no translation found for controls_media_active_session (3146882316024153337) --> - <skip /> + <string name="controls_media_close_session" msgid="1193000643003066508">"ਕੀ ਇਹ ਮੀਡੀਆ ਸੈਸ਼ਨ ਲੁਕਾਉਣਾ ਹੈ?"</string> + <string name="controls_media_active_session" msgid="3146882316024153337">"ਮੌਜੂਦਾ ਮੀਡੀਆ ਸੈਸ਼ਨ ਲੁਕਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"</string> <string name="controls_media_dismiss_button" msgid="9081375542265132213">"ਖਾਰਜ ਕਰੋ"</string> <string name="controls_media_resume" msgid="1933520684481586053">"ਮੁੜ-ਚਾਲੂ ਕਰੋ"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"ਸੈਟਿੰਗਾਂ"</string> @@ -1156,6 +1154,5 @@ <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ਪ੍ਰਮਾਣਿਤ ਕਰੋ"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"ਡੀਵਾਈਸ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string> - <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) --> - <skip /> + <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ਖੋਲ੍ਹਣ ਲਈ ਫਿੰਗਰਪ੍ਰਿੰਟ ਵਰਤੋ"</string> </resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 4c6c15911a59..d95eabc8c35a 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -1165,6 +1165,6 @@ <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Czytnik linii papilarnych"</string> <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"Czytnik linii papilarnych został wyłączony"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"uwierzytelnij"</string> - <string name="accessibility_enter_hint" msgid="2617864063504824834">"dodaj urządzenie"</string> + <string name="accessibility_enter_hint" msgid="2617864063504824834">"otwórz urządzenie"</string> <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"By otworzyć, użyj odcisku palca"</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index cc60b6a3719f..b786dfb46b03 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mover para o canto inferior direito"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mover para a borda e ocultar"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mover para fora da borda e exibir"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"alternar"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Controles do dispositivo"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Adiciona controles aos dispositivos conectados"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles do dispositivo"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Dispensar"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Retomar"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Configurações"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Iniciar"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Inativo, verifique o app"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Erro. Tentando novamente…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Não encontrado"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index c38388d42b9b..496fcb21f838 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mover parte inferior direita"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mover p/ extremidade e ocultar"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Retirar extremidade e mostrar"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ativar/desativar"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Controlos de dispositivos"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Adicione controlos para os dispositivos associados."</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configure os controlos de dispositivos"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Ignorar"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Retomar"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Definições"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Reproduzir"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Inativa. Consulte a app."</string> <string name="controls_error_retryable" msgid="864025882878378470">"Erro. A tentar novamente…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Não encontrado."</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index cc60b6a3719f..b786dfb46b03 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mover para o canto inferior direito"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mover para a borda e ocultar"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mover para fora da borda e exibir"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"alternar"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Controles do dispositivo"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Adiciona controles aos dispositivos conectados"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles do dispositivo"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Dispensar"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Retomar"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Configurações"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Iniciar"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Inativo, verifique o app"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Erro. Tentando novamente…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Não encontrado"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 4e3fb127ee37..2100466e2cdf 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -1049,8 +1049,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Mutați în dreapta jos"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mutați în afară și ascundeți"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mutați în afară și afișați"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"Activați / dezactivați"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Comenzile dispozitivelor"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Adăugați comenzi pentru dispozitivele conectate"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurați comenzile dispozitivelor"</string> @@ -1098,8 +1097,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Închideți"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Reia"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Setări"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Redați"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Inactiv, verificați aplicația"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Eroare, se încearcă din nou…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Nu s-a găsit"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index fe834484ab56..45abf9550ff3 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"පහළ දකුණට ගෙන යන්න"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"මායිමට ගෙන යන්න සහ සඟවන්න"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"මායිමෙන් පිටට ගන්න සහ පෙන්වන්න"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ටොගල් කරන්න"</string> <string name="quick_controls_title" msgid="6839108006171302273">"උපාංග පාලන"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"ඔබේ සම්බන්ධිත උපාංග සඳහා පාලන එක් කරන්න"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"උපාංග පාලන පිහිටුවන්න"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"ඉවත ලන්න"</string> <string name="controls_media_resume" msgid="1933520684481586053">"නැවත පටන් ගන්න"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"සැකසීම්"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"වාදනය කරන්න"</string> <string name="controls_error_timeout" msgid="794197289772728958">"අක්රියයි, යෙදුම පරීක්ෂා කරන්න"</string> <string name="controls_error_retryable" msgid="864025882878378470">"දෝෂයකි, නැවත උත්සාහ කරමින්…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"හමු නොවිණි"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index d947376d1429..63c3b8bc5876 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -1054,8 +1054,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Presunúť doprava nadol"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Presunúť k okraju a skryť"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Presunúť z okraja a zobraziť"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"prepínač"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Ovládanie zariadení"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Pridajte si ovládače pripojených zariadení"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Nastavenie ovládania zariadení"</string> @@ -1104,8 +1103,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Zavrieť"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Pokračovať"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Nastavenia"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Prehrať"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Neaktívne, preverte aplikáciu"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Chyba, skúša sa znova…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Nenájdené"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index a0b5081c84ae..f1f7a7a63ff7 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Zhvendos poshtë djathtas"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Zhvendose te skaji dhe fshihe"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Zhvendose jashtë skajit dhe shfaqe"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"aktivizo/çaktivizo"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Kontrollet e pajisjes"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Shto kontrolle për pajisjet e tua të lidhura"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfiguro kontrollet e pajisjes"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Hiq"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Vazhdo"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Cilësimet"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Luaj"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Joaktive, kontrollo aplikacionin"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Gabim, po provohet përsëri"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Nuk u gjet"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index de323ecbffd1..22af16a5e242 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -1049,8 +1049,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Премести доле десно"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Премести до ивице и сакриј"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Премести изван ивице и прикажи"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"укључите/искључите"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Контроле уређаја"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Додајте контроле за повезане уређаје"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Подесите контроле уређаја"</string> @@ -1098,8 +1097,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Одбаци"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Настави"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Подешавања"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Пусти"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Неактивно. Видите апликацију"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Грешка, покушава се поново…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Није пронађено"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index cc7adf5bd078..ebcae0f3ade8 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Flytta längst ned till höger"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Flytta till kanten och dölj"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Flytta från kanten och visa"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"aktivera och inaktivera"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Enhetsstyrning"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Lägg till snabbkontroller för anslutna enheter"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurera enhetsstyrning"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Stäng"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Återuppta"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Inställningar"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Spela upp"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Inaktiv, kolla appen"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Fel, försöker igen …"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Hittades inte"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index afa23984d9e8..2a45ce5a0a33 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Sogeza chini kulia"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Sogeza kwenye ukingo kisha ufiche"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Sogeza nje ya ukingo kisha uonyeshe"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"geuza"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Vidhibiti vya vifaa"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Weka vidhibiti vya vifaa ulivyounganisha"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Weka mipangilio ya vidhibiti vya vifaa"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Ondoa"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Endelea"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Mipangilio"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Cheza"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Haitumiki, angalia programu"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Hitilafu, inajaribu tena…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Hakipatikani"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index ad0e4c751900..63b4c3b8560d 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"கீழே வலதுபுறத்திற்கு நகர்த்து"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"ஓரத்திற்கு நகர்த்தி மறை"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"ஓரத்திற்கு நகர்த்தி, காட்டு"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"நிலைமாற்று"</string> <string name="quick_controls_title" msgid="6839108006171302273">"சாதனக் கட்டுப்பாடுகள்"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"இணைக்கப்பட்ட சாதனங்களில் கட்டுப்பாடுகளைச் சேர்க்கலாம்"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"சாதனக் கட்டுப்பாடுகளை அமைத்தல்"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"மூடுக"</string> <string name="controls_media_resume" msgid="1933520684481586053">"தொடர்க"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"அமைப்புகள்"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"இயக்குதல்"</string> <string name="controls_error_timeout" msgid="794197289772728958">"செயலில் இல்லை , சரிபார்க்கவும்"</string> <string name="controls_error_retryable" msgid="864025882878378470">"பிழை, மீண்டும் முயல்கிறது…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"இல்லை"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 0b030faa82e7..7b05e3620d9b 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -1087,10 +1087,8 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"మరిన్నింటిని చూడటం కోసం స్వైప్ చేయండి"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"సిఫార్సులు లోడ్ అవుతున్నాయి"</string> <string name="controls_media_title" msgid="1746947284862928133">"మీడియా"</string> - <!-- no translation found for controls_media_close_session (1193000643003066508) --> - <skip /> - <!-- no translation found for controls_media_active_session (3146882316024153337) --> - <skip /> + <string name="controls_media_close_session" msgid="1193000643003066508">"ఈ మీడియా సెషన్ను దాచాలా?"</string> + <string name="controls_media_active_session" msgid="3146882316024153337">"ప్రస్తుత మీడియా సెషన్ను దాచడం సాధ్యం కాదు."</string> <string name="controls_media_dismiss_button" msgid="9081375542265132213">"విస్మరించు"</string> <string name="controls_media_resume" msgid="1933520684481586053">"కొనసాగించండి"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"సెట్టింగ్లు"</string> @@ -1156,6 +1154,5 @@ <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"వేలిముద్ర సెన్సార్ డిజేబుల్ చేయబడింది"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ప్రామాణీకరించండి"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"పరికరాన్ని ఎంటర్ చేయండి"</string> - <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) --> - <skip /> + <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"తెరవడానికి వేలిముద్రను ఉపయోగించండి"</string> </resources> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 578f8a11bf39..171ecd449b06 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"ย้ายไปด้านขาวล่าง"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"ย้ายไปที่ขอบและซ่อน"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"ย้ายออกจากขอบและแสดง"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"สลับ"</string> <string name="quick_controls_title" msgid="6839108006171302273">"ระบบควบคุมอุปกรณ์"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"เพิ่มตัวควบคุมของอุปกรณ์ที่เชื่อมต่อ"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"ตั้งค่าระบบควบคุมอุปกรณ์"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"ปิด"</string> <string name="controls_media_resume" msgid="1933520684481586053">"เล่นต่อ"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"การตั้งค่า"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"เล่น"</string> <string name="controls_error_timeout" msgid="794197289772728958">"ไม่มีการใช้งาน โปรดตรวจสอบแอป"</string> <string name="controls_error_retryable" msgid="864025882878378470">"มีข้อผิดพลาด กำลังลองอีกครั้ง…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"ไม่พบ"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 896eeade63fc..0490ff7ce286 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Ilipat sa kanan sa ibaba"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Ilipat sa sulok at itago"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Alisin sa sulok at ipakita"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"i-toggle"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Mga kontrol ng device"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Magdagdag ng kontrol para sa mga nakakonektang device"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"I-set up ang mga kontrol ng device"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"I-dismiss"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Ituloy"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Mga Setting"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"I-play"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Hindi aktibo, tingnan ang app"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Nagka-error, sinusubukan ulit…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Hindi nahanap"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index c584d31438b4..12cae9b93216 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Sağ alta taşı"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Kenara taşıyıp gizle"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Kenarın dışına taşıyıp göster"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"değiştir"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Cihaz denetimleri"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Bağlı cihazlarınız için denetimler ekleyin"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Cihaz denetimlerini kur"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Kapat"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Devam ettir"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Ayarlar"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Oynat"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Devre dışı, uygulamaya bakın"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Hata, yeniden deneniyor…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Bulunamadı"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 73d5e935a973..4e7de7110672 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -1165,6 +1165,6 @@ <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Сканер відбитків пальців"</string> <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"Сканер відбитків пальців вимкнено"</string> <string name="accessibility_authenticate_hint" msgid="798914151813205721">"пройти автентифікацію"</string> - <string name="accessibility_enter_hint" msgid="2617864063504824834">"виконати вхід на пристрої"</string> + <string name="accessibility_enter_hint" msgid="2617864063504824834">"відкрити пристрій"</string> <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Щоб відкрити, використайте відбиток пальця"</string> </resources> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 7e9cf556a9c8..702bc7efd36b 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -137,8 +137,7 @@ <string name="accessibility_phone_button" msgid="4256353121703100427">"فون"</string> <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"صوتی معاون"</string> <string name="accessibility_unlock_button" msgid="122785427241471085">"غیر مقفل کریں"</string> - <!-- no translation found for accessibility_lock_icon (661492842417875775) --> - <skip /> + <string name="accessibility_lock_icon" msgid="661492842417875775">"آلہ مقفل کر دیا گیا"</string> <string name="accessibility_waiting_for_fingerprint" msgid="5209142744692162598">"فنگر پرنٹ کا انتظار ہے"</string> <string name="accessibility_unlock_without_fingerprint" msgid="1811563723195375298">"فنگر پرنٹ استعمال کیے بغیرغیر مقفل کریں"</string> <string name="accessibility_scanning_face" msgid="3093828357921541387">"اسکیننگ چہرہ"</string> @@ -1088,10 +1087,8 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"مزید دیکھنے کیلئے سوائپ کریں"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"تجاویز لوڈ ہو رہی ہیں"</string> <string name="controls_media_title" msgid="1746947284862928133">"میڈیا"</string> - <!-- no translation found for controls_media_close_session (1193000643003066508) --> - <skip /> - <!-- no translation found for controls_media_active_session (3146882316024153337) --> - <skip /> + <string name="controls_media_close_session" msgid="1193000643003066508">"اس میڈیا سیشن کو چھپائیں؟"</string> + <string name="controls_media_active_session" msgid="3146882316024153337">"میڈیا کے موجودہ سیشن کو چھپایا نہیں جا سکتا۔"</string> <string name="controls_media_dismiss_button" msgid="9081375542265132213">"برخاست کریں"</string> <string name="controls_media_resume" msgid="1933520684481586053">"دوبارہ شروع کریں"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"ترتیبات"</string> @@ -1153,14 +1150,9 @@ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"آپ کے بیٹری میٹر کو پڑھنے میں دشواری"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"مزید معلومات کے لیے تھپتھپائیں"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"کوئی الارم سیٹ نہیں ہے"</string> - <!-- no translation found for accessibility_fingerprint_label (5255731221854153660) --> - <skip /> - <!-- no translation found for accessibility_udfps_disabled_button (4284034245130239384) --> - <skip /> - <!-- no translation found for accessibility_authenticate_hint (798914151813205721) --> - <skip /> - <!-- no translation found for accessibility_enter_hint (2617864063504824834) --> - <skip /> - <!-- no translation found for keyguard_try_fingerprint (2825130772993061165) --> - <skip /> + <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"فنگر پرنٹ سینسر"</string> + <string name="accessibility_udfps_disabled_button" msgid="4284034245130239384">"فنگر پرنٹ سینسر غیر فعال ہے"</string> + <string name="accessibility_authenticate_hint" msgid="798914151813205721">"تصدیق کریں"</string> + <string name="accessibility_enter_hint" msgid="2617864063504824834">"آلہ درج کریں"</string> + <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"کھولنے کے لیے فنگر پرنٹ کا استعمال کریں"</string> </resources> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index eb6a27214556..216a0944fcad 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Quyi oʻngga surish"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Chetiga olib borish va yashirish"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Chetidan qaytarish va koʻrsatish"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"oʻzgartirish"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Qurilmalarni boshqarish"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Ulangan qurilmalar uchun boshqaruv elementlari"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Qurilma boshqaruv elementlarini sozlash"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Yopish"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Davom etish"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Sozlamalar"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Ijro"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Nofaol. Ilovani tekshiring"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Xato, qayta urinilmoqda…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Topilmadi"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 237036f725c8..a6a9ace99e4c 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Chuyển tới dưới cùng bên phải"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Chuyển đến cạnh và ẩn"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Chuyển ra xa cạnh và hiển thị"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"bật/tắt"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Điều khiển thiết bị"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Thêm các nút điều khiển cho các thiết bị đã kết nối"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Thiết lập các tùy chọn điều khiển thiết bị"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Đóng"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Tiếp tục"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Cài đặt"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Phát"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Không hoạt động, hãy kiểm tra ứng dụng"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Lỗi, đang thử lại…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Không tìm thấy"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index aa5e4e2b1824..51b9a545721e 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"移去右下方"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"移到邊緣並隱藏"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"從邊緣移出並顯示"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"切換"</string> <string name="quick_controls_title" msgid="6839108006171302273">"裝置控制"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"為連接的裝置新增控制選項"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"設定裝置控制"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"關閉"</string> <string name="controls_media_resume" msgid="1933520684481586053">"繼續播放"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"設定"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"播放"</string> <string name="controls_error_timeout" msgid="794197289772728958">"已停用,請檢查應用程式"</string> <string name="controls_error_retryable" msgid="864025882878378470">"發生錯誤,正在重試…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"找不到"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index ed44b087f0f8..8a93729c1e34 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"移到右下方"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"移到邊緣並隱藏"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"從邊緣移出並顯示"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"切換"</string> <string name="quick_controls_title" msgid="6839108006171302273">"裝置控制"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"新增已連結裝置的控制項"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"設定裝置控制項"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"關閉"</string> <string name="controls_media_resume" msgid="1933520684481586053">"繼續播放"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"設定"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"播放"</string> <string name="controls_error_timeout" msgid="794197289772728958">"無效,請查看應用程式"</string> <string name="controls_error_retryable" msgid="864025882878378470">"發生錯誤,正在重試…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"找不到控制項"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 01e0fca3a89e..674a7c843f5f 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -1044,8 +1044,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"Hamba phansi ngakwesokudla"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Hamba onqenqemeni ufihle"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Phuma onqenqemeni ubonise"</string> - <!-- no translation found for accessibility_floating_button_action_double_tap_to_toggle (7976492639670692037) --> - <skip /> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"guqula"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Izilawuli zezinsiza"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Engeza izilawuli zedivayisi yakho exhunyiwe"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Setha izilawuli zezinsiza"</string> @@ -1092,8 +1091,7 @@ <string name="controls_media_dismiss_button" msgid="9081375542265132213">"Cashisa"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Qalisa kabusha"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Izilungiselelo"</string> - <!-- no translation found for controls_media_smartspace_rec_title (1699818353932537407) --> - <skip /> + <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Dlala"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Akusebenzi, hlola uhlelo lokusebenza"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Iphutha, iyazama futhi…"</string> <string name="controls_error_removed" msgid="6675638069846014366">"Ayitholakali"</string> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 673a03ddac4e..d9cc24fa38ef 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1897,13 +1897,16 @@ <string name="notification_channel_summary_automatic_demoted"><b>Status:</b> Ranked Lower</string> <!-- [CHAR LIMIT=150] Notification Importance title: important conversation level summary --> - <string name="notification_channel_summary_priority">Always shown at the top of your notifications, even when Priority mode is on</string> + <string name="notification_channel_summary_priority_baseline">Shows at the top of conversation notifications and as a profile picture on lock screen</string> + <string name="notification_channel_summary_priority_bubble">Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble</string> + <string name="notification_channel_summary_priority_dnd">Shows at the top of conversation notifications and as a profile picture on lock screen, interrupts Do Not Disturb</string> + <string name="notification_channel_summary_priority_all">Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble, interrupts Do Not Disturb</string> <!--[CHAR LIMIT=30] Linkable text to Settings app --> <string name="notification_conversation_channel_settings">Settings</string> <!-- [CHAR LIMIT=150] Notification Importance title: important conversation level --> - <string name="notification_priority_title">Priority conversations</string> + <string name="notification_priority_title">Priority</string> <!-- Text shown in notification guts for conversation notifications that don't implement the full feature --> <string name="no_shortcut"><xliff:g id="app_name" example="YouTube">%1$s</xliff:g> doesn\u2019t support conversation features</string> @@ -2667,25 +2670,6 @@ <!-- Title of the overlay warning the user to interact with the device or it will go to sleep. [CHAR LIMIT=25] --> <string name="inattentive_sleep_warning_title">Standby</string> - <!-- Priority conversation onboarding screen --> - <!-- title of priority onboarding [CHAR LIMIT=75] --> - <string name="priority_onboarding_title">Conversation set to priority</string> - <!-- Text explaining that the following actions are the behaviors of priority conversations. - E.g. priority conversations will show at the top of the conversation section [CHAR LIMIT=75] --> - <string name="priority_onboarding_behavior">Priority conversations</string> - <!-- Text explaining that priority conversations show at the top of the conversation section [CHAR LIMIT=120] --> - <string name="priority_onboarding_show_at_top_text">These conversations are shown at the top of your list and can always reach you when Priority mode is on</string> - <!-- Text explaining that priority conversations show an avatar on the lock screen [CHAR LIMIT=120] --> - <string name="priority_onboarding_show_avatar_text">Profile pictures are shown on the lock screen</string> - <!-- Text explaining that priority conversations will appear as a bubble [CHAR LIMIT=120] --> - <string name="priority_onboarding_appear_as_bubble_text">You can easily find these conversations in bubbles on your Home screen</string> - <!-- Text explaining that priority conversations can interrupt DnD settings [CHAR LIMIT=120] --> - <string name="priority_onboarding_ignores_dnd_text">Interrupt Do Not Disturb</string> - <!-- Title for the affirmative button [CHAR LIMIT=50] --> - <string name="priority_onboarding_done_button_title">Got it</string> - <!-- Title for the settings button button [CHAR LIMIT=50] --> - <string name="priority_onboarding_settings_button_title">Settings</string> - <!-- Window Magnification strings --> <!-- Title for Magnification Window [CHAR LIMIT=NONE] --> <string name="magnification_window_title">Magnification Window</string> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index ac9ced93f2df..aa1f954cb27a 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -14,7 +14,8 @@ limitations under the License. --> -<resources xmlns:android="http://schemas.android.com/apk/res/android"> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <style name="ClearAllButtonDefaultMargins"> <item name="android:layout_marginStart">0dp</item> <item name="android:layout_marginTop">0dp</item> @@ -609,12 +610,54 @@ <item name="android:elevation">10dp</item> </style> - <style name="MediaPlayer.Button" parent="@android:style/Widget.Material.Button.Borderless.Small"> + <!-- Media controls always have light background --> + <style name="MediaPlayer" parent="@*android:style/Theme.DeviceDefault.Light"> + <item name="android:textColor">?android:attr/textColorPrimary</item> + <item name="android:backgroundTint">@android:color/system_accent2_50</item> + </style> + + <style name="MediaPlayer.ProgressBar" parent="@android:style/Widget.ProgressBar.Horizontal"> + <item name="android:thumbTint">?android:attr/textColorPrimary</item> + <item name="android:progressTint">?android:attr/textColorPrimary</item> + <item name="android:progressBackgroundTint">?android:attr/textColorTertiary</item> + <item name="android:clickable">true</item> + <item name="android:splitTrack">false</item> + </style> + + <style name="MediaPlayer.Subtitle" parent="MediaPlayer"> + <item name="android:textColor">?android:attr/textColorSecondary</item> + </style> + + <style name="MediaPlayer.Action" parent="@android:style/Widget.Material.Button.Borderless.Small"> <item name="android:background">@drawable/qs_media_light_source</item> <item name="android:tint">?android:attr/textColorPrimary</item> <item name="android:stateListAnimator">@anim/media_button_state_list_animator</item> </style> + <style name="MediaPlayer.OutlineButton"> + <item name="android:background">@drawable/qs_media_button_background</item> + <item name="android:textColor">?android:attr/textColorPrimary</item> + <item name="android:backgroundTint">?androidprv:attr/colorAccentPrimaryVariant</item> + <item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item> + </style> + + <style name="MediaPlayer.SolidButton"> + <item name="android:backgroundTint">?android:attr/colorAccent</item> + <item name="android:tint">?android:attr/colorPrimary</item> + <item name="android:textColor">?android:attr/colorPrimary</item> + </style> + + <style name="MediaPlayer.AppIcon"> + <item name="android:background">@drawable/qs_media_icon_background</item> + <item name="android:backgroundTint">?android:attr/colorPrimary</item> + <item name="android:tint">?android:attr/colorAccent</item> + </style> + + <style name="MediaPlayer.Album"> + <item name="android:backgroundTint">?androidprv:attr/colorAccentSecondary</item> + + </style> + <!-- Used to style charging animation AVD animation --> <style name="ChargingAnim" /> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java index b7a2c64dd107..2325b554d507 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java @@ -76,7 +76,7 @@ public class KeyguardPINView extends KeyguardPinBasedInputView { protected void onFinishInflate() { super.onFinishInflate(); - mContainer = findViewById(R.id.container); + mContainer = findViewById(R.id.pin_container); mRow0 = findViewById(R.id.row0); mRow1 = findViewById(R.id.row1); mRow2 = findViewById(R.id.row2); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java index d4513384c569..98e7fb48b7a6 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java @@ -97,7 +97,7 @@ public class KeyguardPatternView extends KeyguardInputView mLockPatternView = findViewById(R.id.lockPatternView); mEcaView = findViewById(R.id.keyguard_selector_fade_container); - mContainer = findViewById(R.id.container); + mContainer = findViewById(R.id.pattern_container); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/Prefs.java b/packages/SystemUI/src/com/android/systemui/Prefs.java index f28d1137f3e7..7f183798709c 100644 --- a/packages/SystemUI/src/com/android/systemui/Prefs.java +++ b/packages/SystemUI/src/com/android/systemui/Prefs.java @@ -73,8 +73,7 @@ public final class Prefs { Key.TOUCHED_RINGER_TOGGLE, Key.HAS_SEEN_ODI_CAPTIONS_TOOLTIP, Key.HAS_SEEN_REVERSE_BOTTOM_SHEET, - Key.CONTROLS_STRUCTURE_SWIPE_TOOLTIP_COUNT, - Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S + Key.CONTROLS_STRUCTURE_SWIPE_TOOLTIP_COUNT }) // TODO: annotate these with their types so {@link PrefsCommandLine} can know how to set them public @interface Key { @@ -123,8 +122,6 @@ public final class Prefs { String HAS_SEEN_ODI_CAPTIONS_TOOLTIP = "HasSeenODICaptionsTooltip"; String HAS_SEEN_REVERSE_BOTTOM_SHEET = "HasSeenReverseBottomSheet"; String CONTROLS_STRUCTURE_SWIPE_TOOLTIP_COUNT = "ControlsStructureSwipeTooltipCount"; - /** Tracks whether the user has seen the onboarding screen for priority conversations */ - String HAS_SEEN_PRIORITY_ONBOARDING_IN_S = "HasUserSeenPriorityOnboardingInS"; } public static boolean getBoolean(Context context, @Key String key, boolean defaultValue) { diff --git a/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java index 58881d9a33f4..c821d100f553 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java @@ -35,7 +35,6 @@ import com.android.systemui.dagger.qualifiers.TestHarness; import com.android.systemui.dock.DockManager; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.statusbar.policy.KeyguardStateController; -import com.android.systemui.util.sensors.ThresholdSensor; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -317,7 +316,7 @@ public class BrightLineFalsingManager implements FalsingManager { } @Override - public void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) { + public void onProximityEvent(ProximityEvent proximityEvent) { // TODO: some of these classifiers might allow us to abort early, meaning we don't have to // make these calls. mClassifiers.forEach((classifier) -> classifier.onProximityEvent(proximityEvent)); diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingClassifier.java index 81b9f66e9bc3..d75752841023 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingClassifier.java @@ -18,7 +18,7 @@ package com.android.systemui.classifier; import android.view.MotionEvent; -import com.android.systemui.util.sensors.ProximitySensor; +import com.android.systemui.plugins.FalsingManager; import java.util.List; @@ -110,7 +110,7 @@ public abstract class FalsingClassifier { /** * Called when a ProximityEvent occurs (change in near/far). */ - void onProximityEvent(ProximitySensor.ThresholdSensorEvent proximityEvent) {} + void onProximityEvent(FalsingManager.ProximityEvent proximityEvent) {} /** * The phone screen has turned on and we need to begin falsing detection. diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java index 94e5c8ad1536..0f202b085851 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java @@ -361,7 +361,7 @@ class FalsingCollectorImpl implements FalsingCollector { private void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) { // TODO: some of these classifiers might allow us to abort early, meaning we don't have to // make these calls. - mFalsingManager.onProximityEvent(proximityEvent); + mFalsingManager.onProximityEvent(new ProximityEventImpl(proximityEvent)); } @@ -374,4 +374,21 @@ class FalsingCollectorImpl implements FalsingCollector { Log.d(TAG, msg, throwable); } } + + private static class ProximityEventImpl implements FalsingManager.ProximityEvent { + private ThresholdSensor.ThresholdSensorEvent mThresholdSensorEvent; + + ProximityEventImpl(ThresholdSensor.ThresholdSensorEvent thresholdSensorEvent) { + mThresholdSensorEvent = thresholdSensorEvent; + } + @Override + public boolean getCovered() { + return mThresholdSensorEvent.getBelow(); + } + + @Override + public long getTimestampNs() { + return mThresholdSensorEvent.getTimestampNs(); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java index e8445d40836e..ee69e277cc46 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java @@ -20,7 +20,6 @@ import android.net.Uri; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.plugins.FalsingManager; -import com.android.systemui.util.sensors.ThresholdSensor; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -133,7 +132,7 @@ public class FalsingManagerFake implements FalsingManager { } @Override - public void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) { + public void onProximityEvent(ProximityEvent proximityEvent) { } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java index 6b819fbbbcf1..ee0dba0a5087 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java @@ -31,7 +31,6 @@ import com.android.systemui.plugins.FalsingPlugin; import com.android.systemui.plugins.PluginListener; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.util.DeviceConfigProxy; -import com.android.systemui.util.sensors.ThresholdSensor; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -186,7 +185,7 @@ public class FalsingManagerProxy implements FalsingManager, Dumpable { } @Override - public void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) { + public void onProximityEvent(ProximityEvent proximityEvent) { mInternalFalsingManager.onProximityEvent(proximityEvent); } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/ProximityClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/ProximityClassifier.java index 72d4303dc0ef..32d9ca59951d 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/ProximityClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/ProximityClassifier.java @@ -25,8 +25,8 @@ import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS; import android.provider.DeviceConfig; import android.view.MotionEvent; +import com.android.systemui.plugins.FalsingManager; import com.android.systemui.util.DeviceConfigProxy; -import com.android.systemui.util.sensors.ProximitySensor; import java.util.Locale; @@ -107,11 +107,11 @@ class ProximityClassifier extends FalsingClassifier { @Override public void onProximityEvent( - ProximitySensor.ThresholdSensorEvent proximityEvent) { - boolean near = proximityEvent.getBelow(); + FalsingManager.ProximityEvent proximityEvent) { + boolean covered = proximityEvent.getCovered(); long timestampNs = proximityEvent.getTimestampNs(); - logDebug("Sensor is: " + near + " at time " + timestampNs); - update(near, timestampNs); + logDebug("Sensor is: " + covered + " at time " + timestampNs); + update(covered, timestampNs); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt index 6a2d0afa813b..24503675ae36 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt @@ -3,7 +3,6 @@ package com.android.systemui.media import android.app.smartspace.SmartspaceTarget import android.content.Context import android.content.Intent -import android.content.res.ColorStateList import android.content.res.Configuration import android.provider.Settings.ACTION_MEDIA_CONTROLS_SETTINGS import android.util.Log @@ -116,7 +115,6 @@ class MediaCarouselController @Inject constructor( private var needsReordering: Boolean = false private var keysNeedRemoval = mutableSetOf<String>() private var bgColor = getBackgroundColor() - private var fgColor = getForegroundColor() private var isRtl: Boolean = false set(value) { if (value != field) { @@ -276,10 +274,6 @@ class MediaCarouselController @Inject constructor( } private fun addOrUpdatePlayer(key: String, oldKey: String?, data: MediaData) { - data.actions.forEach { - it.icon?.setTintList(ColorStateList.valueOf(fgColor)) - } - data.appIcon?.setTintList(ColorStateList.valueOf(fgColor)) val dataCopy = data.copy(backgroundColor = bgColor) val existingPlayer = MediaPlayerData.getMediaPlayer(key, oldKey) if (existingPlayer == null) { @@ -328,7 +322,7 @@ class MediaCarouselController @Inject constructor( val lp = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) newRecs.recommendationViewHolder?.recommendations?.setLayoutParams(lp) - newRecs.bindRecommendation(data, fgColor, bgColor) + newRecs.bindRecommendation(data, bgColor) MediaPlayerData.addMediaPlayer(key, newRecs) updatePlayerToState(newRecs, noAnimation = true) reorderAllPlayers() @@ -368,8 +362,6 @@ class MediaCarouselController @Inject constructor( private fun recreatePlayers() { bgColor = getBackgroundColor() - fgColor = getForegroundColor() - pageIndicator.tintList = ColorStateList.valueOf(fgColor) MediaPlayerData.mediaData().forEach { (key, data) -> removePlayer(key, dismissMediaData = false) @@ -381,11 +373,6 @@ class MediaCarouselController @Inject constructor( return context.getColor(android.R.color.system_accent2_50) } - private fun getForegroundColor(): Int { - return com.android.settingslib.Utils.getColorAttr(context, - com.android.internal.R.attr.textColorPrimary).defaultColor - } - private fun updatePageIndicator() { val numPages = mediaContent.getChildCount() pageIndicator.setNumPages(numPages) diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index ed16777110c9..1e9cc8cb08cc 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -265,9 +265,6 @@ public class MediaControlPanel { ConstraintSet expandedSet = mMediaViewController.getExpandedLayout(); ConstraintSet collapsedSet = mMediaViewController.getCollapsedLayout(); - mPlayerViewHolder.getPlayer().setBackgroundTintList( - ColorStateList.valueOf(mBackgroundColor)); - // Click action PendingIntent clickIntent = data.getClickIntent(); if (clickIntent != null) { @@ -465,15 +462,11 @@ public class MediaControlPanel { /** Bind this recommendation view based on the data given. */ public void bindRecommendation( @NonNull SmartspaceTarget target, - @NonNull int primaryColor, @NonNull int backgroundColor) { if (mRecommendationViewHolder == null) { return; } - mRecommendationViewHolder.getCardIcon().setColorFilter(primaryColor); - mRecommendationViewHolder.getCardText().setTextColor(primaryColor); - mInstanceId = target.getSmartspaceTargetId().hashCode(); mRecommendationViewHolder.getRecommendations() .setBackgroundTintList(ColorStateList.valueOf(backgroundColor)); diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index c552e89a3625..aa4fb712090b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -7,7 +7,6 @@ import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.content.Context; import android.content.res.Configuration; -import android.content.res.Resources; import android.os.Bundle; import android.util.AttributeSet; import android.util.Log; @@ -333,11 +332,6 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { @Override public boolean updateResources() { - // Update bottom padding, useful for removing extra space once the panel page indicator is - // hidden. - Resources res = getContext().getResources(); - setPageMargin(res.getDimensionPixelOffset(R.dimen.qs_tile_margin_horizontal)); - setPadding(0, 0, 0, getContext().getResources().getDimensionPixelSize( R.dimen.qs_paged_tile_layout_padding_bottom)); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java index f486c535d9e2..3b436769a456 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java @@ -207,11 +207,12 @@ public class QSContainerImpl extends FrameLayout { mContext.getResources().getDimensionPixelSize(R.dimen.qs_container_bottom_padding) ); - mSideMargins = getResources().getDimensionPixelSize(R.dimen.notification_side_paddings); + int sideMargins = getResources().getDimensionPixelSize(R.dimen.notification_side_paddings); int padding = getResources().getDimensionPixelSize( R.dimen.notification_shade_content_margin_horizontal); - boolean marginsChanged = padding != mContentPadding; + boolean marginsChanged = padding != mContentPadding || sideMargins != mSideMargins; mContentPadding = padding; + mSideMargins = sideMargins; if (marginsChanged) { updatePaddingsAndMargins(qsPanelController, quickStatusBarHeaderController); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index e3f00f42d2ca..c69956f90c67 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -55,9 +55,13 @@ public class QuickStatusBarHeader extends FrameLayout { private TouchAnimator mAlphaAnimator; private TouchAnimator mTranslationAnimator; + private TouchAnimator mIconsAlphaAnimator; + private TouchAnimator mIconsAlphaAnimatorFixed; protected QuickQSPanel mHeaderQsPanel; private View mDatePrivacyView; + private View mDateView; + private View mSecurityHeaderView; private View mClockIconsView; private View mContainer; @@ -66,7 +70,7 @@ public class QuickStatusBarHeader extends FrameLayout { private Space mSpace; private BatteryMeterView mBatteryRemainingIcon; private StatusIconContainer mIconContainer; - + private View mPrivacyChip; private TintedIconManager mTintedIconManager; private QSExpansionPathInterpolator mQSExpansionPathInterpolator; @@ -79,7 +83,6 @@ public class QuickStatusBarHeader extends FrameLayout { private int mCutOutPaddingLeft; private int mCutOutPaddingRight; private float mClockIconsAlpha = 1.0f; - private float mDatePrivacyAlpha = 1.0f; private float mKeyguardExpansionFraction; private int mTextColorPrimary = Color.TRANSPARENT; private int mTopViewMeasureHeight; @@ -111,8 +114,11 @@ public class QuickStatusBarHeader extends FrameLayout { mDatePrivacyView = findViewById(R.id.quick_status_bar_date_privacy); mClockIconsView = findViewById(R.id.quick_qs_status_icons); mQSCarriers = findViewById(R.id.carrier_group); - mContainer = findViewById(R.id.container); + mContainer = findViewById(R.id.qs_container); mIconContainer = findViewById(R.id.statusIcons); + mPrivacyChip = findViewById(R.id.privacy_chip); + mDateView = findViewById(R.id.date); + mSecurityHeaderView = findViewById(R.id.header_text_container); mClockView = findViewById(R.id.clock); mSpace = findViewById(R.id.space); @@ -126,6 +132,11 @@ public class QuickStatusBarHeader extends FrameLayout { // QS will always show the estimate, and BatteryMeterView handles the case where // it's unavailable or charging mBatteryRemainingIcon.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE); + + mIconsAlphaAnimatorFixed = new TouchAnimator.Builder() + .addFloat(mIconContainer, "alpha", 0, 1) + .addFloat(mBatteryRemainingIcon, "alpha", 0, 1) + .build(); } void onAttach(TintedIconManager iconManager, @@ -226,8 +237,12 @@ public class QuickStatusBarHeader extends FrameLayout { StatusBarIconView callStrengthIcon = ((StatusBarIconView) mIconContainer.getViewForSlot(mCallStrengthSlotName)); TouchAnimator.Builder builder = new TouchAnimator.Builder() - .addFloat(mQSCarriers, "alpha", 0, 1) - .addFloat(mDatePrivacyView, "alpha", 0, mDatePrivacyAlpha); + // The following two views have to be hidden manually, so as not to hide the + // Privacy chip in QQS + .addFloat(mDateView, "alpha", 0, 1) + .addFloat(mSecurityHeaderView, "alpha", 0, 1) + .addFloat(mQSCarriers, "alpha", 0, 1); + if (noCallingIcon != null || callStrengthIcon != null) { if (noCallingIcon != null) { builder.addFloat(noCallingIcon, "alpha", 1, 0); @@ -259,6 +274,20 @@ public class QuickStatusBarHeader extends FrameLayout { mAlphaAnimator = builder.build(); } + void setChipVisibility(boolean visibility) { + mPrivacyChip.setVisibility(visibility ? View.VISIBLE : View.GONE); + if (visibility) { + // Animates the icons and battery indicator from alpha 0 to 1, when the chip is visible + mIconsAlphaAnimator = mIconsAlphaAnimatorFixed; + mIconsAlphaAnimator.setPosition(mKeyguardExpansionFraction); + } else { + mIconsAlphaAnimator = null; + mIconContainer.setAlpha(1); + mBatteryRemainingIcon.setAlpha(1); + } + + } + /** */ public void setExpanded(boolean expanded, QuickQSPanelController quickQSPanelController) { if (mExpanded == expanded) return; @@ -285,6 +314,9 @@ public class QuickStatusBarHeader extends FrameLayout { if (mTranslationAnimator != null) { mTranslationAnimator.setPosition(keyguardExpansionFraction); } + if (mIconsAlphaAnimator != null) { + mIconsAlphaAnimator.setPosition(keyguardExpansionFraction); + } // If forceExpanded (we are opening QS from lockscreen), the animators have been set to // position = 1f. if (forceExpanded) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java index 3aafea98ff2a..617b067be891 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java @@ -225,7 +225,6 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader private void setChipVisibility(boolean chipVisible) { if (chipVisible && getChipEnabled()) { - mPrivacyChip.setVisibility(View.VISIBLE); mPrivacyLogger.logChipVisible(true); // Makes sure that the chip is logged as viewed at most once each time QS is opened // mListening makes sure that the callback didn't return after the user closed QS @@ -235,8 +234,8 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader } } else { mPrivacyLogger.logChipVisible(false); - mPrivacyChip.setVisibility(View.GONE); } + mView.setChipVisibility(chipVisible); } private List<String> getIgnoredIconSlots() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/commandline/CommandRegistry.kt b/packages/SystemUI/src/com/android/systemui/statusbar/commandline/CommandRegistry.kt index 1da42a705311..78e85f1e6f73 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/commandline/CommandRegistry.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/commandline/CommandRegistry.kt @@ -168,7 +168,6 @@ private class PrefsCommand(val context: Context) : Command { when (topLevel) { "list-prefs" -> listPrefs(pw) - "set-pref" -> setPref(pw, args.drop(1)) else -> help(pw) } } @@ -180,25 +179,4 @@ private class PrefsCommand(val context: Context) : Command { pw.println(field.get(Prefs.Key::class.java)) } } - - /** - * Sets a preference from [Prefs] - */ - private fun setPref(pw: PrintWriter, args: List<String>) { - if (args.isEmpty()) { - pw.println("invalid arguments: $args") - return - } - val pref = args[0] - - when (pref) { - Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S -> { - val value = Integer.parseInt(args[1]) - Prefs.putBoolean(context, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, value != 0) - } - else -> { - pw.println("Cannot set pref ($pref)") - } - } - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt index 5ab71bc62fe6..b3f7ca6f2630 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt @@ -29,6 +29,8 @@ import com.android.systemui.animation.Interpolators import com.android.systemui.R import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.statusbar.phone.StatusBarLocationPublisher +import com.android.systemui.statusbar.phone.StatusBarMarginUpdatedListener import java.lang.IllegalStateException import java.util.concurrent.Executor @@ -51,8 +53,9 @@ import javax.inject.Inject @SysUISingleton class PrivacyDotViewController @Inject constructor( - @Main val mainExecutor: Executor, - val animationScheduler: SystemStatusAnimationScheduler + @Main private val mainExecutor: Executor, + private val locationPublisher: StatusBarLocationPublisher, + private val animationScheduler: SystemStatusAnimationScheduler ) { private var rotation = 0 private var leftSize = 0 @@ -80,12 +83,21 @@ class PrivacyDotViewController @Inject constructor( private val views: Sequence<View> get() = if (!this::tl.isInitialized) sequenceOf() else sequenceOf(tl, tr, br, bl) + init { + locationPublisher.addCallback(object : StatusBarMarginUpdatedListener { + override fun onStatusBarMarginUpdated(marginLeft: Int, marginRight: Int) { + setStatusBarMargins(marginLeft, marginRight) + } + }) + } + fun setUiExecutor(e: Executor) { uiExecutor = e } @UiThread fun updateRotation(rot: Int) { + dlog("updateRotation: ") if (rot == rotation) { return } @@ -248,7 +260,7 @@ class PrivacyDotViewController @Inject constructor( * @param left the space between the status bar contents and the left side of the screen * @param right space between the status bar contents and the right side of the screen */ - fun setStatusBarMargins(left: Int, right: Int) { + private fun setStatusBarMargins(left: Int, right: Int) { leftSize = left rightSize = right @@ -262,6 +274,7 @@ class PrivacyDotViewController @Inject constructor( } private fun doUpdates(rot: Boolean, height: Boolean, width: Boolean) { + dlog("doUpdates: ") var newDesignatedCorner: View? = null if (rot) { @@ -324,12 +337,19 @@ class PrivacyDotViewController @Inject constructor( } } +private fun dlog(s: String) { + if (DEBUG) { + Log.d(TAG, s) + } +} + const val TOP_LEFT = 0 const val TOP_RIGHT = 1 const val BOTTOM_RIGHT = 2 const val BOTTOM_LEFT = 3 private const val DURATION = 160L private const val TAG = "PrivacyDotViewController" +private const val DEBUG = false private fun Int.toGravity(): Int { return when (this) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt index 620963060b49..b861c1db9b8b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt @@ -27,6 +27,7 @@ import android.widget.FrameLayout import com.android.systemui.R import com.android.systemui.statusbar.SuperStatusBarViewFactory +import com.android.systemui.statusbar.phone.StatusBarLocationPublisher import com.android.systemui.statusbar.phone.StatusBarWindowController import com.android.systemui.statusbar.phone.StatusBarWindowView @@ -39,7 +40,8 @@ import javax.inject.Inject class SystemEventChipAnimationController @Inject constructor( private val context: Context, private val statusBarViewFactory: SuperStatusBarViewFactory, - private val statusBarWindowController: StatusBarWindowController + private val statusBarWindowController: StatusBarWindowController, + private val locationPublisher: StatusBarLocationPublisher ) : SystemStatusChipAnimationCallback { var showPersistentDot = false set(value) { @@ -64,13 +66,15 @@ class SystemEventChipAnimationController @Inject constructor( if (state == ANIMATING_IN) { currentAnimatedView = viewCreator(context) - animationWindowView.addView(currentAnimatedView, layoutParamsDefault) + animationWindowView.addView(currentAnimatedView, layoutParamsDefault()) // We are animating IN; chip comes in from View.END currentAnimatedView?.apply { - translationX = width.toFloat() + val translation = width.toFloat() + translationX = if (isLayoutRtl) -translation else translation alpha = 0f visibility = View.VISIBLE + setPadding(locationPublisher.marginLeft, 0, locationPublisher.marginRight, 0) } } else { // We are animating away @@ -109,7 +113,7 @@ class SystemEventChipAnimationController @Inject constructor( val w = width val translation = (1 - amt) * w - translationX = translation + translationX = if (isLayoutRtl) -translation else translation } } @@ -131,7 +135,13 @@ class SystemEventChipAnimationController @Inject constructor( statusBarWindowView.addView(animationWindowView, lp) } - private val layoutParamsDefault = FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT).also { - it.gravity = Gravity.END or Gravity.CENTER_VERTICAL + private fun start() = if (animationWindowView.isLayoutRtl) right() else left() + private fun right() = locationPublisher.marginRight + private fun left() = locationPublisher.marginLeft + + private fun layoutParamsDefault(): FrameLayout.LayoutParams = + FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT).also { + it.gravity = Gravity.END or Gravity.CENTER_VERTICAL + it.marginStart = start() } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt index 1e071312065b..40049373610c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt @@ -127,7 +127,6 @@ class SystemStatusAnimationScheduler @Inject constructor( } private fun isTooEarly(): Boolean { - Log.d(TAG, "time=> ${systemClock.uptimeMillis() - Process.getStartUptimeMillis()}") return systemClock.uptimeMillis() - Process.getStartUptimeMillis() < MIN_UPTIME } @@ -339,4 +338,4 @@ private const val ENTRANCE_ANIM_LENGTH = 500L private const val CHIP_ANIM_LENGTH = 500L private const val MIN_UPTIME: Long = 5 * 1000 -private const val DEBUG = false
\ No newline at end of file +private const val DEBUG = false diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java index 617dadb42594..e2a37f647bf5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java @@ -69,7 +69,6 @@ import com.android.systemui.statusbar.notification.logging.NotificationPanelLogg import com.android.systemui.statusbar.notification.row.ChannelEditorDialogController; import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback; -import com.android.systemui.statusbar.notification.row.PriorityOnboardingDialogController; import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager; import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm; import com.android.systemui.statusbar.phone.ShadeController; @@ -141,7 +140,6 @@ public interface NotificationsModule { ShortcutManager shortcutManager, ChannelEditorDialogController channelEditorDialogController, UserContextProvider contextTracker, - Provider<PriorityOnboardingDialogController.Builder> builderProvider, AssistantFeedbackController assistantFeedbackController, Optional<BubblesManager> bubblesManagerOptional, UiEventLogger uiEventLogger, @@ -161,7 +159,6 @@ public interface NotificationsModule { shortcutManager, channelEditorDialogController, contextTracker, - builderProvider, assistantFeedbackController, bubblesManagerOptional, uiEventLogger, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java index 40be4bfa47dc..1f4f3caea517 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java @@ -22,6 +22,8 @@ import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED; import static android.app.NotificationManager.IMPORTANCE_DEFAULT; import static android.app.NotificationManager.IMPORTANCE_LOW; import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED; +import static android.app.NotificationManager.Policy.CONVERSATION_SENDERS_ANYONE; +import static android.app.NotificationManager.Policy.CONVERSATION_SENDERS_IMPORTANT; import static com.android.systemui.animation.Interpolators.FAST_OUT_SLOW_IN; @@ -34,7 +36,6 @@ import android.app.INotificationManager; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationChannelGroup; -import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; @@ -55,7 +56,6 @@ import android.transition.TransitionManager; import android.transition.TransitionSet; import android.util.AttributeSet; import android.util.Log; -import android.view.LayoutInflater; import android.view.View; import android.view.accessibility.AccessibilityEvent; import android.widget.ImageView; @@ -64,7 +64,6 @@ import android.widget.TextView; import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.notification.ConversationIconFactory; -import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; @@ -78,8 +77,6 @@ import com.android.systemui.wmshell.BubblesManager; import java.lang.annotation.Retention; import java.util.Optional; -import javax.inject.Provider; - /** * The guts of a conversation notification revealed when performing a long press. */ @@ -107,7 +104,6 @@ public class NotificationConversationInfo extends LinearLayout implements private StatusBarNotification mSbn; @Nullable private Notification.BubbleMetadata mBubbleMetadata; private Context mUserContext; - private Provider<PriorityOnboardingDialogController.Builder> mBuilderProvider; private boolean mIsDeviceProvisioned; private int mAppBubble; @@ -172,13 +168,9 @@ public class NotificationConversationInfo extends LinearLayout implements private OnClickListener mOnDone = v -> { mPressedApply = true; - // If the user selected Priority, maybe show the priority onboarding. // If the user selected Priority and the previous selection was not priority, show a - // People Tile add request. If showing the priority onboarding, however, delay the request - // to when the onboarding dialog closes. - if (mSelectedAction == ACTION_FAVORITE && shouldShowPriorityOnboarding()) { - showPriorityOnboarding(); - } else if (mSelectedAction == ACTION_FAVORITE && getPriority() != mSelectedAction) { + // People Tile add request. + if (mSelectedAction == ACTION_FAVORITE && getPriority() != mSelectedAction) { mShadeController.animateCollapsePanels(); mPeopleSpaceWidgetManager.requestPinAppWidget(mShortcutInfo, new Bundle()); } @@ -229,7 +221,6 @@ public class NotificationConversationInfo extends LinearLayout implements OnSnoozeClickListener onSnoozeClickListener, ConversationIconFactory conversationIconFactory, Context userContext, - Provider<PriorityOnboardingDialogController.Builder> builderProvider, boolean isDeviceProvisioned, @Main Handler mainHandler, @Background Handler bgHandler, @@ -258,7 +249,6 @@ public class NotificationConversationInfo extends LinearLayout implements mBubbleMetadata = bubbleMetadata; mBubblesManagerOptional = bubblesManagerOptional; mShadeController = shadeController; - mBuilderProvider = builderProvider; mMainHandler = mainHandler; mBgHandler = bgHandler; mShortcutManager = shortcutManager; @@ -342,6 +332,18 @@ public class NotificationConversationInfo extends LinearLayout implements // bindName(); bindPackage(); bindIcon(mNotificationChannel.isImportantConversation()); + + mPriorityDescriptionView = findViewById(R.id.priority_summary); + if (willShowAsBubble() && willBypassDnd()) { + mPriorityDescriptionView.setText(R.string.notification_channel_summary_priority_all); + } else if (willShowAsBubble()) { + mPriorityDescriptionView.setText(R.string.notification_channel_summary_priority_bubble); + } else if (willBypassDnd()) { + mPriorityDescriptionView.setText(R.string.notification_channel_summary_priority_dnd); + } else { + mPriorityDescriptionView.setText( + R.string.notification_channel_summary_priority_baseline); + } } private void bindIcon(boolean important) { @@ -428,7 +430,6 @@ public class NotificationConversationInfo extends LinearLayout implements protected void onFinishInflate() { super.onFinishInflate(); - mPriorityDescriptionView = findViewById(R.id.priority_summary); mDefaultDescriptionView = findViewById(R.id.default_summary); mSilentDescriptionView = findViewById(R.id.silence_summary); } @@ -552,51 +553,22 @@ public class NotificationConversationInfo extends LinearLayout implements StackStateAnimator.ANIMATION_DURATION_STANDARD); } - private boolean shouldShowPriorityOnboarding() { - return !Prefs.getBoolean(mUserContext, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, false); - } - - private void showPriorityOnboarding() { - View onboardingView = LayoutInflater.from(mContext) - .inflate(R.layout.priority_onboarding_half_shell, null); - - boolean ignoreDnd = false; + private boolean willBypassDnd() { + boolean bypassesDnd = false; try { - ignoreDnd = mINotificationManager - .getConsolidatedNotificationPolicy().priorityConversationSenders == - NotificationManager.Policy.CONVERSATION_SENDERS_IMPORTANT; + int allowedSenders = mINotificationManager + .getConsolidatedNotificationPolicy().priorityConversationSenders; + bypassesDnd = allowedSenders == CONVERSATION_SENDERS_IMPORTANT + || allowedSenders == CONVERSATION_SENDERS_ANYONE; } catch (RemoteException e) { Log.e(TAG, "Could not check conversation senders", e); } + return bypassesDnd; + } - boolean showAsBubble = mBubbleMetadata != null - && mBubbleMetadata.getAutoExpandBubble() + private boolean willShowAsBubble() { + return mBubbleMetadata != null && BubblesManager.areBubblesEnabled(mContext, mSbn.getUser()); - - Drawable person = mIconFactory.getBaseIconDrawable(mShortcutInfo); - if (person == null) { - person = mContext.getDrawable(R.drawable.ic_person).mutate(); - TypedArray ta = mContext.obtainStyledAttributes(new int[]{android.R.attr.colorAccent}); - int colorAccent = ta.getColor(0, 0); - ta.recycle(); - person.setTint(colorAccent); - } - - PriorityOnboardingDialogController controller = mBuilderProvider.get() - .setContext(mUserContext) - .setView(onboardingView) - .setIgnoresDnd(ignoreDnd) - .setShowsAsBubble(showAsBubble) - .setIcon(person) - .setBadge(mIconFactory.getAppBadge( - mPackageName, UserHandle.getUserId(mSbn.getUid()))) - .setOnSettingsClick(mOnConversationSettingsClickListener) - .setPeopleSpaceWidgetManager(mPeopleSpaceWidgetManager) - .setShadeController(mShadeController) - .build(); - - controller.init(mShortcutInfo); - controller.show(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java index 1a7f5b0bf5af..59b88a53b45e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java @@ -129,7 +129,6 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx private final LauncherApps mLauncherApps; private final ShortcutManager mShortcutManager; private final UserContextProvider mContextTracker; - private final Provider<PriorityOnboardingDialogController.Builder> mBuilderProvider; private final UiEventLogger mUiEventLogger; private final ShadeController mShadeController; private final AppWidgetManager mAppWidgetManager; @@ -150,7 +149,6 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx ShortcutManager shortcutManager, ChannelEditorDialogController channelEditorDialogController, UserContextProvider contextTracker, - Provider<PriorityOnboardingDialogController.Builder> builderProvider, AssistantFeedbackController assistantFeedbackController, Optional<BubblesManager> bubblesManagerOptional, UiEventLogger uiEventLogger, @@ -168,7 +166,6 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx mLauncherApps = launcherApps; mShortcutManager = shortcutManager; mContextTracker = contextTracker; - mBuilderProvider = builderProvider; mChannelEditorDialogController = channelEditorDialogController; mAssistantFeedbackController = assistantFeedbackController; mBubblesManagerOptional = bubblesManagerOptional; @@ -503,7 +500,6 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx onSnoozeClickListener, iconFactoryLoader, mContextTracker.getUserContext(), - mBuilderProvider, mDeviceProvisionedController.isDeviceProvisioned(), mMainHandler, mBgHandler, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt deleted file mode 100644 index 270721ffa4b8..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt +++ /dev/null @@ -1,291 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.statusbar.notification.row - -import android.animation.Animator -import android.animation.AnimatorListenerAdapter -import android.animation.AnimatorSet -import android.animation.ValueAnimator -import android.app.Dialog -import android.content.Context -import android.content.pm.ShortcutInfo -import android.graphics.Color -import android.graphics.PixelFormat -import android.graphics.drawable.ColorDrawable -import android.graphics.drawable.Drawable -import android.graphics.drawable.GradientDrawable -import android.os.Bundle -import android.text.SpannableStringBuilder -import android.text.style.BulletSpan -import android.view.Gravity -import android.view.View -import android.view.ViewGroup.LayoutParams.MATCH_PARENT -import android.view.ViewGroup.LayoutParams.WRAP_CONTENT -import android.view.Window -import android.view.WindowInsets.Type.statusBars -import android.view.WindowManager -import android.view.animation.Interpolator -import android.view.animation.PathInterpolator -import android.widget.ImageView -import android.widget.TextView -import com.android.systemui.Prefs -import com.android.systemui.R -import com.android.systemui.animation.Interpolators.LINEAR_OUT_SLOW_IN -import com.android.systemui.people.widget.PeopleSpaceWidgetManager -import com.android.systemui.statusbar.notification.row.NotificationConversationInfo.OnConversationSettingsClickListener -import com.android.systemui.statusbar.phone.ShadeController -import javax.inject.Inject - -/** - * Controller to handle presenting the priority conversations onboarding dialog - */ -class PriorityOnboardingDialogController @Inject constructor( - val view: View, - val context: Context, - private val ignoresDnd: Boolean, - private val showsAsBubble: Boolean, - val icon: Drawable, - private val onConversationSettingsClickListener: OnConversationSettingsClickListener, - val badge: Drawable, - private val peopleSpaceWidgetManager: PeopleSpaceWidgetManager, - private val shadeController: ShadeController -) { - - private lateinit var dialog: Dialog - private lateinit var shortcutInfo: ShortcutInfo - private val OVERSHOOT: Interpolator = PathInterpolator(0.4f, 0f, 0.2f, 1.4f) - private val IMPORTANCE_ANIM_DELAY = 150L - private val IMPORTANCE_ANIM_GROW_DURATION = 250L - private val IMPORTANCE_ANIM_SHRINK_DURATION = 200L - private val IMPORTANCE_ANIM_SHRINK_DELAY = 25L - - fun init(info: ShortcutInfo) { - shortcutInfo = info - initDialog() - } - - fun show() { - dialog.show() - } - - private fun done() { - // Log that the user has seen the onboarding - Prefs.putBoolean(context, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, true) - dialog.dismiss() - shadeController.animateCollapsePanels() - peopleSpaceWidgetManager.requestPinAppWidget(shortcutInfo, Bundle()) - } - - private fun settings() { - // Log that the user has seen the onboarding - Prefs.putBoolean(context, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, true) - dialog.dismiss() - onConversationSettingsClickListener?.onClick() - } - - class Builder @Inject constructor() { - private lateinit var view: View - private lateinit var context: Context - private var ignoresDnd = false - private var showAsBubble = false - private lateinit var icon: Drawable - private lateinit var onConversationSettingsClickListener: - OnConversationSettingsClickListener - private lateinit var badge: Drawable - private lateinit var peopleSpaceWidgetManager: PeopleSpaceWidgetManager - private lateinit var shadeController: ShadeController - - fun setView(v: View): Builder { - view = v - return this - } - - fun setContext(c: Context): Builder { - context = c - return this - } - - fun setIgnoresDnd(ignore: Boolean): Builder { - ignoresDnd = ignore - return this - } - - fun setShowsAsBubble(bubble: Boolean): Builder { - showAsBubble = bubble - return this - } - - fun setIcon(draw: Drawable): Builder { - icon = draw - return this - } - fun setBadge(badge: Drawable): Builder { - this.badge = badge - return this - } - - fun setOnSettingsClick(onClick: OnConversationSettingsClickListener): Builder { - onConversationSettingsClickListener = onClick - return this - } - - fun setShadeController(shadeController: ShadeController): Builder { - this.shadeController = shadeController - return this - } - - fun setPeopleSpaceWidgetManager(peopleSpaceWidgetManager: PeopleSpaceWidgetManager): - Builder { - this.peopleSpaceWidgetManager = peopleSpaceWidgetManager - return this - } - - fun build(): PriorityOnboardingDialogController { - val controller = PriorityOnboardingDialogController( - view, context, ignoresDnd, showAsBubble, icon, - onConversationSettingsClickListener, badge, peopleSpaceWidgetManager, - shadeController) - return controller - } - } - - private fun initDialog() { - dialog = Dialog(context) - - if (dialog.window == null) { - throw IllegalStateException("Need a window for the onboarding dialog to show") - } - - dialog.window?.requestFeature(Window.FEATURE_NO_TITLE) - // Prevent a11y readers from reading the first element in the dialog twice - dialog.setTitle("\u00A0") - dialog.apply { - setContentView(view) - setCanceledOnTouchOutside(true) - - findViewById<TextView>(R.id.done_button)?.setOnClickListener { - done() - } - - findViewById<TextView>(R.id.settings_button)?.setOnClickListener { - settings() - } - - findViewById<ImageView>(R.id.conversation_icon)?.setImageDrawable(icon) - findViewById<ImageView>(R.id.icon)?.setImageDrawable(badge) - val mImportanceRingView = findViewById<ImageView>(R.id.conversation_icon_badge_ring) - val conversationIconBadgeBg = findViewById<ImageView>(R.id.conversation_icon_badge_bg) - - val ring: GradientDrawable = mImportanceRingView.drawable as GradientDrawable - ring.mutate() - val bg = conversationIconBadgeBg.drawable as GradientDrawable - bg.mutate() - val ringColor = context.getResources() - .getColor(com.android.internal.R.color.conversation_important_highlight) - val standardThickness = context.resources.getDimensionPixelSize( - com.android.internal.R.dimen.importance_ring_stroke_width) - val largeThickness = context.resources.getDimensionPixelSize( - com.android.internal.R.dimen.importance_ring_anim_max_stroke_width) - val standardSize = context.resources.getDimensionPixelSize( - com.android.internal.R.dimen.importance_ring_size) - val baseSize = standardSize - standardThickness * 2 - val largeSize = baseSize + largeThickness * 2 - val bgSize = context.resources.getDimensionPixelSize( - com.android.internal.R.dimen.conversation_icon_size_badged) - - val animatorUpdateListener: ValueAnimator.AnimatorUpdateListener = - ValueAnimator.AnimatorUpdateListener { animation -> - val strokeWidth = animation.animatedValue as Int - ring.setStroke(strokeWidth, ringColor) - val newSize = baseSize + strokeWidth * 2 - ring.setSize(newSize, newSize) - mImportanceRingView.invalidate() - } - - val growAnimation: ValueAnimator = ValueAnimator.ofInt(0, largeThickness) - growAnimation.interpolator = LINEAR_OUT_SLOW_IN - growAnimation.duration = IMPORTANCE_ANIM_GROW_DURATION - growAnimation.addUpdateListener(animatorUpdateListener) - - val shrinkAnimation: ValueAnimator = - ValueAnimator.ofInt(largeThickness, standardThickness) - shrinkAnimation.duration = IMPORTANCE_ANIM_SHRINK_DURATION - shrinkAnimation.startDelay = IMPORTANCE_ANIM_SHRINK_DELAY - shrinkAnimation.interpolator = OVERSHOOT - shrinkAnimation.addUpdateListener(animatorUpdateListener) - shrinkAnimation.addListener(object : AnimatorListenerAdapter() { - override fun onAnimationStart(animation: Animator?) { - // Shrink the badge bg so that it doesn't peek behind the animation - bg.setSize(baseSize, baseSize) - conversationIconBadgeBg.invalidate() - } - - override fun onAnimationEnd(animation: Animator?) { - // Reset bg back to normal size - bg.setSize(bgSize, bgSize) - conversationIconBadgeBg.invalidate() - } - }) - - val anims = AnimatorSet() - anims.startDelay = IMPORTANCE_ANIM_DELAY - anims.playSequentially(growAnimation, shrinkAnimation) - - val gapWidth = dialog.context.getResources().getDimensionPixelSize( - R.dimen.conversation_onboarding_bullet_gap_width) - val description = SpannableStringBuilder() - description.append(context.getText(R.string.priority_onboarding_show_at_top_text), - BulletSpan(gapWidth), /* flags */0) - description.append(System.lineSeparator()) - description.append(context.getText(R.string.priority_onboarding_show_avatar_text), - BulletSpan(gapWidth), /* flags */0) - if (showsAsBubble) { - description.append(System.lineSeparator()) - description.append(context.getText( - R.string.priority_onboarding_appear_as_bubble_text), - BulletSpan(gapWidth), /* flags */0) - } - if (ignoresDnd) { - description.append(System.lineSeparator()) - description.append(context.getText(R.string.priority_onboarding_ignores_dnd_text), - BulletSpan(gapWidth), /* flags */0) - } - findViewById<TextView>(R.id.behaviors).setText(description) - - window?.apply { - setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) - addFlags(wmFlags) - setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL) - setWindowAnimations(com.android.internal.R.style.Animation_InputMethod) - - attributes = attributes.apply { - format = PixelFormat.TRANSLUCENT - title = PriorityOnboardingDialogController::class.java.simpleName - gravity = Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL - fitInsetsTypes = attributes.fitInsetsTypes and statusBars().inv() - width = MATCH_PARENT - height = WRAP_CONTENT - } - } - anims.start() - } - } - - private val wmFlags = (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS - or WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH - or WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) -} 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 bae44fcaff34..506d8a185adc 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 @@ -1142,16 +1142,18 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable */ private void updateStackPosition() { // Consider interpolating from an mExpansionStartY for use on lockscreen and AOD - final float stackY = MathUtils.lerp(0, mTopPadding, mAmbientState.getExpansionFraction()); + final float fraction = mAmbientState.getExpansionFraction(); + final float stackY = MathUtils.lerp(0, mTopPadding, fraction); mAmbientState.setStackY(stackY); if (mOnStackYChanged != null) { mOnStackYChanged.run(); } - final float shadeBottom = getHeight() - getEmptyBottomMargin(); - mAmbientState.setStackEndHeight(shadeBottom - mTopPadding); + final float stackEndHeight = getHeight() - getEmptyBottomMargin() - mTopPadding; + mAmbientState.setStackEndHeight(stackEndHeight); mAmbientState.setStackHeight( - MathUtils.lerp(0, shadeBottom - mTopPadding, mAmbientState.getExpansionFraction())); + MathUtils.lerp(stackEndHeight * StackScrollAlgorithm.START_FRACTION, + stackEndHeight, fraction)); } void setOnStackYChanged(Runnable onStackYChanged) { @@ -2438,18 +2440,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable } @ShadeViewRefactor(RefactorComponent.COORDINATOR) - public int getPeekHeight() { - final ExpandableView firstChild = getFirstChildNotGone(); - final int firstChildMinHeight = firstChild != null ? firstChild.getCollapsedHeight() - : mCollapsedSize; - int shelfHeight = 0; - if (getLastVisibleSection() != null && mShelf.getVisibility() != GONE) { - shelfHeight = mShelf.getIntrinsicHeight(); - } - return mIntrinsicPadding + firstChildMinHeight + shelfHeight; - } - - @ShadeViewRefactor(RefactorComponent.COORDINATOR) private int clampPadding(int desiredPadding) { return Math.max(desiredPadding, mIntrinsicPadding); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java index b039df3f32af..f7eb574feac3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java @@ -1061,10 +1061,6 @@ public class NotificationStackScrollLayoutController { mView.setUnlockHintRunning(running); } - public float getPeekHeight() { - return mView.getPeekHeight(); - } - public boolean isFooterViewNotGone() { return mView.isFooterViewNotGone(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index c1a5f148d4ca..413048d6ce54 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -42,6 +42,8 @@ import java.util.List; */ public class StackScrollAlgorithm { + public static final float START_FRACTION = 0.3f; + private static final String LOG_TAG = "StackScrollAlgorithm"; private final ViewGroup mHostView; @@ -442,7 +444,8 @@ public class StackScrollAlgorithm { maxViewHeight = algorithmState.viewHeightBeforeShelf; } } - viewState.height = (int) MathUtils.lerp(0, maxViewHeight, expansionFraction); + viewState.height = (int) MathUtils.lerp(maxViewHeight * START_FRACTION, maxViewHeight, + expansionFraction); } currentYPosition += viewState.height + expansionFraction * mPaddingBetweenElements; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java index 76657ad5ab07..16bed6f3f38d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java @@ -43,7 +43,6 @@ import com.android.systemui.animation.Interpolators; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.StatusBarState; -import com.android.systemui.statusbar.events.PrivacyDotViewController; import com.android.systemui.statusbar.events.SystemStatusAnimationCallback; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager; @@ -92,7 +91,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue private CommandQueue mCommandQueue; private OngoingCallController mOngoingCallController; private final SystemStatusAnimationScheduler mAnimationScheduler; - private final PrivacyDotViewController mDotViewController; + private final StatusBarLocationPublisher mLocationPublisher; private NotificationIconAreaController mNotificationIconAreaController; private List<String> mBlockedIcons = new ArrayList<>(); @@ -120,12 +119,12 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue public CollapsedStatusBarFragment( OngoingCallController ongoingCallController, SystemStatusAnimationScheduler animationScheduler, - PrivacyDotViewController dotViewController, + StatusBarLocationPublisher locationPublisher, NotificationIconAreaController notificationIconAreaController ) { mOngoingCallController = ongoingCallController; mAnimationScheduler = animationScheduler; - mDotViewController = dotViewController; + mLocationPublisher = locationPublisher; mNotificationIconAreaController = notificationIconAreaController; } @@ -540,7 +539,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue int leftMargin = left - mStatusBar.getLeft(); int rightMargin = mStatusBar.getRight() - right; - mDotViewController.setStatusBarMargins(leftMargin, rightMargin); + mLocationPublisher.updateStatusBarMargin(leftMargin, rightMargin); } // Listen for view end changes of PhoneStatusBarView and publish that to the privacy dot diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java index 0b747f94e935..42f301d2f222 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java @@ -118,7 +118,6 @@ public class HeadsUpTouchHelper implements Gefingerpoken { mPanel.setPanelScrimMinFraction(maxPanelHeight > 0f ? (float) startHeight / maxPanelHeight : 0f); mPanel.startExpandMotion(x, y, true /* startTracking */, startHeight); - mPanel.startExpandingFromPeek(); // This call needs to be after the expansion start otherwise we will get a // flicker of one frame as it's not expanded yet. mHeadsUpManager.unpinAll(true); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 56c0bd5c45ab..20b37e26dcee 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -2831,15 +2831,6 @@ public class NotificationPanelViewController extends PanelViewController { } @Override - protected float getPeekHeight() { - if (mNotificationStackScrollLayoutController.getNotGoneChildCount() > 0) { - return mNotificationStackScrollLayoutController.getPeekHeight(); - } else { - return mQsMinExpansionHeight; - } - } - - @Override protected boolean shouldUseDismissingAnimation() { return mBarState != StatusBarState.SHADE && (mKeyguardStateController.canDismissLockScreen() || !isTracking()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java index 28cfe214dd3a..64e2c1c5d268 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java @@ -212,7 +212,6 @@ public abstract class PanelBar extends FrameLayout { } else { pv.resetViews(false /* animate */); pv.setExpandedFraction(0); // just in case - pv.cancelPeek(); } if (DEBUG) LOG("collapsePanel: animate=%s waiting=%s", animate, waiting); if (!waiting && mState != STATE_CLOSED) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java index 264930972181..f9a644fe2def 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java @@ -68,8 +68,6 @@ import java.util.ArrayList; public abstract class PanelViewController { public static final boolean DEBUG = PanelBar.DEBUG; public static final String TAG = PanelView.class.getSimpleName(); - private static final int INITIAL_OPENING_PEEK_DURATION = 200; - private static final int PEEK_ANIMATION_DURATION = 360; private static final int NO_FIXED_DURATION = -1; private static final long SHADE_OPEN_SPRING_OUT_DURATION = 350L; private static final long SHADE_OPEN_SPRING_BACK_DURATION = 200L; @@ -96,7 +94,6 @@ public abstract class PanelViewController { protected HeadsUpManagerPhone mHeadsUpManager; protected final StatusBarTouchableRegionManager mStatusBarTouchableRegionManager; - private float mPeekHeight; private float mHintDistance; private float mInitialOffsetOnTouch; private boolean mCollapsedAndHeadsUpOnDown; @@ -106,8 +103,6 @@ public abstract class PanelViewController { private boolean mHasLayoutedSinceDown; private float mUpdateFlingVelocity; private boolean mUpdateFlingOnLayout; - private boolean mPeekTouching; - private boolean mJustPeeked; private boolean mClosing; protected boolean mTracking; private boolean mTouchSlopExceeded; @@ -125,7 +120,6 @@ public abstract class PanelViewController { private boolean mHandlingPointerUp; private ValueAnimator mHeightAnimator; - private ObjectAnimator mPeekAnimator; private final VelocityTracker mVelocityTracker = VelocityTracker.obtain(); private FlingAnimationUtils mFlingAnimationUtils; private FlingAnimationUtils mFlingAnimationUtilsClosing; @@ -195,40 +189,6 @@ public abstract class PanelViewController { } } - private void runPeekAnimation(long duration, float peekHeight, boolean collapseWhenFinished) { - mPeekHeight = peekHeight; - if (DEBUG) logf("peek to height=%.1f", mPeekHeight); - if (mHeightAnimator != null) { - return; - } - if (mPeekAnimator != null) { - mPeekAnimator.cancel(); - } - mPeekAnimator = ObjectAnimator.ofFloat(this, "expandedHeight", mPeekHeight).setDuration( - duration); - mPeekAnimator.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN); - mPeekAnimator.addListener(new AnimatorListenerAdapter() { - private boolean mCancelled; - - @Override - public void onAnimationCancel(Animator animation) { - mCancelled = true; - } - - @Override - public void onAnimationEnd(Animator animation) { - mPeekAnimator = null; - if (!mCancelled && collapseWhenFinished) { - mView.postOnAnimation(mPostCollapseRunnable); - } - - } - }); - notifyExpandingStarted(); - mPeekAnimator.start(); - mJustPeeked = true; - } - protected AmbientState getAmbientState() { return mAmbientState; } @@ -336,8 +296,6 @@ public abstract class PanelViewController { } private void startOpening(MotionEvent event) { - runPeekAnimation(INITIAL_OPENING_PEEK_DURATION, getOpeningHeight(), - false /* collapseWhenFinished */); notifyBarPanelExpansionChanged(); maybeVibrateOnOpening(); @@ -375,10 +333,6 @@ public abstract class PanelViewController { return Math.abs(yDiff) >= Math.abs(xDiff); } - protected void startExpandingFromPeek() { - mStatusBar.handlePeekToExpandTransistion(); - } - protected void startExpandMotion(float newX, float newY, boolean startTracking, float expandedHeight) { if (!mHandlingPointerUp) { @@ -442,18 +396,6 @@ public abstract class PanelViewController { if (mUpdateFlingOnLayout) { mUpdateFlingVelocity = vel; } - } else if (mPanelClosedOnDown && !mHeadsUpManager.hasPinnedHeadsUp() && !mTracking - && !mStatusBar.isBouncerShowing() - && !mKeyguardStateController.isKeyguardFadingAway()) { - long timePassed = SystemClock.uptimeMillis() - mDownTime; - if (timePassed < ViewConfiguration.getLongPressTimeout()) { - // Let's show the user that they can actually expand the panel - runPeekAnimation( - PEEK_ANIMATION_DURATION, getPeekHeight(), true /* collapseWhenFinished */); - } else { - // We need to collapse the panel since we peeked to the small height. - mView.postOnAnimation(mPostCollapseRunnable); - } } else if (!mStatusBar.isBouncerShowing() && !mStatusBarKeyguardViewManager.isShowingAlternateAuthOrAnimating()) { boolean expands = onEmptySpaceClick(mInitialTouchX); @@ -461,7 +403,6 @@ public abstract class PanelViewController { } mVelocityTracker.clear(); - mPeekTouching = false; } protected float getCurrentExpandVelocity() { @@ -582,7 +523,6 @@ public abstract class PanelViewController { protected void fling(float vel, boolean expand, float collapseSpeedUpFactor, boolean expandBecauseOfFalsing) { - cancelPeek(); float target = expand ? getMaxPanelHeight() : 0; if (!expand) { mClosing = true; @@ -724,10 +664,6 @@ public abstract class PanelViewController { return; } - if (mPeekAnimator != null || mPeekTouching) { - return; - } - if (mTracking && !isTrackingBlocked()) { return; } @@ -890,20 +826,6 @@ public abstract class PanelViewController { } }; - public void cancelPeek() { - boolean cancelled = false; - if (mPeekAnimator != null) { - cancelled = true; - mPeekAnimator.cancel(); - } - - if (cancelled) { - // When peeking, we already tell mBar that we expanded ourselves. Make sure that we also - // notify mBar that we might have closed ourselves. - notifyBarPanelExpansionChanged(); - } - } - public void expand(final boolean animate) { if (!isFullyCollapsed() && !isCollapsing()) { return; @@ -913,7 +835,6 @@ public abstract class PanelViewController { mAnimateAfterExpanding = animate; mUpdateFlingOnLayout = false; abortAnimations(); - cancelPeek(); if (mTracking) { onTrackingStopped(true /* expands */); // The panel is expanded after this call. } @@ -964,7 +885,6 @@ public abstract class PanelViewController { } private void abortAnimations() { - cancelPeek(); cancelHeightAnimator(); mView.removeCallbacks(mPostCollapseRunnable); mView.removeCallbacks(mFlingCollapseRunnable); @@ -982,7 +902,6 @@ public abstract class PanelViewController { if (mHeightAnimator != null || mTracking) { return; } - cancelPeek(); notifyExpandingStarted(); startUnlockHintAnimationPhase1(() -> { notifyExpandingFinished(); @@ -1085,7 +1004,7 @@ public abstract class PanelViewController { if (mBar != null) { mBar.panelExpansionChanged( mExpandedFraction, - mExpandedFraction > 0f || mPeekAnimator != null || mInstantExpanding + mExpandedFraction > 0f || mInstantExpanding || isPanelVisibleBecauseOfHeadsUp() || mTracking || mHeightAnimator != null); } @@ -1125,19 +1044,16 @@ public abstract class PanelViewController { public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println(String.format("[PanelView(%s): expandedHeight=%f maxPanelHeight=%d closing=%s" - + " tracking=%s justPeeked=%s peekAnim=%s%s timeAnim=%s%s " + + " tracking=%s timeAnim=%s%s " + "touchDisabled=%s" + "]", this.getClass().getSimpleName(), getExpandedHeight(), getMaxPanelHeight(), - mClosing ? "T" : "f", mTracking ? "T" : "f", mJustPeeked ? "T" : "f", mPeekAnimator, - ((mPeekAnimator != null && mPeekAnimator.isStarted()) ? " (started)" : ""), - mHeightAnimator, + mClosing ? "T" : "f", mTracking ? "T" : "f", mHeightAnimator, ((mHeightAnimator != null && mHeightAnimator.isStarted()) ? " (started)" : ""), mTouchDisabled ? "T" : "f")); } public abstract void resetViews(boolean animate); - protected abstract float getPeekHeight(); /** * @return whether "Clear all" button will be visible when the panel is fully expanded @@ -1212,10 +1128,8 @@ public abstract class PanelViewController { mAnimatingOnDown = mHeightAnimator != null; mMinExpandHeight = 0.0f; mDownTime = SystemClock.uptimeMillis(); - if (mAnimatingOnDown && mClosing && !mHintAnimationRunning - || mPeekAnimator != null) { + if (mAnimatingOnDown && mClosing && !mHintAnimationRunning) { cancelHeightAnimator(); - cancelPeek(); mTouchSlopExceeded = true; return true; } @@ -1223,7 +1137,6 @@ public abstract class PanelViewController { mInitialTouchX = x; mTouchStartedInEmptyArea = !isInContentBounds(x, y); mTouchSlopExceeded = mTouchSlopExceededBeforeDown; - mJustPeeked = false; mMotionAborted = false; mPanelClosedOnDown = isFullyCollapsed(); mCollapsedAndHeadsUpOnDown = false; @@ -1302,8 +1215,6 @@ public abstract class PanelViewController { * We capture touch events here and update the expand height here in case according to * the users fingers. This also handles multi-touch. * - * If the user just clicks shortly, we show a quick peek of the shade. - * * Flinging is also enabled in order to open or close the shade. */ @@ -1323,25 +1234,22 @@ public abstract class PanelViewController { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: startExpandMotion(x, y, false /* startTracking */, mExpandedHeight); - mJustPeeked = false; mMinExpandHeight = 0.0f; mPanelClosedOnDown = isFullyCollapsed(); mHasLayoutedSinceDown = false; mUpdateFlingOnLayout = false; mMotionAborted = false; - mPeekTouching = mPanelClosedOnDown; mDownTime = SystemClock.uptimeMillis(); mTouchAboveFalsingThreshold = false; mCollapsedAndHeadsUpOnDown = isFullyCollapsed() && mHeadsUpManager.hasPinnedHeadsUp(); addMovement(event); if (!mGestureWaitForTouchSlop || (mHeightAnimator != null - && !mHintAnimationRunning) || mPeekAnimator != null) { + && !mHintAnimationRunning)) { mTouchSlopExceeded = (mHeightAnimator != null && !mHintAnimationRunning) - || mPeekAnimator != null || mTouchSlopExceededBeforeDown; + || mTouchSlopExceededBeforeDown; cancelHeightAnimator(); - cancelPeek(); onTrackingStarted(); } if (isFullyCollapsed() && !mHeadsUpManager.hasPinnedHeadsUp() @@ -1381,7 +1289,7 @@ public abstract class PanelViewController { || mIgnoreXTouchSlop)) { mTouchSlopExceeded = true; if (mGestureWaitForTouchSlop && !mTracking && !mCollapsedAndHeadsUpOnDown) { - if (!mJustPeeked && mInitialOffsetOnTouch != 0f) { + if (mInitialOffsetOnTouch != 0f) { startExpandMotion(x, y, false /* startTracking */, mExpandedHeight); h = 0; } @@ -1390,26 +1298,12 @@ public abstract class PanelViewController { } } float newHeight = Math.max(0, h + mInitialOffsetOnTouch); - if (newHeight > mPeekHeight) { - if (mPeekAnimator != null) { - mPeekAnimator.cancel(); - } - mJustPeeked = false; - } else if (mPeekAnimator == null && mJustPeeked) { - // The initial peek has finished, but we haven't dragged as far yet, lets - // speed it up by starting at the peek height. - mInitialOffsetOnTouch = mExpandedHeight; - mInitialTouchY = y; - mMinExpandHeight = mExpandedHeight; - mJustPeeked = false; - } newHeight = Math.max(newHeight, mMinExpandHeight); if (-h >= getFalsingThreshold()) { mTouchAboveFalsingThreshold = true; mUpwardsWhenThresholdReached = isDirectionUpwards(x, y); } - if (!mJustPeeked && (!mGestureWaitForTouchSlop || mTracking) - && !isTrackingBlocked()) { + if ((!mGestureWaitForTouchSlop || mTracking) && !isTrackingBlocked()) { setExpandedHeightInternal(newHeight); } break; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index c09293115492..a952db2a6073 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -163,7 +163,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump private final float mDefaultScrimAlpha; // Assuming the shade is expanded during initialization - private float mExpansionFraction = 1f; + private float mPanelExpansion = 1f; private float mQsExpansion; private boolean mQsBottomVisible; @@ -487,8 +487,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump if (isNaN(fraction)) { throw new IllegalArgumentException("Fraction should not be NaN"); } - if (mExpansionFraction != fraction) { - mExpansionFraction = fraction; + if (mPanelExpansion != fraction) { + mPanelExpansion = fraction; boolean relevantState = (mState == ScrimState.UNLOCKED || mState == ScrimState.KEYGUARD @@ -641,7 +641,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump mBehindTint = Color.BLACK; } else { mBehindAlpha = backAlpha; - mNotificationsAlpha = Math.max(1.0f - getInterpolatedFraction(), mQsExpansion); + if (mState == ScrimState.SHADE_LOCKED) { + // going from KEYGUARD to SHADE_LOCKED state + mNotificationsAlpha = getInterpolatedFraction(); + } else { + mNotificationsAlpha = Math.max(1.0f - getInterpolatedFraction(), mQsExpansion); + } mBehindTint = backTint; } } @@ -805,7 +810,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } private float getInterpolatedFraction() { - float frac = mExpansionFraction; + float frac = mPanelExpansion; // let's start this 20% of the way down the screen frac = frac * 1.2f - 0.2f; if (frac <= 0) { @@ -1165,7 +1170,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump pw.print(" mDefaultScrimAlpha="); pw.println(mDefaultScrimAlpha); pw.print(" mExpansionFraction="); - pw.println(mExpansionFraction); + pw.println(mPanelExpansion); } public void setWallpaperSupportsAmbientMode(boolean wallpaperSupportsAmbientMode) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index aaef739af8c4..bd17d00063d7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -209,7 +209,6 @@ import com.android.systemui.statusbar.SuperStatusBarViewFactory; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.charging.WiredChargingRippleController; -import com.android.systemui.statusbar.events.PrivacyDotViewController; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.NotificationActivityStarter; @@ -429,7 +428,7 @@ public class StatusBar extends SystemUI implements DemoMode, private NotificationsController mNotificationsController; private final OngoingCallController mOngoingCallController; private final SystemStatusAnimationScheduler mAnimationScheduler; - private final PrivacyDotViewController mDotViewController; + private final StatusBarLocationPublisher mStatusBarLocationPublisher; // expanded notifications // the sliding/resizing panel within the notification window @@ -799,7 +798,7 @@ public class StatusBar extends SystemUI implements DemoMode, WiredChargingRippleController chargingRippleAnimationController, OngoingCallController ongoingCallController, SystemStatusAnimationScheduler animationScheduler, - PrivacyDotViewController dotViewController, + StatusBarLocationPublisher locationPublisher, FeatureFlags featureFlags, KeyguardUnlockAnimationController keyguardUnlockAnimationController) { super(context); @@ -882,7 +881,7 @@ public class StatusBar extends SystemUI implements DemoMode, mChargingRippleAnimationController = chargingRippleAnimationController; mOngoingCallController = ongoingCallController; mAnimationScheduler = animationScheduler; - mDotViewController = dotViewController; + mStatusBarLocationPublisher = locationPublisher; mFeatureFlags = featureFlags; mExpansionChangedListeners = new ArrayList<>(); @@ -1175,7 +1174,7 @@ public class StatusBar extends SystemUI implements DemoMode, new CollapsedStatusBarFragment( mOngoingCallController, mAnimationScheduler, - mDotViewController, + mStatusBarLocationPublisher, mNotificationIconAreaController), CollapsedStatusBarFragment.TAG) .commit(); @@ -3095,19 +3094,7 @@ public class StatusBar extends SystemUI implements DemoMode, } } - void handlePeekToExpandTransistion() { - try { - // consider the transition from peek to expanded to be a panel open, - // but not one that clears notification effects. - int notificationLoad = mNotificationsController.getActiveNotificationsCount(); - mBarService.onPanelRevealed(false, notificationLoad); - } catch (RemoteException ex) { - // Won't fail unless the world has ended. - } - } - // Visibility reporting - void handleVisibleToUserChangedImpl(boolean visibleToUser) { if (visibleToUser) { /* The LEDs are turned off when the notification panel is shown, even just a little bit. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLocationPublisher.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLocationPublisher.kt new file mode 100644 index 000000000000..4e5ecfe3f623 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLocationPublisher.kt @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.phone + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.statusbar.policy.CallbackController +import java.lang.ref.WeakReference +import javax.inject.Inject + +/** + * Publishes updates to the status bar's margins. + * + * While the status bar view consumes the entire width of the device, the status bar + * contents are laid out with margins for rounded corners, padding from the absolute + * edges, and potentially display cutouts in the corner. + */ +@SysUISingleton +class StatusBarLocationPublisher @Inject constructor() +: CallbackController<StatusBarMarginUpdatedListener> { + private val listeners = mutableSetOf<WeakReference<StatusBarMarginUpdatedListener>>() + + var marginLeft: Int = 0 + private set + var marginRight: Int = 0 + private set + + override fun addCallback(listener: StatusBarMarginUpdatedListener) { + listeners.add(WeakReference(listener)) + } + + override fun removeCallback(listener: StatusBarMarginUpdatedListener) { + var toRemove: WeakReference<StatusBarMarginUpdatedListener>? = null + for (l in listeners) { + if (l.get() == listener) { + toRemove = l + } + } + + if (toRemove != null) { + listeners.remove(toRemove) + } + } + + fun updateStatusBarMargin(left: Int, right: Int) { + marginLeft = left + marginRight = right + + notifyListeners() + } + + private fun notifyListeners() { + var listenerList: List<WeakReference<StatusBarMarginUpdatedListener>> + synchronized(this) { + listenerList = listeners.toList() + } + + listenerList.forEach { wrapper -> + if (wrapper.get() == null) { + listeners.remove(wrapper) + } + + wrapper.get()?.onStatusBarMarginUpdated(marginLeft, marginRight) + } + } +} + +interface StatusBarMarginUpdatedListener { + fun onStatusBarMarginUpdated(marginLeft: Int, marginRight: Int) +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java index 66e1c2e1b571..ae11a74748cd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java @@ -62,7 +62,6 @@ import com.android.systemui.statusbar.SuperStatusBarViewFactory; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.charging.WiredChargingRippleController; -import com.android.systemui.statusbar.events.PrivacyDotViewController; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; @@ -91,6 +90,7 @@ import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; +import com.android.systemui.statusbar.phone.StatusBarLocationPublisher; import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter; import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager; import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; @@ -212,7 +212,7 @@ public interface StatusBarPhoneModule { WiredChargingRippleController chargingRippleAnimationController, OngoingCallController ongoingCallController, SystemStatusAnimationScheduler animationScheduler, - PrivacyDotViewController dotViewController, + StatusBarLocationPublisher locationPublisher, FeatureFlags featureFlags, KeyguardUnlockAnimationController keyguardUnlockAnimationController) { return new StatusBar( @@ -298,7 +298,7 @@ public interface StatusBarPhoneModule { chargingRippleAnimationController, ongoingCallController, animationScheduler, - dotViewController, + locationPublisher, featureFlags, keyguardUnlockAnimationController); } diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java index b95545576e56..10c4a55ad240 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java @@ -675,7 +675,6 @@ public class BubblesManager implements Dumpable { } try { int flags = Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION; - flags |= Notification.BubbleMetadata.FLAG_AUTO_EXPAND_BUBBLE; mBarService.onNotificationBubbleChanged(entry.getKey(), true, flags); } catch (RemoteException e) { Log.e(TAG, e.getMessage()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/ProximityClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/ProximityClassifierTest.java index 60786f6afe99..1c3922a57368 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/ProximityClassifierTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/ProximityClassifierTest.java @@ -29,8 +29,8 @@ import android.view.MotionEvent; import androidx.test.filters.SmallTest; +import com.android.systemui.plugins.FalsingManager; import com.android.systemui.util.DeviceConfigProxyFake; -import com.android.systemui.util.sensors.ProximitySensor; import org.junit.After; import org.junit.Before; @@ -149,8 +149,17 @@ public class ProximityClassifierTest extends ClassifierTest { motionEvent.recycle(); } - private ProximitySensor.ThresholdSensorEvent createSensorEvent( - boolean covered, long timestampMs) { - return new ProximitySensor.ThresholdSensorEvent(covered, timestampMs * NS_PER_MS); + private FalsingManager.ProximityEvent createSensorEvent(boolean covered, long timestampMs) { + return new FalsingManager.ProximityEvent() { + @Override + public boolean getCovered() { + return covered; + } + + @Override + public long getTimestampNs() { + return timestampMs * NS_PER_MS; + } + }; } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt index 94252d2b8331..800daa1e96aa 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt @@ -17,7 +17,6 @@ package com.android.systemui.media import android.content.Intent -import android.content.res.ColorStateList import android.graphics.Color import android.graphics.drawable.GradientDrawable import android.graphics.drawable.RippleDrawable @@ -222,17 +221,6 @@ public class MediaControlPanelTest : SysuiTestCase() { } @Test - fun bindBackgroundColor() { - player.attachPlayer(holder) - val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(), - emptyList(), PACKAGE, session.getSessionToken(), null, device, true, null) - player.bindPlayer(state, PACKAGE) - val list = ArgumentCaptor.forClass(ColorStateList::class.java) - verify(view).setBackgroundTintList(list.capture()) - assertThat(list.value).isEqualTo(ColorStateList.valueOf(BG_COLOR)) - } - - @Test fun bindDevice() { player.attachPlayer(holder) val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java index 5d29f520e8a9..e85e19fbd9b8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java @@ -21,6 +21,8 @@ import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED; import static android.app.NotificationManager.IMPORTANCE_DEFAULT; import static android.app.NotificationManager.IMPORTANCE_HIGH; import static android.app.NotificationManager.IMPORTANCE_LOW; +import static android.app.NotificationManager.Policy.CONVERSATION_SENDERS_ANYONE; +import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_CONVERSATIONS; import static android.print.PrintManager.PRINT_SPOOLER_PACKAGE_NAME; import static android.view.View.GONE; import static android.view.View.VISIBLE; @@ -150,9 +152,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { private ShadeController mShadeController; @Mock private ConversationIconFactory mIconFactory; - @Mock(answer = Answers.RETURNS_SELF) - private PriorityOnboardingDialogController.Builder mBuilder; - private Provider<PriorityOnboardingDialogController.Builder> mBuilderProvider = () -> mBuilder; @Mock private Notification.BubbleMetadata mBubbleMetadata; private Handler mTestHandler; @@ -236,8 +235,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { when(mMockINotificationManager.getConsolidatedNotificationPolicy()) .thenReturn(mock(NotificationManager.Policy.class)); - when(mBuilder.build()).thenReturn(mock(PriorityOnboardingDialogController.class)); - when(mPeopleSpaceWidgetManager.requestPinAppWidget(any(), any())).thenReturn(true); } @@ -258,7 +255,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -285,7 +281,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -340,7 +335,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -368,7 +362,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -395,7 +388,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -433,7 +425,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -464,7 +455,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -493,7 +483,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -523,7 +512,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, false, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -551,7 +539,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -582,7 +569,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -616,7 +602,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -626,6 +611,110 @@ public class NotificationConversationInfoTest extends SysuiTestCase { assertThat(((TextView) view.findViewById(R.id.default_summary)).getText()).isEqualTo( mContext.getString(R.string.notification_channel_summary_default_with_bubbles, "App Name")); + assertThat(((TextView) mNotificationInfo.findViewById(R.id.priority_summary)).getText()) + .isEqualTo(mContext.getString( + R.string.notification_channel_summary_priority_bubble)); + } + + @Test + public void testBindNotification_priorityDnd() throws Exception { + NotificationManager.Policy policy = new NotificationManager.Policy( + PRIORITY_CATEGORY_CONVERSATIONS, 0, 0, 0, CONVERSATION_SENDERS_ANYONE); + when(mMockINotificationManager.getConsolidatedNotificationPolicy()) + .thenReturn(policy); + when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name"); + mConversationChannel.setImportance(IMPORTANCE_HIGH); + mConversationChannel.setImportantConversation(false); + mConversationChannel.setAllowBubbles(false); + mNotificationInfo.bindNotification( + -1, + mShortcutManager, + mMockPackageManager, + mPeopleSpaceWidgetManager, + mMockINotificationManager, + mOnUserInteractionCallback, + TEST_PACKAGE_NAME, + mNotificationChannel, + mEntry, + null, + null, + null, + mIconFactory, + mContext, + true, + mTestHandler, + mTestHandler, null, Optional.of(mBubblesManager), + mShadeController); + assertThat(((TextView) mNotificationInfo.findViewById(R.id.priority_summary)).getText()) + .isEqualTo(mContext.getString( + R.string.notification_channel_summary_priority_dnd)); + } + + @Test + public void testBindNotification_priorityBaseline() throws Exception { + when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name"); + mConversationChannel.setImportance(IMPORTANCE_HIGH); + mConversationChannel.setImportantConversation(false); + mConversationChannel.setAllowBubbles(false); + mNotificationInfo.bindNotification( + -1, + mShortcutManager, + mMockPackageManager, + mPeopleSpaceWidgetManager, + mMockINotificationManager, + mOnUserInteractionCallback, + TEST_PACKAGE_NAME, + mNotificationChannel, + mEntry, + null, + null, + null, + mIconFactory, + mContext, + true, + mTestHandler, + mTestHandler, null, Optional.of(mBubblesManager), + mShadeController); + assertThat(((TextView) mNotificationInfo.findViewById(R.id.priority_summary)).getText()) + .isEqualTo(mContext.getString( + R.string.notification_channel_summary_priority_baseline)); + } + + @Test + public void testBindNotification_priorityDndAndBubble() throws Exception { + NotificationManager.Policy policy = new NotificationManager.Policy( + PRIORITY_CATEGORY_CONVERSATIONS, 0, 0, 0, CONVERSATION_SENDERS_ANYONE); + when(mMockINotificationManager.getConsolidatedNotificationPolicy()) + .thenReturn(policy); + + when(mMockINotificationManager.getBubblePreferenceForPackage(anyString(), anyInt())) + .thenReturn(BUBBLE_PREFERENCE_ALL); + when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name"); + mConversationChannel.setImportance(IMPORTANCE_HIGH); + mConversationChannel.setImportantConversation(false); + mConversationChannel.setAllowBubbles(true); + mNotificationInfo.bindNotification( + -1, + mShortcutManager, + mMockPackageManager, + mPeopleSpaceWidgetManager, + mMockINotificationManager, + mOnUserInteractionCallback, + TEST_PACKAGE_NAME, + mNotificationChannel, + mEntry, + mBubbleMetadata, + null, + null, + mIconFactory, + mContext, + true, + mTestHandler, + mTestHandler, null, Optional.of(mBubblesManager), + mShadeController); + assertThat(((TextView) mNotificationInfo.findViewById(R.id.priority_summary)).getText()) + .isEqualTo(mContext.getString( + R.string.notification_channel_summary_priority_all)); } @Test @@ -649,7 +738,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -696,7 +784,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -742,7 +829,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -789,7 +875,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -829,7 +914,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -868,7 +952,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -911,7 +994,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -944,7 +1026,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -976,7 +1057,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -1015,7 +1095,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -1054,7 +1133,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -1092,7 +1170,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -1129,7 +1206,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -1157,7 +1233,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -1168,97 +1243,8 @@ public class NotificationConversationInfoTest extends SysuiTestCase { } @Test - public void testSelectPriorityPresentsOnboarding_firstTime() { - // GIVEN pref is false - Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, false); - - // GIVEN the priority onboarding screen is present - PriorityOnboardingDialogController.Builder b = - mock(PriorityOnboardingDialogController.Builder.class, Answers.RETURNS_SELF); - PriorityOnboardingDialogController controller = - mock(PriorityOnboardingDialogController.class); - when(b.build()).thenReturn(controller); - - // GIVEN the user is changing conversation settings - mNotificationInfo.bindNotification( - -1, - mShortcutManager, - mMockPackageManager, - mPeopleSpaceWidgetManager, - mMockINotificationManager, - mOnUserInteractionCallback, - TEST_PACKAGE_NAME, - mNotificationChannel, - mEntry, - mBubbleMetadata, - null, - null, - mIconFactory, - mContext, - () -> b, - true, - mTestHandler, - mTestHandler, null, Optional.of(mBubblesManager), - mShadeController); - - // WHEN user clicks "priority" - mNotificationInfo.setSelectedAction(NotificationConversationInfo.ACTION_FAVORITE); - verify(controller, never()).show(); - - // and then done - mNotificationInfo.findViewById(R.id.done).performClick(); - - // THEN the user is presented with the priority onboarding screen - verify(controller, atLeastOnce()).show(); - } - - @Test - public void testSelectPriorityDoesNotShowOnboarding_secondTime() { - //WHEN pref is true - Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, true); - - PriorityOnboardingDialogController.Builder b = - mock(PriorityOnboardingDialogController.Builder.class, Answers.RETURNS_SELF); - PriorityOnboardingDialogController controller = - mock(PriorityOnboardingDialogController.class); - when(b.build()).thenReturn(controller); - - mNotificationInfo.bindNotification( - -1, - mShortcutManager, - mMockPackageManager, - mPeopleSpaceWidgetManager, - mMockINotificationManager, - mOnUserInteractionCallback, - TEST_PACKAGE_NAME, - mNotificationChannel, - mEntry, - mBubbleMetadata, - null, - null, - mIconFactory, - mContext, - () -> b, - true, - mTestHandler, - mTestHandler, null, Optional.of(mBubblesManager), - mShadeController); - - // WHEN user clicks "priority" - mNotificationInfo.setSelectedAction(NotificationConversationInfo.ACTION_FAVORITE); - verify(controller, never()).show(); - - // and then done - mNotificationInfo.findViewById(R.id.done).performClick(); - - // THEN the user is presented with the priority onboarding screen - verify(controller, never()).show(); - } - - @Test public void testSelectPriorityRequestsPinPeopleTile() { - //WHEN pref is true and channel is default importance - Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, true); + //WHEN channel is default importance mNotificationChannel.setImportantConversation(false); mNotificationInfo.bindNotification( -1, @@ -1275,7 +1261,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -1293,9 +1278,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { @Test public void testSelectDefaultDoesNotRequestPinPeopleTile() { - //WHEN pref is true - Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, true); - mNotificationInfo.bindNotification( -1, mShortcutManager, @@ -1311,7 +1293,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), @@ -1329,8 +1310,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { @Test public void testSelectPriority_AlreadyPriority_DoesNotRequestPinPeopleTile() { - //WHEN pref is true and channel is priority - Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING_IN_S, true); mConversationChannel.setOriginalImportance(IMPORTANCE_HIGH); mConversationChannel.setImportance(IMPORTANCE_HIGH); mConversationChannel.setImportantConversation(true); @@ -1350,7 +1329,6 @@ public class NotificationConversationInfoTest extends SysuiTestCase { null, mIconFactory, mContext, - mBuilderProvider, true, mTestHandler, mTestHandler, null, Optional.of(mBubblesManager), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java index bfce2a568c78..9f537f5b6afc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java @@ -139,9 +139,6 @@ public class NotificationGutsManagerTest extends SysuiTestCase { @Mock private BubblesManager mBubblesManager; @Mock private ShadeController mShadeController; @Mock private PeopleSpaceWidgetManager mPeopleSpaceWidgetManager; - @Mock(answer = Answers.RETURNS_SELF) - private PriorityOnboardingDialogController.Builder mBuilder; - private Provider<PriorityOnboardingDialogController.Builder> mProvider = () -> mBuilder; @Mock private AssistantFeedbackController mAssistantFeedbackController; @Before @@ -163,7 +160,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase { () -> mStatusBar, mHandler, mHandler, mAccessibilityManager, mHighPriorityProvider, mINotificationManager, mNotificationEntryManager, mPeopleSpaceWidgetManager, mLauncherApps, mShortcutManager, mChannelEditorDialogController, mContextTracker, - mProvider, mAssistantFeedbackController, Optional.of(mBubblesManager), + mAssistantFeedbackController, Optional.of(mBubblesManager), new UiEventLoggerFake(), mOnUserInteractionCallback, mShadeController); mGutsManager.setUpWithPresenter(mPresenter, mNotificationListContainer, mCheckSaveListener, mOnSettingsClickListener); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java index a01e0b1c3e3a..f485b465e486 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java @@ -38,7 +38,6 @@ import androidx.test.filters.SmallTest; import com.android.systemui.R; import com.android.systemui.SysuiBaseFragmentTest; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.statusbar.events.PrivacyDotViewController; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; @@ -57,7 +56,7 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { private StatusBarStateController mStatusBarStateController; private OngoingCallController mOngoingCallController; private SystemStatusAnimationScheduler mAnimationScheduler; - private PrivacyDotViewController mDotViewController; + private StatusBarLocationPublisher mLocationPublisher; public CollapsedStatusBarFragmentTest() { super(CollapsedStatusBarFragment.class); @@ -224,12 +223,12 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { protected Fragment instantiate(Context context, String className, Bundle arguments) { mOngoingCallController = mock(OngoingCallController.class); mAnimationScheduler = mock(SystemStatusAnimationScheduler.class); - mDotViewController = mock(PrivacyDotViewController.class); + mLocationPublisher = mock(StatusBarLocationPublisher.class); setUpNotificationIconAreaController(); return new CollapsedStatusBarFragment( mOngoingCallController, mAnimationScheduler, - mDotViewController, + mLocationPublisher, mMockNotificationAreaController); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index b6eb4923ee4a..f98f00cd9187 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -20,6 +20,7 @@ import static com.android.systemui.statusbar.phone.ScrimController.OPAQUE; import static com.android.systemui.statusbar.phone.ScrimController.SEMI_TRANSPARENT; import static com.android.systemui.statusbar.phone.ScrimController.TRANSPARENT; +import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; @@ -165,7 +166,7 @@ public class ScrimControllerTest extends SysuiTestCase { endAnimation(mScrimInFront); endAnimation(mScrimForBubble); - Assert.assertEquals("Animators did not finish", + assertEquals("Animators did not finish", mAnimatorListener.getNumStarts(), mAnimatorListener.getNumEnds()); } @@ -422,7 +423,7 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.transitionTo(ScrimState.AOD); finishAnimationsImmediately(); mScrimController.setAodFrontScrimAlpha(0.3f); - Assert.assertEquals(ScrimState.AOD.getFrontAlpha(), mScrimInFront.getViewAlpha(), 0.001f); + assertEquals(ScrimState.AOD.getFrontAlpha(), mScrimInFront.getViewAlpha(), 0.001f); Assert.assertNotEquals(0.3f, mScrimInFront.getViewAlpha(), 0.001f); } @@ -601,13 +602,13 @@ public class ScrimControllerTest extends SysuiTestCase { )); // Front scrim should be transparent - Assert.assertEquals(ScrimController.TRANSPARENT, + assertEquals(ScrimController.TRANSPARENT, mScrimInFront.getViewAlpha(), 0.0f); // Back scrim should be visible - Assert.assertEquals(ScrimController.BUSY_SCRIM_ALPHA, + assertEquals(ScrimController.BUSY_SCRIM_ALPHA, mScrimBehind.getViewAlpha(), 0.0f); // Bubble scrim should be visible - Assert.assertEquals(ScrimController.BUBBLE_SCRIM_ALPHA, + assertEquals(ScrimController.BUBBLE_SCRIM_ALPHA, mScrimForBubble.getViewAlpha(), 0.0f); } @@ -615,15 +616,15 @@ public class ScrimControllerTest extends SysuiTestCase { public void scrimStateCallback() { mScrimController.transitionTo(ScrimState.UNLOCKED); finishAnimationsImmediately(); - Assert.assertEquals(mScrimState, ScrimState.UNLOCKED); + assertEquals(mScrimState, ScrimState.UNLOCKED); mScrimController.transitionTo(ScrimState.BOUNCER); finishAnimationsImmediately(); - Assert.assertEquals(mScrimState, ScrimState.BOUNCER); + assertEquals(mScrimState, ScrimState.BOUNCER); mScrimController.transitionTo(ScrimState.BOUNCER_SCRIMMED); finishAnimationsImmediately(); - Assert.assertEquals(mScrimState, ScrimState.BOUNCER_SCRIMMED); + assertEquals(mScrimState, ScrimState.BOUNCER_SCRIMMED); } @Test @@ -638,13 +639,13 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.setPanelExpansion(1.0f); finishAnimationsImmediately(); - Assert.assertEquals("Scrim alpha should change after setPanelExpansion", + assertEquals("Scrim alpha should change after setPanelExpansion", mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f); mScrimController.setPanelExpansion(0f); finishAnimationsImmediately(); - Assert.assertEquals("Scrim alpha should change after setPanelExpansion", + assertEquals("Scrim alpha should change after setPanelExpansion", mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f); } @@ -698,7 +699,7 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.setExpansionAffectsAlpha(false); mScrimController.setPanelExpansion(0.8f); verifyZeroInteractions(mScrimBehind); - Assert.assertEquals("Scrim opacity shouldn't change when setExpansionAffectsAlpha " + assertEquals("Scrim opacity shouldn't change when setExpansionAffectsAlpha " + "is false", scrimAlpha, mScrimBehind.getViewAlpha(), 0.01f); mScrimController.setExpansionAffectsAlpha(true); @@ -801,9 +802,9 @@ public class ScrimControllerTest extends SysuiTestCase { } }); finishAnimationsImmediately(); - Assert.assertEquals("onStart called in wrong order", 1, callOrder[0]); - Assert.assertEquals("onDisplayBlanked called in wrong order", 2, callOrder[1]); - Assert.assertEquals("onFinished called in wrong order", 3, callOrder[2]); + assertEquals("onStart called in wrong order", 1, callOrder[0]); + assertEquals("onDisplayBlanked called in wrong order", 2, callOrder[1]); + assertEquals("onFinished called in wrong order", 3, callOrder[2]); } @Test @@ -911,7 +912,7 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.transitionTo(ScrimState.UNLOCKED); finishAnimationsImmediately(); - Assert.assertEquals("Scrim expansion opacity wasn't conserved when transitioning back", + assertEquals("Scrim expansion opacity wasn't conserved when transitioning back", expandedAlpha, mScrimBehind.getViewAlpha(), 0.01f); } @@ -981,7 +982,7 @@ public class ScrimControllerTest extends SysuiTestCase { } mScrimController.transitionTo(state); finishAnimationsImmediately(); - Assert.assertEquals("Should be clickable unless AOD or PULSING, was: " + state, + assertEquals("Should be clickable unless AOD or PULSING, was: " + state, mScrimBehind.getViewAlpha() != 0 && !eatsTouches.contains(state), mScrimBehind.isClickable()); } @@ -1035,9 +1036,9 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.setQsPosition(0, 300); finishAnimationsImmediately(); - Assert.assertEquals("Behind scrim should be opaque", + assertEquals("Behind scrim should be opaque", mScrimBehind.getViewAlpha(), 1, 0.0); - Assert.assertEquals("Notifications scrim should be opaque", + assertEquals("Notifications scrim should be opaque", mNotificationsScrim.getViewAlpha(), 1, 0.0); } @@ -1093,6 +1094,40 @@ public class ScrimControllerTest extends SysuiTestCase { mNotificationsScrim, TRANSPARENT)); } + @Test + public void testNotificationScrimVisible_afterOpeningShadeFromLockscreen() { + mScrimController.setPanelExpansion(1); + mScrimController.transitionTo(ScrimState.SHADE_LOCKED); + finishAnimationsImmediately(); + + assertScrimAlpha(Map.of( + mScrimBehind, OPAQUE, + mNotificationsScrim, OPAQUE)); + } + + @Test + public void testNotificationTransparency_followsPanelExpansionInShadeLockedState() { + mScrimController.transitionTo(ScrimState.SHADE_LOCKED); + + assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.8f, /* expansion */ 0.8f); + assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.2f, /* expansion */ 0.2f); + } + + @Test + public void testNotificationTransparency_inKeyguardState() { + mScrimController.transitionTo(ScrimState.KEYGUARD); + + assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.2f, /* expansion */ 0.8f); + assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.8f, /* expansion */ 0.2f); + } + + private void assertAlphaAfterExpansion(ScrimView scrim, float expectedAlpha, float expansion) { + mScrimController.setPanelExpansion(expansion); + finishAnimationsImmediately(); + // alpha is not changing linearly thus 0.2 of leeway when asserting + assertEquals(expectedAlpha, mNotificationsScrim.getViewAlpha(), 0.2); + } + private void assertScrimTinted(Map<ScrimView, Boolean> scrimToTint) { scrimToTint.forEach((scrim, hasTint) -> assertScrimTint(scrim, hasTint)); } @@ -1101,7 +1136,7 @@ public class ScrimControllerTest extends SysuiTestCase { String message = "Tint test failed at state " + mScrimController.getState() + " with scrim: " + getScrimName(scrim) + " and tint: " + Integer.toHexString(scrim.getTint()); - Assert.assertEquals(message, hasTint, scrim.getTint() != Color.TRANSPARENT); + assertEquals(message, hasTint, scrim.getTint() != Color.TRANSPARENT); } private String getScrimName(ScrimView scrim) { @@ -1146,13 +1181,13 @@ public class ScrimControllerTest extends SysuiTestCase { } else { visibility = TRANSPARENT; } - Assert.assertEquals("Invalid visibility.", + assertEquals("Invalid visibility.", visibility /* expected */, mScrimVisibility); } private void assertScrimAlpha(ScrimView scrim, int expectedAlpha) { - Assert.assertEquals("Unexpected " + getScrimName(scrim) + " scrim alpha: " + assertEquals("Unexpected " + getScrimName(scrim) + " scrim alpha: " + scrim.getViewAlpha(), expectedAlpha != TRANSPARENT /* expected */, scrim.getViewAlpha() > TRANSPARENT /* actual */); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index 545e2e08ec07..b2487e8e2444 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -115,7 +115,6 @@ import com.android.systemui.statusbar.StatusBarStateControllerImpl; import com.android.systemui.statusbar.SuperStatusBarViewFactory; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.charging.WiredChargingRippleController; -import com.android.systemui.statusbar.events.PrivacyDotViewController; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.NotificationEntryListener; @@ -267,7 +266,7 @@ public class StatusBarTest extends SysuiTestCase { @Mock private WiredChargingRippleController mWiredChargingRippleController; @Mock private OngoingCallController mOngoingCallController; @Mock private SystemStatusAnimationScheduler mAnimationScheduler; - @Mock private PrivacyDotViewController mDotViewController; + @Mock private StatusBarLocationPublisher mLocationPublisher; @Mock private FeatureFlags mFeatureFlags; @Mock private IWallpaperManager mWallpaperManager; @Mock private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; @@ -437,7 +436,7 @@ public class StatusBarTest extends SysuiTestCase { mWiredChargingRippleController, mOngoingCallController, mAnimationScheduler, - mDotViewController, + mLocationPublisher, mFeatureFlags, mKeyguardUnlockAnimationController); when(mKeyguardViewMediator.registerStatusBar(any(StatusBar.class), any(ViewGroup.class), diff --git a/services/Android.bp b/services/Android.bp index 2281a159f6f7..1dd219264575 100644 --- a/services/Android.bp +++ b/services/Android.bp @@ -190,13 +190,13 @@ droidstubs { defaults: ["services-stubs-default"], check_api: { current: { - api_file: "api/non-updatable-current.txt", - removed_api_file: "api/non-updatable-removed.txt", + api_file: "api/current.txt", + removed_api_file: "api/removed.txt", }, api_lint: { enabled: true, new_since: ":android-non-updatable.api.system-server.latest", - baseline_file: "api/non-updatable-lint-baseline.txt", + baseline_file: "api/lint-baseline.txt", }, }, dists: [ diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java index 61de53a2a483..7403af7605bc 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java @@ -16,6 +16,9 @@ package com.android.server.accessibility; +import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY; +import static android.view.WindowManager.LayoutParams.TYPE_MAGNIFICATION_OVERLAY; + import android.annotation.MainThread; import android.content.Context; import android.graphics.Region; @@ -557,12 +560,16 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo MagnificationGestureHandler magnificationGestureHandler; if (mAms.getMagnificationMode(displayId) == Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW) { - magnificationGestureHandler = new WindowMagnificationGestureHandler(displayContext, + final Context uiContext = displayContext.createWindowContext( + TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY, null /* options */); + magnificationGestureHandler = new WindowMagnificationGestureHandler(uiContext, mAms.getWindowMagnificationMgr(), mAms.getMagnificationController(), detectControlGestures, triggerable, displayId); } else { - magnificationGestureHandler = new FullScreenMagnificationGestureHandler(displayContext, + final Context uiContext = displayContext.createWindowContext( + TYPE_MAGNIFICATION_OVERLAY, null /* options */); + magnificationGestureHandler = new FullScreenMagnificationGestureHandler(uiContext, mAms.getFullScreenMagnificationController(), mAms.getMagnificationController(), detectControlGestures, triggerable, new WindowMagnificationPromptController(displayContext, mUserId), displayId); diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java index 2434e2ca0b54..f7d1b9a311ba 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java @@ -34,6 +34,7 @@ import static java.util.Arrays.copyOfRange; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.UiContext; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -139,7 +140,7 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH private PointerCoords[] mTempPointerCoords; private PointerProperties[] mTempPointerProperties; - public FullScreenMagnificationGestureHandler(Context context, + public FullScreenMagnificationGestureHandler(@UiContext Context context, FullScreenMagnificationController fullScreenMagnificationController, Callback callback, boolean detectTripleTap, diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/PanningScalingHandler.java b/services/accessibility/java/com/android/server/accessibility/magnification/PanningScalingHandler.java index 07f22dcb2c95..c5495d98226e 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/PanningScalingHandler.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/PanningScalingHandler.java @@ -19,6 +19,7 @@ package com.android.server.accessibility.magnification; import static java.lang.Math.abs; import android.annotation.NonNull; +import android.annotation.UiContext; import android.content.Context; import android.os.Handler; import android.util.Log; @@ -63,8 +64,8 @@ class PanningScalingHandler extends private boolean mScaling; private boolean mEnable; - PanningScalingHandler(Context context, float maxScale, float minScale, boolean blockScroll, - @NonNull MagnificationDelegate magnificationDelegate) { + PanningScalingHandler(@UiContext Context context, float maxScale, float minScale, + boolean blockScroll, @NonNull MagnificationDelegate magnificationDelegate) { mDisplayId = context.getDisplayId(); mMaxScale = maxScale; mMinScale = minScale; diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java index fa3406217fa8..4fb9a03b8ac1 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java @@ -24,6 +24,7 @@ import static java.util.Arrays.asList; import static java.util.Arrays.copyOfRange; import android.annotation.Nullable; +import android.annotation.UiContext; import android.content.Context; import android.graphics.Point; import android.provider.Settings; @@ -86,7 +87,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl private final Context mContext; private final Point mTempPoint = new Point(); - public WindowMagnificationGestureHandler(Context context, + public WindowMagnificationGestureHandler(@UiContext Context context, WindowMagnificationManager windowMagnificationMgr, Callback callback, boolean detectTripleTap, boolean detectShortcutTrigger, int displayId) { @@ -342,7 +343,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl */ private final boolean mDetectTripleTap; - DetectingState(Context context, boolean detectTripleTap) { + DetectingState(@UiContext Context context, boolean detectTripleTap) { mDetectTripleTap = detectTripleTap; final MultiTap multiTap = new MultiTap(context, mDetectTripleTap ? 3 : 1, mDetectTripleTap diff --git a/services/api/Android.bp b/services/api/Android.bp index bbc8c72b2eef..ee7d49fc99c8 100644 --- a/services/api/Android.bp +++ b/services/api/Android.bp @@ -24,12 +24,12 @@ package { filegroup { name: "non-updatable-system-server-current.txt", - srcs: ["non-updatable-current.txt"], + srcs: ["current.txt"], visibility: ["//frameworks/base/api"], } filegroup { name: "non-updatable-system-server-removed.txt", - srcs: ["non-updatable-removed.txt"], + srcs: ["removed.txt"], visibility: ["//frameworks/base/api"], } diff --git a/services/api/current.txt b/services/api/current.txt index a0b1e3349e77..475dcf5eb20e 100644 --- a/services/api/current.txt +++ b/services/api/current.txt @@ -1,57 +1,4 @@ // Signature format: 2.0 -package com.android.permission.persistence { - - public interface RuntimePermissionsPersistence { - method @NonNull public static com.android.permission.persistence.RuntimePermissionsPersistence createInstance(); - method public void deleteForUser(@NonNull android.os.UserHandle); - method @Nullable public com.android.permission.persistence.RuntimePermissionsState readForUser(@NonNull android.os.UserHandle); - method public void writeForUser(@NonNull com.android.permission.persistence.RuntimePermissionsState, @NonNull android.os.UserHandle); - } - - public final class RuntimePermissionsState { - ctor public RuntimePermissionsState(int, @Nullable String, @NonNull java.util.Map<java.lang.String,java.util.List<com.android.permission.persistence.RuntimePermissionsState.PermissionState>>, @NonNull java.util.Map<java.lang.String,java.util.List<com.android.permission.persistence.RuntimePermissionsState.PermissionState>>); - method @Nullable public String getFingerprint(); - method @NonNull public java.util.Map<java.lang.String,java.util.List<com.android.permission.persistence.RuntimePermissionsState.PermissionState>> getPackagePermissions(); - method @NonNull public java.util.Map<java.lang.String,java.util.List<com.android.permission.persistence.RuntimePermissionsState.PermissionState>> getSharedUserPermissions(); - method public int getVersion(); - field public static final int NO_VERSION = -1; // 0xffffffff - } - - public static final class RuntimePermissionsState.PermissionState { - ctor public RuntimePermissionsState.PermissionState(@NonNull String, boolean, int); - method public int getFlags(); - method @NonNull public String getName(); - method public boolean isGranted(); - } - -} - -package com.android.role { - - public interface RoleManagerLocal { - method @NonNull public java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getRolesAndHolders(int); - } - -} - -package com.android.role.persistence { - - public interface RolesPersistence { - method @NonNull public static com.android.role.persistence.RolesPersistence createInstance(); - method public void deleteForUser(@NonNull android.os.UserHandle); - method @Nullable public com.android.role.persistence.RolesState readForUser(@NonNull android.os.UserHandle); - method public void writeForUser(@NonNull com.android.role.persistence.RolesState, @NonNull android.os.UserHandle); - } - - public final class RolesState { - ctor public RolesState(int, @Nullable String, @NonNull java.util.Map<java.lang.String,java.util.Set<java.lang.String>>); - method @Nullable public String getPackagesHash(); - method @NonNull public java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getRoles(); - method public int getVersion(); - } - -} - package com.android.server { public final class LocalManagerRegistry { diff --git a/services/api/lint-baseline.txt b/services/api/lint-baseline.txt index e985ddb5352b..b46d21edd44c 100644 --- a/services/api/lint-baseline.txt +++ b/services/api/lint-baseline.txt @@ -1,4 +1,8 @@ // Baseline format: 1.0 +NotCloseable: com.android.server.wifi.SupplicantManager: + Classes that release resources (stop()) should implement AutoClosable and CloseGuard: class com.android.server.wifi.SupplicantManager + + ProtectedMember: com.android.server.SystemService#publishBinderService(String, android.os.IBinder): Protected methods not allowed; must be public: method com.android.server.SystemService.publishBinderService(String,android.os.IBinder)} ProtectedMember: com.android.server.SystemService#publishBinderService(String, android.os.IBinder, boolean): diff --git a/services/api/non-updatable-current.txt b/services/api/non-updatable-current.txt deleted file mode 100644 index 475dcf5eb20e..000000000000 --- a/services/api/non-updatable-current.txt +++ /dev/null @@ -1,71 +0,0 @@ -// Signature format: 2.0 -package com.android.server { - - public final class LocalManagerRegistry { - method public static <T> void addManager(@NonNull Class<T>, @NonNull T); - method @Nullable public static <T> T getManager(@NonNull Class<T>); - } - - public abstract class SystemService { - ctor public SystemService(@NonNull android.content.Context); - method @NonNull public final android.content.Context getContext(); - method public boolean isUserSupported(@NonNull com.android.server.SystemService.TargetUser); - method public void onBootPhase(int); - method public abstract void onStart(); - method public void onUserStarting(@NonNull com.android.server.SystemService.TargetUser); - method public void onUserStopped(@NonNull com.android.server.SystemService.TargetUser); - method public void onUserStopping(@NonNull com.android.server.SystemService.TargetUser); - method public void onUserSwitching(@Nullable com.android.server.SystemService.TargetUser, @NonNull com.android.server.SystemService.TargetUser); - method public void onUserUnlocked(@NonNull com.android.server.SystemService.TargetUser); - method public void onUserUnlocking(@NonNull com.android.server.SystemService.TargetUser); - method protected final void publishBinderService(@NonNull String, @NonNull android.os.IBinder); - method protected final void publishBinderService(@NonNull String, @NonNull android.os.IBinder, boolean); - field public static final int PHASE_ACTIVITY_MANAGER_READY = 550; // 0x226 - field public static final int PHASE_BOOT_COMPLETED = 1000; // 0x3e8 - field public static final int PHASE_DEVICE_SPECIFIC_SERVICES_READY = 520; // 0x208 - field public static final int PHASE_LOCK_SETTINGS_READY = 480; // 0x1e0 - field public static final int PHASE_SYSTEM_SERVICES_READY = 500; // 0x1f4 - field public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600; // 0x258 - field public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100; // 0x64 - } - - public static final class SystemService.TargetUser { - method @NonNull public android.os.UserHandle getUserHandle(); - } - -} - -package com.android.server.am { - - public interface ActivityManagerLocal { - method public boolean canStartForegroundService(int, int, @NonNull String); - } - -} - -package com.android.server.role { - - public interface RoleServicePlatformHelper { - method @NonNull public String computePackageStateHash(int); - method @NonNull public java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getLegacyRoleState(int); - } - -} - -package com.android.server.stats { - - public final class StatsHelper { - method public static void sendStatsdReadyBroadcast(@NonNull android.content.Context); - } - -} - -package com.android.server.wifi { - - public class SupplicantManager { - method public static void start(); - method public static void stop(); - } - -} - diff --git a/services/api/non-updatable-lint-baseline.txt b/services/api/non-updatable-lint-baseline.txt deleted file mode 100644 index b46d21edd44c..000000000000 --- a/services/api/non-updatable-lint-baseline.txt +++ /dev/null @@ -1,9 +0,0 @@ -// Baseline format: 1.0 -NotCloseable: com.android.server.wifi.SupplicantManager: - Classes that release resources (stop()) should implement AutoClosable and CloseGuard: class com.android.server.wifi.SupplicantManager - - -ProtectedMember: com.android.server.SystemService#publishBinderService(String, android.os.IBinder): - Protected methods not allowed; must be public: method com.android.server.SystemService.publishBinderService(String,android.os.IBinder)} -ProtectedMember: com.android.server.SystemService#publishBinderService(String, android.os.IBinder, boolean): - Protected methods not allowed; must be public: method com.android.server.SystemService.publishBinderService(String,android.os.IBinder,boolean)} diff --git a/services/api/non-updatable-removed.txt b/services/api/non-updatable-removed.txt deleted file mode 100644 index d802177e249b..000000000000 --- a/services/api/non-updatable-removed.txt +++ /dev/null @@ -1 +0,0 @@ -// Signature format: 2.0 diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 816c50dde2a8..76a6c0eecd3e 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -1133,7 +1133,7 @@ public abstract class PackageManagerInternal implements PackageSettingsSnapshotP * @param handler to use for postponed calculations. */ public abstract void requestChecksums(@NonNull String packageName, boolean includeSplits, - @Checksum.Type int optional, @Checksum.Type int required, + @Checksum.TypeMask int optional, @Checksum.TypeMask int required, @Nullable List trustedInstallers, @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId, @NonNull Executor executor, @NonNull Handler handler); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 9aedf1504df5..d526ebc8e581 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -14831,7 +14831,7 @@ public class ActivityManagerService extends IActivityManager.Stub throw new IllegalArgumentException("null fd"); } - synchronized (mProcLock) { + synchronized (this) { ProcessRecord proc = findProcessLOSP(process, userId, "dumpHeap"); IApplicationThread thread; if (proc == null || (thread = proc.getThread()) == null) { diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java index b7ef10a5d45d..d2c6c6c620dd 100644 --- a/services/core/java/com/android/server/app/GameManagerService.java +++ b/services/core/java/com/android/server/app/GameManagerService.java @@ -56,6 +56,7 @@ import android.os.ShellCallback; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.KeyValueListParser; import android.util.Slog; @@ -180,9 +181,14 @@ public final class GameManagerService extends IGameManagerService.Stub { break; } case POPULATE_GAME_MODE_SETTINGS: { + // Scan all game packages and re-enforce the configured compat mode overrides + // as the DeviceConfig may have be wiped/since last reboot and we can't risk + // having overrides configured for packages that no longer have any DeviceConfig + // and thus any way to escape compat mode. removeMessages(POPULATE_GAME_MODE_SETTINGS, msg.obj); - loadDeviceConfigLocked(); - break; + final int userId = (int) msg.obj; + final String[] packageNames = getInstalledGamePackageNames(userId); + updateConfigsForUser(userId, packageNames); } } } @@ -198,28 +204,8 @@ public final class GameManagerService extends IGameManagerService.Stub { @Override public void onPropertiesChanged(Properties properties) { - synchronized (mDeviceConfigLock) { - for (final String packageName : properties.getKeyset()) { - try { - // Check if the package is installed before caching it. - mPackageManager.getPackageInfo(packageName, 0); - final GamePackageConfiguration config = - GamePackageConfiguration.fromProperties(packageName, properties); - if (config.isValid()) { - putConfig(config); - } else { - // This means that we received a bad config, or the config was deleted. - Slog.i(TAG, "Removing config for: " + packageName); - mConfigs.remove(packageName); - disableCompatScale(packageName); - } - } catch (PackageManager.NameNotFoundException e) { - if (DEBUG) { - Slog.v(TAG, "Package name not found", e); - } - } - } - } + final String[] packageNames = properties.getKeyset().toArray(new String[0]); + updateConfigsForUser(mContext.getUserId(), packageNames); } @Override @@ -228,80 +214,166 @@ public final class GameManagerService extends IGameManagerService.Stub { } } - private static class GameModeConfiguration { - public static final String TAG = "GameManagerService_GameModeConfiguration"; - public static final String MODE_KEY = "mode"; - public static final String SCALING_KEY = "downscaleFactor"; + /** + * GamePackageConfiguration manages all game mode config details for its associated package. + */ + @VisibleForTesting + public class GamePackageConfiguration { + public static final String TAG = "GameManagerService_GamePackageConfiguration"; - private final @GameMode int mGameMode; - private final String mScaling; + /** + * Metadata that can be included in the app manifest to allow/disallow any window manager + * downscaling interventions. Default value is TRUE. + */ + public static final String METADATA_WM_ALLOW_DOWNSCALE = + "com.android.graphics.intervention.wm.allowDownscale"; - private GameModeConfiguration(@NonNull int gameMode, - @NonNull String scaling) { - mGameMode = gameMode; - mScaling = scaling; - } + /** + * Metadata that needs to be included in the app manifest to OPT-IN to PERFORMANCE mode. + * This means the app will assume full responsibility for the experience provided by this + * mode and the system will enable no window manager downscaling. + * Default value is FALSE + */ + public static final String METADATA_PERFORMANCE_MODE_ENABLE = + "com.android.app.gamemode.performance.enabled"; - public static GameModeConfiguration fromKeyValueListParser(KeyValueListParser parser) { - return new GameModeConfiguration( - parser.getInt(MODE_KEY, GameManager.GAME_MODE_UNSUPPORTED), - parser.getString(SCALING_KEY, "1.0") - ); - } + /** + * Metadata that needs to be included in the app manifest to OPT-IN to BATTERY mode. + * This means the app will assume full responsibility for the experience provided by this + * mode and the system will enable no window manager downscaling. + * Default value is FALSE + */ + public static final String METADATA_BATTERY_MODE_ENABLE = + "com.android.app.gamemode.battery.enabled"; - public int getGameMode() { - return mGameMode; - } + private final String mPackageName; + private final ArrayMap<Integer, GameModeConfiguration> mModeConfigs; + private boolean mPerfModeOptedIn; + private boolean mBatteryModeOptedIn; + private boolean mAllowDownscale; - public String getScaling() { - return mScaling; + GamePackageConfiguration(String packageName, int userId) { + mPackageName = packageName; + mModeConfigs = new ArrayMap<>(); + try { + final ApplicationInfo ai = mPackageManager.getApplicationInfoAsUser(packageName, + PackageManager.GET_META_DATA, userId); + if (ai.metaData != null) { + mPerfModeOptedIn = ai.metaData.getBoolean(METADATA_PERFORMANCE_MODE_ENABLE); + mBatteryModeOptedIn = ai.metaData.getBoolean(METADATA_BATTERY_MODE_ENABLE); + mAllowDownscale = ai.metaData.getBoolean(METADATA_WM_ALLOW_DOWNSCALE, true); + } else { + mPerfModeOptedIn = false; + mBatteryModeOptedIn = false; + mAllowDownscale = true; + } + } catch (PackageManager.NameNotFoundException e) { + Slog.e(TAG, "Failed to get package metadata", e); + } + final String configString = DeviceConfig.getProperty( + DeviceConfig.NAMESPACE_GAME_OVERLAY, packageName); + if (configString != null) { + final String[] gameModeConfigStrings = configString.split(":"); + for (String gameModeConfigString : gameModeConfigStrings) { + try { + final KeyValueListParser parser = new KeyValueListParser(','); + parser.setString(gameModeConfigString); + addModeConfig(new GameModeConfiguration(parser)); + } catch (IllegalArgumentException e) { + Slog.e(TAG, "Invalid config string"); + } + } + } } - public boolean isValid() { - return (mGameMode == GameManager.GAME_MODE_PERFORMANCE - || mGameMode == GameManager.GAME_MODE_BATTERY) && getCompatChangeId() != 0; - } + /** + * GameModeConfiguration contains all the values for all the interventions associated with + * a game mode. + */ + @VisibleForTesting + public class GameModeConfiguration { + public static final String TAG = "GameManagerService_GameModeConfiguration"; + public static final String MODE_KEY = "mode"; + public static final String SCALING_KEY = "downscaleFactor"; + public static final String DEFAULT_SCALING = "1.0"; + + private final @GameMode int mGameMode; + private final String mScaling; + + GameModeConfiguration(KeyValueListParser parser) { + mGameMode = parser.getInt(MODE_KEY, GameManager.GAME_MODE_UNSUPPORTED); + mScaling = !mAllowDownscale || isGameModeOptedIn(mGameMode) + ? DEFAULT_SCALING : parser.getString(SCALING_KEY, DEFAULT_SCALING); + } - public String toString() { - return "[Game Mode:" + mGameMode + ",Scaling:" + mScaling + "]"; - } + public int getGameMode() { + return mGameMode; + } - public long getCompatChangeId() { - switch (mScaling) { - case "0.5": - return DOWNSCALE_50; - case "0.6": - return DOWNSCALE_60; - case "0.7": - return DOWNSCALE_70; - case "0.8": - return DOWNSCALE_80; - case "0.9": - return DOWNSCALE_90; + public String getScaling() { + return mScaling; } - return 0; - } - } - private static class GamePackageConfiguration { - public static final String TAG = "GameManagerService_GamePackageConfiguration"; + public boolean isValid() { + return (mGameMode == GameManager.GAME_MODE_PERFORMANCE + || mGameMode == GameManager.GAME_MODE_BATTERY) + && (!mAllowDownscale || getCompatChangeId() != 0); + } - private final String mPackageName; - private final ArrayMap<Integer, GameModeConfiguration> mModeConfigs; + /** + * @hide + */ + public String toString() { + return "[Game Mode:" + mGameMode + ",Scaling:" + mScaling + "]"; + } - private GamePackageConfiguration(String packageName) { - mPackageName = packageName; - mModeConfigs = new ArrayMap<>(); + /** + * Get the corresponding compat change id for the current scaling string. + */ + public long getCompatChangeId() { + switch (mScaling) { + case "0.5": + return DOWNSCALE_50; + case "0.6": + return DOWNSCALE_60; + case "0.7": + return DOWNSCALE_70; + case "0.8": + return DOWNSCALE_80; + case "0.9": + return DOWNSCALE_90; + } + return 0; + } } public String getPackageName() { return mPackageName; } + /** + * Gets whether a package has opted into a game mode via its manifest. + * + * @return True if the app package has specified in its metadata either: + * "com.android.app.gamemode.performance.enabled" or + * "com.android.app.gamemode.battery.enabled" with a value of "true" + */ + public boolean isGameModeOptedIn(@GameMode int gameMode) { + return (mBatteryModeOptedIn && gameMode == GameManager.GAME_MODE_BATTERY) + || (mPerfModeOptedIn && gameMode == GameManager.GAME_MODE_PERFORMANCE); + } + public @GameMode int[] getAvailableGameModes() { - if (mModeConfigs.keySet().size() > 0) { - return mModeConfigs.keySet().stream() - .mapToInt(Integer::intValue).toArray(); + ArraySet<Integer> modeSet = new ArraySet<>(mModeConfigs.keySet()); + if (mBatteryModeOptedIn) { + modeSet.add(GameManager.GAME_MODE_BATTERY); + } + if (mPerfModeOptedIn) { + modeSet.add(GameManager.GAME_MODE_PERFORMANCE); + } + if (modeSet.size() > 0) { + modeSet.add(GameManager.GAME_MODE_STANDARD); + return modeSet.stream().mapToInt(Integer::intValue).toArray(); } return new int[]{GameManager.GAME_MODE_UNSUPPORTED}; } @@ -327,30 +399,8 @@ public final class GameManagerService extends IGameManagerService.Stub { } } - /** - * Create a new instance from a package name and DeviceConfig.Properties instance - */ - public static GamePackageConfiguration fromProperties(String key, - Properties properties) { - final GamePackageConfiguration packageConfig = new GamePackageConfiguration(key); - final String configString = properties.getString(key, ""); - final String[] gameModeConfigStrings = configString.split(":"); - for (String gameModeConfigString : gameModeConfigStrings) { - try { - final KeyValueListParser parser = new KeyValueListParser(','); - parser.setString(gameModeConfigString); - final GameModeConfiguration config = - GameModeConfiguration.fromKeyValueListParser(parser); - packageConfig.addModeConfig(config); - } catch (IllegalArgumentException e) { - Slog.e(TAG, "Invalid config string"); - } - } - return packageConfig; - } - public boolean isValid() { - return mModeConfigs.size() > 0; + return mModeConfigs.size() > 0 || mBatteryModeOptedIn || mPerfModeOptedIn; } public String toString() { @@ -534,8 +584,6 @@ public final class GameManagerService extends IGameManagerService.Stub { @VisibleForTesting void onBootCompleted() { Slog.d(TAG, "onBootCompleted"); - final Message msg = mHandler.obtainMessage(POPULATE_GAME_MODE_SETTINGS); - mHandler.sendMessage(msg); } void onUserStarting(int userId) { @@ -549,6 +597,9 @@ public final class GameManagerService extends IGameManagerService.Stub { mSettings.put(userId, userSettings); userSettings.readPersistentDataLocked(); } + final Message msg = mHandler.obtainMessage(POPULATE_GAME_MODE_SETTINGS); + msg.obj = userId; + mHandler.sendMessage(msg); } void onUserStopping(int userId) { @@ -562,24 +613,14 @@ public final class GameManagerService extends IGameManagerService.Stub { } } - void loadDeviceConfigLocked() { - final List<PackageInfo> packages = mPackageManager.getInstalledPackages(0); - final String[] packageNames = packages.stream().map(e -> e.packageName) - .toArray(String[]::new); - synchronized (mDeviceConfigLock) { - final Properties properties = DeviceConfig.getProperties( - DeviceConfig.NAMESPACE_GAME_OVERLAY, packageNames); - for (String key : properties.getKeyset()) { - final GamePackageConfiguration config = - GamePackageConfiguration.fromProperties(key, properties); - putConfig(config); - } - } - } - - private void disableCompatScale(String packageName) { + /** + * @hide + */ + @VisibleForTesting + public void disableCompatScale(String packageName) { final long uid = Binder.clearCallingIdentity(); try { + Slog.i(TAG, "Disabling downscale for " + packageName); final ArrayMap<Long, PackageOverride> overrides = new ArrayMap<>(); overrides.put(DOWNSCALED, COMPAT_DISABLED); final CompatibilityOverrideConfig changeConfig = new CompatibilityOverrideConfig( @@ -597,6 +638,7 @@ public final class GameManagerService extends IGameManagerService.Stub { private void enableCompatScale(String packageName, long scaleId) { final long uid = Binder.clearCallingIdentity(); try { + Slog.i(TAG, "Enabling downscale: " + scaleId + " for " + packageName); final ArrayMap<Long, PackageOverride> overrides = new ArrayMap<>(); overrides.put(DOWNSCALED, COMPAT_ENABLED); overrides.put(DOWNSCALE_50, COMPAT_DISABLED); @@ -622,21 +664,25 @@ public final class GameManagerService extends IGameManagerService.Stub { if (gameMode == GameManager.GAME_MODE_STANDARD || gameMode == GameManager.GAME_MODE_UNSUPPORTED) { disableCompatScale(packageName); - Slog.v(TAG, "Disabling downscale"); + return; + } + final GamePackageConfiguration packageConfig = mConfigs.get(packageName); + if (packageConfig == null) { + disableCompatScale(packageName); + Slog.v(TAG, "Package configuration not found for " + packageName); return; } if (DEBUG) { Slog.v(TAG, dumpDeviceConfigs()); } - final GamePackageConfiguration packageConfig = mConfigs.get(packageName); - if (packageConfig == null) { - Slog.w(TAG, "Package configuration not found for " + packageName); + if (packageConfig.isGameModeOptedIn(gameMode)) { + disableCompatScale(packageName); return; } - final GameModeConfiguration modeConfig = packageConfig.getGameModeConfiguration( - gameMode); + final GamePackageConfiguration.GameModeConfiguration modeConfig = + packageConfig.getGameModeConfiguration(gameMode); if (modeConfig == null) { - Slog.w(TAG, "Game mode " + gameMode + " not found for " + packageName); + Slog.i(TAG, "Game mode " + gameMode + " not found for " + packageName); return; } long scaleId = modeConfig.getCompatChangeId(); @@ -645,23 +691,64 @@ public final class GameManagerService extends IGameManagerService.Stub { + packageName); return; } - Slog.i(TAG, "Enabling downscale: " + scaleId + " for " + packageName); + enableCompatScale(packageName, scaleId); } } - private void putConfig(GamePackageConfiguration config) { - if (config.isValid()) { - if (DEBUG) { - Slog.i(TAG, "Adding config: " + config.toString()); + /** + * @hide + */ + @VisibleForTesting + public void updateConfigsForUser(int userId, String ...packageNames) { + try { + synchronized (mDeviceConfigLock) { + for (String packageName : packageNames) { + GamePackageConfiguration config = + new GamePackageConfiguration(packageName, userId); + if (config.isValid()) { + if (DEBUG) { + Slog.i(TAG, "Adding config: " + config.toString()); + } + mConfigs.put(packageName, config); + } else { + Slog.w(TAG, "Invalid package config for " + + config.getPackageName() + ":" + config.toString()); + mConfigs.remove(packageName); + } + } } - mConfigs.put(config.getPackageName(), config); - } else { - Slog.w(TAG, "Invalid package config for " - + config.getPackageName() + ":" + config.toString()); + for (String packageName : packageNames) { + synchronized (mLock) { + if (mSettings.containsKey(userId)) { + GameManagerSettings userSettings = mSettings.get(userId); + updateCompatModeDownscale(packageName, + userSettings.getGameModeLocked(packageName)); + } + } + } + } catch (Exception e) { + Slog.e(TAG, "Failed to update compat modes for user: " + userId); } } + private String[] getInstalledGamePackageNames(int userId) { + final List<PackageInfo> packages = + mPackageManager.getInstalledPackagesAsUser(0, userId); + return packages.stream().filter(e -> e.applicationInfo != null && e.applicationInfo.category + == ApplicationInfo.CATEGORY_GAME) + .map(e -> e.packageName) + .toArray(String[]::new); + } + + /** + * @hide + */ + @VisibleForTesting + public GamePackageConfiguration getConfig(String packageName) { + return mConfigs.get(packageName); + } + private void registerPackageReceiver() { final IntentFilter packageFilter = new IntentFilter(); packageFilter.addAction(ACTION_PACKAGE_ADDED); @@ -677,16 +764,7 @@ public final class GameManagerService extends IGameManagerService.Stub { switch (intent.getAction()) { case ACTION_PACKAGE_ADDED: case ACTION_PACKAGE_CHANGED: - synchronized (mDeviceConfigLock) { - Properties properties = DeviceConfig.getProperties( - DeviceConfig.NAMESPACE_GAME_OVERLAY, packageName); - for (String key : properties.getKeyset()) { - GamePackageConfiguration config = - GamePackageConfiguration.fromProperties(key, - properties); - putConfig(config); - } - } + updateConfigsForUser(mContext.getUserId(), packageName); break; case ACTION_PACKAGE_REMOVED: disableCompatScale(packageName); diff --git a/services/core/java/com/android/server/appop/DiscreteRegistry.java b/services/core/java/com/android/server/appop/DiscreteRegistry.java index 63b41b789280..e9b61b3ab7fb 100644 --- a/services/core/java/com/android/server/appop/DiscreteRegistry.java +++ b/services/core/java/com/android/server/appop/DiscreteRegistry.java @@ -69,18 +69,47 @@ import java.util.Date; import java.util.List; /** - * This class manages information about recent accesses to ops for - * permission usage timeline. + * This class manages information about recent accesses to ops for permission usage timeline. * - * The timeline history is kept for limited time (initial default is 24 hours) and - * discarded after that. + * The discrete history is kept for limited time (initial default is 24 hours, set in + * {@link DiscreteRegistry#sDiscreteHistoryCutoff) and discarded after that. + * + * Discrete history is quantized to reduce resources footprint. By default quantization is set to + * one minute in {@link DiscreteRegistry#sDiscreteHistoryQuantization}. All access times are aligned + * to the closest quantized time. All durations (except -1, meaning no duration) are rounded up to + * the closest quantized interval. + * + * When data is queried through API, events are deduplicated and for every time quant there can + * be only one {@link AppOpsManager.AttributedOpEntry}. Each entry contains information about + * different accesses which happened in specified time quant - across dimensions of + * {@link AppOpsManager.UidState} and {@link AppOpsManager.OpFlags}. For each dimension + * it is only possible to know if at least one access happened in the time quant. * * Every time state is saved (default is 30 minutes), memory state is dumped to a * new file and memory state is cleared. Files older than time limit are deleted * during the process. * * When request comes in, files are read and requested information is collected - * and delivered. + * and delivered. Information is cached in memory until the next state save (up to 30 minutes), to + * avoid reading disk if more API calls come in a quick succession. + * + * THREADING AND LOCKING: + * For in-memory transactions this class relies on {@link DiscreteRegistry#mInMemoryLock}. It is + * assumed that the same lock is used for in-memory transactions in {@link AppOpsService}, + * {@link HistoricalRegistry}, and {@link DiscreteRegistry}. + * {@link DiscreteRegistry#recordDiscreteAccess(int, String, int, String, int, int, long, long)} + * must only be called while holding this lock. + * {@link DiscreteRegistry#mOnDiskLock} is used when disk transactions are performed. + * It is very important to release {@link DiscreteRegistry#mInMemoryLock} as soon as possible, as + * no AppOps related transactions across the system can be performed while it is held. + * + * INITIALIZATION: We can initialize persistence only after the system is ready + * as we need to check the optional configuration override from the settings + * database which is not initialized at the time the app ops service is created. This class + * relies on {@link HistoricalRegistry} for controlling that no calls are allowed until then. All + * outside calls are going through {@link HistoricalRegistry}, where + * {@link HistoricalRegistry#isPersistenceInitializedMLocked()} check is done. + * */ final class DiscreteRegistry { diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 9fd79cefa19c..0840e75823b5 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -123,7 +123,7 @@ import static com.android.server.utils.PriorityDump.PRIORITY_ARG_NORMAL; import android.Manifest; import android.Manifest.permission; -import android.annotation.CallbackExecutor; +import android.annotation.MainThread; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; @@ -492,7 +492,7 @@ public class NotificationManagerService extends SystemService { private DeviceIdleManager mDeviceIdleManager; private IUriGrantsManager mUgm; private UriGrantsManagerInternal mUgmInternal; - private RoleObserver mRoleObserver; + private volatile RoleObserver mRoleObserver; private UserManager mUm; private IPlatformCompat mPlatformCompat; private ShortcutHelper mShortcutHelper; @@ -2651,6 +2651,11 @@ public class NotificationManagerService extends SystemService { @Override public void onBootPhase(int phase) { + onBootPhase(phase, Looper.getMainLooper()); + } + + @VisibleForTesting + void onBootPhase(int phase, Looper mainLooper) { if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) { // no beeping until we're basically done booting mSystemReady = true; @@ -2660,9 +2665,11 @@ public class NotificationManagerService extends SystemService { mAudioManagerInternal = getLocalService(AudioManagerInternal.class); mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class); mZenModeHelper.onSystemReady(); - mRoleObserver = new RoleObserver(getContext().getSystemService(RoleManager.class), - mPackageManager, getContext().getMainExecutor()); - mRoleObserver.init(); + RoleObserver roleObserver = new RoleObserver(getContext(), + getContext().getSystemService(RoleManager.class), + mPackageManager, mainLooper); + roleObserver.init(); + mRoleObserver = roleObserver; LauncherApps launcherApps = (LauncherApps) getContext().getSystemService(Context.LAUNCHER_APPS_SERVICE); mShortcutHelper = new ShortcutHelper(launcherApps, mShortcutListener, getLocalService( @@ -10688,26 +10695,40 @@ public class NotificationManagerService extends SystemService { // Role name : user id : list of approved packages private ArrayMap<String, ArrayMap<Integer, ArraySet<String>>> mNonBlockableDefaultApps; + /** + * Writes should be pretty rare (only when default browser changes) and reads are done + * during activity start code-path, so we're optimizing for reads. This means this set is + * immutable once written and we'll recreate the set every time there is a role change and + * then assign that new set to the volatile below, so reads can be done without needing to + * hold a lock. Every write is done on the main-thread, so write atomicity is guaranteed. + * + * Didn't use unmodifiable set to enforce immutability to avoid iterating via iterators. + */ + private volatile ArraySet<Integer> mTrampolineExemptUids = new ArraySet<>(); + private final RoleManager mRm; private final IPackageManager mPm; private final Executor mExecutor; + private final Looper mMainLooper; - RoleObserver(@NonNull RoleManager roleManager, - @NonNull IPackageManager pkgMgr, - @NonNull @CallbackExecutor Executor executor) { + RoleObserver(Context context, @NonNull RoleManager roleManager, + @NonNull IPackageManager pkgMgr, @NonNull Looper mainLooper) { mRm = roleManager; mPm = pkgMgr; - mExecutor = executor; + mExecutor = context.getMainExecutor(); + mMainLooper = mainLooper; } + /** Should be called from the main-thread. */ + @MainThread public void init() { - List<UserInfo> users = mUm.getUsers(); + List<UserHandle> users = mUm.getUserHandles(/* excludeDying */ true); mNonBlockableDefaultApps = new ArrayMap<>(); for (int i = 0; i < NON_BLOCKABLE_DEFAULT_ROLES.length; i++) { final ArrayMap<Integer, ArraySet<String>> userToApprovedList = new ArrayMap<>(); mNonBlockableDefaultApps.put(NON_BLOCKABLE_DEFAULT_ROLES[i], userToApprovedList); for (int j = 0; j < users.size(); j++) { - Integer userId = users.get(j).getUserHandle().getIdentifier(); + Integer userId = users.get(j).getIdentifier(); ArraySet<String> approvedForUserId = new ArraySet<>(mRm.getRoleHoldersAsUser( NON_BLOCKABLE_DEFAULT_ROLES[i], UserHandle.of(userId))); ArraySet<Pair<String, Integer>> approvedAppUids = new ArraySet<>(); @@ -10718,7 +10739,7 @@ public class NotificationManagerService extends SystemService { mPreferencesHelper.updateDefaultApps(userId, null, approvedAppUids); } } - + updateTrampolineExemptUidsForUsers(users.toArray(new UserHandle[0])); mRm.addOnRoleHoldersChangedListenerAsUser(mExecutor, this, UserHandle.ALL); } @@ -10727,6 +10748,11 @@ public class NotificationManagerService extends SystemService { return mNonBlockableDefaultApps.get(role).get(userId).contains(pkg); } + @VisibleForTesting + public boolean isUidExemptFromTrampolineRestrictions(int uid) { + return mTrampolineExemptUids.contains(uid); + } + /** * Convert the assistant-role holder into settings. The rest of the system uses the * settings. @@ -10736,6 +10762,12 @@ public class NotificationManagerService extends SystemService { */ @Override public void onRoleHoldersChanged(@NonNull String roleName, @NonNull UserHandle user) { + onRoleHoldersChangedForNonBlockableDefaultApps(roleName, user); + onRoleHoldersChangedForTrampolines(roleName, user); + } + + private void onRoleHoldersChangedForNonBlockableDefaultApps(@NonNull String roleName, + @NonNull UserHandle user) { // we only care about a couple of the roles they'll tell us about boolean relevantChange = false; for (int i = 0; i < NON_BLOCKABLE_DEFAULT_ROLES.length; i++) { @@ -10783,6 +10815,41 @@ public class NotificationManagerService extends SystemService { // write of the notification policy xml for this change } + private void onRoleHoldersChangedForTrampolines(@NonNull String roleName, + @NonNull UserHandle user) { + if (!RoleManager.ROLE_BROWSER.equals(roleName)) { + return; + } + updateTrampolineExemptUidsForUsers(user); + } + + private void updateTrampolineExemptUidsForUsers(UserHandle... users) { + Preconditions.checkState(mMainLooper.isCurrentThread()); + ArraySet<Integer> oldUids = mTrampolineExemptUids; + ArraySet<Integer> newUids = new ArraySet<>(); + // Add the uids from previous set for the users that we won't update. + for (int i = 0, n = oldUids.size(); i < n; i++) { + int uid = oldUids.valueAt(i); + UserHandle user = UserHandle.of(UserHandle.getUserId(uid)); + if (!ArrayUtils.contains(users, user)) { + newUids.add(uid); + } + } + // Now lookup the new uids for the users that we want to update. + for (int i = 0, n = users.length; i < n; i++) { + UserHandle user = users[i]; + for (String pkg : mRm.getRoleHoldersAsUser(RoleManager.ROLE_BROWSER, user)) { + int uid = getUidForPackage(pkg, user.getIdentifier()); + if (uid != -1) { + newUids.add(uid); + } else { + Slog.e(TAG, "Bad uid (-1) for browser package " + pkg); + } + } + } + mTrampolineExemptUids = newUids; + } + private int getUidForPackage(String pkg, int userId) { try { return mPm.getPackageUid(pkg, MATCH_ALL, userId); @@ -10947,7 +11014,7 @@ public class NotificationManagerService extends SystemService { } String logcatMessage = "Indirect notification activity start (trampoline) from " + packageName; - if (CompatChanges.isChangeEnabled(NOTIFICATION_TRAMPOLINE_BLOCK, uid)) { + if (blockTrampoline(uid)) { // Post toast() call to mHandler to offload PM lookup from the activity start path mHandler.post(() -> toast(packageName, uid)); Slog.e(TAG, logcatMessage + " blocked"); @@ -10958,6 +11025,13 @@ public class NotificationManagerService extends SystemService { } } + private boolean blockTrampoline(int uid) { + if (mRoleObserver != null && mRoleObserver.isUidExemptFromTrampolineRestrictions(uid)) { + return false; + } + return CompatChanges.isChangeEnabled(NOTIFICATION_TRAMPOLINE_BLOCK, uid); + } + @Override public boolean canCloseSystemDialogs(Collection<IBinder> tokens, int uid) { // If the start is allowed via notification, we allow the app to close system dialogs diff --git a/services/core/java/com/android/server/pm/ApkChecksums.java b/services/core/java/com/android/server/pm/ApkChecksums.java index afce23fe7647..28511070fc8e 100644 --- a/services/core/java/com/android/server/pm/ApkChecksums.java +++ b/services/core/java/com/android/server/pm/ApkChecksums.java @@ -303,8 +303,8 @@ public class ApkChecksums { * @param onChecksumsReadyListener to receive the resulting checksums */ public static void getChecksums(List<Pair<String, File>> filesToChecksum, - @Checksum.Type int optional, - @Checksum.Type int required, + @Checksum.TypeMask int optional, + @Checksum.TypeMask int required, @Nullable String installerPackageName, @Nullable Certificate[] trustedInstallers, @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, @@ -331,7 +331,7 @@ public class ApkChecksums { private static void processRequiredChecksums(List<Pair<String, File>> filesToChecksum, List<Map<Integer, ApkChecksum>> result, - @Checksum.Type int required, + @Checksum.TypeMask int required, @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, @NonNull Injector injector, long startTime) { @@ -382,7 +382,7 @@ public class ApkChecksums { * @param checksums resulting checksums */ private static void getAvailableApkChecksums(String split, File file, - @Checksum.Type int types, + @Checksum.TypeMask int types, @Nullable String installerPackageName, @Nullable Certificate[] trustedInstallers, Map<Integer, ApkChecksum> checksums, @@ -415,7 +415,7 @@ public class ApkChecksums { } private static void getInstallerChecksums(String split, File file, - @Checksum.Type int types, + @Checksum.TypeMask int types, @Nullable String installerPackageName, @Nullable Certificate[] trustedInstallers, Map<Integer, ApkChecksum> checksums, @@ -523,7 +523,7 @@ public class ApkChecksums { * Whether the file is available for checksumming or we need to wait. */ private static boolean needToWait(File file, - @Checksum.Type int types, + @Checksum.TypeMask int types, Map<Integer, ApkChecksum> checksums, @NonNull Injector injector) throws IOException { if (!isRequired(TYPE_WHOLE_MERKLE_ROOT_4K_SHA256, types, checksums) @@ -564,7 +564,7 @@ public class ApkChecksums { * @param checksums resulting checksums */ private static void getRequiredApkChecksums(String split, File file, - @Checksum.Type int types, + @Checksum.TypeMask int types, Map<Integer, ApkChecksum> checksums) { final String filePath = file.getAbsolutePath(); @@ -596,7 +596,7 @@ public class ApkChecksums { } private static boolean isRequired(@Checksum.Type int type, - @Checksum.Type int types, Map<Integer, ApkChecksum> checksums) { + @Checksum.TypeMask int types, Map<Integer, ApkChecksum> checksums) { if ((types & type) == 0) { return false; } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 51288de09c0d..3fc9ac2d9378 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -5707,8 +5707,8 @@ public class PackageManagerService extends IPackageManager.Stub @Override public void requestChecksums(@NonNull String packageName, boolean includeSplits, - @Checksum.Type int optional, - @Checksum.Type int required, @Nullable List trustedInstallers, + @Checksum.TypeMask int optional, + @Checksum.TypeMask int required, @Nullable List trustedInstallers, @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId) { requestChecksumsInternal(packageName, includeSplits, optional, required, trustedInstallers, onChecksumsReadyListener, userId, mInjector.getBackgroundExecutor(), @@ -5716,7 +5716,7 @@ public class PackageManagerService extends IPackageManager.Stub } private void requestChecksumsInternal(@NonNull String packageName, boolean includeSplits, - @Checksum.Type int optional, @Checksum.Type int required, + @Checksum.TypeMask int optional, @Checksum.TypeMask int required, @Nullable List trustedInstallers, @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId, @NonNull Executor executor, @NonNull Handler handler) { @@ -26033,18 +26033,29 @@ public class PackageManagerService extends IPackageManager.Stub @Override public String[] getNamesForUids(int[] uids) throws RemoteException { - if (uids == null || uids.length == 0) { - return null; - } - final String[] names = PackageManagerService.this.getNamesForUids(uids); - final String[] results = (names != null) ? names : new String[uids.length]; - // massage results so they can be parsed by the native binder - for (int i = results.length - 1; i >= 0; --i) { - if (results[i] == null) { - results[i] = ""; + String[] names = null; + String[] results = null; + try { + if (uids == null || uids.length == 0) { + return null; + } + names = PackageManagerService.this.getNamesForUids(uids); + results = (names != null) ? names : new String[uids.length]; + // massage results so they can be parsed by the native binder + for (int i = results.length - 1; i >= 0; --i) { + if (results[i] == null) { + results[i] = ""; + } } + return results; + } catch (Throwable t) { + // STOPSHIP(186558987): revert addition of try/catch/log + Slog.e(TAG, "uids: " + Arrays.toString(uids)); + Slog.e(TAG, "names: " + Arrays.toString(names)); + Slog.e(TAG, "results: " + Arrays.toString(results)); + Slog.e(TAG, "throwing exception", t); + throw t; } - return results; } // NB: this differentiates between preloads and sideloads @@ -27239,7 +27250,7 @@ public class PackageManagerService extends IPackageManager.Stub @Override public void requestChecksums(@NonNull String packageName, boolean includeSplits, - @Checksum.Type int optional, @Checksum.Type int required, + @Checksum.TypeMask int optional, @Checksum.TypeMask int required, @Nullable List trustedInstallers, @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId, @NonNull Executor executor, @NonNull Handler handler) { diff --git a/services/core/java/com/android/server/timezonedetector/MetricsTimeZoneDetectorState.java b/services/core/java/com/android/server/timezonedetector/MetricsTimeZoneDetectorState.java index c8c828f10ad3..27b50d892144 100644 --- a/services/core/java/com/android/server/timezonedetector/MetricsTimeZoneDetectorState.java +++ b/services/core/java/com/android/server/timezonedetector/MetricsTimeZoneDetectorState.java @@ -89,8 +89,6 @@ public final class MetricsTimeZoneDetectorState { @Nullable TelephonyTimeZoneSuggestion latestTelephonySuggestion, @Nullable GeolocationTimeZoneSuggestion latestGeolocationSuggestion) { - // TODO(b/172934905) Add logic to canonicalize the time zone IDs to Android's preferred IDs - // so that the ordinals will match even when the ID is not identical, just equivalent. int deviceTimeZoneIdOrdinal = tzIdOrdinalGenerator.ordinal(Objects.requireNonNull(deviceTimeZoneId)); MetricsTimeZoneSuggestion latestObfuscatedManualSuggestion = diff --git a/services/core/java/com/android/server/timezonedetector/OrdinalGenerator.java b/services/core/java/com/android/server/timezonedetector/OrdinalGenerator.java index a448773c40d5..50875308db7d 100644 --- a/services/core/java/com/android/server/timezonedetector/OrdinalGenerator.java +++ b/services/core/java/com/android/server/timezonedetector/OrdinalGenerator.java @@ -15,9 +15,12 @@ */ package com.android.server.timezonedetector; +import android.annotation.NonNull; import android.util.ArraySet; import java.util.List; +import java.util.Objects; +import java.util.function.Function; /** * A helper class that turns a set of objects into ordinal values, i.e. each object is offered @@ -30,11 +33,19 @@ import java.util.List; class OrdinalGenerator<T> { private final ArraySet<T> mKnownIds = new ArraySet<>(); + private final @NonNull Function<T, T> mCanonicalizationFunction; + + OrdinalGenerator(@NonNull Function<T, T> canonicalizationFunction) { + mCanonicalizationFunction = Objects.requireNonNull(canonicalizationFunction); + } + int ordinal(T object) { - int ordinal = mKnownIds.indexOf(object); + T canonical = mCanonicalizationFunction.apply(object); + + int ordinal = mKnownIds.indexOf(canonical); if (ordinal < 0) { ordinal = mKnownIds.size(); - mKnownIds.add(object); + mKnownIds.add(canonical); } return ordinal; } diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneCanonicalizer.java b/services/core/java/com/android/server/timezonedetector/TimeZoneCanonicalizer.java new file mode 100644 index 000000000000..bdbf60712008 --- /dev/null +++ b/services/core/java/com/android/server/timezonedetector/TimeZoneCanonicalizer.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.timezonedetector; + +import com.android.i18n.timezone.TimeZoneFinder; + +import java.util.function.Function; + +/** + * Returns preferred time zone ID if {@code timeZoneId} was deprecated. For example, returns + * America/Nuuk for America/Godthab. + */ +final class TimeZoneCanonicalizer implements Function<String, String> { + @Override + public String apply(String timeZoneId) { + String canonicialZoneId = TimeZoneFinder.getInstance().getCountryZonesFinder() + .findCanonicalTimeZoneId(timeZoneId); + + return canonicialZoneId == null ? timeZoneId : canonicialZoneId; + } +} diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategyImpl.java b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategyImpl.java index c34a7d37ba24..ab2a88b44a87 100644 --- a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategyImpl.java +++ b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorStrategyImpl.java @@ -383,7 +383,8 @@ public final class TimeZoneDetectorStrategyImpl implements TimeZoneDetectorStrat bestQualifiedTelephonySuggestion == null ? null : bestQualifiedTelephonySuggestion.suggestion; // A new generator is created each time: we don't want / require consistency. - OrdinalGenerator<String> tzIdOrdinalGenerator = new OrdinalGenerator<>(); + OrdinalGenerator<String> tzIdOrdinalGenerator = + new OrdinalGenerator<>(new TimeZoneCanonicalizer()); return MetricsTimeZoneDetectorState.create( tzIdOrdinalGenerator, getConfigurationInternal(currentUserId), diff --git a/services/net/Android.bp b/services/net/Android.bp index 800f7addbd65..f92db86bb880 100644 --- a/services/net/Android.bp +++ b/services/net/Android.bp @@ -52,7 +52,8 @@ java_library { libs: [ "unsupportedappusage", "framework-wifi-util-lib", - "framework-connectivity" + "framework-connectivity", + "modules-utils-build_system", ], static_libs: [ // All the classes in netd_aidl_interface must be jarjar so they do not conflict with the @@ -60,6 +61,7 @@ java_library { "netd_aidl_interface-V3-java", "netlink-client", "networkstack-client", + "modules-utils-build_system", ], apex_available: [ "com.android.wifi", @@ -80,7 +82,7 @@ filegroup { ], visibility: [ "//frameworks/base/packages/Tethering", - "//packages/modules/Connectivity/Tethering" + "//packages/modules/Connectivity/Tethering", ], } diff --git a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java index a8d8a90e8935..96495701811e 100644 --- a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java @@ -19,6 +19,7 @@ package com.android.server.app; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.anyInt; @@ -32,8 +33,10 @@ import android.content.ContextWrapper; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.os.Bundle; import android.platform.test.annotations.Presubmit; import android.provider.DeviceConfig; +import android.util.ArraySet; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; @@ -140,15 +143,19 @@ public class GameManagerServiceTests { applicationInfo.category = ApplicationInfo.CATEGORY_GAME; final PackageInfo pi = new PackageInfo(); pi.packageName = mPackageName; + pi.applicationInfo = applicationInfo; final List<PackageInfo> packages = new ArrayList<>(); packages.add(pi); - when(mMockPackageManager.getInstalledPackages(anyInt())).thenReturn(packages); + when(mMockPackageManager.getInstalledPackagesAsUser(anyInt(), anyInt())) + .thenReturn(packages); when(mMockPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt())) .thenReturn(applicationInfo); } @After public void tearDown() throws Exception { + GameManagerService gameManagerService = new GameManagerService(mMockContext); + gameManagerService.disableCompatScale(mPackageName); if (mMockingSession != null) { mMockingSession.finishMocking(); } @@ -165,57 +172,95 @@ public class GameManagerServiceTests { } private void mockDeviceConfigDefault() { - DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder( - DeviceConfig.NAMESPACE_GAME_OVERLAY).setString(mPackageName, "").build(); - when(DeviceConfig.getProperties(anyString(), anyString())) - .thenReturn(properties); + when(DeviceConfig.getProperty(anyString(), anyString())) + .thenReturn(""); } private void mockDeviceConfigNone() { - DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder( - DeviceConfig.NAMESPACE_GAME_OVERLAY).build(); - when(DeviceConfig.getProperties(anyString(), anyString())) - .thenReturn(properties); + when(DeviceConfig.getProperty(anyString(), anyString())) + .thenReturn(null); } private void mockDeviceConfigPerformance() { String configString = "mode=2,downscaleFactor=0.5"; - DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder( - DeviceConfig.NAMESPACE_GAME_OVERLAY).setString(mPackageName, configString).build(); - when(DeviceConfig.getProperties(anyString(), anyString())) - .thenReturn(properties); + when(DeviceConfig.getProperty(anyString(), anyString())) + .thenReturn(configString); } private void mockDeviceConfigBattery() { String configString = "mode=3,downscaleFactor=0.7"; - DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder( - DeviceConfig.NAMESPACE_GAME_OVERLAY).setString(mPackageName, configString).build(); - when(DeviceConfig.getProperties(anyString(), anyString())) - .thenReturn(properties); + when(DeviceConfig.getProperty(anyString(), anyString())) + .thenReturn(configString); } private void mockDeviceConfigAll() { String configString = "mode=3,downscaleFactor=0.7:mode=2,downscaleFactor=0.5"; - DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder( - DeviceConfig.NAMESPACE_GAME_OVERLAY).setString(mPackageName, configString).build(); - when(DeviceConfig.getProperties(anyString(), anyString())) - .thenReturn(properties); + when(DeviceConfig.getProperty(anyString(), anyString())) + .thenReturn(configString); } private void mockDeviceConfigInvalid() { String configString = "mode=2,downscaleFactor=0.55"; - DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder( - DeviceConfig.NAMESPACE_GAME_OVERLAY).setString(mPackageName, configString).build(); - when(DeviceConfig.getProperties(anyString(), anyString())) - .thenReturn(properties); + when(DeviceConfig.getProperty(anyString(), anyString())) + .thenReturn(configString); } private void mockDeviceConfigMalformed() { String configString = "adsljckv=nin3rn9hn1231245:8795tq=21ewuydg"; - DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder( - DeviceConfig.NAMESPACE_GAME_OVERLAY).setString(mPackageName, configString).build(); - when(DeviceConfig.getProperties(anyString(), anyString())) - .thenReturn(properties); + when(DeviceConfig.getProperty(anyString(), anyString())) + .thenReturn(configString); + } + + private void mockGameModeOptInAll() throws Exception { + final ApplicationInfo applicationInfo = new ApplicationInfo(); + Bundle metaDataBundle = new Bundle(); + metaDataBundle.putBoolean( + GameManagerService.GamePackageConfiguration.METADATA_PERFORMANCE_MODE_ENABLE, true); + metaDataBundle.putBoolean( + GameManagerService.GamePackageConfiguration.METADATA_BATTERY_MODE_ENABLE, true); + applicationInfo.metaData = metaDataBundle; + when(mMockPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt())) + .thenReturn(applicationInfo); + } + + private void mockGameModeOptInPerformance() throws Exception { + final ApplicationInfo applicationInfo = new ApplicationInfo(); + Bundle metaDataBundle = new Bundle(); + metaDataBundle.putBoolean( + GameManagerService.GamePackageConfiguration.METADATA_PERFORMANCE_MODE_ENABLE, true); + applicationInfo.metaData = metaDataBundle; + when(mMockPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt())) + .thenReturn(applicationInfo); + } + + private void mockGameModeOptInBattery() throws Exception { + final ApplicationInfo applicationInfo = new ApplicationInfo(); + Bundle metaDataBundle = new Bundle(); + metaDataBundle.putBoolean( + GameManagerService.GamePackageConfiguration.METADATA_BATTERY_MODE_ENABLE, true); + applicationInfo.metaData = metaDataBundle; + when(mMockPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt())) + .thenReturn(applicationInfo); + } + + private void mockInterventionAllowDownscaleTrue() throws Exception { + final ApplicationInfo applicationInfo = new ApplicationInfo(); + Bundle metaDataBundle = new Bundle(); + metaDataBundle.putBoolean( + GameManagerService.GamePackageConfiguration.METADATA_WM_ALLOW_DOWNSCALE, true); + applicationInfo.metaData = metaDataBundle; + when(mMockPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt())) + .thenReturn(applicationInfo); + } + + private void mockInterventionAllowDownscaleFalse() throws Exception { + final ApplicationInfo applicationInfo = new ApplicationInfo(); + Bundle metaDataBundle = new Bundle(); + metaDataBundle.putBoolean( + GameManagerService.GamePackageConfiguration.METADATA_WM_ALLOW_DOWNSCALE, false); + applicationInfo.metaData = metaDataBundle; + when(mMockPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt())) + .thenReturn(applicationInfo); } /** @@ -353,136 +398,209 @@ public class GameManagerServiceTests { gameManagerService.getGameMode(mPackageName, USER_ID_2)); } + private void checkReportedModes(int ...requiredModes) { + GameManagerService gameManagerService = new GameManagerService(mMockContext); + gameManagerService.onUserStarting(USER_ID_1); + gameManagerService.updateConfigsForUser(USER_ID_1, mPackageName); + ArraySet<Integer> reportedModes = new ArraySet<>(); + int[] modes = gameManagerService.getAvailableGameModes(mPackageName); + for (int mode : modes) { + reportedModes.add(mode); + } + assertEquals(requiredModes.length, reportedModes.size()); + for (int requiredMode : reportedModes) { + assertTrue("Required game mode not supported: " + requiredMode, + reportedModes.contains(requiredMode)); + } + } + + private void checkDownscaling(int gameMode, String scaling) { + GameManagerService gameManagerService = new GameManagerService(mMockContext); + gameManagerService.onUserStarting(USER_ID_1); + gameManagerService.updateConfigsForUser(USER_ID_1, mPackageName); + GameManagerService.GamePackageConfiguration config = + gameManagerService.getConfig(mPackageName); + assertEquals(config.getGameModeConfiguration(gameMode).getScaling(), scaling); + } + /** - * Phonesky device config exists, but is only propagating the default value. + * Phenotype device config exists, but is only propagating the default value. */ @Test public void testDeviceConfigDefault() { mockDeviceConfigDefault(); mockModifyGameModeGranted(); - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); - gameManagerService.loadDeviceConfigLocked(); - - int[] modes = gameManagerService.getAvailableGameModes(mPackageName); - assertEquals(modes.length, 1); - assertEquals(modes[0], GameManager.GAME_MODE_UNSUPPORTED); + checkReportedModes(GameManager.GAME_MODE_UNSUPPORTED); } /** - * Phonesky device config does not exists. + * Phenotype device config does not exists. */ @Test public void testDeviceConfigNone() { mockDeviceConfigNone(); mockModifyGameModeGranted(); - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); - gameManagerService.loadDeviceConfigLocked(); - - int[] modes = gameManagerService.getAvailableGameModes(mPackageName); - assertEquals(modes.length, 1); - assertEquals(modes[0], GameManager.GAME_MODE_UNSUPPORTED); + checkReportedModes(GameManager.GAME_MODE_UNSUPPORTED); } /** - * Phonesky device config for performance mode exists and is valid. + * Phenotype device config for performance mode exists and is valid. */ @Test public void testDeviceConfigPerformance() { mockDeviceConfigPerformance(); mockModifyGameModeGranted(); - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); - gameManagerService.loadDeviceConfigLocked(); - - boolean perfModeExists = false; - int[] modes = gameManagerService.getAvailableGameModes(mPackageName); - for (int mode : modes) { - if (mode == GameManager.GAME_MODE_PERFORMANCE) { - perfModeExists = true; - } - } - assertEquals(modes.length, 1); - assertTrue(perfModeExists); + checkReportedModes(GameManager.GAME_MODE_PERFORMANCE, GameManager.GAME_MODE_STANDARD); } /** - * Phonesky device config for battery mode exists and is valid. + * Phenotype device config for battery mode exists and is valid. */ @Test public void testDeviceConfigBattery() { mockDeviceConfigBattery(); mockModifyGameModeGranted(); - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); - gameManagerService.loadDeviceConfigLocked(); - - boolean batteryModeExists = false; - int[] modes = gameManagerService.getAvailableGameModes(mPackageName); - for (int mode : modes) { - if (mode == GameManager.GAME_MODE_BATTERY) { - batteryModeExists = true; - } - } - assertEquals(modes.length, 1); - assertTrue(batteryModeExists); + checkReportedModes(GameManager.GAME_MODE_BATTERY, GameManager.GAME_MODE_STANDARD); } /** - * Phonesky device configs for both battery and performance modes exists and are valid. + * Phenotype device configs for both battery and performance modes exists and are valid. */ @Test public void testDeviceConfigAll() { mockDeviceConfigAll(); mockModifyGameModeGranted(); - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); - gameManagerService.loadDeviceConfigLocked(); - - boolean batteryModeExists = false; - boolean perfModeExists = false; - int[] modes = gameManagerService.getAvailableGameModes(mPackageName); - for (int mode : modes) { - if (mode == GameManager.GAME_MODE_BATTERY) { - batteryModeExists = true; - } else if (mode == GameManager.GAME_MODE_PERFORMANCE) { - perfModeExists = true; - } - } - assertTrue(batteryModeExists); - assertTrue(perfModeExists); + checkReportedModes(GameManager.GAME_MODE_PERFORMANCE, GameManager.GAME_MODE_BATTERY, + GameManager.GAME_MODE_STANDARD); } /** - * Phonesky device config contains values that parse correctly but are not valid in game mode. + * Phenotype device config contains values that parse correctly but are not valid in game mode. */ @Test public void testDeviceConfigInvalid() { mockDeviceConfigInvalid(); mockModifyGameModeGranted(); - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); - gameManagerService.loadDeviceConfigLocked(); - - int[] modes = gameManagerService.getAvailableGameModes(mPackageName); - assertEquals(modes.length, 1); - assertEquals(modes[0], GameManager.GAME_MODE_UNSUPPORTED); + checkReportedModes(GameManager.GAME_MODE_UNSUPPORTED); } /** - * Phonesky device config is garbage. + * Phenotype device config is garbage. */ @Test public void testDeviceConfigMalformed() { mockDeviceConfigMalformed(); mockModifyGameModeGranted(); + checkReportedModes(GameManager.GAME_MODE_UNSUPPORTED); + } + + /** + * Game modes are made available only through app manifest opt-in. + */ + @Test + public void testGameModeOptInAll() throws Exception { + mockGameModeOptInAll(); + mockDeviceConfigNone(); + mockModifyGameModeGranted(); + checkReportedModes(GameManager.GAME_MODE_PERFORMANCE, GameManager.GAME_MODE_BATTERY, + GameManager.GAME_MODE_STANDARD); + } + + /** + * BATTERY game mode is available through the app manifest opt-in. + */ + @Test + public void testGameModeOptInBattery() throws Exception { + mockGameModeOptInBattery(); + mockDeviceConfigNone(); + mockModifyGameModeGranted(); + checkReportedModes(GameManager.GAME_MODE_BATTERY, GameManager.GAME_MODE_STANDARD); + } + + /** + * PERFORMANCE game mode is available through the app manifest opt-in. + */ + @Test + public void testGameModeOptInPerformance() throws Exception { + mockGameModeOptInPerformance(); + mockDeviceConfigNone(); + mockModifyGameModeGranted(); + checkReportedModes(GameManager.GAME_MODE_PERFORMANCE, GameManager.GAME_MODE_STANDARD); + } + + /** + * BATTERY game mode is available through the app manifest opt-in and PERFORMANCE game mode is + * available through Phenotype. + */ + @Test + public void testGameModeOptInBatteryMixed() throws Exception { + mockGameModeOptInBattery(); + mockDeviceConfigPerformance(); + mockModifyGameModeGranted(); + checkReportedModes(GameManager.GAME_MODE_PERFORMANCE, GameManager.GAME_MODE_BATTERY, + GameManager.GAME_MODE_STANDARD); + } + + /** + * PERFORMANCE game mode is available through the app manifest opt-in and BATTERY game mode is + * available through Phenotype. + */ + @Test + public void testGameModeOptInPerformanceMixed() throws Exception { + mockGameModeOptInPerformance(); + mockDeviceConfigBattery(); + mockModifyGameModeGranted(); + checkReportedModes(GameManager.GAME_MODE_PERFORMANCE, GameManager.GAME_MODE_BATTERY, + GameManager.GAME_MODE_STANDARD); + } + + /** + * PERFORMANCE game mode is configured through Phenotype. The app hasn't specified any metadata. + */ + @Test + public void testInterventionAllowScalingDefault() throws Exception { + mockDeviceConfigPerformance(); + mockModifyGameModeGranted(); + checkDownscaling(GameManager.GAME_MODE_PERFORMANCE, "0.5"); + } + + /** + * PERFORMANCE game mode is configured through Phenotype. The app has opted-out of scaling. + */ + @Test + public void testInterventionAllowDownscaleFalse() throws Exception { + mockDeviceConfigPerformance(); + mockInterventionAllowDownscaleFalse(); + mockModifyGameModeGranted(); + checkDownscaling(GameManager.GAME_MODE_PERFORMANCE, "1.0"); + } + + /** + * PERFORMANCE game mode is configured through Phenotype. The app has redundantly specified + * the downscaling metadata default value of "true". + */ + @Test + public void testInterventionAllowDownscaleTrue() throws Exception { + mockDeviceConfigPerformance(); + mockInterventionAllowDownscaleTrue(); + mockModifyGameModeGranted(); + checkDownscaling(GameManager.GAME_MODE_PERFORMANCE, "0.5"); + } + + /** + * PERFORMANCE game mode is configured through Phenotype, but the app has also opted into the + * same mode. No interventions for this game mode should be available in this case. + */ + @Test + public void testDeviceConfigOptInOverlap() throws Exception { + mockDeviceConfigPerformance(); + mockGameModeOptInPerformance(); + mockModifyGameModeGranted(); GameManagerService gameManagerService = new GameManagerService(mMockContext); gameManagerService.onUserStarting(USER_ID_1); - gameManagerService.loadDeviceConfigLocked(); - - int[] modes = gameManagerService.getAvailableGameModes(mPackageName); - assertEquals(modes.length, 1); - assertEquals(modes[0], GameManager.GAME_MODE_UNSUPPORTED); + gameManagerService.updateConfigsForUser(USER_ID_1, mPackageName); + GameManagerService.GamePackageConfiguration config = + gameManagerService.getConfig(mPackageName); + assertNull(config.getGameModeConfiguration(GameManager.GAME_MODE_PERFORMANCE)); } } diff --git a/services/tests/servicestests/src/com/android/server/timezonedetector/OrdinalGeneratorTest.java b/services/tests/servicestests/src/com/android/server/timezonedetector/OrdinalGeneratorTest.java index af954d599334..3fdac66225a8 100644 --- a/services/tests/servicestests/src/com/android/server/timezonedetector/OrdinalGeneratorTest.java +++ b/services/tests/servicestests/src/com/android/server/timezonedetector/OrdinalGeneratorTest.java @@ -25,13 +25,14 @@ import org.junit.Test; import org.junit.runner.RunWith; import java.util.Arrays; +import java.util.function.Function; @RunWith(AndroidJUnit4.class) public class OrdinalGeneratorTest { @Test - public void testOrdinal() { - OrdinalGenerator<String> ordinalGenerator = new OrdinalGenerator<>(); + public void testOrdinal_withIdentityFunction() { + OrdinalGenerator<String> ordinalGenerator = new OrdinalGenerator<>(Function.identity()); int oneOrd = ordinalGenerator.ordinal("One"); int twoOrd = ordinalGenerator.ordinal("Two"); assertNotEquals(oneOrd, twoOrd); @@ -45,8 +46,8 @@ public class OrdinalGeneratorTest { } @Test - public void testOrdinals() { - OrdinalGenerator<String> ordinalGenerator = new OrdinalGenerator<>(); + public void testOrdinals_withIdentityFunction() { + OrdinalGenerator<String> ordinalGenerator = new OrdinalGenerator<>(Function.identity()); int[] oneTwoOrds = ordinalGenerator.ordinals(Arrays.asList("One", "Two")); int[] twoThreeOrds = ordinalGenerator.ordinals(Arrays.asList("Two", "Three")); assertEquals(oneTwoOrds[0], ordinalGenerator.ordinal("One")); @@ -54,4 +55,33 @@ public class OrdinalGeneratorTest { assertEquals(twoThreeOrds[0], ordinalGenerator.ordinal("Two")); assertEquals(twoThreeOrds[1], ordinalGenerator.ordinal("Three")); } + + @Test + public void testOrdinal_withCanonicalizationFunction() { + OrdinalGenerator<String> ordinalGenerator = new OrdinalGenerator<>(String::toLowerCase); + + int oneOrd = ordinalGenerator.ordinal("One"); + int twoOrd = ordinalGenerator.ordinal("Two"); + assertNotEquals(oneOrd, twoOrd); + + assertEquals(oneOrd, ordinalGenerator.ordinal("ONE")); + assertEquals(twoOrd, ordinalGenerator.ordinal("two")); + + int threeOrd = ordinalGenerator.ordinal("Three"); + assertNotEquals(oneOrd, threeOrd); + assertNotEquals(twoOrd, threeOrd); + } + + @Test + public void testOrdinals_withCanonicalizationFunction() { + OrdinalGenerator<String> ordinalGenerator = new OrdinalGenerator<>(String::toLowerCase); + + int[] oneTwoOrds = ordinalGenerator.ordinals(Arrays.asList("One", "Two")); + int[] twoThreeOrds = ordinalGenerator.ordinals(Arrays.asList("Two", "Three")); + + assertEquals(oneTwoOrds[0], ordinalGenerator.ordinal("ONE")); + assertEquals(oneTwoOrds[1], ordinalGenerator.ordinal("two")); + assertEquals(twoThreeOrds[0], ordinalGenerator.ordinal("TWO")); + assertEquals(twoThreeOrds[1], ordinalGenerator.ordinal("threE")); + } } diff --git a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneCanonicalizerTest.java b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneCanonicalizerTest.java new file mode 100644 index 000000000000..0c78f5b85fac --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneCanonicalizerTest.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.timezonedetector; + +import static com.google.common.truth.Truth.assertThat; + +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class TimeZoneCanonicalizerTest { + + TimeZoneCanonicalizer mFunction = new TimeZoneCanonicalizer(); + + @Test + public void deprecatedTimeZonesAreEqualToCanonical() { + assertThat(mFunction.apply("America/Godthab")).isEqualTo("America/Nuuk"); + assertThat(mFunction.apply("Australia/Currie")).isEqualTo("Australia/Hobart"); + } + + @Test + public void wellKnownCanonicalIDs() { + assertThat(mFunction.apply("America/Detroit")).isEqualTo("America/Detroit"); + assertThat(mFunction.apply("Europe/London")).isEqualTo("Europe/London"); + assertThat(mFunction.apply("America/New_York")).isEqualTo("America/New_York"); + assertThat(mFunction.apply("Europe/Volgograd")).isEqualTo("Europe/Volgograd"); + } + + @Test + public void timeZonesAsGmtOffsetsTreatedAsCanonical() { + assertThat(mFunction.apply("Etc/GMT-11")).isEqualTo("Etc/GMT-11"); + } + + @Test + public void nonExistingOneMappedToThemselves() { + assertThat(mFunction.apply("Mars/Base")).isEqualTo("Mars/Base"); + } +} diff --git a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java index 47475a66c0d5..331f76cf7dc2 100644 --- a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java +++ b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java @@ -56,6 +56,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Function; /** * White-box unit tests for {@link TimeZoneDetectorStrategyImpl}. @@ -1008,7 +1009,7 @@ public class TimeZoneDetectorStrategyImplTest { // Check the various feature state values are what we expect. assertFeatureStateMatchesConfig(expectedInternalConfig, actualState, expectedDetectionMode); - OrdinalGenerator<String> tzIdOrdinalGenerator = new OrdinalGenerator<>(); + OrdinalGenerator<String> tzIdOrdinalGenerator = new OrdinalGenerator<>(Function.identity()); MetricsTimeZoneDetectorState expectedState = MetricsTimeZoneDetectorState.create( tzIdOrdinalGenerator, expectedInternalConfig, expectedDeviceTimeZoneId, diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 537bc2c7d52c..c33287c57377 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -141,6 +141,7 @@ import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.IBinder; +import android.os.Looper; import android.os.Parcel; import android.os.Process; import android.os.RemoteException; @@ -267,6 +268,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { RankingHandler mRankingHandler; @Mock ActivityManagerInternal mAmi; + @Mock + private Looper mMainLooper; @Mock IIntentSender pi1; @@ -514,7 +517,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mAppUsageStats, mock(DevicePolicyManagerInternal.class), mUgm, mUgmInternal, mAppOpsManager, mUm, mHistoryManager, mStatsManager, mock(TelephonyManager.class), mAmi, mToastRateLimiter); - mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY); + // Return first true for RoleObserver main-thread check + when(mMainLooper.isCurrentThread()).thenReturn(true).thenReturn(false); + mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY, mMainLooper); mService.setAudioManager(mAudioManager); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java index 4ce237e3aadc..27ae46c87b28 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java @@ -16,6 +16,7 @@ package com.android.server.notification; +import static android.app.role.RoleManager.ROLE_BROWSER; import static android.app.role.RoleManager.ROLE_DIALER; import static android.app.role.RoleManager.ROLE_EMERGENCY; import static android.content.pm.PackageManager.MATCH_ALL; @@ -23,6 +24,7 @@ import static android.content.pm.PackageManager.MATCH_ALL; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.mock; @@ -31,6 +33,8 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static java.util.Arrays.asList; + import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.app.AppOpsManager; @@ -44,7 +48,6 @@ import android.companion.ICompanionDeviceManager; import android.content.Context; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; -import android.content.pm.UserInfo; import android.os.Looper; import android.os.UserHandle; import android.os.UserManager; @@ -80,7 +83,6 @@ import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.Executor; @SmallTest @RunWith(AndroidTestingRunner.class) @@ -98,13 +100,13 @@ public class RoleObserverTest extends UiServiceTestCase { @Mock private UserManager mUm; @Mock - private Executor mExecutor; - @Mock private RoleManager mRoleManager; + @Mock + private Looper mMainLooper; NotificationRecordLoggerFake mNotificationRecordLogger = new NotificationRecordLoggerFake(); private InstanceIdSequence mNotificationInstanceIdSequence = new InstanceIdSequenceFake( 1 << 30); - private List<UserInfo> mUsers; + private List<UserHandle> mUsers; private static class TestableNotificationManagerService extends NotificationManagerService { TestableNotificationManagerService(Context context, @@ -133,13 +135,15 @@ public class RoleObserverTest extends UiServiceTestCase { mContext.addMockSystemService(AppOpsManager.class, mock(AppOpsManager.class)); mUsers = new ArrayList<>(); - mUsers.add(new UserInfo(0, "system", 0)); - mUsers.add(new UserInfo(10, "second", 0)); - when(mUm.getUsers()).thenReturn(mUsers); + mUsers.add(new UserHandle(0)); + mUsers.add(new UserHandle(10)); + when(mUm.getUserHandles(anyBoolean())).thenReturn(mUsers); + + when(mMainLooper.isCurrentThread()).thenReturn(true); mService = new TestableNotificationManagerService(mContext, mNotificationRecordLogger, mNotificationInstanceIdSequence); - mRoleObserver = mService.new RoleObserver(mRoleManager, mPm, mExecutor); + mRoleObserver = mService.new RoleObserver(mContext, mRoleManager, mPm, mMainLooper); try { mService.init(mService.new WorkerHandler(mock(Looper.class)), @@ -174,7 +178,7 @@ public class RoleObserverTest extends UiServiceTestCase { } @Test - public void testInit() throws Exception { + public void testInit_forNonBlockableDefaultApps() throws Exception { List<String> dialer0 = new ArrayList<>(); dialer0.add("dialer"); List<String> emer0 = new ArrayList<>(); @@ -191,29 +195,29 @@ public class RoleObserverTest extends UiServiceTestCase { when(mRoleManager.getRoleHoldersAsUser( ROLE_DIALER, - mUsers.get(0).getUserHandle())). - thenReturn(dialer0); + mUsers.get(0))) + .thenReturn(dialer0); when(mRoleManager.getRoleHoldersAsUser( ROLE_EMERGENCY, - mUsers.get(0).getUserHandle())). - thenReturn(emer0); + mUsers.get(0))) + .thenReturn(emer0); mRoleObserver.init(); // verify internal records of current state of the world assertTrue(mRoleObserver.isApprovedPackageForRoleForUser( - ROLE_DIALER, dialer0.get(0), mUsers.get(0).id)); + ROLE_DIALER, dialer0.get(0), mUsers.get(0).getIdentifier())); assertFalse(mRoleObserver.isApprovedPackageForRoleForUser( - ROLE_DIALER, dialer0.get(0), mUsers.get(1).id)); + ROLE_DIALER, dialer0.get(0), mUsers.get(1).getIdentifier())); assertTrue(mRoleObserver.isApprovedPackageForRoleForUser( - ROLE_EMERGENCY, emer0.get(0), mUsers.get(0).id)); + ROLE_EMERGENCY, emer0.get(0), mUsers.get(0).getIdentifier())); assertFalse(mRoleObserver.isApprovedPackageForRoleForUser( - ROLE_EMERGENCY, emer0.get(0), mUsers.get(1).id)); + ROLE_EMERGENCY, emer0.get(0), mUsers.get(1).getIdentifier())); // make sure we're listening to updates verify(mRoleManager, times(1)).addOnRoleHoldersChangedListenerAsUser( - eq(mExecutor), any(), eq(UserHandle.ALL)); + any(), any(), eq(UserHandle.ALL)); // make sure we told pref helper about the state of the world verify(mPreferencesHelper, times(1)).updateDefaultApps(0, null, dialer0Pair); @@ -221,14 +225,31 @@ public class RoleObserverTest extends UiServiceTestCase { } @Test - public void testSwapDefault() throws Exception { + public void testInit_forTrampolines() throws Exception { + when(mPm.getPackageUid("com.browser", MATCH_ALL, 0)).thenReturn(30); + when(mRoleManager.getRoleHoldersAsUser( + ROLE_BROWSER, + mUsers.get(0))) + .thenReturn(asList("com.browser")); + + mRoleObserver.init(); + + assertTrue(mRoleObserver.isUidExemptFromTrampolineRestrictions(30)); + + // make sure we're listening to updates + verify(mRoleManager, times(1)).addOnRoleHoldersChangedListenerAsUser(any(), any(), + eq(UserHandle.ALL)); + } + + @Test + public void testSwapDefault_forNonBlockableDefaultApps() throws Exception { List<String> dialer0 = new ArrayList<>(); dialer0.add("dialer"); when(mRoleManager.getRoleHoldersAsUser( ROLE_DIALER, - mUsers.get(0).getUserHandle())). - thenReturn(dialer0); + mUsers.get(0))) + .thenReturn(dialer0); mRoleObserver.init(); @@ -241,8 +262,8 @@ public class RoleObserverTest extends UiServiceTestCase { when(mRoleManager.getRoleHoldersAsUser( ROLE_DIALER, - mUsers.get(0).getUserHandle())). - thenReturn(newDefault); + mUsers.get(0))) + .thenReturn(newDefault); mRoleObserver.onRoleHoldersChanged(ROLE_DIALER, UserHandle.of(0)); @@ -251,15 +272,39 @@ public class RoleObserverTest extends UiServiceTestCase { } @Test - public void testSwapDefault_multipleOverlappingApps() throws Exception { + public void testSwapDefault_forTrampolines() throws Exception { + List<String> dialer0 = new ArrayList<>(); + when(mPm.getPackageUid("com.browser", MATCH_ALL, 0)).thenReturn(30); + when(mPm.getPackageUid("com.browser2", MATCH_ALL, 0)).thenReturn(31); + when(mRoleManager.getRoleHoldersAsUser( + ROLE_BROWSER, + mUsers.get(0))) + .thenReturn(asList("com.browser")); + mRoleObserver.init(); + assertTrue(mRoleObserver.isUidExemptFromTrampolineRestrictions(30)); + assertFalse(mRoleObserver.isUidExemptFromTrampolineRestrictions(31)); + // Default changed + when(mRoleManager.getRoleHoldersAsUser( + ROLE_BROWSER, + mUsers.get(0))) + .thenReturn(asList("com.browser2")); + mRoleObserver.onRoleHoldersChanged(ROLE_BROWSER, UserHandle.of(0)); + + assertFalse(mRoleObserver.isUidExemptFromTrampolineRestrictions(30)); + assertTrue(mRoleObserver.isUidExemptFromTrampolineRestrictions(31)); + } + + @Test + public void testSwapDefault_multipleOverlappingApps_forNonBlockableDefaultApps() + throws Exception { List<String> dialer0 = new ArrayList<>(); dialer0.add("dialer"); dialer0.add("phone"); when(mRoleManager.getRoleHoldersAsUser( ROLE_DIALER, - mUsers.get(0).getUserHandle())). - thenReturn(dialer0); + mUsers.get(0))) + .thenReturn(dialer0); mRoleObserver.init(); @@ -273,8 +318,8 @@ public class RoleObserverTest extends UiServiceTestCase { when(mRoleManager.getRoleHoldersAsUser( ROLE_DIALER, - mUsers.get(0).getUserHandle())). - thenReturn(newDefault); + mUsers.get(0))) + .thenReturn(newDefault); ArraySet<String> expectedRemove = new ArraySet<>(); expectedRemove.add("dialer"); @@ -294,14 +339,14 @@ public class RoleObserverTest extends UiServiceTestCase { } @Test - public void testSwapDefault_newUser() throws Exception { + public void testSwapDefault_newUser_forNonBlockableDefaultApps() throws Exception { List<String> dialer0 = new ArrayList<>(); dialer0.add("dialer"); when(mRoleManager.getRoleHoldersAsUser( ROLE_DIALER, - mUsers.get(0).getUserHandle())). - thenReturn(dialer0); + mUsers.get(0))) + .thenReturn(dialer0); mRoleObserver.init(); @@ -310,8 +355,8 @@ public class RoleObserverTest extends UiServiceTestCase { when(mRoleManager.getRoleHoldersAsUser( ROLE_DIALER, - mUsers.get(1).getUserHandle())). - thenReturn(dialer10); + mUsers.get(1))) + .thenReturn(dialer10); ArraySet<Pair<String, Integer>> expectedAddPair = new ArraySet<>(); expectedAddPair.add(new Pair("phone", 30)); @@ -329,4 +374,27 @@ public class RoleObserverTest extends UiServiceTestCase { assertTrue(mRoleObserver.isApprovedPackageForRoleForUser(ROLE_DIALER, "phone", 10)); assertTrue(mRoleObserver.isApprovedPackageForRoleForUser(ROLE_DIALER, "dialer", 0)); } + + @Test + public void testSwapDefault_newUser_forTrampolines() throws Exception { + List<String> dialer0 = new ArrayList<>(); + when(mPm.getPackageUid("com.browser", MATCH_ALL, 0)).thenReturn(30); + when(mPm.getPackageUid("com.browser2", MATCH_ALL, 10)).thenReturn(1031); + when(mRoleManager.getRoleHoldersAsUser( + ROLE_BROWSER, + mUsers.get(0))) + .thenReturn(asList("com.browser")); + mRoleObserver.init(); + assertTrue(mRoleObserver.isUidExemptFromTrampolineRestrictions(30)); + assertFalse(mRoleObserver.isUidExemptFromTrampolineRestrictions(1031)); + // New user + when(mRoleManager.getRoleHoldersAsUser( + ROLE_BROWSER, + mUsers.get(1))) + .thenReturn(asList("com.browser2")); + mRoleObserver.onRoleHoldersChanged(ROLE_BROWSER, UserHandle.of(10)); + + assertTrue(mRoleObserver.isUidExemptFromTrampolineRestrictions(30)); + assertTrue(mRoleObserver.isUidExemptFromTrampolineRestrictions(1031)); + } } diff --git a/test-mock/Android.bp b/test-mock/Android.bp index a2447d71c3bd..b83bce654a85 100644 --- a/test-mock/Android.bp +++ b/test-mock/Android.bp @@ -38,6 +38,7 @@ java_sdk_library { ], libs: [ "framework", + "framework-annotations-lib", "app-compat-annotations", "unsupportedappusage", ], diff --git a/tests/UpdatableSystemFontTest/Android.bp b/tests/UpdatableSystemFontTest/Android.bp index 8b0ae5c37bae..ea5a43104bba 100644 --- a/tests/UpdatableSystemFontTest/Android.bp +++ b/tests/UpdatableSystemFontTest/Android.bp @@ -21,16 +21,15 @@ package { default_applicable_licenses: ["frameworks_base_license"], } -java_test_host { +android_test { name: "UpdatableSystemFontTest", srcs: ["src/**/*.java"], - libs: [ - "tradefed", - "compatibility-tradefed", - "compatibility-host-util", - ], + libs: ["android.test.runner"], static_libs: [ - "frameworks-base-hostutils", + "androidx.test.ext.junit", + "compatibility-device-util-axt", + "platform-test-annotations", + "truth-prebuilt", ], test_suites: [ "general-tests", @@ -47,4 +46,5 @@ java_test_host { ":UpdatableSystemFontTestNotoColorEmojiVPlus2Ttf", ":UpdatableSystemFontTestNotoColorEmojiVPlus2TtfFsvSig", ], + sdk_version: "test_current", } diff --git a/tests/UpdatableSystemFontTest/AndroidManifest.xml b/tests/UpdatableSystemFontTest/AndroidManifest.xml new file mode 100644 index 000000000000..531ee981a92c --- /dev/null +++ b/tests/UpdatableSystemFontTest/AndroidManifest.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2021 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.updatablesystemfont"> + + <application android:label="UpdatableSystemFontTest"> + <uses-library android:name="android.test.runner"/> + </application> + + <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" + android:label="UpdatableSystemFontTest" + android:targetPackage="com.android.updatablesystemfont"> + </instrumentation> + +</manifest> diff --git a/tests/UpdatableSystemFontTest/AndroidTest.xml b/tests/UpdatableSystemFontTest/AndroidTest.xml index 4f116698ba72..4f6487e7e953 100644 --- a/tests/UpdatableSystemFontTest/AndroidTest.xml +++ b/tests/UpdatableSystemFontTest/AndroidTest.xml @@ -21,6 +21,7 @@ <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> <option name="cleanup-apks" value="true" /> + <option name="test-file-name" value="UpdatableSystemFontTest.apk" /> <option name="test-file-name" value="EmojiRenderingTestApp.apk" /> </target_preparer> @@ -37,7 +38,7 @@ <option name="push" value="UpdatableSystemFontTestNotoColorEmojiVPlus2.ttf.fsv_sig->/data/local/tmp/UpdatableSystemFontTestNotoColorEmojiVPlus2.ttf.fsv_sig" /> </target_preparer> - <test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" > - <option name="jar" value="UpdatableSystemFontTest.jar" /> + <test class="com.android.tradefed.testtype.AndroidJUnitTest"> + <option name="package" value="com.android.updatablesystemfont" /> </test> </configuration> diff --git a/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java b/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java index 74f6bca4d7a0..9793c3447ff2 100644 --- a/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java +++ b/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java @@ -16,44 +16,59 @@ package com.android.updatablesystemfont; +import static android.os.ParcelFileDescriptor.MODE_READ_ONLY; + import static com.google.common.truth.Truth.assertThat; -import static com.google.common.truth.Truth.assertWithMessage; + +import static org.junit.Assume.assumeTrue; import static java.util.concurrent.TimeUnit.SECONDS; +import android.app.UiAutomation; +import android.content.Context; +import android.graphics.fonts.FontFamilyUpdateRequest; +import android.graphics.fonts.FontFileUpdateRequest; +import android.graphics.fonts.FontManager; +import android.os.ParcelFileDescriptor; import android.platform.test.annotations.RootPermissionTest; +import android.security.FileIntegrityManager; +import android.text.FontConfig; +import android.util.Log; +import android.util.Pair; -import com.android.fsverity.AddFsVerityCertRule; -import com.android.tradefed.device.DeviceNotAvailableException; -import com.android.tradefed.log.LogUtil.CLog; -import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; -import com.android.tradefed.util.CommandResult; -import com.android.tradefed.util.CommandStatus; +import androidx.annotation.Nullable; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; + +import com.android.compatibility.common.util.StreamUtil; +import com.android.compatibility.common.util.SystemUtil; import org.junit.After; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Paths; /** - * Tests if fonts can be updated by 'cmd font'. + * Tests if fonts can be updated by {@link FontManager} API. */ @RootPermissionTest -@RunWith(DeviceJUnit4ClassRunner.class) -public class UpdatableSystemFontTest extends BaseHostJUnit4Test { +@RunWith(AndroidJUnit4.class) +public class UpdatableSystemFontTest { + private static final String TAG = "UpdatableSystemFontTest"; private static final String SYSTEM_FONTS_DIR = "/system/fonts/"; private static final String DATA_FONTS_DIR = "/data/fonts/files/"; - private static final String CERT_PATH = "/data/local/tmp/UpdatableSystemFontTestCert.der"; - - private static final Pattern PATTERN_FONT = Pattern.compile("path = ([^, \n]*)"); - private static final String NOTO_COLOR_EMOJI_TTF = "NotoColorEmoji.ttf"; + private static final String NOTO_COLOR_EMOJI_POSTSCRIPT_NAME = "NotoColorEmoji"; private static final String ORIGINAL_NOTO_COLOR_EMOJI_TTF = "/data/local/tmp/NotoColorEmoji.ttf"; @@ -80,64 +95,75 @@ public class UpdatableSystemFontTest extends BaseHostJUnit4Test { EMOJI_RENDERING_TEST_APP_ID + "/.EmojiRenderingTestActivity"; private static final long ACTIVITY_TIMEOUT_MILLIS = SECONDS.toMillis(10); - private interface ThrowingSupplier<T> { - T get() throws Exception; - } - - @Rule - public final AddFsVerityCertRule mAddFsverityCertRule = - new AddFsVerityCertRule(this, CERT_PATH); + private String mKeyId; + private FontManager mFontManager; @Before public void setUp() throws Exception { - expectRemoteCommandToSucceed("cmd font clear"); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); + // Run tests only if updatable system font is enabled. + FileIntegrityManager fim = context.getSystemService(FileIntegrityManager.class); + assumeTrue(fim != null); + assumeTrue(fim.isApkVeritySupported()); + mKeyId = insertCert(CERT_PATH); + mFontManager = context.getSystemService(FontManager.class); + expectCommandToSucceed("cmd font clear"); } @After public void tearDown() throws Exception { - expectRemoteCommandToSucceed("cmd font clear"); + expectCommandToSucceed("cmd font clear"); + if (mKeyId != null) { + expectCommandToSucceed("mini-keyctl unlink " + mKeyId + " .fs-verity"); + } } @Test public void updateFont() throws Exception { - expectRemoteCommandToSucceed(String.format("cmd font update %s %s", - TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG)); - String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF); + assertThat(updateFontFile( + TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG)) + .isEqualTo(FontManager.RESULT_SUCCESS); + String fontPath = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME); assertThat(fontPath).startsWith(DATA_FONTS_DIR); // The updated font should be readable and unmodifiable. - expectRemoteCommandToSucceed("cat " + fontPath + " > /dev/null"); - expectRemoteCommandToFail("echo -n '' >> " + fontPath); + expectCommandToSucceed("dd status=none if=" + fontPath + " of=/dev/null"); + expectCommandToFail("dd status=none if=" + CERT_PATH + " of=" + fontPath); } @Test public void updateFont_twice() throws Exception { - expectRemoteCommandToSucceed(String.format("cmd font update %s %s", - TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG)); - String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF); - expectRemoteCommandToSucceed(String.format("cmd font update %s %s", - TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF_FSV_SIG)); - String fontPath2 = getFontPath(NOTO_COLOR_EMOJI_TTF); + assertThat(updateFontFile( + TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG)) + .isEqualTo(FontManager.RESULT_SUCCESS); + String fontPath = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME); + assertThat(updateFontFile( + TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF_FSV_SIG)) + .isEqualTo(FontManager.RESULT_SUCCESS); + String fontPath2 = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME); assertThat(fontPath2).startsWith(DATA_FONTS_DIR); assertThat(fontPath2).isNotEqualTo(fontPath); // The new file should be readable. - expectRemoteCommandToSucceed("cat " + fontPath2 + " > /dev/null"); + expectCommandToSucceed("dd status=none if=" + fontPath2 + " of=/dev/null"); // The old file should be still readable. - expectRemoteCommandToSucceed("cat " + fontPath + " > /dev/null"); + expectCommandToSucceed("dd status=none if=" + fontPath + " of=/dev/null"); } @Test public void updateFont_allowSameVersion() throws Exception { // Update original font to the same version - expectRemoteCommandToSucceed(String.format("cmd font update %s %s", - ORIGINAL_NOTO_COLOR_EMOJI_TTF, ORIGINAL_NOTO_COLOR_EMOJI_TTF_FSV_SIG)); - String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF); - expectRemoteCommandToSucceed(String.format("cmd font update %s %s", - TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG)); - String fontPath2 = getFontPath(NOTO_COLOR_EMOJI_TTF); + assertThat(updateFontFile( + ORIGINAL_NOTO_COLOR_EMOJI_TTF, ORIGINAL_NOTO_COLOR_EMOJI_TTF_FSV_SIG)) + .isEqualTo(FontManager.RESULT_SUCCESS); + String fontPath = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME); + assertThat(updateFontFile( + TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG)) + .isEqualTo(FontManager.RESULT_SUCCESS); + String fontPath2 = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME); // Update updated font to the same version - expectRemoteCommandToSucceed(String.format("cmd font update %s %s", - TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG)); - String fontPath3 = getFontPath(NOTO_COLOR_EMOJI_TTF); + assertThat(updateFontFile( + TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG)) + .isEqualTo(FontManager.RESULT_SUCCESS); + String fontPath3 = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME); assertThat(fontPath).startsWith(DATA_FONTS_DIR); assertThat(fontPath2).isNotEqualTo(fontPath); assertThat(fontPath2).startsWith(DATA_FONTS_DIR); @@ -147,134 +173,171 @@ public class UpdatableSystemFontTest extends BaseHostJUnit4Test { @Test public void updateFont_invalidCert() throws Exception { - expectRemoteCommandToFail(String.format("cmd font update %s %s", - TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF_FSV_SIG)); + assertThat(updateFontFile( + TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF_FSV_SIG)) + .isEqualTo(FontManager.RESULT_ERROR_VERIFICATION_FAILURE); } @Test public void updateFont_downgradeFromSystem() throws Exception { - expectRemoteCommandToFail(String.format("cmd font update %s %s", - TEST_NOTO_COLOR_EMOJI_V0_TTF, TEST_NOTO_COLOR_EMOJI_V0_TTF_FSV_SIG)); + assertThat(updateFontFile( + TEST_NOTO_COLOR_EMOJI_V0_TTF, TEST_NOTO_COLOR_EMOJI_V0_TTF_FSV_SIG)) + .isEqualTo(FontManager.RESULT_ERROR_DOWNGRADING); } @Test public void updateFont_downgradeFromData() throws Exception { - expectRemoteCommandToSucceed(String.format("cmd font update %s %s", - TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF_FSV_SIG)); - expectRemoteCommandToFail(String.format("cmd font update %s %s", - TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG)); + assertThat(updateFontFile( + TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS2_TTF_FSV_SIG)) + .isEqualTo(FontManager.RESULT_SUCCESS); + assertThat(updateFontFile( + TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG)) + .isEqualTo(FontManager.RESULT_ERROR_DOWNGRADING); } @Test public void launchApp() throws Exception { - String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF); + String fontPath = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME); assertThat(fontPath).startsWith(SYSTEM_FONTS_DIR); startActivity(EMOJI_RENDERING_TEST_APP_ID, EMOJI_RENDERING_TEST_ACTIVITY); - waitUntil(ACTIVITY_TIMEOUT_MILLIS, () -> - isFileOpenedBy(fontPath, EMOJI_RENDERING_TEST_APP_ID)); + SystemUtil.eventually( + () -> assertThat(isFileOpenedBy(fontPath, EMOJI_RENDERING_TEST_APP_ID)).isTrue(), + ACTIVITY_TIMEOUT_MILLIS); } @Test public void launchApp_afterUpdateFont() throws Exception { - String originalFontPath = getFontPath(NOTO_COLOR_EMOJI_TTF); + String originalFontPath = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME); assertThat(originalFontPath).startsWith(SYSTEM_FONTS_DIR); - expectRemoteCommandToSucceed(String.format("cmd font update %s %s", - TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG)); - String updatedFontPath = getFontPath(NOTO_COLOR_EMOJI_TTF); + assertThat(updateFontFile( + TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG)) + .isEqualTo(FontManager.RESULT_SUCCESS); + String updatedFontPath = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME); assertThat(updatedFontPath).startsWith(DATA_FONTS_DIR); startActivity(EMOJI_RENDERING_TEST_APP_ID, EMOJI_RENDERING_TEST_ACTIVITY); // The original font should NOT be opened by the app. - waitUntil(ACTIVITY_TIMEOUT_MILLIS, () -> - isFileOpenedBy(updatedFontPath, EMOJI_RENDERING_TEST_APP_ID) - && !isFileOpenedBy(originalFontPath, EMOJI_RENDERING_TEST_APP_ID)); + SystemUtil.eventually(() -> { + assertThat(isFileOpenedBy(updatedFontPath, EMOJI_RENDERING_TEST_APP_ID)).isTrue(); + assertThat(isFileOpenedBy(originalFontPath, EMOJI_RENDERING_TEST_APP_ID)).isFalse(); + }, ACTIVITY_TIMEOUT_MILLIS); } @Test public void reboot() throws Exception { - expectRemoteCommandToSucceed(String.format("cmd font update %s %s", + expectCommandToSucceed(String.format("cmd font update %s %s", TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG)); - String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF); + String fontPath = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME); assertThat(fontPath).startsWith(DATA_FONTS_DIR); // Emulate reboot by 'cmd font restart'. - expectRemoteCommandToSucceed("cmd font restart"); - String fontPathAfterReboot = getFontPath(NOTO_COLOR_EMOJI_TTF); + expectCommandToSucceed("cmd font restart"); + String fontPathAfterReboot = getFontPath(NOTO_COLOR_EMOJI_POSTSCRIPT_NAME); assertThat(fontPathAfterReboot).isEqualTo(fontPath); } - private String getFontPath(String fontFileName) throws Exception { - // TODO: add a dedicated command for testing. - String lines = expectRemoteCommandToSucceed("cmd font dump"); - for (String line : lines.split("\n")) { - Matcher m = PATTERN_FONT.matcher(line); - if (m.find() && m.group(1).endsWith(fontFileName)) { - return m.group(1); - } + private static String insertCert(String certPath) throws Exception { + Pair<String, String> result; + try (InputStream is = new FileInputStream(certPath)) { + result = runShellCommand("mini-keyctl padd asymmetric fsv_test .fs-verity", is); + } + // Assert that there are no errors. + assertThat(result.second).isEmpty(); + String keyId = result.first.trim(); + assertThat(keyId).matches("^\\d+$"); + return keyId; + } + + private int updateFontFile(String fontPath, String signaturePath) throws IOException { + byte[] signature = Files.readAllBytes(Paths.get(signaturePath)); + try (ParcelFileDescriptor fd = + ParcelFileDescriptor.open(new File(fontPath), MODE_READ_ONLY)) { + return SystemUtil.runWithShellPermissionIdentity(() -> { + FontConfig fontConfig = mFontManager.getFontConfig(); + return mFontManager.updateFontFamily( + new FontFamilyUpdateRequest.Builder() + .addFontFileUpdateRequest(new FontFileUpdateRequest(fd, signature)) + .build(), + fontConfig.getConfigVersion()); + }); } - CLog.e("Font not found: " + fontFileName); - return null; } - private void startActivity(String appId, String activityId) throws Exception { - // Make sure that the app is installed and enabled. - waitUntil(ACTIVITY_TIMEOUT_MILLIS, () -> { - String packageInfo = expectRemoteCommandToSucceed( - "pm list packages -e " + EMOJI_RENDERING_TEST_APP_ID); - return !packageInfo.isEmpty(); + private String getFontPath(String psName) { + return SystemUtil.runWithShellPermissionIdentity(() -> { + FontConfig fontConfig = mFontManager.getFontConfig(); + for (FontConfig.FontFamily family : fontConfig.getFontFamilies()) { + for (FontConfig.Font font : family.getFontList()) { + if (psName.equals(font.getPostScriptName())) { + return font.getFile().getAbsolutePath(); + } + } + } + throw new AssertionError("Font not found: " + psName); }); - expectRemoteCommandToSucceed("am force-stop " + EMOJI_RENDERING_TEST_APP_ID); - expectRemoteCommandToSucceed("am start-activity -n " + EMOJI_RENDERING_TEST_ACTIVITY); } - private String expectRemoteCommandToSucceed(String cmd) throws Exception { - CommandResult result = getDevice().executeShellV2Command(cmd); - assertWithMessage("`" + cmd + "` failed: " + result.getStderr()) - .that(result.getStatus()) - .isEqualTo(CommandStatus.SUCCESS); - return result.getStdout(); + private static void startActivity(String appId, String activityId) throws Exception { + expectCommandToSucceed("am force-stop " + appId); + expectCommandToSucceed("am start-activity -n " + activityId); + } + + private static String expectCommandToSucceed(String cmd) throws IOException { + Pair<String, String> result = runShellCommand(cmd, null); + // UiAutomation.runShellCommand() does not return exit code. + // Assume that the command fails if stderr is not empty. + assertThat(result.second.trim()).isEmpty(); + return result.first; } - private void expectRemoteCommandToFail(String cmd) throws Exception { - CommandResult result = getDevice().executeShellV2Command(cmd); - assertWithMessage("Unexpected success from `" + cmd + "`: " + result.getStderr()) - .that(result.getStatus()) - .isNotEqualTo(CommandStatus.SUCCESS); + private static void expectCommandToFail(String cmd) throws IOException { + Pair<String, String> result = runShellCommand(cmd, null); + // UiAutomation.runShellCommand() does not return exit code. + // Assume that the command fails if stderr is not empty. + assertThat(result.second.trim()).isNotEmpty(); } - private void waitUntil(long timeoutMillis, ThrowingSupplier<Boolean> func) { - long untilMillis = System.currentTimeMillis() + timeoutMillis; - do { - try { - if (func.get()) return; - Thread.sleep(100); - } catch (InterruptedException e) { - throw new AssertionError("Interrupted", e); - } catch (Exception e) { - throw new AssertionError("Unexpected exception", e); + /** Runs a command and returns (stdout, stderr). */ + private static Pair<String, String> runShellCommand(String cmd, @Nullable InputStream input) + throws IOException { + Log.i(TAG, "runShellCommand: " + cmd); + UiAutomation automation = InstrumentationRegistry.getInstrumentation().getUiAutomation(); + ParcelFileDescriptor[] rwe = automation.executeShellCommandRwe(cmd); + // executeShellCommandRwe returns [stdout, stdin, stderr]. + try (ParcelFileDescriptor outFd = rwe[0]; + ParcelFileDescriptor inFd = rwe[1]; + ParcelFileDescriptor errFd = rwe[2]) { + if (input != null) { + try (OutputStream os = new FileOutputStream(inFd.getFileDescriptor())) { + StreamUtil.copyStreams(input, os); + } } - } while (System.currentTimeMillis() < untilMillis); - throw new AssertionError("Timed out"); + // We have to close stdin before reading stdout and stderr. + // It's safe to close ParcelFileDescriptor multiple times. + inFd.close(); + String stdout; + try (InputStream is = new FileInputStream(outFd.getFileDescriptor())) { + stdout = StreamUtil.readInputStream(is); + } + Log.i(TAG, "stdout = " + stdout); + String stderr; + try (InputStream is = new FileInputStream(errFd.getFileDescriptor())) { + stderr = StreamUtil.readInputStream(is); + } + Log.i(TAG, "stderr = " + stderr); + return new Pair<>(stdout, stderr); + } } - private boolean isFileOpenedBy(String path, String appId) throws DeviceNotAvailableException { + private static boolean isFileOpenedBy(String path, String appId) throws Exception { String pid = pidOf(appId); if (pid.isEmpty()) { return false; } - CommandResult result = getDevice().executeShellV2Command( - String.format("lsof -t -p %s '%s'", pid, path)); - if (result.getStatus() != CommandStatus.SUCCESS) { - return false; - } - // The file is open if the output of lsof is non-empty. - return !result.getStdout().trim().isEmpty(); + String cmd = String.format("lsof -t -p %s %s", pid, path); + return !expectCommandToSucceed(cmd).trim().isEmpty(); } - private String pidOf(String appId) throws DeviceNotAvailableException { - CommandResult result = getDevice().executeShellV2Command("pidof " + appId); - if (result.getStatus() != CommandStatus.SUCCESS) { - return ""; - } - return result.getStdout().trim(); + private static String pidOf(String appId) throws Exception { + return expectCommandToSucceed("pidof " + appId).trim(); } } diff --git a/tools/aapt/Android.bp b/tools/aapt/Android.bp index c75ba71c4432..a19d183d617b 100644 --- a/tools/aapt/Android.bp +++ b/tools/aapt/Android.bp @@ -124,6 +124,9 @@ cc_binary_host { srcs: ["Main.cpp"], use_version_lib: true, static_libs: ["libaapt"], + dist: { + targets: ["aapt2_artifacts"], + }, } // ========================================================== diff --git a/tools/aapt2/dump/DumpManifest.cpp b/tools/aapt2/dump/DumpManifest.cpp index f29c9185cafa..61ba09b6a3c9 100644 --- a/tools/aapt2/dump/DumpManifest.cpp +++ b/tools/aapt2/dump/DumpManifest.cpp @@ -132,6 +132,12 @@ class ManifestExtractor { /** Adds an element to the list of children of the element. */ void AddChild(std::unique_ptr<Element>& child) { children_.push_back(std::move(child)); } + template <typename Predicate> + void Filter(Predicate&& func) { + children_.erase(std::remove_if(children_.begin(), children_.end(), + [&](const auto& e) { return func(e.get()); })); + } + /** Retrieves the list of children of the element. */ const std::vector<std::unique_ptr<Element>>& children() const { return children_; @@ -1963,6 +1969,21 @@ bool ManifestExtractor::Dump(text::Printer* printer, IDiagnostics* diag) { // Extract badging information auto root = Visit(element); + // Filter out all "uses-sdk" tags besides the very last tag. The android runtime only uses the + // attribute values from the last defined tag. + std::vector<UsesSdkBadging*> filtered_uses_sdk_tags; + for (const auto& child : root->children()) { + if (auto uses_sdk = ElementCast<UsesSdkBadging>(child.get())) { + filtered_uses_sdk_tags.emplace_back(uses_sdk); + } + } + filtered_uses_sdk_tags.pop_back(); + + root->Filter([&](const ManifestExtractor::Element* e) { + return std::find(filtered_uses_sdk_tags.begin(), filtered_uses_sdk_tags.end(), e) != + filtered_uses_sdk_tags.end(); + }); + // Print the elements in order seen Print(root.get(), printer); |