Merge "Set config_matchSecondaryInternalDisplay.. default to false" into main
diff --git a/core/java/android/view/NotificationTopLineView.java b/core/java/android/view/NotificationTopLineView.java
index bd20f5b..a2919f5 100644
--- a/core/java/android/view/NotificationTopLineView.java
+++ b/core/java/android/view/NotificationTopLineView.java
@@ -21,6 +21,7 @@
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Rect;
+import android.os.Trace;
import android.util.AttributeSet;
import android.widget.RemoteViews;
@@ -106,6 +107,7 @@
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ Trace.beginSection("NotificationTopLineView#onMeasure");
final int givenWidth = MeasureSpec.getSize(widthMeasureSpec);
final int givenHeight = MeasureSpec.getSize(heightMeasureSpec);
final boolean wrapHeight = MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST;
@@ -161,6 +163,7 @@
.finish();
}
setMeasuredDimension(givenWidth, wrapHeight ? maxChildHeight : givenHeight);
+ Trace.endSection();
}
@Override
diff --git a/core/java/com/android/internal/widget/ImageFloatingTextView.java b/core/java/com/android/internal/widget/ImageFloatingTextView.java
index 1ac5e1f..de10bd2 100644
--- a/core/java/com/android/internal/widget/ImageFloatingTextView.java
+++ b/core/java/com/android/internal/widget/ImageFloatingTextView.java
@@ -18,6 +18,7 @@
import android.annotation.Nullable;
import android.content.Context;
+import android.os.Trace;
import android.text.BoringLayout;
import android.text.Layout;
import android.text.StaticLayout;
@@ -68,6 +69,7 @@
protected Layout makeSingleLayout(int wantWidth, BoringLayout.Metrics boring, int ellipsisWidth,
Layout.Alignment alignment, boolean shouldEllipsize,
TextUtils.TruncateAt effectiveEllipsize, boolean useSaved) {
+ Trace.beginSection("ImageFloatingTextView#makeSingleLayout");
TransformationMethod transformationMethod = getTransformationMethod();
CharSequence text = getText();
if (transformationMethod != null) {
@@ -110,7 +112,9 @@
builder.setIndents(null, margins);
}
- return builder.build();
+ final StaticLayout result = builder.build();
+ Trace.endSection();
+ return result;
}
/**
@@ -135,6 +139,7 @@
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ Trace.beginSection("ImageFloatingTextView#onMeasure");
int availableHeight = MeasureSpec.getSize(heightMeasureSpec) - mPaddingTop - mPaddingBottom;
if (getLayout() != null && getLayout().getHeight() != availableHeight) {
// We've been measured before and the new size is different than before, lets make sure
@@ -161,6 +166,7 @@
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
+ Trace.endSection();
}
@Override
diff --git a/libs/dream/lowlight/src/com/android/dream/lowlight/LowLightTransitionCoordinator.kt b/libs/dream/lowlight/src/com/android/dream/lowlight/LowLightTransitionCoordinator.kt
index 26efb55..4736030 100644
--- a/libs/dream/lowlight/src/com/android/dream/lowlight/LowLightTransitionCoordinator.kt
+++ b/libs/dream/lowlight/src/com/android/dream/lowlight/LowLightTransitionCoordinator.kt
@@ -111,8 +111,14 @@
}
animator.addListener(listener)
continuation.invokeOnCancellation {
- animator.removeListener(listener)
- animator.cancel()
+ try {
+ animator.removeListener(listener)
+ animator.cancel()
+ } catch (exception: IndexOutOfBoundsException) {
+ // TODO(b/285666217): remove this try/catch once a proper fix is implemented.
+ // Cancelling the animator can cause an exception since we may be removing a
+ // listener during the cancellation. See b/285666217 for more details.
+ }
}
}
}
diff --git a/packages/SettingsLib/tests/robotests/Android.bp b/packages/SettingsLib/tests/robotests/Android.bp
index c037c40..5c55a43 100644
--- a/packages/SettingsLib/tests/robotests/Android.bp
+++ b/packages/SettingsLib/tests/robotests/Android.bp
@@ -42,10 +42,7 @@
name: "SettingsLibRoboTests",
srcs: ["src/**/*.java"],
static_libs: [
- "Settings_robolectric_meta_service_file",
- "Robolectric_shadows_androidx_fragment_upstream",
"SettingsLib-robo-testutils",
- "androidx.fragment_fragment",
"androidx.test.core",
"androidx.core_core",
"testng", // TODO: remove once JUnit on Android provides assertThrows
@@ -56,20 +53,6 @@
test_options: {
timeout: 36000,
},
- upstream: true,
-}
-
-java_genrule {
- name: "Settings_robolectric_meta_service_file",
- out: ["robolectric_meta_service_file.jar"],
- tools: ["soong_zip"],
- cmd: "mkdir -p $(genDir)/META-INF/services/ && touch $(genDir)/META-INF/services/org.robolectric.internal.ShadowProvider &&" +
- "echo -e 'org.robolectric.Shadows' >> $(genDir)/META-INF/services/org.robolectric.internal.ShadowProvider && " +
- "echo -e 'org.robolectric.shadows.multidex.Shadows' >> $(genDir)/META-INF/services/org.robolectric.internal.ShadowProvider && " +
- "echo -e 'org.robolectric.shadows.httpclient.Shadows' >> $(genDir)/META-INF/services/org.robolectric.internal.ShadowProvider && " +
- //"echo -e 'com.android.settings.testutils.shadow.Shadows' >> $(genDir)/META-INF/services/org.robolectric.internal.ShadowProvider && " +
- "echo -e 'com.android.settingslib.testutils.shadow.Shadows' >> $(genDir)/META-INF/services/org.robolectric.internal.ShadowProvider && " +
- "$(location soong_zip) -o $(out) -C $(genDir) -D $(genDir)/META-INF/services/",
}
java_library {
@@ -77,23 +60,9 @@
srcs: [
"testutils/com/android/settingslib/testutils/**/*.java",
],
- javacflags: [
- "-Aorg.robolectric.annotation.processing.shadowPackage=com.android.settingslib.testutils.shadow",
- "-Aorg.robolectric.annotation.processing.sdkCheckMode=ERROR",
- // Uncomment the below to debug annotation processors not firing.
- //"-verbose",
- //"-XprintRounds",
- //"-XprintProcessorInfo",
- //"-Xlint",
- //"-J-verbose",
- ],
- plugins: [
- "auto_value_plugin_1.9",
- "auto_value_builder_plugin_1.9",
- "Robolectric_processor_upstream",
- ],
+
libs: [
- "Robolectric_all-target_upstream",
+ "Robolectric_all-target",
"mockito-robolectric-prebuilt",
"truth-prebuilt",
],
diff --git a/packages/SettingsLib/tests/robotests/config/robolectric.properties b/packages/SettingsLib/tests/robotests/config/robolectric.properties
index 2a9e50d..fab7251 100644
--- a/packages/SettingsLib/tests/robotests/config/robolectric.properties
+++ b/packages/SettingsLib/tests/robotests/config/robolectric.properties
@@ -1,2 +1 @@
sdk=NEWEST_SDK
-instrumentedPackages=androidx.preference
diff --git a/packages/SettingsLib/tests/robotests/fragment/Android.bp b/packages/SettingsLib/tests/robotests/fragment/Android.bp
deleted file mode 100644
index 3e67156..0000000
--- a/packages/SettingsLib/tests/robotests/fragment/Android.bp
+++ /dev/null
@@ -1,40 +0,0 @@
-//#############################################
-// Compile Robolectric shadows framework misapplied to androidx
-//#############################################
-
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "frameworks_base_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["frameworks_base_license"],
-}
-
-java_library {
- name: "Robolectric_shadows_androidx_fragment_upstream",
- srcs: [
- "src/main/java/**/*.java",
- "src/main/java/**/*.kt",
- ],
- javacflags: [
- "-Aorg.robolectric.annotation.processing.shadowPackage=org.robolectric.shadows.androidx.fragment",
- "-Aorg.robolectric.annotation.processing.sdkCheckMode=ERROR",
- // Uncomment the below to debug annotation processors not firing.
- //"-verbose",
- //"-XprintRounds",
- //"-XprintProcessorInfo",
- //"-Xlint",
- //"-J-verbose",
- ],
- libs: [
- "Robolectric_all-target_upstream",
- "androidx.fragment_fragment",
- ],
- plugins: [
- "auto_value_plugin_1.9",
- "auto_value_builder_plugin_1.9",
- "Robolectric_processor_upstream",
- ],
-
-}
diff --git a/packages/SettingsLib/tests/robotests/fragment/BUILD b/packages/SettingsLib/tests/robotests/fragment/BUILD
deleted file mode 100644
index 393a02e..0000000
--- a/packages/SettingsLib/tests/robotests/fragment/BUILD
+++ /dev/null
@@ -1,69 +0,0 @@
-load("//third_party/java/android/android_sdk_linux/extras/android/compatibility/jetify:jetify.bzl", "jetify_android_library", "jetify_android_local_test")
-
-package(
- default_applicable_licenses = ["//third_party/java_src/robolectric:license"],
- default_visibility = ["//third_party/java_src/robolectric:__subpackages__"],
-)
-
-licenses(["notice"])
-
-#==============================================================================
-# Test resources library
-#==============================================================================
-jetify_android_library(
- name = "test_resources",
- custom_package = "org.robolectric.shadows.androidx.fragment",
- manifest = "src/test/AndroidManifest.xml",
- resource_files = glob(
- ["src/test/resources/**/*"],
- ),
-)
-
-#==============================================================================
-# AndroidX fragment module library
-#==============================================================================
-jetify_android_library(
- name = "androidx_fragment",
- testonly = 1,
- srcs = glob(
- ["src/main/java/**"],
- ),
- custom_package = "org.robolectric.shadows.androidx.fragment",
- javacopts = [
- "-Aorg.robolectric.annotation.processing.shadowPackage=org.robolectric.shadows.androidx.fragment",
- ],
- jetify_sources = True,
- plugins = [
- "//java/com/google/thirdparty/robolectric/processor",
- ],
- deps = [
- "//third_party/java/androidx/core",
- "//third_party/java/androidx/fragment",
- "//third_party/java/androidx/lifecycle",
- "//third_party/java_src/robolectric/shadowapi",
- "//third_party/java_src/robolectric/shadows/framework",
- ],
-)
-
-[
- jetify_android_local_test(
- name = "test_" + src.rstrip(".java"),
- size = "small",
- srcs = glob(
- ["src/test/java/**/*.java"],
- ),
- jetify_sources = True,
- deps = [
- ":androidx_fragment",
- ":test_resources",
- "//third_party/java/androidx/fragment",
- "//third_party/java/androidx/loader",
- "//third_party/java/mockito",
- "//third_party/java/robolectric",
- "//third_party/java/truth",
- ],
- )
- for src in glob(
- ["src/test/java/**/*Test.java"],
- )
-]
diff --git a/packages/SettingsLib/tests/robotests/fragment/build.gradle b/packages/SettingsLib/tests/robotests/fragment/build.gradle
deleted file mode 100644
index d9dcd84..0000000
--- a/packages/SettingsLib/tests/robotests/fragment/build.gradle
+++ /dev/null
@@ -1,48 +0,0 @@
-plugins {
- id "net.ltgt.errorprone" version "0.0.13"
-}
-
-apply plugin: 'com.android.library'
-
-android {
- compileSdkVersion 28
-
- android {
- sourceSets {
- main {
- res.srcDirs = ['src/test/resources/res']
- }
- }
- testOptions {
- unitTests {
- includeAndroidResources = true
- }
- }
- }
-}
-
-dependencies {
- // Project dependencies
- compileOnly project(":robolectric")
-
- // Compile dependencies
- compileOnly AndroidSdk.MAX_SDK.coordinates
- compileOnly "androidx.core:core:1.0.0-rc02"
- compileOnly 'androidx.fragment:fragment:1.0.0-rc02'
- compileOnly "androidx.lifecycle:lifecycle-viewmodel:2.0.0-rc01"
- compileOnly "androidx.lifecycle:lifecycle-common:2.0.0-beta01"
-
- // Testing dependencies
- testImplementation "com.google.truth:truth:0.44"
- testImplementation "org.mockito:mockito-core:2.5.4"
- testImplementation "androidx.arch.core:core-common:2.0.0-beta01"
- testImplementation "androidx.arch.core:core-runtime:2.0.0-rc01"
- testImplementation "androidx.collection:collection:1.0.0-rc01"
- testImplementation "androidx.core:core:1.0.0-rc02"
- testImplementation 'androidx.fragment:fragment:1.0.0-rc02'
- testImplementation "androidx.lifecycle:lifecycle-viewmodel:2.0.0-rc01"
- testImplementation "androidx.lifecycle:lifecycle-common:2.0.0-beta01"
- testImplementation "androidx.lifecycle:lifecycle-runtime:2.0.0-rc01"
- testImplementation "androidx.lifecycle:lifecycle-livedata-core:2.0.0-rc01"
- testImplementation "androidx.loader:loader:1.0.0-rc02"
-}
diff --git a/packages/SettingsLib/tests/robotests/fragment/src/main/java/org/robolectric/shadows/androidx/fragment/FragmentController.java b/packages/SettingsLib/tests/robotests/fragment/src/main/java/org/robolectric/shadows/androidx/fragment/FragmentController.java
deleted file mode 100644
index c688683..0000000
--- a/packages/SettingsLib/tests/robotests/fragment/src/main/java/org/robolectric/shadows/androidx/fragment/FragmentController.java
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.robolectric.shadows.androidx.fragment;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.widget.LinearLayout;
-
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-
-import org.robolectric.android.controller.ActivityController;
-import org.robolectric.android.controller.ComponentController;
-import org.robolectric.util.ReflectionHelpers;
-
-/** A Controller that can be used to drive the lifecycle of a {@link Fragment} */
-public class FragmentController<F extends Fragment>
- extends ComponentController<FragmentController<F>, F> {
-
- private final F mFragment;
- private final ActivityController<? extends FragmentActivity> mActivityController;
-
- private FragmentController(F fragment, Class<? extends FragmentActivity> activityClass) {
- this(fragment, activityClass, null /*intent*/, null /*arguments*/);
- }
-
- private FragmentController(
- F fragment, Class<? extends FragmentActivity> activityClass, Intent intent) {
- this(fragment, activityClass, intent, null /*arguments*/);
- }
-
- private FragmentController(
- F fragment, Class<? extends FragmentActivity> activityClass, Bundle arguments) {
- this(fragment, activityClass, null /*intent*/, arguments);
- }
-
- private FragmentController(
- F fragment,
- Class<? extends FragmentActivity> activityClass,
- Intent intent,
- Bundle arguments) {
- super(fragment, intent);
- this.mFragment = fragment;
- if (arguments != null) {
- this.mFragment.setArguments(arguments);
- }
- this.mActivityController =
- ActivityController.of(ReflectionHelpers.callConstructor(activityClass), intent);
- }
-
- /**
- * Generate the {@link FragmentController} for specific fragment.
- *
- * @param fragment the fragment which you'd like to drive lifecycle
- * @return {@link FragmentController}
- */
- public static <F extends Fragment> FragmentController<F> of(F fragment) {
- return new FragmentController<>(fragment, FragmentControllerActivity.class);
- }
-
- /**
- * Generate the {@link FragmentController} for specific fragment and intent.
- *
- * @param fragment the fragment which you'd like to drive lifecycle
- * @param intent the intent which will be retained by activity
- * @return {@link FragmentController}
- */
- public static <F extends Fragment> FragmentController<F> of(F fragment, Intent intent) {
- return new FragmentController<>(fragment, FragmentControllerActivity.class, intent);
- }
-
- /**
- * Generate the {@link FragmentController} for specific fragment and arguments.
- *
- * @param fragment the fragment which you'd like to drive lifecycle
- * @param arguments the arguments which will be retained by fragment
- * @return {@link FragmentController}
- */
- public static <F extends Fragment> FragmentController<F> of(F fragment, Bundle arguments) {
- return new FragmentController<>(fragment, FragmentControllerActivity.class, arguments);
- }
-
- /**
- * Generate the {@link FragmentController} for specific fragment and activity class.
- *
- * @param fragment the fragment which you'd like to drive lifecycle
- * @param activityClass the activity which will be attached by fragment
- * @return {@link FragmentController}
- */
- public static <F extends Fragment> FragmentController<F> of(
- F fragment, Class<? extends FragmentActivity> activityClass) {
- return new FragmentController<>(fragment, activityClass);
- }
-
- /**
- * Generate the {@link FragmentController} for specific fragment, intent and arguments.
- *
- * @param fragment the fragment which you'd like to drive lifecycle
- * @param intent the intent which will be retained by activity
- * @param arguments the arguments which will be retained by fragment
- * @return {@link FragmentController}
- */
- public static <F extends Fragment> FragmentController<F> of(
- F fragment, Intent intent, Bundle arguments) {
- return new FragmentController<>(fragment, FragmentControllerActivity.class, intent,
- arguments);
- }
-
- /**
- * Generate the {@link FragmentController} for specific fragment, activity class and intent.
- *
- * @param fragment the fragment which you'd like to drive lifecycle
- * @param activityClass the activity which will be attached by fragment
- * @param intent the intent which will be retained by activity
- * @return {@link FragmentController}
- */
- public static <F extends Fragment> FragmentController<F> of(
- F fragment, Class<? extends FragmentActivity> activityClass, Intent intent) {
- return new FragmentController<>(fragment, activityClass, intent);
- }
-
- /**
- * Generate the {@link FragmentController} for specific fragment, activity class and arguments.
- *
- * @param fragment the fragment which you'd like to drive lifecycle
- * @param activityClass the activity which will be attached by fragment
- * @param arguments the arguments which will be retained by fragment
- * @return {@link FragmentController}
- */
- public static <F extends Fragment> FragmentController<F> of(
- F fragment, Class<? extends FragmentActivity> activityClass, Bundle arguments) {
- return new FragmentController<>(fragment, activityClass, arguments);
- }
-
- /**
- * Generate the {@link FragmentController} for specific fragment, activity class, intent and
- * arguments.
- *
- * @param fragment the fragment which you'd like to drive lifecycle
- * @param activityClass the activity which will be attached by fragment
- * @param intent the intent which will be retained by activity
- * @param arguments the arguments which will be retained by fragment
- * @return {@link FragmentController}
- */
- public static <F extends Fragment> FragmentController<F> of(
- F fragment,
- Class<? extends FragmentActivity> activityClass,
- Intent intent,
- Bundle arguments) {
- return new FragmentController<>(fragment, activityClass, intent, arguments);
- }
-
- /**
- * Sets up the given fragment by attaching it to an activity, calling its onCreate() through
- * onResume() lifecycle methods, and then making it visible. Note that the fragment will be
- * added
- * to the view with ID 1.
- */
- public static <F extends Fragment> F setupFragment(F fragment) {
- return FragmentController.of(fragment).create().start().resume().visible().get();
- }
-
- /**
- * Sets up the given fragment by attaching it to an activity, calling its onCreate() through
- * onResume() lifecycle methods, and then making it visible. Note that the fragment will be
- * added
- * to the view with ID 1.
- */
- public static <F extends Fragment> F setupFragment(
- F fragment, Class<? extends FragmentActivity> fragmentActivityClass) {
- return FragmentController.of(fragment, fragmentActivityClass)
- .create()
- .start()
- .resume()
- .visible()
- .get();
- }
-
- /**
- * Sets up the given fragment by attaching it to an activity created with the given bundle,
- * calling its onCreate() through onResume() lifecycle methods, and then making it visible. Note
- * that the fragment will be added to the view with ID 1.
- */
- public static <F extends Fragment> F setupFragment(
- F fragment, Class<? extends FragmentActivity> fragmentActivityClass, Bundle bundle) {
- return FragmentController.of(fragment, fragmentActivityClass)
- .create(bundle)
- .start()
- .resume()
- .visible()
- .get();
- }
-
- /**
- * Sets up the given fragment by attaching it to an activity created with the given bundle and
- * container id, calling its onCreate() through onResume() lifecycle methods, and then making it
- * visible.
- */
- public static <F extends Fragment> F setupFragment(
- F fragment,
- Class<? extends FragmentActivity> fragmentActivityClass,
- int containerViewId,
- Bundle bundle) {
- return FragmentController.of(fragment, fragmentActivityClass)
- .create(containerViewId, bundle)
- .start()
- .resume()
- .visible()
- .get();
- }
-
- /**
- * Creates the activity with {@link Bundle} and adds the fragment to the view with ID {@code
- * contentViewId}.
- */
- public FragmentController<F> create(final int contentViewId, final Bundle bundle) {
- shadowMainLooper.runPaused(
- new Runnable() {
- @Override
- public void run() {
- mActivityController
- .create(bundle)
- .get()
- .getSupportFragmentManager()
- .beginTransaction()
- .add(contentViewId, mFragment)
- .commit();
- }
- });
- return this;
- }
-
- /**
- * Creates the activity with {@link Bundle} and adds the fragment to it. Note that the fragment
- * will be added to the view with ID 1.
- */
- public FragmentController<F> create(final Bundle bundle) {
- return create(1, bundle);
- }
-
- /**
- * Creates the {@link Fragment} in a newly initialized state and hence will receive a null
- * savedInstanceState {@link Bundle parameter}
- */
- @Override
- public FragmentController<F> create() {
- return create(null);
- }
-
- /** Drive lifecycle of activity to Start lifetime */
- public FragmentController<F> start() {
- shadowMainLooper.runPaused(
- new Runnable() {
- @Override
- public void run() {
- mActivityController.start();
- }
- });
- return this;
- }
-
- /** Drive lifecycle of activity to Resume lifetime */
- public FragmentController<F> resume() {
- shadowMainLooper.runPaused(
- new Runnable() {
- @Override
- public void run() {
- mActivityController.resume();
- }
- });
- return this;
- }
-
- /** Drive lifecycle of activity to Pause lifetime */
- public FragmentController<F> pause() {
- shadowMainLooper.runPaused(
- new Runnable() {
- @Override
- public void run() {
- mActivityController.pause();
- }
- });
- return this;
- }
-
- /** Drive lifecycle of activity to Stop lifetime */
- public FragmentController<F> stop() {
- shadowMainLooper.runPaused(
- new Runnable() {
- @Override
- public void run() {
- mActivityController.stop();
- }
- });
- return this;
- }
-
- /** Drive lifecycle of activity to Destroy lifetime */
- @Override
- public FragmentController<F> destroy() {
- shadowMainLooper.runPaused(
- new Runnable() {
- @Override
- public void run() {
- mActivityController.destroy();
- }
- });
- return this;
- }
-
- /** Let activity can be visible lifetime */
- public FragmentController<F> visible() {
- shadowMainLooper.runPaused(
- new Runnable() {
- @Override
- public void run() {
- mActivityController.visible();
- }
- });
- return this;
- }
-
- private static class FragmentControllerActivity extends FragmentActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- LinearLayout view = new LinearLayout(this);
- view.setId(1);
-
- setContentView(view);
- }
- }
-}
diff --git a/packages/SettingsLib/tests/robotests/fragment/src/main/java/org/robolectric/shadows/androidx/fragment/package-info.java b/packages/SettingsLib/tests/robotests/fragment/src/main/java/org/robolectric/shadows/androidx/fragment/package-info.java
deleted file mode 100644
index dd89441..0000000
--- a/packages/SettingsLib/tests/robotests/fragment/src/main/java/org/robolectric/shadows/androidx/fragment/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Testing infrastructure for androidx.fragment library.
- *
- * <p>To use this in your project, add the artifact {@code
- * org.robolectric:shadows-androidx-fragment} to your project.
- */
-package org.robolectric.shadows.androidx.fragment;
diff --git a/packages/SettingsLib/tests/robotests/fragment/src/test/AndroidManifest.xml b/packages/SettingsLib/tests/robotests/fragment/src/test/AndroidManifest.xml
deleted file mode 100644
index 8493c02..0000000
--- a/packages/SettingsLib/tests/robotests/fragment/src/test/AndroidManifest.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="org.robolectric.shadows.androidx.fragment">
-
- <uses-sdk android:targetSdkVersion="28"/>
-</manifest>
diff --git a/packages/SettingsLib/tests/robotests/fragment/src/test/java/org/robolectric/shadows/androidx/fragment/FragmentControllerTest.java b/packages/SettingsLib/tests/robotests/fragment/src/test/java/org/robolectric/shadows/androidx/fragment/FragmentControllerTest.java
deleted file mode 100644
index ef63058..0000000
--- a/packages/SettingsLib/tests/robotests/fragment/src/test/java/org/robolectric/shadows/androidx/fragment/FragmentControllerTest.java
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.robolectric.shadows.androidx.fragment;
-
-import static android.os.Looper.getMainLooper;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.robolectric.Shadows.shadowOf;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-
-import org.junit.After;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/** Tests for {@link FragmentController} */
-@RunWith(RobolectricTestRunner.class)
-public class FragmentControllerTest {
-
- @After
- public void tearDown() {
- TranscriptFragment.clearLifecycleEvents();
- }
-
- @Test
- public void initialNotAttached() {
- final FragmentController<TranscriptFragment> controller =
- FragmentController.of(new TranscriptFragment());
-
- assertThat(controller.get().getView()).isNull();
- assertThat(controller.get().getActivity()).isNull();
- assertThat(controller.get().isAdded()).isFalse();
- }
-
- @Test
- public void initialNotAttached_customActivity() {
- final FragmentController<TranscriptFragment> controller =
- FragmentController.of(new TranscriptFragment(), TestActivity.class);
-
- assertThat(controller.get().getView()).isNull();
- assertThat(controller.get().getActivity()).isNull();
- assertThat(controller.get().isAdded()).isFalse();
- }
-
- @Test
- public void attachedAfterCreate() {
- final FragmentController<TranscriptFragment> controller =
- FragmentController.of(new TranscriptFragment());
-
- controller.create();
- shadowOf(getMainLooper()).idle();
-
- assertThat(controller.get().getActivity()).isNotNull();
- assertThat(controller.get().isAdded()).isTrue();
- assertThat(controller.get().isResumed()).isFalse();
- }
-
- @Test
- public void attachedAfterCreate_customActivity() {
- final FragmentController<TranscriptFragment> controller =
- FragmentController.of(new TranscriptFragment(), TestActivity.class);
-
- controller.create();
- shadowOf(getMainLooper()).idle();
-
- assertThat(controller.get().getActivity()).isNotNull();
- assertThat(controller.get().getActivity()).isInstanceOf(TestActivity.class);
- assertThat(controller.get().isAdded()).isTrue();
- assertThat(controller.get().isResumed()).isFalse();
- }
-
- @Test
- public void attachedAfterCreate_customizedViewId() {
- final FragmentController<TranscriptFragment> controller =
- FragmentController.of(new TranscriptFragment(), CustomizedViewIdTestActivity.class);
-
- controller.create(R.id.custom_activity_view, null).start();
-
- assertThat(controller.get().getView()).isNotNull();
- assertThat(controller.get().getActivity()).isNotNull();
- assertThat(controller.get().isAdded()).isTrue();
- assertThat(controller.get().isResumed()).isFalse();
- assertThat((TextView) controller.get().getView().findViewById(R.id.tacos)).isNotNull();
- }
-
- @Test
- public void hasViewAfterStart() {
- final FragmentController<TranscriptFragment> controller =
- FragmentController.of(new TranscriptFragment());
-
- controller.create().start();
-
- assertThat(controller.get().getView()).isNotNull();
- }
-
- @Test
- public void isResumed() {
- final FragmentController<TranscriptFragment> controller =
- FragmentController.of(new TranscriptFragment(), TestActivity.class);
-
- controller.create().start().resume();
-
- assertThat(controller.get().getView()).isNotNull();
- assertThat(controller.get().getActivity()).isNotNull();
- assertThat(controller.get().isAdded()).isTrue();
- assertThat(controller.get().isResumed()).isTrue();
- assertThat((TextView) controller.get().getView().findViewById(R.id.tacos)).isNotNull();
- }
-
- @Test
- public void isPaused() {
- final FragmentController<TranscriptFragment> controller =
- FragmentController.of(new TranscriptFragment(), TestActivity.class);
-
- controller.create().start().resume().pause();
-
- assertThat(controller.get().getView()).isNotNull();
- assertThat(controller.get().getActivity()).isNotNull();
- assertThat(controller.get().isAdded()).isTrue();
- assertThat(controller.get().isResumed()).isFalse();
- assertThat(controller.get().getLifecycleEvents())
- .containsExactly("onCreate", "onStart", "onResume", "onPause")
- .inOrder();
- }
-
- @Test
- public void isStopped() {
- final FragmentController<TranscriptFragment> controller =
- FragmentController.of(new TranscriptFragment(), TestActivity.class);
-
- controller.create().start().resume().pause().stop();
-
- assertThat(controller.get().getView()).isNotNull();
- assertThat(controller.get().getActivity()).isNotNull();
- assertThat(controller.get().isAdded()).isTrue();
- assertThat(controller.get().isResumed()).isFalse();
- assertThat(controller.get().getLifecycleEvents())
- .containsExactly("onCreate", "onStart", "onResume", "onPause", "onStop")
- .inOrder();
- }
-
- @Test
- public void withIntent() {
- final Intent intent = generateTestIntent();
- final FragmentController<TranscriptFragment> controller =
- FragmentController.of(new TranscriptFragment(), TestActivity.class, intent);
-
- controller.create();
- shadowOf(getMainLooper()).idle();
- final Intent intentInFragment = controller.get().getActivity().getIntent();
-
- assertThat(intentInFragment.getAction()).isEqualTo("test_action");
- assertThat(intentInFragment.getExtras().getString("test_key")).isEqualTo("test_value");
- }
-
- @Test
- public void withArguments() {
- final Bundle bundle = generateTestBundle();
- final FragmentController<TranscriptFragment> controller =
- FragmentController.of(new TranscriptFragment(), TestActivity.class, bundle);
-
- controller.create();
- final Bundle args = controller.get().getArguments();
-
- assertThat(args.getString("test_key")).isEqualTo("test_value");
- }
-
- @Test
- public void withIntentAndArguments() {
- final Bundle bundle = generateTestBundle();
- final Intent intent = generateTestIntent();
- final FragmentController<TranscriptFragment> controller =
- FragmentController.of(new TranscriptFragment(), TestActivity.class, intent, bundle);
-
- controller.create();
- shadowOf(getMainLooper()).idle();
- final Intent intentInFragment = controller.get().getActivity().getIntent();
- final Bundle args = controller.get().getArguments();
-
- assertThat(intentInFragment.getAction()).isEqualTo("test_action");
- assertThat(intentInFragment.getExtras().getString("test_key")).isEqualTo("test_value");
- assertThat(args.getString("test_key")).isEqualTo("test_value");
- }
-
- @Test
- public void visible() {
- final FragmentController<TranscriptFragment> controller =
- FragmentController.of(new TranscriptFragment(), TestActivity.class);
-
- controller.create().start().resume();
-
- assertThat(controller.get().isVisible()).isFalse();
-
- controller.visible();
-
- assertThat(controller.get().isVisible()).isTrue();
- }
-
- @Test
- public void setupFragmentWithFragment_fragmentHasCorrectLifecycle() {
- TranscriptFragment fragment = FragmentController.setupFragment(new TranscriptFragment());
-
- assertThat(fragment.getLifecycleEvents())
- .containsExactly("onCreate", "onStart", "onResume")
- .inOrder();
- assertThat(fragment.isVisible()).isTrue();
- }
-
- @Test
- public void setupFragmentWithFragmentAndActivity_fragmentHasCorrectLifecycle() {
- TranscriptFragment fragment =
- FragmentController.setupFragment(new TranscriptFragment(), TestActivity.class);
-
- assertThat(fragment.getLifecycleEvents())
- .containsExactly("onCreate", "onStart", "onResume")
- .inOrder();
- assertThat(fragment.isVisible()).isTrue();
- }
-
- @Test
- public void setupFragmentWithFragmentAndActivityAndBundle_HasCorrectLifecycle() {
- Bundle testBundle = generateTestBundle();
- TranscriptFragment fragment =
- FragmentController.setupFragment(new TranscriptFragment(), TestActivity.class,
- testBundle);
-
- assertThat(fragment.getLifecycleEvents())
- .containsExactly("onCreate", "onStart", "onResume")
- .inOrder();
- assertThat(fragment.isVisible()).isTrue();
- }
-
- @Test
- public void
- setupFragmentWithFragment_Activity_ContainViewIdAndBundle_HasCorrectLifecycle() {
- Bundle testBundle = generateTestBundle();
- TranscriptFragment fragment =
- FragmentController.setupFragment(
- new TranscriptFragment(),
- CustomizedViewIdTestActivity.class,
- R.id.custom_activity_view,
- testBundle);
-
- assertThat(fragment.getLifecycleEvents())
- .containsExactly("onCreate", "onStart", "onResume")
- .inOrder();
- assertThat(fragment.isVisible()).isTrue();
- }
-
- private Intent generateTestIntent() {
- final Intent testIntent = new Intent("test_action").putExtra("test_key", "test_value");
- return testIntent;
- }
-
- private Bundle generateTestBundle() {
- final Bundle testBundle = new Bundle();
- testBundle.putString("test_key", "test_value");
-
- return testBundle;
- }
-
- /** A Fragment which can record lifecycle status for test. */
- public static class TranscriptFragment extends Fragment {
-
- public static final List<String> sLifecycleEvents = new ArrayList<>();
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- sLifecycleEvents.add("onCreate");
- }
-
- @Override
- public void onStart() {
- super.onStart();
- sLifecycleEvents.add("onStart");
- }
-
- @Override
- public void onResume() {
- super.onResume();
- sLifecycleEvents.add("onResume");
- }
-
- @Override
- public void onPause() {
- super.onPause();
- sLifecycleEvents.add("onPause");
- }
-
- @Override
- public void onStop() {
- super.onStop();
- sLifecycleEvents.add("onStop");
- }
-
- @Override
- public View onCreateView(
- LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- return inflater.inflate(R.layout.fragment_contents, container, false);
- }
-
- public List<String> getLifecycleEvents() {
- return sLifecycleEvents;
- }
-
- public static void clearLifecycleEvents() {
- sLifecycleEvents.clear();
- }
- }
-
- /** A Activity which set a default view for test. */
- public static class TestActivity extends FragmentActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- LinearLayout view = new LinearLayout(this);
- view.setId(1);
-
- setContentView(view);
- }
- }
-
- /** A Activity which has a custom view for test. */
- public static class CustomizedViewIdTestActivity extends FragmentActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.custom_activity_view);
- }
- }
-}
diff --git a/packages/SettingsLib/tests/robotests/fragment/src/test/resources/res/layout/custom_activity_view.xml b/packages/SettingsLib/tests/robotests/fragment/src/test/resources/res/layout/custom_activity_view.xml
deleted file mode 100644
index c074f30..0000000
--- a/packages/SettingsLib/tests/robotests/fragment/src/test/resources/res/layout/custom_activity_view.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/custom_activity_view"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical">
-
-</LinearLayout>
diff --git a/packages/SettingsLib/tests/robotests/fragment/src/test/resources/res/layout/fragment_contents.xml b/packages/SettingsLib/tests/robotests/fragment/src/test/resources/res/layout/fragment_contents.xml
deleted file mode 100644
index 425b2bb..0000000
--- a/packages/SettingsLib/tests/robotests/fragment/src/test/resources/res/layout/fragment_contents.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/tacos"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="TACOS"/>
-
- <TextView
- android:id="@+id/burritos"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="BURRITOS"/>
-
-</LinearLayout>
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
index bb72375..4a913c8 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
@@ -25,6 +25,7 @@
import static org.mockito.Mockito.when;
import android.app.ActivityManager;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
@@ -57,10 +58,12 @@
import org.robolectric.shadows.ShadowSettings;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {UtilsTest.ShadowLocationManager.class})
+@Config(shadows = {UtilsTest.ShadowSecure.class, UtilsTest.ShadowLocationManager.class})
public class UtilsTest {
private static final double[] TEST_PERCENTAGES = {0, 0.4, 0.5, 0.6, 49, 49.3, 49.8, 50, 100};
private static final String TAG = "UtilsTest";
@@ -91,7 +94,7 @@
mContext = spy(RuntimeEnvironment.application);
when(mContext.getSystemService(Context.LOCATION_SERVICE)).thenReturn(mLocationManager);
when(mContext.getSystemService(UsbManager.class)).thenReturn(mUsbManager);
- ShadowSettings.ShadowSecure.reset();
+ ShadowSecure.reset();
mAudioManager = mContext.getSystemService(AudioManager.class);
}
@@ -108,16 +111,15 @@
Settings.Secure.LOCATION_CHANGER_QUICK_SETTINGS);
assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.LOCATION_CHANGER,
- Settings.Secure.LOCATION_CHANGER_UNKNOWN)).isEqualTo(
- Settings.Secure.LOCATION_CHANGER_QUICK_SETTINGS);
+ Settings.Secure.LOCATION_CHANGER, Settings.Secure.LOCATION_CHANGER_UNKNOWN))
+ .isEqualTo(Settings.Secure.LOCATION_CHANGER_QUICK_SETTINGS);
}
@Test
public void testFormatPercentage_RoundTrue_RoundUpIfPossible() {
- final String[] expectedPercentages =
- {PERCENTAGE_0, PERCENTAGE_0, PERCENTAGE_1, PERCENTAGE_1, PERCENTAGE_49,
- PERCENTAGE_49, PERCENTAGE_50, PERCENTAGE_50, PERCENTAGE_100};
+ final String[] expectedPercentages = {PERCENTAGE_0, PERCENTAGE_0, PERCENTAGE_1,
+ PERCENTAGE_1, PERCENTAGE_49, PERCENTAGE_49, PERCENTAGE_50, PERCENTAGE_50,
+ PERCENTAGE_100};
for (int i = 0, size = TEST_PERCENTAGES.length; i < size; i++) {
final String percentage = Utils.formatPercentage(TEST_PERCENTAGES[i], true);
@@ -127,9 +129,9 @@
@Test
public void testFormatPercentage_RoundFalse_NoRound() {
- final String[] expectedPercentages =
- {PERCENTAGE_0, PERCENTAGE_0, PERCENTAGE_0, PERCENTAGE_0, PERCENTAGE_49,
- PERCENTAGE_49, PERCENTAGE_49, PERCENTAGE_50, PERCENTAGE_100};
+ final String[] expectedPercentages = {PERCENTAGE_0, PERCENTAGE_0, PERCENTAGE_0,
+ PERCENTAGE_0, PERCENTAGE_49, PERCENTAGE_49, PERCENTAGE_49, PERCENTAGE_50,
+ PERCENTAGE_100};
for (int i = 0, size = TEST_PERCENTAGES.length; i < size; i++) {
final String percentage = Utils.formatPercentage(TEST_PERCENTAGES[i], false);
@@ -141,7 +143,12 @@
public void testGetDefaultStorageManagerDaysToRetain_storageManagerDaysToRetainUsesResources() {
Resources resources = mock(Resources.class);
when(resources.getInteger(
- eq(com.android.internal.R.integer.config_storageManagerDaystoRetainDefault)))
+ eq(
+ com.android
+ .internal
+ .R
+ .integer
+ .config_storageManagerDaystoRetainDefault)))
.thenReturn(60);
assertThat(Utils.getDefaultStorageManagerDaysToRetain(resources)).isEqualTo(60);
}
@@ -156,6 +163,31 @@
return intent -> TextUtils.equals(expected, intent.getAction());
}
+ @Implements(value = Settings.Secure.class)
+ public static class ShadowSecure extends ShadowSettings.ShadowSecure {
+ private static Map<String, Integer> map = new HashMap<>();
+
+ @Implementation
+ public static boolean putIntForUser(ContentResolver cr, String name, int value,
+ int userHandle) {
+ map.put(name, value);
+ return true;
+ }
+
+ @Implementation
+ public static int getIntForUser(ContentResolver cr, String name, int def, int userHandle) {
+ if (map.containsKey(name)) {
+ return map.get(name);
+ } else {
+ return def;
+ }
+ }
+
+ public static void reset() {
+ map.clear();
+ }
+ }
+
@Implements(value = LocationManager.class)
public static class ShadowLocationManager {
@@ -305,8 +337,9 @@
@Test
public void getBatteryStatus_statusIsFull_returnFullString() {
- final Intent intent = new Intent().putExtra(BatteryManager.EXTRA_LEVEL, 100).putExtra(
- BatteryManager.EXTRA_SCALE, 100);
+ final Intent intent = new Intent()
+ .putExtra(BatteryManager.EXTRA_LEVEL, 100)
+ .putExtra(BatteryManager.EXTRA_SCALE, 100);
final Resources resources = mContext.getResources();
assertThat(Utils.getBatteryStatus(mContext, intent, /* compactStatus= */ false)).isEqualTo(
@@ -315,8 +348,9 @@
@Test
public void getBatteryStatus_statusIsFullAndUseCompactStatus_returnFullyChargedString() {
- final Intent intent = new Intent().putExtra(BatteryManager.EXTRA_LEVEL, 100).putExtra(
- BatteryManager.EXTRA_SCALE, 100);
+ final Intent intent = new Intent()
+ .putExtra(BatteryManager.EXTRA_LEVEL, 100)
+ .putExtra(BatteryManager.EXTRA_SCALE, 100);
final Resources resources = mContext.getResources();
assertThat(Utils.getBatteryStatus(mContext, intent, /* compactStatus= */ true)).isEqualTo(
@@ -482,6 +516,7 @@
when(mUsbPort.getStatus()).thenReturn(mUsbPortStatus);
when(mUsbPort.supportsComplianceWarnings()).thenReturn(true);
when(mUsbPortStatus.isConnected()).thenReturn(true);
- when(mUsbPortStatus.getComplianceWarnings()).thenReturn(new int[]{complianceWarningType});
+ when(mUsbPortStatus.getComplianceWarnings())
+ .thenReturn(new int[]{complianceWarningType});
}
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/accessibility/AccessibilityUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/accessibility/AccessibilityUtilsTest.java
index 3de8446..44fdaec 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/accessibility/AccessibilityUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/accessibility/AccessibilityUtilsTest.java
@@ -23,17 +23,13 @@
import android.os.UserHandle;
import android.provider.Settings;
-import com.android.settingslib.testutils.shadow.ShadowSecure;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowSecure.class})
public class AccessibilityUtilsTest {
private Context mContext;
@@ -50,7 +46,7 @@
@Test
public void getEnabledServicesFromSettings_badFormat_emptyResult() {
- ShadowSecure.putStringForUser(
+ Settings.Secure.putStringForUser(
mContext.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
":",
UserHandle.myUserId());
@@ -61,7 +57,7 @@
@Test
public void getEnabledServicesFromSettings_1Service_1result() {
final ComponentName cn = new ComponentName("pkg", "serv");
- ShadowSecure.putStringForUser(
+ Settings.Secure.putStringForUser(
mContext.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
cn.flattenToString() + ":",
UserHandle.myUserId());
@@ -74,7 +70,7 @@
public void getEnabledServicesFromSettings_2Services_2results() {
final ComponentName cn1 = new ComponentName("pkg", "serv");
final ComponentName cn2 = new ComponentName("pkg", "serv2");
- ShadowSecure.putStringForUser(
+ Settings.Secure.putStringForUser(
mContext.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
cn1.flattenToString() + ":" + cn2.flattenToString(),
UserHandle.myUserId());
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/RecentAppOpsAccessesTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/RecentAppOpsAccessesTest.java
index f9505dd..cb62a73 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/RecentAppOpsAccessesTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/RecentAppOpsAccessesTest.java
@@ -37,8 +37,6 @@
import android.os.UserManager;
import android.util.LongSparseArray;
-import com.android.settingslib.testutils.shadow.ShadowPermissionChecker;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -47,6 +45,7 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowPermissionChecker;
import java.time.Clock;
import java.util.ArrayList;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/MetricsFeatureProviderTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/MetricsFeatureProviderTest.java
index a2e8c59..dd8d54a 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/MetricsFeatureProviderTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/MetricsFeatureProviderTest.java
@@ -38,7 +38,6 @@
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.LooperMode;
import org.robolectric.util.ReflectionHelpers;
import java.util.ArrayList;
@@ -168,7 +167,6 @@
}
@Test
- @LooperMode(LooperMode.Mode.PAUSED)
public void getAttribution_notSet_shouldReturnUnknown() {
final Activity activity = Robolectric.setupActivity(Activity.class);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/SettingsJankMonitorTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/SettingsJankMonitorTest.java
index 25833b3..d67d44b 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/SettingsJankMonitorTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/SettingsJankMonitorTest.java
@@ -36,7 +36,6 @@
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.jank.InteractionJankMonitor.CujType;
-import com.android.settingslib.testutils.OverpoweredReflectionHelper;
import com.android.settingslib.testutils.shadow.ShadowInteractionJankMonitor;
import org.junit.Before;
@@ -52,6 +51,7 @@
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.Resetter;
+import org.robolectric.util.ReflectionHelpers;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -83,10 +83,8 @@
public void setUp() {
ShadowInteractionJankMonitor.reset();
when(ShadowInteractionJankMonitor.MOCK_INSTANCE.begin(any())).thenReturn(true);
- OverpoweredReflectionHelper
- .setStaticField(SettingsJankMonitor.class,
- "scheduledExecutorService",
- mScheduledExecutorService);
+ ReflectionHelpers.setStaticField(SettingsJankMonitor.class, "scheduledExecutorService",
+ mScheduledExecutorService);
}
@Test
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/lifecycle/HideNonSystemOverlayMixinTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/lifecycle/HideNonSystemOverlayMixinTest.java
index 471dac0..cf702b53 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/lifecycle/HideNonSystemOverlayMixinTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/lifecycle/HideNonSystemOverlayMixinTest.java
@@ -37,10 +37,8 @@
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.android.controller.ActivityController;
-import org.robolectric.annotation.LooperMode;
@RunWith(RobolectricTestRunner.class)
-@LooperMode(LooperMode.Mode.PAUSED)
public class HideNonSystemOverlayMixinTest {
private ActivityController<TestActivity> mActivityController;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java
index b009abd..3475ff7 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java
@@ -22,14 +22,13 @@
import android.os.UserManager;
import android.provider.Settings;
-import com.android.settingslib.testutils.shadow.ShadowUserManager;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
@RunWith(RobolectricTestRunner.class)
public class DevelopmentSettingsEnablerTest {
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXmlTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXmlTest.java
index 0cabab2..8e33ca3 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXmlTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXmlTest.java
@@ -21,7 +21,6 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.LooperMode;
import org.xmlpull.v1.XmlPullParserException;
import java.io.ByteArrayInputStream;
@@ -270,7 +269,6 @@
}
@Test
- @LooperMode(LooperMode.Mode.PAUSED)
public void testGenerateHtmlWithCustomHeading() throws Exception {
List<File> xmlFiles = new ArrayList<>();
Map<String, Map<String, Set<String>>> fileNameToLibraryToContentIdMap = new HashMap<>();
@@ -294,7 +292,6 @@
}
@Test
- @LooperMode(LooperMode.Mode.PAUSED)
public void testGenerateNewHtmlWithCustomHeading() throws Exception {
List<File> xmlFiles = new ArrayList<>();
Map<String, Map<String, Set<String>>> fileNameToLibraryToContentIdMap = new HashMap<>();
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/package-info.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/package-info.java
deleted file mode 100644
index 9e9725f..0000000
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-@LooperMode(LooperMode.Mode.LEGACY)
-package com.android.settingslib;
-
-import org.robolectric.annotation.LooperMode;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/AnimatedImageViewTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/AnimatedImageViewTest.java
index faec02f7..d41d511 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/AnimatedImageViewTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/AnimatedImageViewTest.java
@@ -27,7 +27,6 @@
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.LooperMode;
@RunWith(RobolectricTestRunner.class)
public class AnimatedImageViewTest {
@@ -41,7 +40,6 @@
}
@Test
- @LooperMode(LooperMode.Mode.PAUSED)
public void testAnimation_ViewVisible_AnimationRunning() {
mAnimatedImageView.setVisibility(View.VISIBLE);
mAnimatedImageView.setAnimating(true);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/BannerMessagePreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/BannerMessagePreferenceTest.java
index 0d88913..0a48f19 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/BannerMessagePreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/BannerMessagePreferenceTest.java
@@ -41,8 +41,6 @@
import androidx.preference.PreferenceViewHolder;
import androidx.preference.R;
-import com.android.settingslib.testutils.OverpoweredReflectionHelper;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -504,18 +502,14 @@
private void assumeAndroidR() {
ReflectionHelpers.setStaticField(Build.VERSION.class, "SDK_INT", 30);
ReflectionHelpers.setStaticField(Build.VERSION.class, "CODENAME", "R");
- OverpoweredReflectionHelper
- .setStaticField(BannerMessagePreference.class, "IS_AT_LEAST_S", false);
+ ReflectionHelpers.setStaticField(BannerMessagePreference.class, "IS_AT_LEAST_S", false);
// Reset view holder to use correct layout.
}
-
-
private void assumeAndroidS() {
ReflectionHelpers.setStaticField(Build.VERSION.class, "SDK_INT", 31);
ReflectionHelpers.setStaticField(Build.VERSION.class, "CODENAME", "S");
- OverpoweredReflectionHelper
- .setStaticField(BannerMessagePreference.class, "IS_AT_LEAST_S", true);
+ ReflectionHelpers.setStaticField(BannerMessagePreference.class, "IS_AT_LEAST_S", true);
// Re-inflate view to update layout.
setUpViewHolder();
}
diff --git a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/OverpoweredReflectionHelper.java b/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/OverpoweredReflectionHelper.java
deleted file mode 100644
index 4fcc5a1..0000000
--- a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/OverpoweredReflectionHelper.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settingslib.testutils;
-
-import org.robolectric.util.ReflectionHelpers;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-
-public class OverpoweredReflectionHelper extends ReflectionHelpers {
-
- /**
- * Robolectric upstream does not rely on or encourage this behaviour.
- *
- * @param field
- */
- private static void makeFieldVeryAccessible(Field field) {
- field.setAccessible(true);
- // remove 'final' modifier if present
- if ((field.getModifiers() & Modifier.FINAL) == Modifier.FINAL) {
- Field modifiersField = getModifiersField();
- modifiersField.setAccessible(true);
- try {
- modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
- } catch (IllegalAccessException e) {
-
- throw new AssertionError(e);
- }
- }
- }
-
- private static Field getModifiersField() {
- try {
- return Field.class.getDeclaredField("modifiers");
- } catch (NoSuchFieldException e) {
- try {
- Method getFieldsMethod =
- Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class);
- getFieldsMethod.setAccessible(true);
- Field[] fields = (Field[]) getFieldsMethod.invoke(Field.class, false);
- for (Field modifiersField : fields) {
- if ("modifiers".equals(modifiersField.getName())) {
- return modifiersField;
- }
- }
- } catch (ReflectiveOperationException innerE) {
- throw new AssertionError(innerE);
- }
- }
- throw new AssertionError();
- }
-
- /**
- * Reflectively set the value of a static field.
- *
- * @param field Field object.
- * @param fieldNewValue The new value.
- */
- public static void setStaticField(Field field, Object fieldNewValue) {
- try {
- makeFieldVeryAccessible(field);
- field.setAccessible(true);
- field.set(null, fieldNewValue);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Reflectively set the value of a static field.
- *
- * @param clazz Target class.
- * @param fieldName The field name.
- * @param fieldNewValue The new value.
- */
- public static void setStaticField(Class<?> clazz, String fieldName, Object fieldNewValue) {
- try {
- setStaticField(clazz.getDeclaredField(fieldName), fieldNewValue);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
-}
diff --git a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowActivityManager.java b/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowActivityManager.java
index 0b9ba8d..924eb04 100644
--- a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowActivityManager.java
+++ b/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowActivityManager.java
@@ -16,27 +16,23 @@
package com.android.settingslib.testutils.shadow;
-import static android.os.Build.VERSION_CODES.O;
-
import android.app.ActivityManager;
-import android.app.IActivityManager;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.Resetter;
import org.robolectric.shadow.api.Shadow;
-import org.robolectric.util.ReflectionHelpers;
@Implements(ActivityManager.class)
public class ShadowActivityManager {
private static int sCurrentUserId = 0;
- private static int sUserSwitchedTo = -1;
+ private int mUserSwitchedTo = -1;
@Resetter
- public static void reset() {
+ public void reset() {
sCurrentUserId = 0;
- sUserSwitchedTo = 0;
+ mUserSwitchedTo = 0;
}
@Implementation
@@ -46,21 +42,16 @@
@Implementation
protected boolean switchUser(int userId) {
- sUserSwitchedTo = userId;
+ mUserSwitchedTo = userId;
return true;
}
- @Implementation(minSdk = O)
- protected static IActivityManager getService() {
- return ReflectionHelpers.createNullProxy(IActivityManager.class);
- }
-
public boolean getSwitchUserCalled() {
- return sUserSwitchedTo != -1;
+ return mUserSwitchedTo != -1;
}
public int getUserSwitchedTo() {
- return sUserSwitchedTo;
+ return mUserSwitchedTo;
}
public static void setCurrentUser(int userId) {
diff --git a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowDefaultDialerManager.java b/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowDefaultDialerManager.java
index bbfdb7f..2c0792f 100644
--- a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowDefaultDialerManager.java
+++ b/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowDefaultDialerManager.java
@@ -29,7 +29,7 @@
private static String sDefaultDialer;
@Resetter
- public static void reset() {
+ public void reset() {
sDefaultDialer = null;
}
diff --git a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowPermissionChecker.java b/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowPermissionChecker.java
deleted file mode 100644
index fae3aea..0000000
--- a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowPermissionChecker.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settingslib.testutils.shadow;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.AttributionSource;
-import android.content.Context;
-import android.content.PermissionChecker;
-
-import org.robolectric.annotation.Implementation;
-import org.robolectric.annotation.Implements;
-
-import java.util.HashMap;
-import java.util.Map;
-/** Shadow class of {@link PermissionChecker}. */
-@Implements(PermissionChecker.class)
-public class ShadowPermissionChecker {
- private static final Map<String, Map<String, Integer>> RESULTS = new HashMap<>();
- /** Set the result of permission check for a specific permission. */
- public static void setResult(String packageName, String permission, int result) {
- if (!RESULTS.containsKey(packageName)) {
- RESULTS.put(packageName, new HashMap<>());
- }
- RESULTS.get(packageName).put(permission, result);
- }
- /** Check the permission of calling package. */
- @Implementation
- public static int checkCallingPermissionForDataDelivery(
- Context context,
- String permission,
- String packageName,
- String attributionTag,
- String message) {
- return RESULTS.containsKey(packageName) && RESULTS.get(packageName).containsKey(permission)
- ? RESULTS.get(packageName).get(permission)
- : PermissionChecker.checkCallingPermissionForDataDelivery(
- context, permission, packageName, attributionTag, message);
- }
- /** Check general permission. */
- @Implementation
- public static int checkPermissionForDataDelivery(
- Context context,
- String permission,
- int pid,
- int uid,
- String packageName,
- String attributionTag,
- String message) {
- return RESULTS.containsKey(packageName) && RESULTS.get(packageName).containsKey(permission)
- ? RESULTS.get(packageName).get(permission)
- : PermissionChecker.checkPermissionForDataDelivery(
- context, permission, pid, uid, packageName, attributionTag, message);
- }
- /** Check general permission. */
- @Implementation
- public static int checkPermissionForPreflight(@NonNull Context context,
- @NonNull String permission, int pid, int uid, @Nullable String packageName) {
- return checkPermissionForPreflight(context, permission, new AttributionSource(
- uid, packageName, null /*attributionTag*/));
- }
- /** Check general permission. */
- @Implementation
- public static int checkPermissionForPreflight(@NonNull Context context,
- @NonNull String permission, @NonNull AttributionSource attributionSource) {
- final String packageName = attributionSource.getPackageName();
- return RESULTS.containsKey(packageName) && RESULTS.get(packageName).containsKey(permission)
- ? RESULTS.get(packageName).get(permission)
- : PermissionChecker.checkPermissionForPreflight(
- context, permission, attributionSource);
- }
-}
diff --git a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowSecure.java b/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowSecure.java
deleted file mode 100644
index 70ebc67..0000000
--- a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowSecure.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settingslib.testutils.shadow;
-
-import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
-
-import android.content.ContentResolver;
-import android.provider.Settings;
-
-import org.robolectric.annotation.Implementation;
-import org.robolectric.annotation.Implements;
-import org.robolectric.shadows.ShadowSettings;
-
-@Implements(value = Settings.Secure.class)
-public class ShadowSecure extends ShadowSettings.ShadowSecure {
- @Implementation(minSdk = JELLY_BEAN_MR1)
- public static boolean putStringForUser(ContentResolver cr, String name, String value,
- int userHandle) {
- return putString(cr, name, value);
- }
-}
diff --git a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowSmsApplication.java b/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowSmsApplication.java
index 5ac0a87..381d072 100644
--- a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowSmsApplication.java
+++ b/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowSmsApplication.java
@@ -31,7 +31,7 @@
private static ComponentName sDefaultSmsApplication;
@Resetter
- public static void reset() {
+ public void reset() {
sDefaultSmsApplication = null;
}
diff --git a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowUserManager.java b/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowUserManager.java
index 60d7721..ca1eefc 100644
--- a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowUserManager.java
+++ b/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowUserManager.java
@@ -16,28 +16,20 @@
package com.android.settingslib.testutils.shadow;
-import static android.os.Build.VERSION_CODES.N_MR1;
-
import android.annotation.UserIdInt;
import android.content.Context;
import android.content.pm.UserInfo;
-import android.content.pm.UserProperties;
-import android.os.UserHandle;
import android.os.UserManager;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
-import org.robolectric.shadows.ShadowBuild;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
@Implements(value = UserManager.class)
public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager {
private List<UserInfo> mUserInfos = addProfile(0, "Owner");
- private final Map<Integer, UserProperties> mUserPropertiesMap = new HashMap<>();
@Implementation
protected static UserManager get(Context context) {
@@ -70,37 +62,4 @@
protected List<UserInfo> getProfiles(@UserIdInt int userHandle) {
return getProfiles();
}
-
- /**
- * @return {@code false} by default, or the value specified via {@link #setIsAdminUser(boolean)}
- */
- @Implementation(minSdk = N_MR1)
- public boolean isAdminUser() {
- return getUserInfo(UserHandle.myUserId()).isAdmin();
- }
-
- /**
- * Sets that the current user is an admin user; controls the return value of
- * {@link UserManager#isAdminUser}.
- */
- public void setIsAdminUser(boolean isAdminUser) {
- UserInfo userInfo = getUserInfo(UserHandle.myUserId());
- if (isAdminUser) {
- userInfo.flags |= UserInfo.FLAG_ADMIN;
- } else {
- userInfo.flags &= ~UserInfo.FLAG_ADMIN;
- }
- }
-
- public void setupUserProperty(int userId, int showInSettings) {
- UserProperties userProperties = new UserProperties(new UserProperties.Builder()
- .setShowInSettings(showInSettings).build());
- mUserPropertiesMap.putIfAbsent(userId, userProperties);
- }
-
- @Implementation(minSdk = ShadowBuild.UPSIDE_DOWN_CAKE)
- protected UserProperties getUserProperties(UserHandle user) {
- return mUserPropertiesMap.getOrDefault(user.getIdentifier(),
- new UserProperties(new UserProperties.Builder().build()));
- }
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java b/packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java
index 657d691..00f2d0e 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java
@@ -75,6 +75,15 @@
}
}
+ @Override
+ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ final IContentProvider iprovider = mProvider.getIContentProvider();
+ pw.println("device config properties:");
+ for (String line : MyShellCommand.listAll(iprovider)) {
+ pw.println(line);
+ }
+ }
+
private void callUpdableDeviceConfigShellCommandHandler(FileDescriptor in, FileDescriptor out,
FileDescriptor err, String[] args, ResultReceiver resultReceiver) {
int result = -1;
@@ -111,6 +120,31 @@
mProvider = provider;
}
+ public static List<String> listAll(IContentProvider provider) {
+ final ArrayList<String> lines = new ArrayList<>();
+
+ try {
+ Bundle args = new Bundle();
+ args.putInt(Settings.CALL_METHOD_USER_KEY,
+ ActivityManager.getService().getCurrentUser().id);
+ Bundle b = provider.call(new AttributionSource(Process.myUid(),
+ resolveCallingPackage(), null), Settings.AUTHORITY,
+ Settings.CALL_METHOD_LIST_CONFIG, null, args);
+ if (b != null) {
+ Map<String, String> flagsToValues =
+ (HashMap) b.getSerializable(Settings.NameValueTable.VALUE);
+ for (String key : flagsToValues.keySet()) {
+ lines.add(key + "=" + flagsToValues.get(key));
+ }
+ }
+
+ Collections.sort(lines);
+ } catch (RemoteException e) {
+ throw new RuntimeException("Failed in IPC", e);
+ }
+ return lines;
+ }
+
@SuppressLint("AndroidFrameworkRequiresPermission")
@Override
public int onCommand(String cmd) {
@@ -391,31 +425,6 @@
return success;
}
- private List<String> listAll(IContentProvider provider) {
- final ArrayList<String> lines = new ArrayList<>();
-
- try {
- Bundle args = new Bundle();
- args.putInt(Settings.CALL_METHOD_USER_KEY,
- ActivityManager.getService().getCurrentUser().id);
- Bundle b = provider.call(new AttributionSource(Process.myUid(),
- resolveCallingPackage(), null), Settings.AUTHORITY,
- Settings.CALL_METHOD_LIST_CONFIG, null, args);
- if (b != null) {
- Map<String, String> flagsToValues =
- (HashMap) b.getSerializable(Settings.NameValueTable.VALUE);
- for (String key : flagsToValues.keySet()) {
- lines.add(key + "=" + flagsToValues.get(key));
- }
- }
-
- Collections.sort(lines);
- } catch (RemoteException e) {
- throw new RuntimeException("Failed in IPC", e);
- }
- return lines;
- }
-
private static String resolveCallingPackage() {
switch (Binder.getCallingUid()) {
case Process.ROOT_UID: {
diff --git a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
index 4e0e8d0..4a6e53d 100644
--- a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
+++ b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
@@ -26,6 +26,7 @@
import android.view.View
import android.view.View.OnAttachStateChangeListener
import android.view.ViewTreeObserver
+import android.view.ViewTreeObserver.OnGlobalLayoutListener
import android.widget.FrameLayout
import androidx.annotation.VisibleForTesting
import androidx.lifecycle.Lifecycle
@@ -88,6 +89,15 @@
) {
var clock: ClockController? = null
set(value) {
+ smallClockOnAttachStateChangeListener?.let {
+ field?.smallClock?.view?.removeOnAttachStateChangeListener(it)
+ smallClockFrame?.viewTreeObserver
+ ?.removeOnGlobalLayoutListener(onGlobalLayoutListener)
+ }
+ largeClockOnAttachStateChangeListener?.let {
+ field?.largeClock?.view?.removeOnAttachStateChangeListener(it)
+ }
+
field = value
if (value != null) {
smallLogBuffer?.log(TAG, DEBUG, {}, { "New Clock" })
@@ -130,44 +140,62 @@
}
value.events.onWeatherDataChanged(it)
}
- value.smallClock.view.addOnAttachStateChangeListener(
+
+ smallClockOnAttachStateChangeListener =
object : OnAttachStateChangeListener {
var pastVisibility: Int? = null
override fun onViewAttachedToWindow(view: View?) {
value.events.onTimeFormatChanged(DateFormat.is24HourFormat(context))
if (view != null) {
- val smallClockFrame = view.parent as FrameLayout
- pastVisibility = smallClockFrame.visibility
- smallClockFrame.viewTreeObserver.addOnGlobalLayoutListener(
- ViewTreeObserver.OnGlobalLayoutListener {
- val currentVisibility = smallClockFrame.visibility
- if (pastVisibility != currentVisibility) {
- pastVisibility = currentVisibility
- // when small clock visible, recalculate bounds and sample
- if (currentVisibility == View.VISIBLE) {
- smallRegionSampler?.stopRegionSampler()
- smallRegionSampler?.startRegionSampler()
+ smallClockFrame = view.parent as FrameLayout
+ smallClockFrame?.let {frame ->
+ pastVisibility = frame.visibility
+ onGlobalLayoutListener = OnGlobalLayoutListener {
+ val currentVisibility = frame.visibility
+ if (pastVisibility != currentVisibility) {
+ pastVisibility = currentVisibility
+ // when small clock visible,
+ // recalculate bounds and sample
+ if (currentVisibility == View.VISIBLE) {
+ smallRegionSampler?.stopRegionSampler()
+ smallRegionSampler?.startRegionSampler()
+ }
}
}
- })
+ frame.viewTreeObserver
+ .addOnGlobalLayoutListener(onGlobalLayoutListener)
+ }
}
}
override fun onViewDetachedFromWindow(p0: View?) {
+ smallClockFrame?.viewTreeObserver
+ ?.removeOnGlobalLayoutListener(onGlobalLayoutListener)
}
- })
- value.largeClock.view.addOnAttachStateChangeListener(
+ }
+ value.smallClock.view
+ .addOnAttachStateChangeListener(smallClockOnAttachStateChangeListener)
+
+ largeClockOnAttachStateChangeListener =
object : OnAttachStateChangeListener {
override fun onViewAttachedToWindow(p0: View?) {
value.events.onTimeFormatChanged(DateFormat.is24HourFormat(context))
}
-
override fun onViewDetachedFromWindow(p0: View?) {
}
- })
+ }
+ value.largeClock.view
+ .addOnAttachStateChangeListener(largeClockOnAttachStateChangeListener)
}
}
+ @VisibleForTesting
+ var smallClockOnAttachStateChangeListener: OnAttachStateChangeListener? = null
+ @VisibleForTesting
+ var largeClockOnAttachStateChangeListener: OnAttachStateChangeListener? = null
+ private var smallClockFrame: FrameLayout? = null
+ private var onGlobalLayoutListener: OnGlobalLayoutListener? = null
+
private var isDozing = false
private set
@@ -307,7 +335,6 @@
return
}
isRegistered = true
-
broadcastDispatcher.registerReceiver(
localeBroadcastReceiver,
IntentFilter(Intent.ACTION_LOCALE_CHANGED)
@@ -346,6 +373,12 @@
largeRegionSampler?.stopRegionSampler()
smallTimeListener?.stop()
largeTimeListener?.stop()
+ clock?.smallClock?.view
+ ?.removeOnAttachStateChangeListener(smallClockOnAttachStateChangeListener)
+ smallClockFrame?.viewTreeObserver
+ ?.removeOnGlobalLayoutListener(onGlobalLayoutListener)
+ clock?.largeClock?.view
+ ?.removeOnAttachStateChangeListener(largeClockOnAttachStateChangeListener)
}
private fun updateTimeListeners() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java
index 4a9921e..bcf3b0c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java
@@ -240,10 +240,8 @@
Insets.of(0, safeTouchRegionHeight, 0, 0));
}
lp.providedInsets = new InsetsFrameProvider[] {
- new InsetsFrameProvider(mInsetsSourceOwner, 0, statusBars())
- .setInsetsSize(Insets.of(0, height, 0, 0)),
- new InsetsFrameProvider(mInsetsSourceOwner, 0, tappableElement())
- .setInsetsSize(Insets.of(0, height, 0, 0)),
+ new InsetsFrameProvider(mInsetsSourceOwner, 0, statusBars()),
+ new InsetsFrameProvider(mInsetsSourceOwner, 0, tappableElement()),
gestureInsetsProvider
};
return lp;
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt
index 2318988..b67f280 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt
@@ -18,7 +18,8 @@
import android.content.BroadcastReceiver
import android.testing.AndroidTestingRunner
import android.view.View
-import android.widget.TextView
+import android.view.ViewTreeObserver
+import android.widget.FrameLayout
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository
@@ -83,7 +84,13 @@
@Mock private lateinit var bgExecutor: Executor
@Mock private lateinit var featureFlags: FeatureFlags
@Mock private lateinit var smallClockController: ClockFaceController
+ @Mock private lateinit var smallClockView: View
+ @Mock private lateinit var smallClockViewTreeObserver: ViewTreeObserver
+ @Mock private lateinit var smallClockFrame: FrameLayout
+ @Mock private lateinit var smallClockFrameViewTreeObserver: ViewTreeObserver
@Mock private lateinit var largeClockController: ClockFaceController
+ @Mock private lateinit var largeClockView: View
+ @Mock private lateinit var largeClockViewTreeObserver: ViewTreeObserver
@Mock private lateinit var smallClockEvents: ClockFaceEvents
@Mock private lateinit var largeClockEvents: ClockFaceEvents
@Mock private lateinit var parentView: View
@@ -99,8 +106,12 @@
fun setUp() {
whenever(clock.smallClock).thenReturn(smallClockController)
whenever(clock.largeClock).thenReturn(largeClockController)
- whenever(smallClockController.view).thenReturn(TextView(context))
- whenever(largeClockController.view).thenReturn(TextView(context))
+ whenever(smallClockController.view).thenReturn(smallClockView)
+ whenever(smallClockView.parent).thenReturn(smallClockFrame)
+ whenever(smallClockView.viewTreeObserver).thenReturn(smallClockViewTreeObserver)
+ whenever(smallClockFrame.viewTreeObserver).thenReturn(smallClockFrameViewTreeObserver)
+ whenever(largeClockController.view).thenReturn(largeClockView)
+ whenever(largeClockView.viewTreeObserver).thenReturn(largeClockViewTreeObserver)
whenever(smallClockController.events).thenReturn(smallClockEvents)
whenever(largeClockController.events).thenReturn(largeClockEvents)
whenever(clock.events).thenReturn(events)
@@ -302,8 +313,38 @@
verify(configurationController).removeCallback(any())
verify(batteryController).removeCallback(any())
verify(keyguardUpdateMonitor).removeCallback(any())
+ verify(smallClockController.view)
+ .removeOnAttachStateChangeListener(underTest.smallClockOnAttachStateChangeListener)
+ verify(largeClockController.view)
+ .removeOnAttachStateChangeListener(underTest.largeClockOnAttachStateChangeListener)
}
+ @Test
+ fun registerOnAttachStateChangeListener_validate() = runBlocking(IMMEDIATE) {
+ verify(smallClockController.view)
+ .addOnAttachStateChangeListener(underTest.smallClockOnAttachStateChangeListener)
+ verify(largeClockController.view)
+ .addOnAttachStateChangeListener(underTest.largeClockOnAttachStateChangeListener)
+ }
+
+ @Test
+ fun registerAndRemoveOnGlobalLayoutListener_correctly() = runBlocking(IMMEDIATE) {
+ underTest.smallClockOnAttachStateChangeListener!!.onViewAttachedToWindow(smallClockView)
+ verify(smallClockFrame.viewTreeObserver).addOnGlobalLayoutListener(any())
+ underTest.smallClockOnAttachStateChangeListener!!.onViewDetachedFromWindow(smallClockView)
+ verify(smallClockFrame.viewTreeObserver).removeOnGlobalLayoutListener(any())
+ }
+
+ @Test
+ fun registerOnGlobalLayoutListener_RemoveOnAttachStateChangeListener_correctly() =
+ runBlocking(IMMEDIATE) {
+ underTest.smallClockOnAttachStateChangeListener!!
+ .onViewAttachedToWindow(smallClockView)
+ verify(smallClockFrame.viewTreeObserver).addOnGlobalLayoutListener(any())
+ underTest.unregisterListeners()
+ verify(smallClockFrame.viewTreeObserver).removeOnGlobalLayoutListener(any())
+ }
+
companion object {
private val IMMEDIATE = Dispatchers.Main.immediate
}