Merge "Add MessageFormats to Spa"
diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt
index 286a800..b9182bc 100644
--- a/core/api/module-lib-current.txt
+++ b/core/api/module-lib-current.txt
@@ -425,6 +425,26 @@
field public static final String NAMESPACE_DEVICE_IDLE = "device_idle";
}
+ public final class Settings {
+ field public static final int RESET_MODE_PACKAGE_DEFAULTS = 1; // 0x1
+ field public static final int RESET_MODE_TRUSTED_DEFAULTS = 4; // 0x4
+ field public static final int RESET_MODE_UNTRUSTED_CHANGES = 3; // 0x3
+ field public static final int RESET_MODE_UNTRUSTED_DEFAULTS = 2; // 0x2
+ }
+
+ public static final class Settings.Config extends android.provider.Settings.NameValueTable {
+ method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean deleteString(@NonNull String, @NonNull String);
+ method @Nullable @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getString(@NonNull String);
+ method @NonNull @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static java.util.Map<java.lang.String,java.lang.String> getStrings(@NonNull String, @NonNull java.util.List<java.lang.String>);
+ method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static int getSyncDisabledMode();
+ method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean putString(@NonNull String, @NonNull String, @Nullable String, boolean);
+ method public static void registerContentObserver(@Nullable String, boolean, @NonNull android.database.ContentObserver);
+ method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static void resetToDefaults(int, @Nullable String);
+ method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setStrings(@NonNull String, @NonNull java.util.Map<java.lang.String,java.lang.String>) throws android.provider.DeviceConfig.BadConfigException;
+ method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static void setSyncDisabledMode(int);
+ method public static void unregisterContentObserver(@NonNull android.database.ContentObserver);
+ }
+
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
field public static final String BLE_SCAN_ALWAYS_AVAILABLE = "ble_scan_always_enabled";
field public static final String BLE_SCAN_BACKGROUND_MODE = "ble_scan_background_mode";
diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java
index ca88ae3..27f4d08 100644
--- a/core/java/android/provider/DeviceConfig.java
+++ b/core/java/android/provider/DeviceConfig.java
@@ -55,13 +55,6 @@
@SystemApi
public final class DeviceConfig {
/**
- * The content:// style URL for the config table.
- *
- * @hide
- */
- public static final Uri CONTENT_URI = Uri.parse("content://" + Settings.AUTHORITY + "/config");
-
- /**
* Namespace for activity manager related features. These features will be applied
* immediately upon change.
*
@@ -1194,11 +1187,6 @@
}
}
- private static Uri createNamespaceUri(@NonNull String namespace) {
- Preconditions.checkNotNull(namespace);
- return CONTENT_URI.buildUpon().appendPath(namespace).build();
- }
-
/**
* Increment the count used to represent the number of listeners subscribed to the given
* namespace. If this is the first (i.e. incrementing from 0 to 1) for the given namespace, a
@@ -1223,7 +1211,7 @@
}
};
Settings.Config
- .registerContentObserver(createNamespaceUri(namespace), true, contentObserver);
+ .registerContentObserver(namespace, true, contentObserver);
sNamespaces.put(namespace, new Pair<>(contentObserver, 1));
}
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index f12bff2..f3e8b7c 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2819,6 +2819,7 @@
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
@TestApi
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public static final int RESET_MODE_PACKAGE_DEFAULTS = 1;
/**
@@ -2828,6 +2829,7 @@
* the setting will be deleted. This mode is only available to the system.
* @hide
*/
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public static final int RESET_MODE_UNTRUSTED_DEFAULTS = 2;
/**
@@ -2838,6 +2840,7 @@
* This mode is only available to the system.
* @hide
*/
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public static final int RESET_MODE_UNTRUSTED_CHANGES = 3;
/**
@@ -2849,6 +2852,7 @@
* to the system.
* @hide
*/
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public static final int RESET_MODE_TRUSTED_DEFAULTS = 4;
/** @hide */
@@ -18001,6 +18005,7 @@
*
* @hide
*/
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public static final class Config extends NameValueTable {
/**
@@ -18035,12 +18040,19 @@
*/
public static final int SYNC_DISABLED_MODE_UNTIL_REBOOT = 2;
+ /**
+ * The content:// style URL for the config table.
+ *
+ * @hide
+ */
+ public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/config");
+
private static final ContentProviderHolder sProviderHolder =
- new ContentProviderHolder(DeviceConfig.CONTENT_URI);
+ new ContentProviderHolder(CONTENT_URI);
// Populated lazily, guarded by class object:
private static final NameValueCache sNameValueCache = new NameValueCache(
- DeviceConfig.CONTENT_URI,
+ CONTENT_URI,
CALL_METHOD_GET_CONFIG,
CALL_METHOD_PUT_CONFIG,
CALL_METHOD_DELETE_CONFIG,
@@ -18049,6 +18061,10 @@
sProviderHolder,
Config.class);
+ // Should never be invoked
+ private Config() {
+ }
+
/**
* Look up a name in the database.
* @param name to look up in the table
@@ -18056,8 +18072,10 @@
*
* @hide
*/
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+ @Nullable
@RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG)
- static String getString(String name) {
+ public static String getString(@NonNull String name) {
ContentResolver resolver = getContentResolver();
return sNameValueCache.getStringForUser(resolver, name, resolver.getUserId());
}
@@ -18072,6 +18090,8 @@
*
* @hide
*/
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+ @NonNull
@RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG)
public static Map<String, String> getStrings(@NonNull String namespace,
@NonNull List<String> names) {
@@ -18128,6 +18148,7 @@
*
* @hide
*/
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
@RequiresPermission(Manifest.permission.WRITE_DEVICE_CONFIG)
public static boolean putString(@NonNull String namespace,
@NonNull String name, @Nullable String value, boolean makeDefault) {
@@ -18147,6 +18168,7 @@
*
* @hide
*/
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
@RequiresPermission(Manifest.permission.WRITE_DEVICE_CONFIG)
public static boolean setStrings(@NonNull String namespace,
@NonNull Map<String, String> keyValues)
@@ -18197,8 +18219,9 @@
*
* @hide
*/
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
@RequiresPermission(Manifest.permission.WRITE_DEVICE_CONFIG)
- static boolean deleteString(@NonNull String namespace,
+ public static boolean deleteString(@NonNull String namespace,
@NonNull String name) {
ContentResolver resolver = getContentResolver();
return sNameValueCache.deleteStringForUser(resolver,
@@ -18218,8 +18241,9 @@
*
* @hide
*/
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
@RequiresPermission(Manifest.permission.WRITE_DEVICE_CONFIG)
- static void resetToDefaults(@ResetMode int resetMode,
+ public static void resetToDefaults(@ResetMode int resetMode,
@Nullable String namespace) {
try {
ContentResolver resolver = getContentResolver();
@@ -18233,7 +18257,7 @@
cp.call(resolver.getAttributionSource(),
sProviderHolder.mUri.getAuthority(), CALL_METHOD_RESET_CONFIG, null, arg);
} catch (RemoteException e) {
- Log.w(TAG, "Can't reset to defaults for " + DeviceConfig.CONTENT_URI, e);
+ Log.w(TAG, "Can't reset to defaults for " + CONTENT_URI, e);
}
}
@@ -18243,9 +18267,10 @@
*
* @hide
*/
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
@SuppressLint("AndroidFrameworkRequiresPermission")
@RequiresPermission(Manifest.permission.WRITE_DEVICE_CONFIG)
- static void setSyncDisabledMode(@SyncDisabledMode int disableSyncMode) {
+ public static void setSyncDisabledMode(@SyncDisabledMode int disableSyncMode) {
try {
ContentResolver resolver = getContentResolver();
Bundle args = new Bundle();
@@ -18254,7 +18279,7 @@
cp.call(resolver.getAttributionSource(), sProviderHolder.mUri.getAuthority(),
CALL_METHOD_SET_SYNC_DISABLED_MODE_CONFIG, null, args);
} catch (RemoteException e) {
- Log.w(TAG, "Can't set sync disabled mode " + DeviceConfig.CONTENT_URI, e);
+ Log.w(TAG, "Can't set sync disabled mode " + CONTENT_URI, e);
}
}
@@ -18264,9 +18289,10 @@
*
* @hide
*/
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
@SuppressLint("AndroidFrameworkRequiresPermission")
@RequiresPermission(Manifest.permission.WRITE_DEVICE_CONFIG)
- static int getSyncDisabledMode() {
+ public static int getSyncDisabledMode() {
try {
ContentResolver resolver = getContentResolver();
Bundle args = Bundle.EMPTY;
@@ -18277,7 +18303,7 @@
null, args);
return bundle.getInt(KEY_CONFIG_GET_SYNC_DISABLED_MODE_RETURN);
} catch (RemoteException e) {
- Log.w(TAG, "Can't query sync disabled mode " + DeviceConfig.CONTENT_URI, e);
+ Log.w(TAG, "Can't query sync disabled mode " + CONTENT_URI, e);
}
return -1;
}
@@ -18297,21 +18323,26 @@
/**
- * Register a content observer
+ * Register a content observer.
*
* @hide
*/
- public static void registerContentObserver(@NonNull Uri uri, boolean notifyForDescendants,
- @NonNull ContentObserver observer) {
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+ public static void registerContentObserver(@Nullable String namespace,
+ boolean notifyForDescendants, @NonNull ContentObserver observer) {
ActivityThread.currentApplication().getContentResolver()
- .registerContentObserver(uri, notifyForDescendants, observer);
+ .registerContentObserver(createNamespaceUri(namespace),
+ notifyForDescendants, observer);
}
/**
- * Unregister a content observer
+ * Unregister a content observer.
+ * this may only be used with content observers registered through
+ * {@link Config#registerContentObserver}
*
* @hide
*/
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public static void unregisterContentObserver(@NonNull ContentObserver observer) {
ActivityThread.currentApplication().getContentResolver()
.unregisterContentObserver(observer);
@@ -18372,6 +18403,11 @@
return namespace + "/";
}
+ private static Uri createNamespaceUri(@NonNull String namespace) {
+ Preconditions.checkNotNull(namespace);
+ return CONTENT_URI.buildUpon().appendPath(namespace).build();
+ }
+
private static ContentResolver getContentResolver() {
return ActivityThread.currentApplication().getContentResolver();
}
diff --git a/core/java/android/util/SparseArray.java b/core/java/android/util/SparseArray.java
index 05c86172..cc83dec 100644
--- a/core/java/android/util/SparseArray.java
+++ b/core/java/android/util/SparseArray.java
@@ -525,9 +525,10 @@
return false;
}
+ // size() calls above took care about gc() compaction.
for (int index = 0; index < size; index++) {
- int key = keyAt(index);
- if (!Objects.equals(valueAt(index), other.get(key))) {
+ if (mKeys[index] != other.mKeys[index]
+ || !Objects.equals(mValues[index], other.mValues[index])) {
return false;
}
}
@@ -545,10 +546,11 @@
public int contentHashCode() {
int hash = 0;
int size = size();
+ // size() call above took care about gc() compaction.
for (int index = 0; index < size; index++) {
- int key = keyAt(index);
- E value = valueAt(index);
- hash = 31 * hash + Objects.hashCode(key);
+ int key = mKeys[index];
+ E value = (E) mValues[index];
+ hash = 31 * hash + key;
hash = 31 * hash + Objects.hashCode(value);
}
return hash;
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 0743ccb..6d9f99f 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -53,7 +53,6 @@
import android.view.KeyEvent;
import android.view.InputEvent;
import android.view.InsetsState;
-import android.view.InsetsVisibilities;
import android.view.MagnificationSpec;
import android.view.MotionEvent;
import android.view.InputChannel;
diff --git a/core/java/android/view/InsetsVisibilities.aidl b/core/java/android/view/InsetsVisibilities.aidl
deleted file mode 100644
index bd573ea..0000000
--- a/core/java/android/view/InsetsVisibilities.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2021, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view;
-
-parcelable InsetsVisibilities;
diff --git a/core/java/android/view/InsetsVisibilities.java b/core/java/android/view/InsetsVisibilities.java
deleted file mode 100644
index 7d259fb..0000000
--- a/core/java/android/view/InsetsVisibilities.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view;
-
-import android.annotation.NonNull;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.Arrays;
-import java.util.StringJoiner;
-
-/**
- * A collection of visibilities of insets. This is used for carrying the requested visibilities.
- * @hide
- */
-public class InsetsVisibilities implements Parcelable {
-
- private static final int UNSPECIFIED = 0;
- private static final int VISIBLE = 1;
- private static final int INVISIBLE = -1;
-
- private final int[] mVisibilities = new int[InsetsState.SIZE];
-
- public InsetsVisibilities() {
- }
-
- public InsetsVisibilities(InsetsVisibilities other) {
- set(other);
- }
-
- public InsetsVisibilities(Parcel in) {
- in.readIntArray(mVisibilities);
- }
-
- /**
- * Copies from another {@link InsetsVisibilities}.
- *
- * @param other an instance of {@link InsetsVisibilities}.
- */
- public void set(InsetsVisibilities other) {
- System.arraycopy(other.mVisibilities, InsetsState.FIRST_TYPE, mVisibilities,
- InsetsState.FIRST_TYPE, InsetsState.SIZE);
- }
-
- /**
- * Sets a visibility to a type.
- *
- * @param type The {@link @InsetsState.InternalInsetsType}.
- * @param visible {@code true} represents visible; {@code false} represents invisible.
- */
- public void setVisibility(@InsetsState.InternalInsetsType int type, boolean visible) {
- mVisibilities[type] = visible ? VISIBLE : INVISIBLE;
- }
-
- /**
- * Returns the specified insets visibility of the type. If it has never been specified,
- * this returns the default visibility.
- *
- * @param type The {@link @InsetsState.InternalInsetsType}.
- * @return The specified visibility or the default one if it is not specified.
- */
- public boolean getVisibility(@InsetsState.InternalInsetsType int type) {
- final int visibility = mVisibilities[type];
- return visibility == UNSPECIFIED
- ? InsetsState.getDefaultVisibility(type)
- : visibility == VISIBLE;
- }
-
- @Override
- public String toString() {
- StringJoiner joiner = new StringJoiner(", ");
- for (int type = InsetsState.FIRST_TYPE; type <= InsetsState.LAST_TYPE; type++) {
- final int visibility = mVisibilities[type];
- if (visibility != UNSPECIFIED) {
- joiner.add(InsetsState.typeToString(type) + ": "
- + (visibility == VISIBLE ? "visible" : "invisible"));
- }
- }
- return joiner.toString();
- }
-
- @Override
- public int hashCode() {
- return Arrays.hashCode(mVisibilities);
- }
-
- @Override
- public boolean equals(Object other) {
- if (!(other instanceof InsetsVisibilities)) {
- return false;
- }
- return Arrays.equals(mVisibilities, ((InsetsVisibilities) other).mVisibilities);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeIntArray(mVisibilities);
- }
-
- public void readFromParcel(@NonNull Parcel in) {
- in.readIntArray(mVisibilities);
- }
-
- public static final @NonNull Creator<InsetsVisibilities> CREATOR =
- new Creator<InsetsVisibilities>() {
-
- public InsetsVisibilities createFromParcel(Parcel in) {
- return new InsetsVisibilities(in);
- }
-
- public InsetsVisibilities[] newArray(int size) {
- return new InsetsVisibilities[size];
- }
- };
-}
diff --git a/core/java/android/view/WindowInsets.java b/core/java/android/view/WindowInsets.java
index 8de15c1..fd55d8d 100644
--- a/core/java/android/view/WindowInsets.java
+++ b/core/java/android/view/WindowInsets.java
@@ -1493,37 +1493,37 @@
public static String toString(@InsetsType int types) {
StringBuilder result = new StringBuilder();
if ((types & STATUS_BARS) != 0) {
- result.append("statusBars |");
+ result.append("statusBars ");
}
if ((types & NAVIGATION_BARS) != 0) {
- result.append("navigationBars |");
+ result.append("navigationBars ");
}
if ((types & CAPTION_BAR) != 0) {
- result.append("captionBar |");
+ result.append("captionBar ");
}
if ((types & IME) != 0) {
- result.append("ime |");
+ result.append("ime ");
}
if ((types & SYSTEM_GESTURES) != 0) {
- result.append("systemGestures |");
+ result.append("systemGestures ");
}
if ((types & MANDATORY_SYSTEM_GESTURES) != 0) {
- result.append("mandatorySystemGestures |");
+ result.append("mandatorySystemGestures ");
}
if ((types & TAPPABLE_ELEMENT) != 0) {
- result.append("tappableElement |");
+ result.append("tappableElement ");
}
if ((types & DISPLAY_CUTOUT) != 0) {
- result.append("displayCutout |");
+ result.append("displayCutout ");
}
if ((types & WINDOW_DECOR) != 0) {
- result.append("windowDecor |");
+ result.append("windowDecor ");
}
if ((types & SYSTEM_OVERLAYS) != 0) {
- result.append("systemOverlays |");
+ result.append("systemOverlays ");
}
if (result.length() > 0) {
- result.delete(result.length() - 2, result.length());
+ result.delete(result.length() - 1, result.length());
}
return result.toString();
}
diff --git a/core/res/res/values/config_telephony.xml b/core/res/res/values/config_telephony.xml
index f2a16d3..d40adf5 100644
--- a/core/res/res/values/config_telephony.xml
+++ b/core/res/res/values/config_telephony.xml
@@ -118,6 +118,11 @@
<bool name="config_using_subscription_manager_service">false</bool>
<java-symbol type="bool" name="config_using_subscription_manager_service" />
+ <!-- Whether asynchronously update the subscription database or not. Async mode increases
+ the performance, but sync mode reduces the chance of database/cache out-of-sync. -->
+ <bool name="config_subscription_database_async_update">true</bool>
+ <java-symbol type="bool" name="config_subscription_database_async_update" />
+
<!-- Boolean indicating whether the emergency numbers for a country, sourced from modem/config,
should be ignored if that country is 'locked' (i.e. ignore_modem_config set to true) in
Android Emergency DB. If this value is true, emergency numbers for a country, sourced from
diff --git a/core/tests/coretests/src/android/provider/DeviceConfigTest.java b/core/tests/coretests/src/android/provider/DeviceConfigTest.java
index 352c6a7..aa1853f 100644
--- a/core/tests/coretests/src/android/provider/DeviceConfigTest.java
+++ b/core/tests/coretests/src/android/provider/DeviceConfigTest.java
@@ -857,7 +857,10 @@
ContentResolver resolver = InstrumentationRegistry.getContext().getContentResolver();
String compositeName = namespace + "/" + key;
Bundle result = resolver.call(
- DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_DELETE_CONFIG, compositeName, null);
+ Settings.Config.CONTENT_URI,
+ Settings.CALL_METHOD_DELETE_CONFIG,
+ compositeName,
+ null);
assertThat(result).isNotNull();
return compositeName.equals(result.getString(Settings.NameValueTable.VALUE));
}
diff --git a/core/tests/coretests/src/android/provider/NameValueCacheTest.java b/core/tests/coretests/src/android/provider/NameValueCacheTest.java
index ee0b127..2e31bb5 100644
--- a/core/tests/coretests/src/android/provider/NameValueCacheTest.java
+++ b/core/tests/coretests/src/android/provider/NameValueCacheTest.java
@@ -76,7 +76,7 @@
when(mMockContentProvider.getIContentProvider()).thenReturn(mMockIContentProvider);
mMockContentResolver = new MockContentResolver(InstrumentationRegistry
.getInstrumentation().getContext());
- mMockContentResolver.addProvider(DeviceConfig.CONTENT_URI.getAuthority(),
+ mMockContentResolver.addProvider(Settings.Config.CONTENT_URI.getAuthority(),
mMockContentProvider);
mCacheGenerationStore = new MemoryIntArray(1);
mStorage = new HashMap<>();
@@ -84,7 +84,7 @@
// Stores keyValues for a given prefix and increments the generation. (Note that this
// increments the generation no matter what, it doesn't pay attention to if anything
// actually changed).
- when(mMockIContentProvider.call(any(), eq(DeviceConfig.CONTENT_URI.getAuthority()),
+ when(mMockIContentProvider.call(any(), eq(Settings.Config.CONTENT_URI.getAuthority()),
eq(Settings.CALL_METHOD_SET_ALL_CONFIG),
any(), any(Bundle.class))).thenAnswer(invocationOnMock -> {
Bundle incomingBundle = invocationOnMock.getArgument(4);
@@ -104,7 +104,7 @@
// Returns the keyValues corresponding to a namespace, or an empty map if the namespace
// doesn't have anything stored for it. Returns the generation key if the caller asked
// for one.
- when(mMockIContentProvider.call(any(), eq(DeviceConfig.CONTENT_URI.getAuthority()),
+ when(mMockIContentProvider.call(any(), eq(Settings.Config.CONTENT_URI.getAuthority()),
eq(Settings.CALL_METHOD_LIST_CONFIG),
any(), any(Bundle.class))).thenAnswer(invocationOnMock -> {
Bundle incomingBundle = invocationOnMock.getArgument(4);
diff --git a/core/tests/coretests/src/android/provider/SettingsProviderTest.java b/core/tests/coretests/src/android/provider/SettingsProviderTest.java
index 4adbc91..1331779 100644
--- a/core/tests/coretests/src/android/provider/SettingsProviderTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsProviderTest.java
@@ -345,27 +345,33 @@
try {
// value is empty
Bundle results =
- r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_GET_CONFIG, name, null);
+ r.call(Settings.Config.CONTENT_URI,
+ Settings.CALL_METHOD_GET_CONFIG, name, null);
assertNull(results.get(Settings.NameValueTable.VALUE));
// save value
- results = r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_PUT_CONFIG, name, args);
+ results = r.call(Settings.Config.CONTENT_URI,
+ Settings.CALL_METHOD_PUT_CONFIG, name, args);
assertNull(results);
// value is no longer empty
- results = r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_GET_CONFIG, name, null);
+ results = r.call(Settings.Config.CONTENT_URI,
+ Settings.CALL_METHOD_GET_CONFIG, name, null);
assertEquals(value, results.get(Settings.NameValueTable.VALUE));
// save new value
args.putString(Settings.NameValueTable.VALUE, newValue);
- r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_PUT_CONFIG, name, args);
+ r.call(Settings.Config.CONTENT_URI,
+ Settings.CALL_METHOD_PUT_CONFIG, name, args);
// new value is returned
- results = r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_GET_CONFIG, name, null);
+ results = r.call(Settings.Config.CONTENT_URI,
+ Settings.CALL_METHOD_GET_CONFIG, name, null);
assertEquals(newValue, results.get(Settings.NameValueTable.VALUE));
} finally {
// clean up
- r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_DELETE_CONFIG, name, null);
+ r.call(Settings.Config.CONTENT_URI,
+ Settings.CALL_METHOD_DELETE_CONFIG, name, null);
}
}
@@ -379,23 +385,25 @@
try {
// save value
- r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_PUT_CONFIG, name, args);
+ r.call(Settings.Config.CONTENT_URI, Settings.CALL_METHOD_PUT_CONFIG, name, args);
// get value
Bundle results =
- r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_GET_CONFIG, name, null);
+ r.call(Settings.Config.CONTENT_URI,
+ Settings.CALL_METHOD_GET_CONFIG, name, null);
assertEquals(value, results.get(Settings.NameValueTable.VALUE));
// delete value
- results = r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_DELETE_CONFIG, name,
+ results = r.call(Settings.Config.CONTENT_URI, Settings.CALL_METHOD_DELETE_CONFIG, name,
null);
// value is empty now
- results = r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_GET_CONFIG, name, null);
+ results = r.call(Settings.Config.CONTENT_URI,
+ Settings.CALL_METHOD_GET_CONFIG, name, null);
assertNull(results.get(Settings.NameValueTable.VALUE));
} finally {
// clean up
- r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_DELETE_CONFIG, name, null);
+ r.call(Settings.Config.CONTENT_URI, Settings.CALL_METHOD_DELETE_CONFIG, name, null);
}
}
@@ -413,12 +421,12 @@
try {
// save both values
- r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_PUT_CONFIG, name, args);
+ r.call(Settings.Config.CONTENT_URI, Settings.CALL_METHOD_PUT_CONFIG, name, args);
args.putString(Settings.NameValueTable.VALUE, newValue);
- r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_PUT_CONFIG, newName, args);
+ r.call(Settings.Config.CONTENT_URI, Settings.CALL_METHOD_PUT_CONFIG, newName, args);
// list all values
- Bundle result = r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_LIST_CONFIG,
+ Bundle result = r.call(Settings.Config.CONTENT_URI, Settings.CALL_METHOD_LIST_CONFIG,
null, null);
Map<String, String> keyValueMap =
(HashMap) result.getSerializable(Settings.NameValueTable.VALUE);
@@ -428,14 +436,15 @@
// list values for prefix
args.putString(Settings.CALL_METHOD_PREFIX_KEY, prefix);
- result = r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_LIST_CONFIG, null, args);
+ result = r.call(Settings.Config.CONTENT_URI,
+ Settings.CALL_METHOD_LIST_CONFIG, null, args);
keyValueMap = (HashMap) result.getSerializable(Settings.NameValueTable.VALUE);
assertThat(keyValueMap, aMapWithSize(1));
assertEquals(value, keyValueMap.get(name));
} finally {
// clean up
- r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_DELETE_CONFIG, name, null);
- r.call(DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_DELETE_CONFIG, newName, null);
+ r.call(Settings.Config.CONTENT_URI, Settings.CALL_METHOD_DELETE_CONFIG, name, null);
+ r.call(Settings.Config.CONTENT_URI, Settings.CALL_METHOD_DELETE_CONFIG, newName, null);
}
}
}
diff --git a/core/tests/coretests/src/android/view/InsetsVisibilitiesTest.java b/core/tests/coretests/src/android/view/InsetsVisibilitiesTest.java
deleted file mode 100644
index 5664e0b..0000000
--- a/core/tests/coretests/src/android/view/InsetsVisibilitiesTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view;
-
-import static android.view.InsetsState.FIRST_TYPE;
-import static android.view.InsetsState.LAST_TYPE;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
-
-import android.platform.test.annotations.Presubmit;
-import android.view.InsetsState.InternalInsetsType;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Tests for {@link InsetsVisibilities}.
- *
- * <p>Build/Install/Run:
- * atest FrameworksCoreTests:InsetsVisibilities
- *
- * <p>This test class is a part of Window Manager Service tests and specified in
- * {@link com.android.server.wm.test.filters.FrameworksTestsFilter}.
- */
-@Presubmit
-@RunWith(AndroidJUnit4.class)
-public class InsetsVisibilitiesTest {
-
- @Test
- public void testEquals() {
- final InsetsVisibilities v1 = new InsetsVisibilities();
- final InsetsVisibilities v2 = new InsetsVisibilities();
- final InsetsVisibilities v3 = new InsetsVisibilities();
- assertEquals(v1, v2);
- assertEquals(v1, v3);
-
- for (@InternalInsetsType int type = FIRST_TYPE; type <= LAST_TYPE; type++) {
- v1.setVisibility(type, false);
- v2.setVisibility(type, false);
- }
- assertEquals(v1, v2);
- assertNotEquals(v1, v3);
-
- for (@InternalInsetsType int type = FIRST_TYPE; type <= LAST_TYPE; type++) {
- v1.setVisibility(type, true);
- v2.setVisibility(type, true);
- }
- assertEquals(v1, v2);
- assertNotEquals(v1, v3);
- }
-
- @Test
- public void testSet() {
- for (@InternalInsetsType int type = FIRST_TYPE; type <= LAST_TYPE; type++) {
- final InsetsVisibilities v1 = new InsetsVisibilities();
- final InsetsVisibilities v2 = new InsetsVisibilities();
-
- v1.setVisibility(type, true);
- assertNotEquals(v1, v2);
-
- v2.set(v1);
- assertEquals(v1, v2);
-
- v2.setVisibility(type, false);
- assertNotEquals(v1, v2);
-
- v1.set(v2);
- assertEquals(v1, v2);
- }
- }
-
- @Test
- public void testCopyConstructor() {
- for (@InternalInsetsType int type = FIRST_TYPE; type <= LAST_TYPE; type++) {
- final InsetsVisibilities v1 = new InsetsVisibilities();
- v1.setVisibility(type, true);
- final InsetsVisibilities v2 = new InsetsVisibilities(v1);
- assertEquals(v1, v2);
-
- v2.setVisibility(type, false);
- assertNotEquals(v1, v2);
- }
- }
-
- @Test
- public void testGetterAndSetter() {
- final InsetsVisibilities v1 = new InsetsVisibilities();
- final InsetsVisibilities v2 = new InsetsVisibilities();
-
- for (@InternalInsetsType int type = FIRST_TYPE; type <= LAST_TYPE; type++) {
- assertEquals(InsetsState.getDefaultVisibility(type), v1.getVisibility(type));
- }
-
- for (@InternalInsetsType int type = FIRST_TYPE; type <= LAST_TYPE; type++) {
- v1.setVisibility(type, true);
- assertTrue(v1.getVisibility(type));
-
- v2.setVisibility(type, false);
- assertFalse(v2.getVisibility(type));
- }
- }
-}
diff --git a/packages/SettingsLib/Spa/testutils/src/com/android/settingslib/spa/testutils/LiveDataTestUtil.kt b/packages/SettingsLib/Spa/testutils/src/com/android/settingslib/spa/testutils/LiveDataTestUtil.kt
new file mode 100644
index 0000000..dddda55
--- /dev/null
+++ b/packages/SettingsLib/Spa/testutils/src/com/android/settingslib/spa/testutils/LiveDataTestUtil.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2022 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.spa.testutils
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.Observer
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeoutException
+
+fun <T> LiveData<T>.getOrAwaitValue(
+ timeout: Long = 1,
+ timeUnit: TimeUnit = TimeUnit.SECONDS,
+ afterObserve: () -> Unit = {},
+): T? {
+ var data: T? = null
+ val latch = CountDownLatch(1)
+ val observer = Observer<T> { newData ->
+ data = newData
+ latch.countDown()
+ }
+ this.observeForever(observer)
+
+ afterObserve()
+
+ try {
+ // Don't wait indefinitely if the LiveData is not set.
+ if (!latch.await(timeout, timeUnit)) {
+ throw TimeoutException("LiveData value was never set.")
+ }
+ } finally {
+ this.removeObserver(observer)
+ }
+
+ return data
+}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 0b7b2f9..503859b 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -3595,8 +3595,8 @@
private Uri getNotificationUriFor(int key, String name) {
if (isConfigSettingsKey(key)) {
- return (name != null) ? Uri.withAppendedPath(DeviceConfig.CONTENT_URI, name)
- : DeviceConfig.CONTENT_URI;
+ return (name != null) ? Uri.withAppendedPath(Settings.Config.CONTENT_URI, name)
+ : Settings.Config.CONTENT_URI;
} else if (isGlobalSettingsKey(key)) {
return (name != null) ? Uri.withAppendedPath(Settings.Global.CONTENT_URI, name)
: Settings.Global.CONTENT_URI;
diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/DeviceConfigServiceTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/DeviceConfigServiceTest.java
index e588b3d..753378b 100644
--- a/packages/SettingsProvider/test/src/com/android/providers/settings/DeviceConfigServiceTest.java
+++ b/packages/SettingsProvider/test/src/com/android/providers/settings/DeviceConfigServiceTest.java
@@ -22,7 +22,6 @@
import android.content.ContentResolver;
import android.os.Bundle;
-import android.provider.DeviceConfig;
import android.provider.Settings;
import androidx.test.InstrumentationRegistry;
@@ -180,14 +179,14 @@
args.putBoolean(Settings.CALL_METHOD_MAKE_DEFAULT_KEY, true);
}
resolver.call(
- DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_PUT_CONFIG, compositeName, args);
+ Settings.Config.CONTENT_URI, Settings.CALL_METHOD_PUT_CONFIG, compositeName, args);
}
private static String getFromContentProvider(ContentResolver resolver, String namespace,
String key) {
String compositeName = namespace + "/" + key;
Bundle result = resolver.call(
- DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_GET_CONFIG, compositeName, null);
+ Settings.Config.CONTENT_URI, Settings.CALL_METHOD_GET_CONFIG, compositeName, null);
assertNotNull(result);
return result.getString(Settings.NameValueTable.VALUE);
}
@@ -196,7 +195,8 @@
String key) {
String compositeName = namespace + "/" + key;
Bundle result = resolver.call(
- DeviceConfig.CONTENT_URI, Settings.CALL_METHOD_DELETE_CONFIG, compositeName, null);
+ Settings.Config.CONTENT_URI,
+ Settings.CALL_METHOD_DELETE_CONFIG, compositeName, null);
assertNotNull(result);
return compositeName.equals(result.getString(Settings.NameValueTable.VALUE));
}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 8aa898e..519429f 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -10913,6 +10913,21 @@
}
/**
+ * Called by an AudioPolicyProxy when the client dies.
+ * Checks if an active playback for media use case is currently routed to one of the
+ * remote submix devices owned by this dynamic policy and broadcasts a becoming noisy
+ * intend in this case.
+ * @param addresses list of remote submix device addresses to check.
+ */
+ private void onPolicyClientDeath(List<String> addresses) {
+ for (String address : addresses) {
+ if (mPlaybackMonitor.hasActiveMediaPlaybackOnSubmixWithAddress(address)) {
+ mDeviceBroker.postBroadcastBecomingNoisy();
+ return;
+ }
+ }
+ }
+ /**
* Apps with MODIFY_AUDIO_ROUTING can register any policy.
* Apps with an audio capable MediaProjection are allowed to register a RENDER|LOOPBACK policy
* as those policy do not modify the audio routing.
@@ -11622,6 +11637,13 @@
public void binderDied() {
mDynPolicyLogger.enqueue((new EventLogger.StringEvent("AudioPolicy "
+ mPolicyCallback.asBinder() + " died").printLog(TAG)));
+
+ List<String> addresses = new ArrayList<>();
+ for (AudioMix mix : mMixes) {
+ addresses.add(mix.getRegistration());
+ }
+ onPolicyClientDeath(addresses);
+
release();
}
diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
index 0bc4b20..89dfc17 100644
--- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
@@ -32,6 +32,7 @@
import android.content.pm.PackageManager;
import android.media.AudioAttributes;
import android.media.AudioDeviceAttributes;
+import android.media.AudioDeviceInfo;
import android.media.AudioManager;
import android.media.AudioPlaybackConfiguration;
import android.media.AudioPlaybackConfiguration.PlayerMuteEvent;
@@ -542,6 +543,26 @@
return false;
}
+ /**
+ * Return true if an active playback for media use case is currently routed to
+ * a remote submix device with the supplied address.
+ * @param address
+ */
+ public boolean hasActiveMediaPlaybackOnSubmixWithAddress(@NonNull String address) {
+ synchronized (mPlayerLock) {
+ for (AudioPlaybackConfiguration apc : mPlayers.values()) {
+ AudioDeviceInfo device = apc.getAudioDeviceInfo();
+ if (apc.getAudioAttributes().getUsage() == AudioAttributes.USAGE_MEDIA
+ && apc.isActive() && device != null
+ && device.getInternalType() == AudioSystem.DEVICE_OUT_REMOTE_SUBMIX
+ && address.equals(device.getAddress())) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
protected void dump(PrintWriter pw) {
// players
pw.println("\nPlaybackActivityMonitor dump time: "
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 6140508..5ba70aa 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -6814,10 +6814,9 @@
@Override
public boolean isRequestedVisible(@InsetsType int types) {
- if (types == ime()) {
- return getInsetsStateController().getImeSourceProvider().isImeShowing();
- }
- return (mRequestedVisibleTypes & types) != 0;
+ return ((types & ime()) != 0
+ && getInsetsStateController().getImeSourceProvider().isImeShowing())
+ || (mRequestedVisibleTypes & types) != 0;
}
@Override
diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java
index db9dfbb..3b84b65 100644
--- a/telephony/java/android/telephony/SubscriptionInfo.java
+++ b/telephony/java/android/telephony/SubscriptionInfo.java
@@ -649,6 +649,15 @@
}
/**
+ * @return {@code true} if the subscription is from the actively used SIM.
+ *
+ * @hide
+ */
+ public boolean isActive() {
+ return mSimSlotIndex >= 0 || mType == SubscriptionManager.SUBSCRIPTION_TYPE_REMOTE_SIM;
+ }
+
+ /**
* Used in scenarios where different subscriptions are bundled as a group.
* It's typically a primary and an opportunistic subscription. (see {@link #isOpportunistic()})
* Such that those subscriptions will have some affiliated behaviors such as opportunistic
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 794fe72..5244f41 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -1766,8 +1766,7 @@
*
* <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* or that the calling app has carrier privileges (see
- * {@link TelephonyManager#hasCarrierPrivileges}). In the latter case, only records accessible
- * to the calling app are returned.
+ * {@link TelephonyManager#hasCarrierPrivileges}).
*
* @return Sorted list of the currently {@link SubscriptionInfo} records available on the device.
* <ul>
@@ -1785,7 +1784,6 @@
* </li>
* </ul>
*/
- @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges
@RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public List<SubscriptionInfo> getActiveSubscriptionInfoList() {
return getActiveSubscriptionInfoList(/* userVisibleonly */true);
@@ -1989,17 +1987,12 @@
}
/**
+ * Get the active subscription count.
*
- * Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- * or that the calling app has carrier privileges (see
- * {@link TelephonyManager#hasCarrierPrivileges}). In the latter case, the count will include
- * only those subscriptions accessible to the caller.
+ * @return The current number of active subscriptions.
*
- * @return the current number of active subscriptions. There is no guarantee the value
- * returned by this method will be the same as the length of the list returned by
- * {@link #getActiveSubscriptionInfoList}.
+ * @see #getActiveSubscriptionInfoList()
*/
- @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges
@RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public int getActiveSubscriptionInfoCount() {
int result = 0;
@@ -2139,7 +2132,7 @@
/**
* Set SIM icon tint color for subscription ID
* @param tint the RGB value of icon tint color of the SIM
- * @param subId the unique Subscritpion ID in database
+ * @param subId the unique subscription ID in database
* @return the number of records updated
* @hide
*/
@@ -2147,7 +2140,7 @@
public int setIconTint(@ColorInt int tint, int subId) {
if (VDBG) logd("[setIconTint]+ tint:" + tint + " subId:" + subId);
return setSubscriptionPropertyHelper(subId, "setIconTint",
- (iSub)-> iSub.setIconTint(tint, subId)
+ (iSub)-> iSub.setIconTint(subId, tint)
);
}
diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl
index 5173405..e9cea68 100644
--- a/telephony/java/com/android/internal/telephony/ISub.aidl
+++ b/telephony/java/com/android/internal/telephony/ISub.aidl
@@ -135,11 +135,11 @@
/**
* Set SIM icon tint color by simInfo index
- * @param tint the icon tint color of the SIM
* @param subId the unique SubscriptionInfo index in database
+ * @param tint the icon tint color of the SIM
* @return the number of records updated
*/
- int setIconTint(int tint, int subId);
+ int setIconTint(int subId, int tint);
/**
* Set display name by simInfo index with name source
diff --git a/tests/WindowInsetsTests/src/com/google/android/test/windowinsetstests/ControllerActivity.java b/tests/WindowInsetsTests/src/com/google/android/test/windowinsetstests/ControllerActivity.java
index e6b60cf..167d560 100644
--- a/tests/WindowInsetsTests/src/com/google/android/test/windowinsetstests/ControllerActivity.java
+++ b/tests/WindowInsetsTests/src/com/google/android/test/windowinsetstests/ControllerActivity.java
@@ -88,46 +88,7 @@
}
private static String insetsTypesToString(int types) {
- if (types == 0) {
- return "none";
- }
- final StringBuilder sb = new StringBuilder();
- if ((types & Type.statusBars()) != 0) {
- types &= ~Type.statusBars();
- sb.append("statusBars ");
- }
- if ((types & Type.navigationBars()) != 0) {
- types &= ~Type.navigationBars();
- sb.append("navigationBars ");
- }
- if ((types & Type.captionBar()) != 0) {
- types &= ~Type.captionBar();
- sb.append("captionBar ");
- }
- if ((types & Type.ime()) != 0) {
- types &= ~Type.ime();
- sb.append("ime ");
- }
- if ((types & Type.systemGestures()) != 0) {
- types &= ~Type.systemGestures();
- sb.append("systemGestures ");
- }
- if ((types & Type.mandatorySystemGestures()) != 0) {
- types &= ~Type.mandatorySystemGestures();
- sb.append("mandatorySystemGestures ");
- }
- if ((types & Type.tappableElement()) != 0) {
- types &= ~Type.tappableElement();
- sb.append("tappableElement ");
- }
- if ((types & Type.displayCutout()) != 0) {
- types &= ~Type.displayCutout();
- sb.append("displayCutout ");
- }
- if (types != 0) {
- sb.append("unknownTypes:").append(types);
- }
- return sb.toString();
+ return types == 0 ? "none" : WindowInsets.Type.toString(types);
}
@Override