diff options
9 files changed, 180 insertions, 6 deletions
diff --git a/core/java/android/app/appfunctions/OWNERS b/core/java/android/app/appfunctions/OWNERS index c6827cc93222..6a69e15d00dd 100644 --- a/core/java/android/app/appfunctions/OWNERS +++ b/core/java/android/app/appfunctions/OWNERS @@ -4,3 +4,4 @@ toki@google.com tonymak@google.com mingweiliao@google.com anothermark@google.com +utkarshnigam@google.com diff --git a/packages/SystemUI/res-keyguard/layout-land/keyguard_pattern_view.xml b/packages/SystemUI/res-keyguard/layout-land/keyguard_pattern_view.xml new file mode 100644 index 000000000000..8a77d88a7e83 --- /dev/null +++ b/packages/SystemUI/res-keyguard/layout-land/keyguard_pattern_view.xml @@ -0,0 +1,100 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +** +** Copyright 2024, 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. +*/ +--> + +<!-- This is the screen that shows the 9 circle unlock widget and instructs + the user how to unlock their device, or make an emergency call. This + is the landscape layout. --> +<com.android.keyguard.KeyguardPatternView + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/res-auto" + android:id="@+id/keyguard_pattern_view" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_gravity="center_horizontal|bottom" + android:clipChildren="false" + android:clipToPadding="false" + android:orientation="horizontal"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="2" + android:clipChildren="false" + android:clipToPadding="false" + android:layoutDirection="ltr" + android:orientation="vertical"> + + <include layout="@layout/keyguard_bouncer_message_area"/> + + <com.android.systemui.bouncer.ui.BouncerMessageView + android:id="@+id/bouncer_message_view" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + androidprv:layout_constraintBottom_toTopOf="@+id/lockPatternView" + androidprv:layout_constraintTop_toTopOf="parent" + androidprv:layout_constraintVertical_chainStyle="packed" /> + + <include + android:id="@+id/keyguard_selector_fade_container" + layout="@layout/keyguard_eca" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="bottom|center_horizontal" + android:layout_marginBottom="@dimen/keyguard_eca_bottom_margin" + android:layout_marginTop="@dimen/keyguard_eca_top_margin" + android:gravity="center_horizontal" + android:orientation="vertical" + androidprv:layout_constraintBottom_toBottomOf="parent" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/pattern_container" + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="3" + android:clipChildren="false" + android:clipToPadding="false" + android:layoutDirection="ltr" + android:orientation="vertical"> + + <androidx.constraintlayout.widget.Guideline + android:id="@+id/pattern_top_guideline" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="horizontal" + androidprv:layout_constraintGuide_percent="0" /> + + <com.android.internal.widget.LockPatternView + android:id="@+id/lockPatternView" + android:layout_width="0dp" + android:layout_height="0dp" + android:clipChildren="false" + android:clipToPadding="false" + android:orientation="horizontal" + androidprv:layout_constraintDimensionRatio="1.0" + androidprv:layout_constraintVertical_bias="1.0" + androidprv:layout_constraintLeft_toLeftOf="parent" + androidprv:layout_constraintRight_toRightOf="parent" + androidprv:layout_constraintBottom_toBottomOf="parent" + androidprv:layout_constraintTop_toBottomOf="@id/pattern_top_guideline"/> + + </androidx.constraintlayout.widget.ConstraintLayout> +</com.android.keyguard.KeyguardPatternView> diff --git a/ravenwood/tests/coretest/Android.bp b/ravenwood/tests/coretest/Android.bp index d94475c00240..85f1baf1cab9 100644 --- a/ravenwood/tests/coretest/Android.bp +++ b/ravenwood/tests/coretest/Android.bp @@ -17,9 +17,15 @@ android_ravenwood_test { "junit-params", "platform-parametric-runner-lib", "truth", + + // This library should be removed by Ravenizer + "mockito-target-minus-junit4", ], srcs: [ "test/**/*.java", ], + ravenizer: { + strip_mockito: true, + }, auto_gen_config: true, } diff --git a/ravenwood/tests/coretest/test/com/android/ravenwoodtest/coretest/RavenwoodMockitoTest.java b/ravenwood/tests/coretest/test/com/android/ravenwoodtest/coretest/RavenwoodMockitoTest.java new file mode 100644 index 000000000000..dd6d259d5a34 --- /dev/null +++ b/ravenwood/tests/coretest/test/com/android/ravenwoodtest/coretest/RavenwoodMockitoTest.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2024 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.ravenwoodtest.coretest; + +import static org.junit.Assert.assertThrows; + +import org.junit.Test; + +public class RavenwoodMockitoTest { + + @Test + public void checkMockitoClasses() { + // DexMaker should not exist + assertThrows( + ClassNotFoundException.class, + () -> Class.forName("com.android.dx.DexMaker")); + // Mockito 2 should not exist + assertThrows( + ClassNotFoundException.class, + () -> Class.forName("org.mockito.Matchers")); + } +} diff --git a/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/Ravenizer.kt b/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/Ravenizer.kt index f7f9a8563656..49f0b599762f 100644 --- a/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/Ravenizer.kt +++ b/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/Ravenizer.kt @@ -85,18 +85,17 @@ data class RavenizerStats( /** * Main class. */ -class Ravenizer(val options: RavenizerOptions) { - fun run() { +class Ravenizer { + fun run(options: RavenizerOptions) { val stats = RavenizerStats() - val fatalValidation = options.fatalValidation.get - stats.totalTime = log.nTime { process( options.inJar.get, options.outJar.get, options.enableValidation.get, - fatalValidation, + options.fatalValidation.get, + options.stripMockito.get, stats, ) } @@ -108,6 +107,7 @@ class Ravenizer(val options: RavenizerOptions) { outJar: String, enableValidation: Boolean, fatalValidation: Boolean, + stripMockito: Boolean, stats: RavenizerStats, ) { var allClasses = ClassNodes.loadClassStructures(inJar) { @@ -126,6 +126,9 @@ class Ravenizer(val options: RavenizerOptions) { } } } + if (includeUnsupportedMockito(allClasses)) { + log.w("Unsupported Mockito detected in $inJar}!") + } stats.totalProcessTime = log.vTime("$executableName processing $inJar") { ZipFile(inJar).use { inZip -> @@ -145,6 +148,11 @@ class Ravenizer(val options: RavenizerOptions) { ) } + if (stripMockito && entry.name.isMockitoFile()) { + // Skip this entry + continue + } + val className = zipEntryNameToClassName(entry.name) if (className != null) { diff --git a/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/RavenizerMain.kt b/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/RavenizerMain.kt index ff41818cd370..aee453020fb4 100644 --- a/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/RavenizerMain.kt +++ b/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/RavenizerMain.kt @@ -36,6 +36,6 @@ fun main(args: Array<String>) { log.v("Options: $options") // Run. - Ravenizer(options).run() + Ravenizer().run(options) } } diff --git a/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/RavenizerOptions.kt b/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/RavenizerOptions.kt index 10fe0a3b5a93..32dcbe546f3c 100644 --- a/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/RavenizerOptions.kt +++ b/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/RavenizerOptions.kt @@ -47,6 +47,9 @@ class RavenizerOptions( /** Whether the validation failure is fatal or not. */ var fatalValidation: SetOnce<Boolean> = SetOnce(false), + + /** Whether to remove mockito and dexmaker classes. */ + var stripMockito: SetOnce<Boolean> = SetOnce(false), ) { companion object { @@ -85,6 +88,9 @@ class RavenizerOptions( "--fatal-validation" -> ret.fatalValidation.set(true) "--no-fatal-validation" -> ret.fatalValidation.set(false) + "--strip-mockito" -> ret.stripMockito.set(true) + "--no-strip-mockito" -> ret.stripMockito.set(false) + else -> throw ArgumentsException("Unknown option: $arg") } } catch (e: SetOnce.SetMoreThanOnceException) { diff --git a/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/Utils.kt b/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/Utils.kt index 1aa70c08c254..37a797528e13 100644 --- a/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/Utils.kt +++ b/ravenwood/tools/ravenizer/src/com/android/platform/test/ravenwood/ravenizer/Utils.kt @@ -100,3 +100,19 @@ fun String.shouldByBypassed(): Boolean { // TODO -- anything else? ) } + +/** + * Files that should be removed when "--strip-mockito" is set. + */ +fun String.isMockitoFile(): Boolean { + return this.startsWithAny( + "org/mockito/", // Mockito + "com/android/dx/", // DexMaker + "mockito-extensions/", // DexMaker overrides + ) +} + +fun includeUnsupportedMockito(classes: ClassNodes): Boolean { + return classes.findClass("com/android/dx/DexMaker") != null + || classes.findClass("org/mockito/Matchers") != null +} diff --git a/tests/Internal/src/com/android/internal/os/OWNERS b/tests/Internal/src/com/android/internal/os/OWNERS new file mode 100644 index 000000000000..64ffa463bac1 --- /dev/null +++ b/tests/Internal/src/com/android/internal/os/OWNERS @@ -0,0 +1,2 @@ +# ApplicationSharedMemory +per-file *ApplicationSharedMemory* = file:/PERFORMANCE_OWNERS |