Merge "Fix incremental installs with app metadata bundles" into main
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 9589785..8271caf 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -29,6 +29,7 @@
import static com.android.window.flags.Flags.FLAG_OFFLOAD_COLOR_EXTRACTION;
import static com.android.window.flags.Flags.noConsecutiveVisibilityEvents;
+import static com.android.window.flags.Flags.noVisibilityEventOnDisplayStateChange;
import static com.android.window.flags.Flags.offloadColorExtraction;
import static com.android.window.flags.Flags.windowSessionRelayoutInfo;
@@ -2387,8 +2388,10 @@
@Override
public void onDisplayChanged(int displayId) {
if (mDisplay.getDisplayId() == displayId) {
- boolean forceReport = mIsWearOs
- && mDisplay.getState() != Display.STATE_DOZE_SUSPEND;
+ boolean forceReport =
+ !noVisibilityEventOnDisplayStateChange()
+ && mIsWearOs
+ && mDisplay.getState() != Display.STATE_DOZE_SUSPEND;
reportVisibility(forceReport);
}
}
diff --git a/core/java/android/window/flags/wallpaper_manager.aconfig b/core/java/android/window/flags/wallpaper_manager.aconfig
index 150b04e..01c78a0 100644
--- a/core/java/android/window/flags/wallpaper_manager.aconfig
+++ b/core/java/android/window/flags/wallpaper_manager.aconfig
@@ -31,4 +31,11 @@
metadata {
purpose: PURPOSE_BUGFIX
}
-}
\ No newline at end of file
+}
+
+flag {
+ name: "no_visibility_event_on_display_state_change"
+ namespace: "wear_frameworks"
+ description: "Prevent the system from sending visibility event on display state change."
+ bug: "331725519"
+}
diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index 2194c89..40d760e 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -537,8 +537,13 @@
}
mContentParent.requestApplyInsets();
final Callback cb = getCallback();
- if (cb != null && !isDestroyed()) {
- cb.onContentChanged();
+ if (!isDestroyed()) {
+ if (cb != null) {
+ cb.onContentChanged();
+ }
+ if (mDecorContentParent != null) {
+ mDecorContentParent.notifyContentChanged();
+ }
}
mContentParentExplicitlySet = true;
}
@@ -568,8 +573,13 @@
}
mContentParent.requestApplyInsets();
final Callback cb = getCallback();
- if (cb != null && !isDestroyed()) {
- cb.onContentChanged();
+ if (!isDestroyed()) {
+ if (cb != null) {
+ cb.onContentChanged();
+ }
+ if (mDecorContentParent != null) {
+ mDecorContentParent.notifyContentChanged();
+ }
}
mContentParentExplicitlySet = true;
}
@@ -586,8 +596,13 @@
mContentParent.addView(view, params);
mContentParent.requestApplyInsets();
final Callback cb = getCallback();
- if (cb != null && !isDestroyed()) {
- cb.onContentChanged();
+ if (!isDestroyed()) {
+ if (cb != null) {
+ cb.onContentChanged();
+ }
+ if (mDecorContentParent != null) {
+ mDecorContentParent.notifyContentChanged();
+ }
}
}
diff --git a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java
index 6832825..ff57fd4 100644
--- a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java
+++ b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java
@@ -898,6 +898,13 @@
mDecorToolbar.dismissPopupMenus();
}
+ @Override
+ public void notifyContentChanged() {
+ mLastBaseContentInsets.setEmpty();
+ mLastBaseInnerInsets = WindowInsets.CONSUMED;
+ mLastInnerInsets = WindowInsets.CONSUMED;
+ }
+
public static class LayoutParams extends MarginLayoutParams {
public LayoutParams(Context c, AttributeSet attrs) {
super(c, attrs);
diff --git a/core/java/com/android/internal/widget/DecorContentParent.java b/core/java/com/android/internal/widget/DecorContentParent.java
index ac524f9..8d6cfd1 100644
--- a/core/java/com/android/internal/widget/DecorContentParent.java
+++ b/core/java/com/android/internal/widget/DecorContentParent.java
@@ -22,6 +22,7 @@
import android.util.SparseArray;
import android.view.Menu;
import android.view.Window;
+
import com.android.internal.view.menu.MenuPresenter;
/**
@@ -49,4 +50,5 @@
void saveToolbarHierarchyState(SparseArray<Parcelable> toolbarStates);
void restoreToolbarHierarchyState(SparseArray<Parcelable> toolbarStates);
void dismissPopups();
+ void notifyContentChanged();
}
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/AndroidManifest.xml b/core/tests/batterystatstests/BatteryStatsViewer/AndroidManifest.xml
index 6e9d4db..94bde68 100644
--- a/core/tests/batterystatstests/BatteryStatsViewer/AndroidManifest.xml
+++ b/core/tests/batterystatstests/BatteryStatsViewer/AndroidManifest.xml
@@ -25,10 +25,11 @@
<application
android:theme="@style/Theme"
+ android:icon="@mipmap/ic_launcher"
+ android:roundIcon="@mipmap/ic_launcher_round"
android:label="Battery Stats Viewer">
<activity android:name=".BatteryConsumerPickerActivity"
android:label="Battery Stats"
- android:icon="@mipmap/ic_launcher"
android:launchMode="singleTop"
android:exported="true">
<intent-filter>
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/drawable/ic_launcher_background.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/drawable/ic_launcher_background.xml
deleted file mode 100644
index 07d5da9..0000000
--- a/core/tests/batterystatstests/BatteryStatsViewer/res/drawable/ic_launcher_background.xml
+++ /dev/null
@@ -1,170 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="108dp"
- android:height="108dp"
- android:viewportWidth="108"
- android:viewportHeight="108">
- <path
- android:fillColor="#3DDC84"
- android:pathData="M0,0h108v108h-108z" />
- <path
- android:fillColor="#00000000"
- android:pathData="M9,0L9,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M19,0L19,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M29,0L29,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M39,0L39,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M49,0L49,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M59,0L59,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M69,0L69,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M79,0L79,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M89,0L89,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M99,0L99,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,9L108,9"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,19L108,19"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,29L108,29"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,39L108,39"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,49L108,49"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,59L108,59"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,69L108,69"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,79L108,79"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,89L108,89"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,99L108,99"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M19,29L89,29"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M19,39L89,39"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M19,49L89,49"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M19,59L89,59"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M19,69L89,69"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M19,79L89,79"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M29,19L29,89"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M39,19L39,89"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M49,19L49,89"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M59,19L59,89"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M69,19L69,89"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M79,19L79,89"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
-</vector>
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/drawable/ic_launcher_foreground.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/drawable/ic_launcher_foreground.xml
deleted file mode 100644
index fc0c6ab..0000000
--- a/core/tests/batterystatstests/BatteryStatsViewer/res/drawable/ic_launcher_foreground.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:aapt="http://schemas.android.com/aapt"
- android:width="108dp"
- android:height="108dp"
- android:viewportWidth="108"
- android:viewportHeight="108">
- <path
- android:fillType="evenOdd"
- android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,
- 49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
- android:strokeWidth="1"
- android:strokeColor="#00000000">
- <aapt:attr name="android:fillColor">
- <gradient
- android:endX="78.5885"
- android:endY="90.9159"
- android:startX="48.7653"
- android:startY="61.0927"
- android:type="linear">
- <item
- android:color="#44000000"
- android:offset="0.0" />
- <item
- android:color="#00000000"
- android:offset="1.0" />
- </gradient>
- </aapt:attr>
- </path>
- <path
- android:fillColor="#FFFFFF"
- android:fillType="nonZero"
- android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,
- 50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,
- 37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,
- 42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,
- 40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,
- 52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,
- 56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,
- 52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
- android:strokeWidth="1"
- android:strokeColor="#00000000" />
-</vector>
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_picker_layout.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_picker_layout.xml
index f35a210..987de6b 100644
--- a/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_picker_layout.xml
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_picker_layout.xml
@@ -17,6 +17,7 @@
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_refresh"
+ android:paddingTop="?attr/actionBarSize"
android:layout_width="match_parent"
android:layout_height="match_parent">
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_stats_viewer_layout.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_stats_viewer_layout.xml
index cf50d2a..2d276a5 100644
--- a/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_stats_viewer_layout.xml
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_stats_viewer_layout.xml
@@ -17,11 +17,13 @@
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_refresh"
+ android:paddingTop="?attr/actionBarSize"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
+ android:paddingTop="?attr/actionBarSize"
android:layout_width="match_parent"
android:layout_height="match_parent">
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-anydpi-v26/ic_launcher.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..036d09b
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@color/ic_launcher_background"/>
+ <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
\ No newline at end of file
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-anydpi-v26/ic_launcher_round.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..036d09b
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@color/ic_launcher_background"/>
+ <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
\ No newline at end of file
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-anydpi/ic_launcher.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-anydpi/ic_launcher.xml
index 6b78462..036d09b 100644
--- a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-anydpi/ic_launcher.xml
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-anydpi/ic_launcher.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
- <background android:drawable="@drawable/ic_launcher_background" />
- <foreground android:drawable="@drawable/ic_launcher_foreground" />
-</adaptive-icon>
+ <background android:drawable="@color/ic_launcher_background"/>
+ <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
\ No newline at end of file
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-anydpi/ic_launcher_round.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-anydpi/ic_launcher_round.xml
new file mode 100644
index 0000000..036d09b
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-anydpi/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@color/ic_launcher_background"/>
+ <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
\ No newline at end of file
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-hdpi/ic_launcher.webp b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..0057985
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-hdpi/ic_launcher_foreground.webp b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-hdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000..085df9d
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-hdpi/ic_launcher_foreground.webp
Binary files differ
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-hdpi/ic_launcher_round.webp b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..bcb3b7d
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-hdpi/ic_launcher_round.webp
Binary files differ
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-mdpi/ic_launcher.webp b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000..3d1cf0e
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-mdpi/ic_launcher.webp
Binary files differ
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-mdpi/ic_launcher_foreground.webp b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-mdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000..bfd4568
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-mdpi/ic_launcher_foreground.webp
Binary files differ
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-mdpi/ic_launcher_round.webp b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..4cf0d43
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-mdpi/ic_launcher_round.webp
Binary files differ
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xhdpi/ic_launcher.webp b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000..ac4f693
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xhdpi/ic_launcher.webp
Binary files differ
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xhdpi/ic_launcher_foreground.webp b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xhdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000..cc6b763
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xhdpi/ic_launcher_foreground.webp
Binary files differ
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xhdpi/ic_launcher_round.webp b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..1f17221
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xhdpi/ic_launcher_round.webp
Binary files differ
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxhdpi/ic_launcher.webp b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..b70e145
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxhdpi/ic_launcher.webp
Binary files differ
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxhdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000..6e46bce
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxhdpi/ic_launcher_foreground.webp
Binary files differ
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxhdpi/ic_launcher_round.webp b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..3fa346c
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxhdpi/ic_launcher_round.webp
Binary files differ
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxxhdpi/ic_launcher.webp b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..8b463f2
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxxhdpi/ic_launcher.webp
Binary files differ
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxxhdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000..849caff
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxxhdpi/ic_launcher_foreground.webp
Binary files differ
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxxhdpi/ic_launcher_round.webp b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..bd6e312
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-xxxhdpi/ic_launcher_round.webp
Binary files differ
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/values/ic_launcher_background.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/values/ic_launcher_background.xml
new file mode 100644
index 0000000..1e90e07
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/values/ic_launcher_background.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <color name="ic_launcher_background">#1A7945</color>
+</resources>
\ No newline at end of file
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/values/styles.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/values/styles.xml
index 629d729..fa30b2c 100644
--- a/core/tests/batterystatstests/BatteryStatsViewer/res/values/styles.xml
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/values/styles.xml
@@ -21,6 +21,7 @@
<item name="colorPrimary">#34a853</item>
<item name="android:windowActionBar">true</item>
<item name="android:windowNoTitle">false</item>
+ <item name="android:windowDrawsSystemBarBackgrounds">false</item>
</style>
<style name="LoadTestCardView" parent="Widget.MaterialComponents.CardView">
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 82d2381..5d4139e 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -23,23 +23,19 @@
<!-- Needed for Build.getSerial(), which is used to send a unique number for serial, per HUIG. -->
<privapp-permissions package="android.car.usb.handler">
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.angle">
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.apps.tag">
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.backupconfirm">
<permission name="android.permission.BACKUP"/>
<permission name="android.permission.CRYPT_KEEPER"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.credentialmanager">
@@ -50,13 +46,11 @@
<permission name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<permission name="android.permission.WRITE_MEDIA_STORAGE"/>
<permission name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.imsserviceentitlement">
<permission name="android.permission.MODIFY_PHONE_STATE" />
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.launcher3">
@@ -68,7 +62,6 @@
<permission name="android.permission.INSTALL_LOCATION_PROVIDER"/>
<permission name="android.permission.UPDATE_DEVICE_STATS"/>
<permission name="android.permission.UPDATE_APP_OPS_STATS"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.managedprovisioning">
@@ -98,7 +91,6 @@
<permission name="android.permission.BIND_CARRIER_MESSAGING_SERVICE"/>
<permission name="android.permission.BIND_CARRIER_SERVICES"/>
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.mtp">
@@ -108,19 +100,16 @@
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.WRITE_MEDIA_STORAGE"/>
<permission name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.musicfx">
<permission name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.networkrecommendation">
<permission name="android.permission.SCORE_NETWORKS"/>
<permission name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"/>
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.packageinstaller">
@@ -201,7 +190,6 @@
<permission name="android.permission.USE_RESERVED_DISK"/>
<permission name="android.permission.LOG_COMPAT_CHANGE" />
<permission name="android.permission.READ_COMPAT_CHANGE_CONFIG" />
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.providers.contacts">
@@ -215,7 +203,6 @@
<permission name="android.permission.USE_RESERVED_DISK"/>
<permission name="android.permission.READ_COMPAT_CHANGE_CONFIG" />
<permission name="android.permission.LOG_COMPAT_CHANGE" />
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.providers.downloads">
@@ -228,7 +215,6 @@
<permission name="android.permission.UPDATE_APP_OPS_STATS"/>
<permission name="android.permission.UPDATE_DEVICE_STATS"/>
<permission name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.providers.telephony">
@@ -238,7 +224,6 @@
<!-- Permissions required for reading and logging compat changes -->
<permission name="android.permission.LOG_COMPAT_CHANGE" />
<permission name="android.permission.READ_COMPAT_CHANGE_CONFIG" />
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.server.telecom">
@@ -254,13 +239,11 @@
<permission name="android.permission.MODIFY_PHONE_STATE"/>
<permission name="android.permission.STOP_APP_SWITCHES"/>
<permission name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.sharedstoragebackup">
<permission name="android.permission.WRITE_MEDIA_STORAGE"/>
<permission name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.shell">
@@ -602,12 +585,10 @@
<permission name="android.permission.INTENT_FILTER_VERIFICATION_AGENT"/>
<permission name="android.permission.DOMAIN_VERIFICATION_AGENT"/>
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.soundpicker">
<permission name="android.permission.INTERACT_ACROSS_USERS" />
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.tv">
@@ -619,18 +600,15 @@
<permission name="android.permission.READ_CONTENT_RATING_SYSTEMS"/>
<permission name="com.android.providers.tv.permission.ACCESS_ALL_EPG_DATA"/>
<permission name="com.android.providers.tv.permission.ACCESS_WATCHED_PROGRAMS"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.vpndialogs">
<permission name="android.permission.CONTROL_VPN"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.wallpaper.livepicker">
<permission name="android.permission.SET_WALLPAPER_COMPONENT"/>
<permission name="android.permission.BIND_WALLPAPER"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.wallpaper">
@@ -638,15 +616,14 @@
<permission name="android.permission.BIND_WALLPAPER"/>
<permission name="android.permission.CUSTOMIZE_SYSTEM_UI"/>
<permission name="android.permission.SET_WALLPAPER_DIM_AMOUNT"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.dynsystem">
<permission name="android.permission.REBOOT"/>
<permission name="android.permission.MANAGE_DYNAMIC_SYSTEM"/>
<permission name="android.permission.READ_OEM_UNLOCK_STATE"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
+
<privapp-permissions package="com.android.settings">
<permission name="android.permission.INSTALL_DYNAMIC_SYSTEM"/>
<permission name="android.permission.BIND_CELL_BROADCAST_SERVICE"/>
@@ -657,12 +634,10 @@
<privapp-permissions package="com.android.bips">
<permission name="android.permission.SUBSTITUTE_SHARE_TARGET_APP_NAME_AND_ICON"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.calllogbackup">
<permission name="com.android.voicemail.permission.READ_VOICEMAIL"/>
- <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.devicediagnostics">
diff --git a/packages/SystemUI/OWNERS b/packages/SystemUI/OWNERS
index d2e5a13..e03ac3d 100644
--- a/packages/SystemUI/OWNERS
+++ b/packages/SystemUI/OWNERS
@@ -11,6 +11,7 @@
alexflo@google.com
andonian@google.com
amiko@google.com
+austindelgado@google.com
aroederer@google.com
arteiro@google.com
asc@google.com
@@ -29,11 +30,13 @@
cinek@google.com
cocod@google.com
darrellshi@google.com
+diyab@google.com
dupin@google.com
ethibodeau@google.com
evanlaird@google.com
florenceyang@google.com
gallmann@google.com
+graciecheng@google.com
gwasserman@google.com
hwwang@google.com
hyunyoungs@google.com
@@ -42,10 +45,12 @@
jbolinger@google.com
jdemeulenaere@google.com
jeffdq@google.com
+jeffpu@google.com
jernej@google.com
jglazier@google.com
jjaggi@google.com
jonmiranda@google.com
+joshmccloskey@google.com
joshtrask@google.com
juansmartinez@google.com
juliacr@google.com
@@ -87,6 +92,7 @@
santie@google.com
shanh@google.com
snoeberger@google.com
+spdonghao@google.com
steell@google.com
stevenckng@google.com
stwu@google.com
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt
index 18e65508..22566e7 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt
@@ -99,7 +99,7 @@
if (sceneKey == currentSceneKey) {
currentDestinations
} else {
- composableScene.destinationScenes.value
+ viewModel.resolveSceneFamilies(composableScene.destinationScenes.value)
},
) {
with(composableScene) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
index cf83582..00566c1 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
@@ -712,7 +712,6 @@
// As soon as the shade starts animating out of the way, start the canned unlock animation,
// which will finish keyguard exit when it completes. The in-window animations in the
// Launcher window will end on their own.
- if (fastUnlockTransition()) hideKeyguardViewAfterRemoteAnimation()
handler.postDelayed({
if (keyguardViewMediator.get().isShowingAndNotOccluded &&
!keyguardStateController.isKeyguardGoingAway) {
@@ -723,7 +722,7 @@
if ((wallpaperTargets?.isNotEmpty() == true)) {
fadeInWallpaper()
- if (!fastUnlockTransition()) hideKeyguardViewAfterRemoteAnimation()
+ hideKeyguardViewAfterRemoteAnimation()
} else {
keyguardViewMediator.get().exitKeyguardAndFinishSurfaceBehindRemoteAnimation(
false /* cancelled */)
diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt
index c98a49b..08175c3 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt
@@ -330,9 +330,16 @@
* otherwise returns a singleton [Flow] containing [sceneKey].
*/
fun resolveSceneFamily(sceneKey: SceneKey): Flow<SceneKey> = flow {
- emitAll(sceneFamilyResolvers.get()[sceneKey]?.resolvedScene ?: flowOf(sceneKey))
+ emitAll(resolveSceneFamilyOrNull(sceneKey) ?: flowOf(sceneKey))
}
+ /**
+ * Returns the [concrete scene][Scenes] for [sceneKey] if it is a [scene family][SceneFamilies],
+ * otherwise returns `null`.
+ */
+ fun resolveSceneFamilyOrNull(sceneKey: SceneKey): StateFlow<SceneKey>? =
+ sceneFamilyResolvers.get()[sceneKey]?.resolvedScene
+
private fun isVisibleInternal(
raw: Boolean = repository.isVisible.value,
isRemoteUserInteractionOngoing: Boolean = repository.isRemoteUserInteractionOngoing.value,
diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt
index ab24e0b..d380251 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt
@@ -147,6 +147,20 @@
} ?: true
}
+ /**
+ * Immediately resolves any scene families present in [actionResultMap] to their current
+ * resolution target.
+ */
+ fun resolveSceneFamilies(
+ actionResultMap: Map<UserAction, UserActionResult>,
+ ): Map<UserAction, UserActionResult> {
+ return actionResultMap.mapValues { (_, actionResult) ->
+ sceneInteractor.resolveSceneFamilyOrNull(actionResult.toScene)?.value?.let {
+ actionResult.copy(toScene = it)
+ } ?: actionResult
+ }
+ }
+
private fun replaceSceneFamilies(
destinationScenes: Map<UserAction, UserActionResult>,
): Flow<Map<UserAction, UserActionResult>> {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
index 4bf122d..3925beb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
@@ -202,6 +202,7 @@
* Gets the touchable region needed for heads up notifications. Returns null if no touchable
* region is required (ie: no heads up notification currently exists).
*/
+ // TODO(b/347007367): With scene container enabled this method may report outdated regions
@Override
public @Nullable Region getTouchableRegion() {
NotificationEntry topEntry = getTopEntry();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java
index d1189e1..4b1ee58 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java
@@ -29,6 +29,7 @@
import android.view.ViewTreeObserver.OnComputeInternalInsetsListener;
import android.view.WindowInsets;
+import com.android.compose.animation.scene.ObservableTransitionState;
import com.android.internal.policy.SystemBarUtils;
import com.android.systemui.Dumpable;
import com.android.systemui.ScreenDecorations;
@@ -38,7 +39,7 @@
import com.android.systemui.res.R;
import com.android.systemui.scene.domain.interactor.SceneInteractor;
import com.android.systemui.scene.shared.flag.SceneContainerFlag;
-import com.android.systemui.shade.ShadeExpansionStateManager;
+import com.android.systemui.scene.shared.model.Scenes;
import com.android.systemui.shade.domain.interactor.ShadeInteractor;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -67,7 +68,7 @@
private final UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController;
private boolean mIsStatusBarExpanded = false;
- private boolean mIsSceneContainerVisible = false;
+ private boolean mIsIdleOnGone = false;
private boolean mShouldAdjustInsets = false;
private View mNotificationShadeWindowView;
private View mNotificationPanelView;
@@ -87,7 +88,6 @@
NotificationShadeWindowController notificationShadeWindowController,
ConfigurationController configurationController,
HeadsUpManager headsUpManager,
- ShadeExpansionStateManager shadeExpansionStateManager,
ShadeInteractor shadeInteractor,
Provider<SceneInteractor> sceneInteractor,
JavaAdapter javaAdapter,
@@ -131,8 +131,8 @@
if (SceneContainerFlag.isEnabled()) {
javaAdapter.alwaysCollectFlow(
- sceneInteractor.get().isVisible(),
- this::onSceneContainerVisibilityChanged);
+ sceneInteractor.get().getTransitionState(),
+ this::onSceneChanged);
} else {
javaAdapter.alwaysCollectFlow(
shadeInteractor.isAnyExpanded(),
@@ -167,10 +167,11 @@
}
}
- private void onSceneContainerVisibilityChanged(Boolean isVisible) {
- if (isVisible != mIsSceneContainerVisible) {
- mIsSceneContainerVisible = isVisible;
- if (isVisible) {
+ private void onSceneChanged(ObservableTransitionState transitionState) {
+ boolean isIdleOnGone = transitionState.isIdle(Scenes.Gone);
+ if (isIdleOnGone != mIsIdleOnGone) {
+ mIsIdleOnGone = isIdleOnGone;
+ if (!isIdleOnGone) {
// make sure our state is sensible
mForceCollapsedUntilLayout = false;
}
@@ -281,7 +282,7 @@
// since we don't want stray touches to go through the light reveal scrim to whatever is
// underneath.
return mIsStatusBarExpanded
- || mIsSceneContainerVisible
+ || !mIsIdleOnGone
|| mPrimaryBouncerInteractor.isShowing().getValue()
|| mAlternateBouncerInteractor.isVisibleState()
|| mUnlockedScreenOffAnimationController.isAnimationPlaying();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardUnlockAnimationControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardUnlockAnimationControllerTest.kt
index 128dd23..27b9863 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardUnlockAnimationControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardUnlockAnimationControllerTest.kt
@@ -44,6 +44,7 @@
import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.MockitoAnnotations
+import org.mockito.kotlin.clearInvocations
import java.util.function.Predicate
@RunWith(AndroidJUnit4::class)
@@ -336,6 +337,10 @@
false /* requestedShowSurfaceBehindKeyguard */
)
+ // Cancel the animator so we can verify only the setSurfaceBehind call below.
+ keyguardUnlockAnimationController.surfaceBehindAlphaAnimator.end()
+ clearInvocations(surfaceTransactionApplier)
+
// Set appear to 50%, we'll just verify that we're not applying the identity matrix which
// means an animation is in progress.
keyguardUnlockAnimationController.setSurfaceBehindAppearAmount(0.5f)
@@ -377,6 +382,10 @@
false /* requestedShowSurfaceBehindKeyguard */
)
+ // Cancel the animator so we can verify only the setSurfaceBehind call below.
+ keyguardUnlockAnimationController.surfaceBehindAlphaAnimator.end()
+ clearInvocations(surfaceTransactionApplier)
+
keyguardUnlockAnimationController.setSurfaceBehindAppearAmount(1f)
keyguardUnlockAnimationController.setWallpaperAppearAmount(1f)
@@ -409,6 +418,10 @@
false /* requestedShowSurfaceBehindKeyguard */
)
+ // Stop the animator - we just want to test whether the override is not applied.
+ keyguardUnlockAnimationController.surfaceBehindAlphaAnimator.end()
+ clearInvocations(surfaceTransactionApplier)
+
keyguardUnlockAnimationController.setSurfaceBehindAppearAmount(1f)
keyguardUnlockAnimationController.setWallpaperAppearAmount(1f)
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 5dd1480..684cb24 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -13911,9 +13911,8 @@
final int stream = AudioAttributes.toLegacyStreamType(aa);
final boolean mutingFromVolume = getStreamVolume(stream) == 0;
if (mutingFromVolume) {
- if (DEBUG_VOL) {
- Slog.d(TAG, "notification should not play due to muted stream " + stream);
- }
+ Slog.i(TAG, "shouldNotificationSoundPlay false: muted stream:" + stream
+ + " attr:" + aa);
return false;
}
@@ -13926,10 +13925,8 @@
// is the owner of GAIN_TRANSIENT_EXCLUSIVE focus also recording?
final boolean mutingFromFocusAndRecording = mRecordMonitor.isRecordingActiveForUid(uid);
if (mutingFromFocusAndRecording) {
- if (DEBUG_VOL) {
- Slog.d(TAG, "notification should not play due to exclusive focus owner recording "
- + " uid:" + uid);
- }
+ Slog.i(TAG, "shouldNotificationSoundPlay false: exclusive focus owner recording "
+ + " uid:" + uid + " attr:" + aa);
return false;
}
return true;
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index 99036c6..15f7dd9 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -322,7 +322,7 @@
private final Handler mHandler;
@NonNull
- private final Handler mPackageMonitorHandler;
+ private final Handler mIoHandler;
@MultiUserUnawareField
@UserIdInt
@@ -1237,7 +1237,7 @@
Context context,
boolean experimentalConcurrentMultiUserModeEnabled,
@Nullable ServiceThread serviceThreadForTesting,
- @Nullable ServiceThread packageMonitorThreadForTesting,
+ @Nullable ServiceThread ioThreadForTesting,
@Nullable IntFunction<InputMethodBindingController> bindingControllerForTesting) {
synchronized (ImfLock.class) {
mExperimentalConcurrentMultiUserModeEnabled =
@@ -1258,15 +1258,15 @@
thread.start();
mHandler = Handler.createAsync(thread.getLooper(), this);
{
- final ServiceThread packageMonitorThread =
- packageMonitorThreadForTesting != null
- ? packageMonitorThreadForTesting
+ final ServiceThread ioThread =
+ ioThreadForTesting != null
+ ? ioThreadForTesting
: new ServiceThread(
PACKAGE_MONITOR_THREAD_NAME,
Process.THREAD_PRIORITY_FOREGROUND,
true /* allowIo */);
- packageMonitorThread.start();
- mPackageMonitorHandler = Handler.createAsync(packageMonitorThread.getLooper());
+ ioThread.start();
+ mIoHandler = Handler.createAsync(ioThread.getLooper());
}
SystemLocaleWrapper.onStart(context, this::onActionLocaleChanged, mHandler);
mImeTrackerService = new ImeTrackerService(serviceThreadForTesting != null
@@ -1537,7 +1537,7 @@
}
}, "Lazily initialize IMMS#mImeDrawsImeNavBarRes");
- mMyPackageMonitor.register(mContext, UserHandle.ALL, mPackageMonitorHandler);
+ mMyPackageMonitor.register(mContext, UserHandle.ALL, mIoHandler);
mSettingsObserver.registerContentObserverLocked(currentUserId);
final IntentFilter broadcastFilterForAllUsers = new IntentFilter();
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodSettingsRepository.java b/services/core/java/com/android/server/inputmethod/InputMethodSettingsRepository.java
index 60b9a4c..68924b5 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodSettingsRepository.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodSettingsRepository.java
@@ -78,7 +78,7 @@
userId,
AdditionalSubtypeMapRepository.get(userId),
DirectBootAwareness.AUTO);
- sPerUserMap.put(userId, settings);
+ put(userId, settings);
}
}
});
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 66a93d7..c0b8034 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -3999,7 +3999,9 @@
final PackageMetrics.ComponentStateMetrics componentStateMetrics =
new PackageMetrics.ComponentStateMetrics(setting,
UserHandle.getUid(userId, packageSetting.getAppId()),
- packageSetting.getEnabled(userId), callingUid);
+ setting.isComponent() ? computer.getComponentEnabledSettingInternal(
+ setting.getComponentName(), callingUid, userId)
+ : packageSetting.getEnabled(userId), callingUid);
if (!setEnabledSettingInternalLocked(computer, packageSetting, setting, userId,
callingPackage)) {
continue;
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java
index 3b25cb1..42bd75a 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java
@@ -127,7 +127,7 @@
protected IInputMethodInvoker mMockInputMethodInvoker;
protected InputMethodManagerService mInputMethodManagerService;
protected ServiceThread mServiceThread;
- protected ServiceThread mPackageMonitorThread;
+ protected ServiceThread mIoThread;
protected boolean mIsLargeScreen;
private InputManagerGlobal.TestSession mInputManagerGlobalSession;
@@ -226,14 +226,14 @@
"immstest1",
Process.THREAD_PRIORITY_FOREGROUND,
true /* allowIo */);
- mPackageMonitorThread =
+ mIoThread =
new ServiceThread(
"immstest2",
Process.THREAD_PRIORITY_FOREGROUND,
true /* allowIo */);
mInputMethodManagerService = new InputMethodManagerService(mContext,
InputMethodManagerService.shouldEnableExperimentalConcurrentMultiUserMode(mContext),
- mServiceThread, mPackageMonitorThread,
+ mServiceThread, mIoThread,
unusedUserId -> mMockInputMethodBindingController);
spyOn(mInputMethodManagerService);
@@ -267,8 +267,8 @@
mInputMethodManagerService.mInputMethodDeviceConfigs.destroy();
}
- if (mPackageMonitorThread != null) {
- mPackageMonitorThread.quitSafely();
+ if (mIoThread != null) {
+ mIoThread.quitSafely();
}
if (mServiceThread != null) {
diff --git a/services/tests/servicestests/src/com/android/server/statusbar/StatusBarManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/statusbar/StatusBarManagerServiceTest.java
index f221b75..148c968 100644
--- a/services/tests/servicestests/src/com/android/server/statusbar/StatusBarManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/statusbar/StatusBarManagerServiceTest.java
@@ -18,6 +18,20 @@
import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
import static android.app.ActivityManager.PROCESS_STATE_TOP;
+import static android.app.StatusBarManager.DISABLE2_GLOBAL_ACTIONS;
+import static android.app.StatusBarManager.DISABLE2_MASK;
+import static android.app.StatusBarManager.DISABLE2_NONE;
+import static android.app.StatusBarManager.DISABLE2_NOTIFICATION_SHADE;
+import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS;
+import static android.app.StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS;
+import static android.app.StatusBarManager.DISABLE_BACK;
+import static android.app.StatusBarManager.DISABLE_CLOCK;
+import static android.app.StatusBarManager.DISABLE_HOME;
+import static android.app.StatusBarManager.DISABLE_MASK;
+import static android.app.StatusBarManager.DISABLE_NONE;
+import static android.app.StatusBarManager.DISABLE_RECENT;
+import static android.app.StatusBarManager.DISABLE_SEARCH;
+import static android.app.StatusBarManager.DISABLE_SYSTEM_INFO;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
@@ -137,6 +151,7 @@
LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal);
when(mMockStatusBar.asBinder()).thenReturn(mMockStatusBar);
+ when(mMockStatusBar.isBinderAlive()).thenReturn(true);
when(mApplicationInfo.loadLabel(any())).thenReturn(APP_NAME);
mockHandleIncomingUser();
@@ -722,6 +737,369 @@
verify(mOverlayManager, never()).setEnabledExclusiveInCategory(anyString(), anyInt());
}
+ @Test
+ public void testGetDisableFlags() throws Exception {
+ String packageName = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ mStatusBarManagerService.disable(DISABLE_NONE, mMockStatusBar, packageName);
+ assertEquals(DISABLE_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ }
+
+ @Test
+ public void testSetHomeDisabled() throws Exception {
+ int expectedFlags = DISABLE_MASK & DISABLE_HOME;
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ // disable
+ mStatusBarManagerService.disable(expectedFlags, mMockStatusBar, pkg);
+ // check that disable works
+ assertEquals(expectedFlags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ }
+
+ @Test
+ public void testSetSystemInfoDisabled() throws Exception {
+ int expectedFlags = DISABLE_MASK & DISABLE_SYSTEM_INFO;
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ // disable
+ mStatusBarManagerService.disable(expectedFlags, mMockStatusBar, pkg);
+ // check that right flag is disabled
+ assertEquals(expectedFlags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ }
+
+ @Test
+ public void testSetRecentDisabled() throws Exception {
+ int expectedFlags = DISABLE_MASK & DISABLE_RECENT;
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ // disable
+ mStatusBarManagerService.disable(expectedFlags, mMockStatusBar, pkg);
+ // check that right flag is disabled
+ assertEquals(expectedFlags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ }
+
+ @Test
+ public void testSetBackDisabled() throws Exception {
+ int expectedFlags = DISABLE_MASK & DISABLE_BACK;
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ // disable
+ mStatusBarManagerService.disable(expectedFlags, mMockStatusBar, pkg);
+ // check that right flag is disabled
+ assertEquals(expectedFlags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ }
+
+ @Test
+ public void testSetClockDisabled() throws Exception {
+ int expectedFlags = DISABLE_MASK & DISABLE_CLOCK;
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ // disable home
+ mStatusBarManagerService.disable(expectedFlags, mMockStatusBar, pkg);
+ // check that right flag is disabled
+ assertEquals(expectedFlags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ }
+
+ @Test
+ public void testSetSearchDisabled() throws Exception {
+ int expectedFlags = DISABLE_MASK & DISABLE_SEARCH;
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE_NONE, mStatusBarManagerService.getDisableFlags(mMockStatusBar,
+ userId)[0]);
+ // disable
+ mStatusBarManagerService.disable(expectedFlags, mMockStatusBar, pkg);
+ // check that right flag is disabled
+ assertEquals(expectedFlags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ }
+
+ @Test
+ public void testSetQuickSettingsDisabled2() throws Exception {
+ int expectedFlags = DISABLE2_MASK & DISABLE2_QUICK_SETTINGS;
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE2_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[1]);
+ // disable
+ mStatusBarManagerService.disable2(expectedFlags, mMockStatusBar, pkg);
+ // check that right flag is disabled
+ assertEquals(expectedFlags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[1]);
+ }
+
+ @Test
+ public void testSetSystemIconsDisabled2() throws Exception {
+ int expectedFlags = DISABLE2_MASK & DISABLE2_QUICK_SETTINGS;
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE_NONE, mStatusBarManagerService.getDisableFlags(mMockStatusBar,
+ userId)[1]);
+ // disable
+ mStatusBarManagerService.disable2(expectedFlags, mMockStatusBar, pkg);
+ // check that right flag is disabled
+ assertEquals(expectedFlags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[1]);
+ }
+
+ @Test
+ public void testSetNotificationShadeDisabled2() throws Exception {
+ int expectedFlags = DISABLE2_MASK & DISABLE2_NOTIFICATION_SHADE;
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE_NONE, mStatusBarManagerService.getDisableFlags(mMockStatusBar,
+ userId)[1]);
+ // disable
+ mStatusBarManagerService.disable2(expectedFlags, mMockStatusBar, pkg);
+ // check that right flag is disabled
+ assertEquals(expectedFlags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[1]);
+ }
+
+
+ @Test
+ public void testSetGlobalActionsDisabled2() throws Exception {
+ int expectedFlags = DISABLE2_MASK & DISABLE2_GLOBAL_ACTIONS;
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE_NONE, mStatusBarManagerService.getDisableFlags(mMockStatusBar,
+ userId)[1]);
+ // disable
+ mStatusBarManagerService.disable2(expectedFlags, mMockStatusBar, pkg);
+ // check that right flag is disabled
+ assertEquals(expectedFlags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[1]);
+ }
+
+ @Test
+ public void testSetRotateSuggestionsDisabled2() throws Exception {
+ int expectedFlags = DISABLE2_MASK & DISABLE2_ROTATE_SUGGESTIONS;
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[1]);
+ // disable
+ mStatusBarManagerService.disable2(expectedFlags, mMockStatusBar, pkg);
+ // check that right flag is disabled
+ assertEquals(expectedFlags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[1]);
+ }
+
+ @Test
+ public void testSetTwoDisable2Flags() throws Exception {
+ int expectedFlags = DISABLE2_MASK & DISABLE2_ROTATE_SUGGESTIONS & DISABLE2_QUICK_SETTINGS;
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[1]);
+ // disable
+ mStatusBarManagerService.disable2(expectedFlags, mMockStatusBar, pkg);
+ // check that right flag is disabled
+ assertEquals(expectedFlags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[1]);
+ }
+
+ @Test
+ public void testSetTwoDisableFlagsRemoveOne() throws Exception {
+ int twoFlags = DISABLE_MASK & DISABLE_HOME & DISABLE_BACK;
+ int expectedFlag = DISABLE_MASK & DISABLE_HOME;
+
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ // disable
+ mStatusBarManagerService.disable(twoFlags, mMockStatusBar, pkg);
+ mStatusBarManagerService.disable(DISABLE_NONE, mMockStatusBar, pkg);
+ mStatusBarManagerService.disable(expectedFlag, mMockStatusBar, pkg);
+ // check that right flag is disabled
+ assertEquals(expectedFlag,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ }
+
+ @Test
+ public void testSetTwoDisable2FlagsRemoveOne() throws Exception {
+ int twoFlags = DISABLE2_MASK & DISABLE2_ROTATE_SUGGESTIONS & DISABLE2_QUICK_SETTINGS;
+ int expectedFlag = DISABLE2_MASK & DISABLE2_QUICK_SETTINGS;
+
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE_NONE, mStatusBarManagerService.getDisableFlags(mMockStatusBar,
+ userId)[1]);
+ // disable
+ mStatusBarManagerService.disable2(twoFlags, mMockStatusBar, pkg);
+ mStatusBarManagerService.disable2(DISABLE2_NONE, mMockStatusBar, pkg);
+ mStatusBarManagerService.disable2(expectedFlag, mMockStatusBar, pkg);
+ // check that right flag is disabled
+ assertEquals(expectedFlag,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[1]);
+ }
+
+ @Test
+ public void testDisableBothFlags() throws Exception {
+ int disableFlags = DISABLE_MASK & DISABLE_BACK & DISABLE_HOME;
+ int disable2Flags = DISABLE2_MASK & DISABLE2_QUICK_SETTINGS & DISABLE2_ROTATE_SUGGESTIONS;
+
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE_NONE, mStatusBarManagerService.getDisableFlags(mMockStatusBar,
+ userId)[0]);
+ assertEquals(DISABLE2_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[1]);
+ // disable
+ mStatusBarManagerService.disable(disableFlags, mMockStatusBar, pkg);
+ mStatusBarManagerService.disable2(disable2Flags, mMockStatusBar, pkg);
+ // check that right flag is disabled
+ assertEquals(disableFlags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ assertEquals(disable2Flags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[1]);
+ }
+
+ @Test
+ public void testDisableBothFlagsEnable1Flags() throws Exception {
+ int disableFlags = DISABLE_MASK & DISABLE_BACK & DISABLE_HOME;
+ int disable2Flags = DISABLE2_MASK & DISABLE2_QUICK_SETTINGS & DISABLE2_ROTATE_SUGGESTIONS;
+
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ assertEquals(DISABLE2_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[1]);
+ // disable
+ mStatusBarManagerService.disable(disableFlags, mMockStatusBar, pkg);
+ mStatusBarManagerService.disable2(disable2Flags, mMockStatusBar, pkg);
+ // re-enable one
+ mStatusBarManagerService.disable(DISABLE_NONE, mMockStatusBar, pkg);
+ // check that right flag is disabled
+ assertEquals(DISABLE_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ assertEquals(disable2Flags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[1]);
+ }
+
+ @Test
+ public void testDisableBothFlagsEnable2Flags() throws Exception {
+ int disableFlags = DISABLE_MASK & DISABLE_BACK & DISABLE_HOME;
+ int disable2Flags = DISABLE2_MASK & DISABLE2_QUICK_SETTINGS & DISABLE2_ROTATE_SUGGESTIONS;
+
+ String pkg = mContext.getPackageName();
+ int userId = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(userId);
+ // before disabling
+ assertEquals(DISABLE_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ assertEquals(DISABLE2_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[1]);
+ // disable
+ mStatusBarManagerService.disable(disableFlags, mMockStatusBar, pkg);
+ mStatusBarManagerService.disable2(disable2Flags, mMockStatusBar, pkg);
+ // re-enable one
+ mStatusBarManagerService.disable2(DISABLE_NONE, mMockStatusBar, pkg);
+ // check that right flag is disabled
+ assertEquals(disableFlags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[0]);
+ assertEquals(DISABLE2_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, userId)[1]);
+ }
+
+ @Test
+ public void testDifferentUsersDisable() throws Exception {
+ int user1Id = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(user1Id);
+ int user2Id = 14;
+ mockComponentInfo(user2Id);
+ mockEverything(user2Id);
+
+ int expectedUser1Flags = DISABLE_MASK & DISABLE_BACK;
+ int expectedUser2Flags = DISABLE_MASK & DISABLE_HOME;
+ String pkg = mContext.getPackageName();
+
+ // before disabling
+ assertEquals(DISABLE_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, user1Id)[0]);
+ assertEquals(DISABLE_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, user2Id)[0]);
+ // disable
+ mStatusBarManagerService.disableForUser(expectedUser1Flags, mMockStatusBar, pkg, user1Id);
+ mStatusBarManagerService.disableForUser(expectedUser2Flags, mMockStatusBar, pkg, user2Id);
+ // check that right flag is disabled
+ assertEquals(expectedUser1Flags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, user1Id)[0]);
+ assertEquals(expectedUser2Flags,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, user2Id)[0]);
+ }
+
+
private void mockUidCheck() {
mockUidCheck(TEST_PACKAGE);
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategory.java
index d551953..c16d18b 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategory.java
@@ -23,6 +23,7 @@
import org.w3c.dom.Document;
import org.w3c.dom.Element;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -40,6 +41,11 @@
this.mDataTypes = dataTypes;
}
+ public DataCategory(String categoryName) {
+ this.mCategoryName = categoryName;
+ this.mDataTypes = new LinkedHashMap<String, DataType>();
+ }
+
public String getCategoryName() {
return mCategoryName;
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategoryFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategoryFactory.java
index 90424fe..7244162 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategoryFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategoryFactory.java
@@ -26,33 +26,8 @@
import java.util.List;
import java.util.Map;
-public class DataCategoryFactory implements AslMarshallableFactory<DataCategory> {
- @Override
- public DataCategory createFromHrElements(List<Element> elements) throws MalformedXmlException {
- String categoryName = null;
- Map<String, DataType> dataTypeMap = new LinkedHashMap<String, DataType>();
- for (Element ele : elements) {
- categoryName = XmlUtils.getStringAttr(ele, XmlUtils.HR_ATTR_DATA_CATEGORY, true);
- String dataTypeName = XmlUtils.getStringAttr(ele, XmlUtils.HR_ATTR_DATA_TYPE, true);
- if (!DataTypeConstants.getValidDataTypes().containsKey(categoryName)) {
- throw new MalformedXmlException(
- String.format("Unrecognized data category %s", categoryName));
- }
- if (!DataTypeConstants.getValidDataTypes().get(categoryName).contains(dataTypeName)) {
- throw new MalformedXmlException(
- String.format(
- "Unrecognized data type name %s for category %s",
- dataTypeName, categoryName));
- }
- dataTypeMap.put(
- dataTypeName, new DataTypeFactory().createFromHrElements(XmlUtils.listOf(ele)));
- }
-
- return new DataCategory(categoryName, dataTypeMap);
- }
-
+public class DataCategoryFactory {
/** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
- @Override
public DataCategory createFromOdElements(List<Element> elements) throws MalformedXmlException {
Element dataCategoryEle = XmlUtils.getSingleElement(elements);
Map<String, DataType> dataTypeMap = new LinkedHashMap<String, DataType>();
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataLabels.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataLabels.java
index 4a0d759..ba0e3db 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataLabels.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataLabels.java
@@ -30,28 +30,17 @@
* DataCategory}
*/
public class DataLabels implements AslMarshallable {
- private final Map<String, DataCategory> mDataAccessed;
private final Map<String, DataCategory> mDataCollected;
private final Map<String, DataCategory> mDataShared;
public DataLabels(
- Map<String, DataCategory> dataAccessed,
Map<String, DataCategory> dataCollected,
Map<String, DataCategory> dataShared) {
- mDataAccessed = dataAccessed;
mDataCollected = dataCollected;
mDataShared = dataShared;
}
/**
- * Returns the data accessed {@link Map} of {@link DataCategoryConstants} to {@link
- * DataCategory}
- */
- public Map<String, DataCategory> getDataAccessed() {
- return mDataAccessed;
- }
-
- /**
* Returns the data collected {@link Map} of {@link DataCategoryConstants} to {@link
* DataCategory}
*/
@@ -72,7 +61,6 @@
Element dataLabelsEle =
XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_DATA_LABELS);
- maybeAppendDataUsages(doc, dataLabelsEle, mDataAccessed, XmlUtils.OD_NAME_DATA_ACCESSED);
maybeAppendDataUsages(doc, dataLabelsEle, mDataCollected, XmlUtils.OD_NAME_DATA_COLLECTED);
maybeAppendDataUsages(doc, dataLabelsEle, mDataShared, XmlUtils.OD_NAME_DATA_SHARED);
@@ -83,9 +71,12 @@
@Override
public List<Element> toHrDomElements(Document doc) {
Element dataLabelsEle = doc.createElement(XmlUtils.HR_TAG_DATA_LABELS);
- maybeAppendHrDataUsages(doc, dataLabelsEle, mDataAccessed, XmlUtils.HR_TAG_DATA_ACCESSED);
- maybeAppendHrDataUsages(doc, dataLabelsEle, mDataCollected, XmlUtils.HR_TAG_DATA_COLLECTED);
- maybeAppendHrDataUsages(doc, dataLabelsEle, mDataShared, XmlUtils.HR_TAG_DATA_SHARED);
+ maybeAppendHrDataUsages(
+ doc, dataLabelsEle, mDataCollected, XmlUtils.HR_TAG_DATA_COLLECTED, false);
+ maybeAppendHrDataUsages(
+ doc, dataLabelsEle, mDataCollected, XmlUtils.HR_TAG_DATA_COLLECTED_EPHEMERAL, true);
+ maybeAppendHrDataUsages(
+ doc, dataLabelsEle, mDataShared, XmlUtils.HR_TAG_DATA_SHARED, false);
return XmlUtils.listOf(dataLabelsEle);
}
@@ -115,7 +106,8 @@
Document doc,
Element dataLabelsEle,
Map<String, DataCategory> dataCategoriesMap,
- String dataUsageTypeName) {
+ String dataUsageTypeName,
+ boolean ephemeral) {
if (dataCategoriesMap.isEmpty()) {
return;
}
@@ -123,10 +115,15 @@
DataCategory dataCategory = dataCategoriesMap.get(dataCategoryName);
for (String dataTypeName : dataCategory.getDataTypes().keySet()) {
DataType dataType = dataCategory.getDataTypes().get(dataTypeName);
- // XmlUtils.appendChildren(dataLabelsEle, dataType.toHrDomElements(doc));
+ if (ephemeral
+ != (dataType.getEphemeral() != null ? dataType.getEphemeral() : false)) {
+ continue;
+ }
+
Element hrDataTypeEle = doc.createElement(dataUsageTypeName);
- hrDataTypeEle.setAttribute(XmlUtils.HR_ATTR_DATA_CATEGORY, dataCategoryName);
- hrDataTypeEle.setAttribute(XmlUtils.HR_ATTR_DATA_TYPE, dataTypeName);
+ hrDataTypeEle.setAttribute(
+ XmlUtils.HR_ATTR_DATA_TYPE,
+ dataCategoryName + XmlUtils.DATA_TYPE_SEPARATOR + dataTypeName);
XmlUtils.maybeSetHrBoolAttr(
hrDataTypeEle,
XmlUtils.HR_ATTR_IS_COLLECTION_OPTIONAL,
@@ -135,8 +132,6 @@
hrDataTypeEle,
XmlUtils.HR_ATTR_IS_SHARING_OPTIONAL,
dataType.getIsSharingOptional());
- XmlUtils.maybeSetHrBoolAttr(
- hrDataTypeEle, XmlUtils.HR_ATTR_EPHEMERAL, dataType.getEphemeral());
hrDataTypeEle.setAttribute(
XmlUtils.HR_ATTR_PURPOSES,
String.join(
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataLabelsFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataLabelsFactory.java
index 5473e01..c4d8876 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataLabelsFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataLabelsFactory.java
@@ -18,16 +18,15 @@
import com.android.asllib.util.AslgenUtil;
import com.android.asllib.util.DataCategoryConstants;
+import com.android.asllib.util.DataTypeConstants;
import com.android.asllib.util.MalformedXmlException;
import com.android.asllib.util.XmlUtils;
import org.w3c.dom.Element;
-import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import java.util.Set;
public class DataLabelsFactory implements AslMarshallableFactory<DataLabels> {
@@ -39,13 +38,46 @@
AslgenUtil.logI("Found no DataLabels in hr format.");
return null;
}
- Map<String, DataCategory> dataAccessed =
- getDataCategoriesWithTag(ele, XmlUtils.HR_TAG_DATA_ACCESSED);
Map<String, DataCategory> dataCollected =
- getDataCategoriesWithTag(ele, XmlUtils.HR_TAG_DATA_COLLECTED);
+ getDataCategoriesWithTag(ele, XmlUtils.HR_TAG_DATA_COLLECTED, false);
+ Map<String, DataCategory> dataCollectedEphemeral =
+ getDataCategoriesWithTag(ele, XmlUtils.HR_TAG_DATA_COLLECTED_EPHEMERAL, true);
Map<String, DataCategory> dataShared =
- getDataCategoriesWithTag(ele, XmlUtils.HR_TAG_DATA_SHARED);
- DataLabels dataLabels = new DataLabels(dataAccessed, dataCollected, dataShared);
+ getDataCategoriesWithTag(ele, XmlUtils.HR_TAG_DATA_SHARED, null);
+
+ for (String dataCollectedEphemeralDataCategoryKey : dataCollectedEphemeral.keySet()) {
+ DataCategory dataCategoryEphemeral =
+ dataCollectedEphemeral.get(dataCollectedEphemeralDataCategoryKey);
+ for (String dataCollectedEphemeralDataTypeKey :
+ dataCategoryEphemeral.getDataTypes().keySet()) {
+ if (dataCollected.containsKey(dataCollectedEphemeralDataCategoryKey)
+ && dataCollected
+ .get(dataCollectedEphemeralDataCategoryKey)
+ .getDataTypes()
+ .containsKey(dataCollectedEphemeralDataTypeKey)) {
+ throw new MalformedXmlException(
+ String.format(
+ "Duplicate entries in data-collected and"
+ + " data-collected-ephemeral: %s %s",
+ dataCollectedEphemeralDataCategoryKey,
+ dataCollectedEphemeralDataTypeKey));
+ }
+
+ if (!dataCollected.containsKey(dataCollectedEphemeralDataCategoryKey)) {
+ dataCollected.put(
+ dataCollectedEphemeralDataCategoryKey,
+ new DataCategory(dataCollectedEphemeralDataCategoryKey));
+ }
+ DataType dataTypeEphemeral =
+ dataCategoryEphemeral.getDataTypes().get(dataCollectedEphemeralDataTypeKey);
+ dataCollected
+ .get(dataCollectedEphemeralDataCategoryKey)
+ .getDataTypes()
+ .put(dataCollectedEphemeralDataTypeKey, dataTypeEphemeral);
+ }
+ }
+ DataLabels dataLabels = new DataLabels(dataCollected, dataShared);
+
validateIsXOptional(dataLabels);
return dataLabels;
}
@@ -58,13 +90,11 @@
AslgenUtil.logI("Found no DataLabels in od format.");
return null;
}
- Map<String, DataCategory> dataAccessed =
- getOdDataCategoriesWithTag(dataLabelsEle, XmlUtils.OD_NAME_DATA_ACCESSED);
Map<String, DataCategory> dataCollected =
getOdDataCategoriesWithTag(dataLabelsEle, XmlUtils.OD_NAME_DATA_COLLECTED);
Map<String, DataCategory> dataShared =
getOdDataCategoriesWithTag(dataLabelsEle, XmlUtils.OD_NAME_DATA_SHARED);
- DataLabels dataLabels = new DataLabels(dataAccessed, dataCollected, dataShared);
+ DataLabels dataLabels = new DataLabels(dataCollected, dataShared);
validateIsXOptional(dataLabels);
return dataLabels;
}
@@ -88,56 +118,56 @@
}
private static Map<String, DataCategory> getDataCategoriesWithTag(
- Element dataLabelsEle, String dataCategoryUsageTypeTag) throws MalformedXmlException {
+ Element dataLabelsEle, String dataCategoryUsageTypeTag, Boolean ephemeral)
+ throws MalformedXmlException {
List<Element> dataUsedElements =
XmlUtils.getChildrenByTagName(dataLabelsEle, dataCategoryUsageTypeTag);
Map<String, DataCategory> dataCategoryMap = new LinkedHashMap<String, DataCategory>();
- Set<String> dataCategoryNames = new HashSet<String>();
for (int i = 0; i < dataUsedElements.size(); i++) {
Element dataUsedEle = dataUsedElements.get(i);
- String dataCategoryName = dataUsedEle.getAttribute(XmlUtils.HR_ATTR_DATA_CATEGORY);
+ String dataCategoryAndTypeCombinedStr =
+ dataUsedEle.getAttribute(XmlUtils.HR_ATTR_DATA_TYPE);
+ String[] strs = dataCategoryAndTypeCombinedStr.split(XmlUtils.DATA_TYPE_SEPARATOR);
+ if (strs.length != 2) {
+ throw new MalformedXmlException(
+ String.format(
+ "Could not parse human-readable data type string (expecting"
+ + " substring of _data_type_): %s",
+ dataCategoryAndTypeCombinedStr));
+ }
+ String dataCategoryName = strs[0];
+ String dataTypeName = strs[1];
+
if (!DataCategoryConstants.getValidDataCategories().contains(dataCategoryName)) {
throw new MalformedXmlException(
String.format("Unrecognized category name: %s", dataCategoryName));
}
- dataCategoryNames.add(dataCategoryName);
+ if (!DataTypeConstants.getValidDataTypes()
+ .get(dataCategoryName)
+ .contains(dataTypeName)) {
+ throw new MalformedXmlException(
+ String.format(
+ "Unrecognized data type name %s for category %s",
+ dataTypeName, dataCategoryName));
+ }
+
+ if (!dataCategoryMap.containsKey(dataCategoryName)) {
+ dataCategoryMap.put(dataCategoryName, new DataCategory(dataCategoryName));
+ }
+ dataCategoryMap
+ .get(dataCategoryName)
+ .getDataTypes()
+ .put(
+ dataTypeName,
+ new DataTypeFactory().createFromHrElements(dataUsedEle, ephemeral));
}
- for (String dataCategoryName : dataCategoryNames) {
- var dataCategoryElements =
- dataUsedElements.stream()
- .filter(
- ele ->
- ele.getAttribute(XmlUtils.HR_ATTR_DATA_CATEGORY)
- .equals(dataCategoryName))
- .toList();
- DataCategory dataCategory =
- new DataCategoryFactory().createFromHrElements(dataCategoryElements);
- dataCategoryMap.put(dataCategoryName, dataCategory);
- }
+
return dataCategoryMap;
}
private void validateIsXOptional(DataLabels dataLabels) throws MalformedXmlException {
// Validate booleans such as isCollectionOptional, isSharingOptional.
- for (DataCategory dataCategory : dataLabels.getDataAccessed().values()) {
- for (DataType dataType : dataCategory.getDataTypes().values()) {
- if (dataType.getIsSharingOptional() != null) {
- throw new MalformedXmlException(
- String.format(
- "isSharingOptional was unexpectedly defined on a DataType"
- + " belonging to data accessed: %s",
- dataType.getDataTypeName()));
- }
- if (dataType.getIsCollectionOptional() != null) {
- throw new MalformedXmlException(
- String.format(
- "isCollectionOptional was unexpectedly defined on a DataType"
- + " belonging to data accessed: %s",
- dataType.getDataTypeName()));
- }
- }
- }
for (DataCategory dataCategory : dataLabels.getDataCollected().values()) {
for (DataType dataType : dataCategory.getDataTypes().values()) {
if (dataType.getIsSharingOptional() != null) {
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataTypeFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataTypeFactory.java
index 488c259..a5559d8 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataTypeFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataTypeFactory.java
@@ -25,12 +25,22 @@
import java.util.List;
import java.util.stream.Collectors;
-public class DataTypeFactory implements AslMarshallableFactory<DataType> {
+public class DataTypeFactory {
/** Creates a {@link DataType} from the human-readable DOM element. */
- @Override
- public DataType createFromHrElements(List<Element> elements) throws MalformedXmlException {
- Element hrDataTypeEle = XmlUtils.getSingleElement(elements);
- String dataTypeName = hrDataTypeEle.getAttribute(XmlUtils.HR_ATTR_DATA_TYPE);
+ public DataType createFromHrElements(Element hrDataTypeEle, Boolean ephemeral)
+ throws MalformedXmlException {
+ String dataCategoryAndTypeCombinedStr =
+ hrDataTypeEle.getAttribute(XmlUtils.HR_ATTR_DATA_TYPE);
+ String[] strs = dataCategoryAndTypeCombinedStr.split(XmlUtils.DATA_TYPE_SEPARATOR);
+ if (strs.length != 2) {
+ throw new MalformedXmlException(
+ String.format(
+ "Could not parse human-readable data type string (expecting substring"
+ + " of _data_type_): %s",
+ dataCategoryAndTypeCombinedStr));
+ }
+ String dataTypeName = strs[1];
+
List<DataType.Purpose> purposes =
XmlUtils.getPipelineSplitAttr(hrDataTypeEle, XmlUtils.HR_ATTR_PURPOSES, true)
.stream()
@@ -47,13 +57,13 @@
XmlUtils.getBoolAttr(hrDataTypeEle, XmlUtils.HR_ATTR_IS_COLLECTION_OPTIONAL, false);
Boolean isSharingOptional =
XmlUtils.getBoolAttr(hrDataTypeEle, XmlUtils.HR_ATTR_IS_SHARING_OPTIONAL, false);
- Boolean ephemeral = XmlUtils.getBoolAttr(hrDataTypeEle, XmlUtils.HR_ATTR_EPHEMERAL, false);
+ // Boolean ephemeral = XmlUtils.getBoolAttr(hrDataTypeEle, XmlUtils.HR_ATTR_EPHEMERAL,
+ // false);
return new DataType(
dataTypeName, purposes, isCollectionOptional, isSharingOptional, ephemeral);
}
/** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
- @Override
public DataType createFromOdElements(List<Element> elements) throws MalformedXmlException {
Element odDataTypeEle = XmlUtils.getSingleElement(elements);
String dataTypeName = odDataTypeEle.getAttribute(XmlUtils.OD_ATTR_NAME);
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabel.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabel.java
index 854c0d0..242e7be 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabel.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabel.java
@@ -26,15 +26,10 @@
/** Safety Label representation containing zero or more {@link DataCategory} for data shared */
public class SystemAppSafetyLabel implements AslMarshallable {
- private final String mUrl;
+ private final Boolean mDeclaration;
- public SystemAppSafetyLabel(String url) {
- this.mUrl = url;
- }
-
- /** Returns the system app safety label URL. */
- public String getUrl() {
- return mUrl;
+ public SystemAppSafetyLabel(Boolean d) {
+ this.mDeclaration = d;
}
/** Creates an on-device DOM element from the {@link SystemAppSafetyLabel}. */
@@ -43,7 +38,7 @@
Element systemAppSafetyLabelEle =
XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_SYSTEM_APP_SAFETY_LABEL);
systemAppSafetyLabelEle.appendChild(
- XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_URL, mUrl));
+ XmlUtils.createOdBooleanEle(doc, XmlUtils.OD_NAME_DECLARATION, mDeclaration));
return XmlUtils.listOf(systemAppSafetyLabelEle);
}
@@ -52,7 +47,8 @@
public List<Element> toHrDomElements(Document doc) {
Element systemAppSafetyLabelEle =
doc.createElement(XmlUtils.HR_TAG_SYSTEM_APP_SAFETY_LABEL);
- systemAppSafetyLabelEle.setAttribute(XmlUtils.HR_ATTR_URL, mUrl);
+ XmlUtils.maybeSetHrBoolAttr(
+ systemAppSafetyLabelEle, XmlUtils.HR_ATTR_DECLARATION, mDeclaration);
return XmlUtils.listOf(systemAppSafetyLabelEle);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabelFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabelFactory.java
index c8e22b6..7f4aa7a 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabelFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabelFactory.java
@@ -36,8 +36,9 @@
return null;
}
- String url = XmlUtils.getStringAttr(systemAppSafetyLabelEle, XmlUtils.HR_ATTR_URL, true);
- return new SystemAppSafetyLabel(url);
+ Boolean declaration =
+ XmlUtils.getBoolAttr(systemAppSafetyLabelEle, XmlUtils.HR_ATTR_DECLARATION, true);
+ return new SystemAppSafetyLabel(declaration);
}
/** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
@@ -49,7 +50,8 @@
AslgenUtil.logI("No SystemAppSafetyLabel found in od format.");
return null;
}
- String url = XmlUtils.getOdStringEle(systemAppSafetyLabelEle, XmlUtils.OD_NAME_URL, true);
- return new SystemAppSafetyLabel(url);
+ Boolean declaration =
+ XmlUtils.getOdBoolEle(systemAppSafetyLabelEle, XmlUtils.OD_NAME_DECLARATION, true);
+ return new SystemAppSafetyLabel(declaration);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/XmlUtils.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/XmlUtils.java
index 1d54ead..97cbc39 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/XmlUtils.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/XmlUtils.java
@@ -27,6 +27,8 @@
import java.util.List;
public class XmlUtils {
+ public static final String DATA_TYPE_SEPARATOR = "_data_type_";
+
public static final String HR_TAG_APP_METADATA_BUNDLES = "app-metadata-bundles";
public static final String HR_TAG_SYSTEM_APP_SAFETY_LABEL = "system-app-safety-label";
public static final String HR_TAG_SAFETY_LABELS = "safety-labels";
@@ -38,6 +40,7 @@
public static final String HR_TAG_THIRD_PARTY_VERIFICATION = "third-party-verification";
public static final String HR_TAG_DATA_ACCESSED = "data-accessed";
public static final String HR_TAG_DATA_COLLECTED = "data-collected";
+ public static final String HR_TAG_DATA_COLLECTED_EPHEMERAL = "data-collected-ephemeral";
public static final String HR_TAG_DATA_SHARED = "data-shared";
public static final String HR_ATTR_NAME = "name";
public static final String HR_ATTR_EMAIL = "email";
@@ -52,10 +55,11 @@
public static final String HR_ATTR_IS_SHARING_OPTIONAL = "isSharingOptional";
public static final String HR_ATTR_IS_DATA_DELETABLE = "isDataDeletable";
public static final String HR_ATTR_IS_DATA_ENCRYPTED = "isDataEncrypted";
- public static final String HR_ATTR_EPHEMERAL = "ephemeral";
+ // public static final String HR_ATTR_EPHEMERAL = "ephemeral";
public static final String HR_ATTR_PURPOSES = "purposes";
public static final String HR_ATTR_VERSION = "version";
public static final String HR_ATTR_URL = "url";
+ public static final String HR_ATTR_DECLARATION = "declaration";
public static final String HR_ATTR_TITLE = "title";
public static final String HR_ATTR_DESCRIPTION = "description";
public static final String HR_ATTR_CONTAINS_ADS = "containsAds";
@@ -103,6 +107,7 @@
public static final String OD_NAME_CATEGORY = "category";
public static final String OD_NAME_VERSION = "version";
public static final String OD_NAME_URL = "url";
+ public static final String OD_NAME_DECLARATION = "declaration";
public static final String OD_NAME_SYSTEM_APP_SAFETY_LABEL = "system_app_safety_label";
public static final String OD_NAME_SECURITY_LABELS = "security_labels";
public static final String OD_NAME_THIRD_PARTY_VERIFICATION = "third_party_verification";
@@ -299,12 +304,13 @@
.toList();
if (boolEles.size() > 1) {
throw new MalformedXmlException(
- String.format("Found more than one %s in %s.", nameName, ele.getTagName()));
+ String.format(
+ "Found more than one boolean %s in %s.", nameName, ele.getTagName()));
}
if (boolEles.isEmpty()) {
if (required) {
throw new MalformedXmlException(
- String.format("Found no %s in %s.", nameName, ele.getTagName()));
+ String.format("Found no boolean %s in %s.", nameName, ele.getTagName()));
}
return null;
}
@@ -329,12 +335,13 @@
.toList();
if (longEles.size() > 1) {
throw new MalformedXmlException(
- String.format("Found more than one %s in %s.", nameName, ele.getTagName()));
+ String.format(
+ "Found more than one long %s in %s.", nameName, ele.getTagName()));
}
if (longEles.isEmpty()) {
if (required) {
throw new MalformedXmlException(
- String.format("Found no %s in %s.", nameName, ele.getTagName()));
+ String.format("Found no long %s in %s.", nameName, ele.getTagName()));
}
return null;
}
@@ -359,12 +366,13 @@
.toList();
if (eles.size() > 1) {
throw new MalformedXmlException(
- String.format("Found more than one %s in %s.", nameName, ele.getTagName()));
+ String.format(
+ "Found more than one string %s in %s.", nameName, ele.getTagName()));
}
if (eles.isEmpty()) {
if (required) {
throw new MalformedXmlException(
- String.format("Found no %s in %s.", nameName, ele.getTagName()));
+ String.format("Found no string %s in %s.", nameName, ele.getTagName()));
}
return null;
}
@@ -386,12 +394,13 @@
.toList();
if (eles.size() > 1) {
throw new MalformedXmlException(
- String.format("Found more than one %s in %s.", nameName, ele.getTagName()));
+ String.format(
+ "Found more than one pbundle %s in %s.", nameName, ele.getTagName()));
}
if (eles.isEmpty()) {
if (required) {
throw new MalformedXmlException(
- String.format("Found no %s in %s.", nameName, ele.getTagName()));
+ String.format("Found no pbundle %s in %s.", nameName, ele.getTagName()));
}
return null;
}
@@ -456,12 +465,15 @@
.toList();
if (arrayEles.size() > 1) {
throw new MalformedXmlException(
- String.format("Found more than one %s in %s.", nameName, ele.getTagName()));
+ String.format(
+ "Found more than one string array %s in %s.",
+ nameName, ele.getTagName()));
}
if (arrayEles.isEmpty()) {
if (required) {
throw new MalformedXmlException(
- String.format("Found no %s in %s.", nameName, ele.getTagName()));
+ String.format(
+ "Found no string array %s in %s.", nameName, ele.getTagName()));
}
return null;
}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/AllTests.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/AllTests.java
index f156484..dbeeb49 100644
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/AllTests.java
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/AllTests.java
@@ -18,7 +18,6 @@
import com.android.asllib.marshallable.AndroidSafetyLabelTest;
import com.android.asllib.marshallable.AppInfoTest;
-import com.android.asllib.marshallable.DataCategoryTest;
import com.android.asllib.marshallable.DataLabelsTest;
import com.android.asllib.marshallable.DataTypeEqualityTest;
import com.android.asllib.marshallable.DeveloperInfoTest;
@@ -36,7 +35,7 @@
AslgenTests.class,
AndroidSafetyLabelTest.class,
AppInfoTest.class,
- DataCategoryTest.class,
+ // DataCategoryTest.class,
DataLabelsTest.class,
DataTypeEqualityTest.class,
DeveloperInfoTest.class,
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/AslgenTests.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/AslgenTests.java
index d2e0fc3..5d1d45a 100644
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/AslgenTests.java
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/AslgenTests.java
@@ -34,8 +34,7 @@
@RunWith(JUnit4.class)
public class AslgenTests {
private static final String VALID_MAPPINGS_PATH = "com/android/asllib/validmappings";
- private static final List<String> VALID_MAPPINGS_SUBDIRS =
- List.of("location", "contacts", "general");
+ private static final List<String> VALID_MAPPINGS_SUBDIRS = List.of("general");
private static final String HR_XML_FILENAME = "hr.xml";
private static final String OD_XML_FILENAME = "od.xml";
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataCategoryTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataCategoryTest.java
deleted file mode 100644
index ebb3186..0000000
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataCategoryTest.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.asllib.marshallable;
-
-import com.android.asllib.testutils.TestUtils;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-public class DataCategoryTest {
- private static final String DATA_CATEGORY_HR_PATH = "com/android/asllib/datacategory/hr";
- private static final String DATA_CATEGORY_OD_PATH = "com/android/asllib/datacategory/od";
-
- private static final String VALID_PERSONAL_FILE_NAME = "data-category-personal.xml";
- private static final String VALID_PARTIAL_PERSONAL_FILE_NAME =
- "data-category-personal-partial.xml";
- private static final String VALID_FINANCIAL_FILE_NAME = "data-category-financial.xml";
- private static final String VALID_LOCATION_FILE_NAME = "data-category-location.xml";
- private static final String VALID_EMAIL_TEXT_MESSAGE_FILE_NAME =
- "data-category-email-text-message.xml";
- private static final String VALID_PHOTO_VIDEO_FILE_NAME = "data-category-photo-video.xml";
- private static final String VALID_AUDIO_FILE_NAME = "data-category-audio.xml";
- private static final String VALID_STORAGE_FILE_NAME = "data-category-storage.xml";
- private static final String VALID_HEALTH_FITNESS_FILE_NAME = "data-category-health-fitness.xml";
- private static final String VALID_CONTACTS_FILE_NAME = "data-category-contacts.xml";
- private static final String VALID_CALENDAR_FILE_NAME = "data-category-calendar.xml";
- private static final String VALID_IDENTIFIERS_FILE_NAME = "data-category-identifiers.xml";
- private static final String VALID_APP_PERFORMANCE_FILE_NAME =
- "data-category-app-performance.xml";
- private static final String VALID_ACTIONS_IN_APP_FILE_NAME = "data-category-actions-in-app.xml";
- private static final String VALID_SEARCH_AND_BROWSING_FILE_NAME =
- "data-category-search-and-browsing.xml";
-
- private static final String EMPTY_PURPOSE_PERSONAL_FILE_NAME =
- "data-category-personal-empty-purpose.xml";
- private static final String MISSING_PURPOSE_PERSONAL_FILE_NAME =
- "data-category-personal-missing-purpose.xml";
- private static final String UNRECOGNIZED_TYPE_PERSONAL_FILE_NAME =
- "data-category-personal-unrecognized-type.xml";
- private static final String UNRECOGNIZED_CATEGORY_FILE_NAME = "data-category-unrecognized.xml";
-
- /** Logic for setting up tests (empty if not yet needed). */
- public static void main(String[] params) throws Exception {}
-
- @Before
- public void setUp() throws Exception {
- System.out.println("set up.");
- }
-
- /** Test for data category personal. */
- @Test
- public void testDataCategoryPersonal() throws Exception {
- System.out.println("starting testDataCategoryPersonal.");
- testHrToOdDataCategory(VALID_PERSONAL_FILE_NAME);
- }
-
- /** Test for data category financial. */
- @Test
- public void testDataCategoryFinancial() throws Exception {
- System.out.println("starting testDataCategoryFinancial.");
- testHrToOdDataCategory(VALID_FINANCIAL_FILE_NAME);
- }
-
- /** Test for data category location. */
- @Test
- public void testDataCategoryLocation() throws Exception {
- System.out.println("starting testDataCategoryLocation.");
- testHrToOdDataCategory(VALID_LOCATION_FILE_NAME);
- }
-
- /** Test for data category email text message. */
- @Test
- public void testDataCategoryEmailTextMessage() throws Exception {
- System.out.println("starting testDataCategoryEmailTextMessage.");
- testHrToOdDataCategory(VALID_EMAIL_TEXT_MESSAGE_FILE_NAME);
- }
-
- /** Test for data category photo video. */
- @Test
- public void testDataCategoryPhotoVideo() throws Exception {
- System.out.println("starting testDataCategoryPhotoVideo.");
- testHrToOdDataCategory(VALID_PHOTO_VIDEO_FILE_NAME);
- }
-
- /** Test for data category audio. */
- @Test
- public void testDataCategoryAudio() throws Exception {
- System.out.println("starting testDataCategoryAudio.");
- testHrToOdDataCategory(VALID_AUDIO_FILE_NAME);
- }
-
- /** Test for data category storage. */
- @Test
- public void testDataCategoryStorage() throws Exception {
- System.out.println("starting testDataCategoryStorage.");
- testHrToOdDataCategory(VALID_STORAGE_FILE_NAME);
- }
-
- /** Test for data category health fitness. */
- @Test
- public void testDataCategoryHealthFitness() throws Exception {
- System.out.println("starting testDataCategoryHealthFitness.");
- testHrToOdDataCategory(VALID_HEALTH_FITNESS_FILE_NAME);
- }
-
- /** Test for data category contacts. */
- @Test
- public void testDataCategoryContacts() throws Exception {
- System.out.println("starting testDataCategoryContacts.");
- testHrToOdDataCategory(VALID_CONTACTS_FILE_NAME);
- }
-
- /** Test for data category calendar. */
- @Test
- public void testDataCategoryCalendar() throws Exception {
- System.out.println("starting testDataCategoryCalendar.");
- testHrToOdDataCategory(VALID_CALENDAR_FILE_NAME);
- }
-
- /** Test for data category identifiers. */
- @Test
- public void testDataCategoryIdentifiers() throws Exception {
- System.out.println("starting testDataCategoryIdentifiers.");
- testHrToOdDataCategory(VALID_IDENTIFIERS_FILE_NAME);
- }
-
- /** Test for data category app performance. */
- @Test
- public void testDataCategoryAppPerformance() throws Exception {
- System.out.println("starting testDataCategoryAppPerformance.");
- testHrToOdDataCategory(VALID_APP_PERFORMANCE_FILE_NAME);
- }
-
- /** Test for data category actions in app. */
- @Test
- public void testDataCategoryActionsInApp() throws Exception {
- System.out.println("starting testDataCategoryActionsInApp.");
- testHrToOdDataCategory(VALID_ACTIONS_IN_APP_FILE_NAME);
- }
-
- /** Test for data category search and browsing. */
- @Test
- public void testDataCategorySearchAndBrowsing() throws Exception {
- System.out.println("starting testDataCategorySearchAndBrowsing.");
- testHrToOdDataCategory(VALID_SEARCH_AND_BROWSING_FILE_NAME);
- }
-
- /** Test for data category search and browsing. */
- @Test
- public void testMissingOptionalsAllowed() throws Exception {
- System.out.println("starting testMissingOptionalsAllowed.");
- testHrToOdDataCategory(VALID_PARTIAL_PERSONAL_FILE_NAME);
- }
-
- /** Test for empty purposes. */
- @Test
- public void testEmptyPurposesNotAllowed() throws Exception {
- System.out.println("starting testEmptyPurposesNotAllowed.");
- hrToOdExpectException(EMPTY_PURPOSE_PERSONAL_FILE_NAME);
- }
-
- /** Test for missing purposes. */
- @Test
- public void testMissingPurposesNotAllowed() throws Exception {
- System.out.println("starting testMissingPurposesNotAllowed.");
- hrToOdExpectException(MISSING_PURPOSE_PERSONAL_FILE_NAME);
- }
-
- /** Test for unrecognized type. */
- @Test
- public void testUnrecognizedTypeNotAllowed() throws Exception {
- System.out.println("starting testUnrecognizedTypeNotAllowed.");
- hrToOdExpectException(UNRECOGNIZED_TYPE_PERSONAL_FILE_NAME);
- }
-
- /** Test for unrecognized category. */
- @Test
- public void testUnrecognizedCategoryNotAllowed() throws Exception {
- System.out.println("starting testUnrecognizedCategoryNotAllowed.");
- hrToOdExpectException(UNRECOGNIZED_CATEGORY_FILE_NAME);
- }
-
- private void hrToOdExpectException(String fileName) {
- TestUtils.hrToOdExpectException(new DataCategoryFactory(), DATA_CATEGORY_HR_PATH, fileName);
- }
-
- private void testHrToOdDataCategory(String fileName) throws Exception {
- TestUtils.testHrToOd(
- TestUtils.document(),
- new DataCategoryFactory(),
- DATA_CATEGORY_HR_PATH,
- DATA_CATEGORY_OD_PATH,
- fileName);
- }
-}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataLabelsTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataLabelsTest.java
index 2661726..ff43741 100644
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataLabelsTest.java
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataLabelsTest.java
@@ -34,6 +34,10 @@
"data-labels-accessed-invalid-bool.xml";
private static final String COLLECTED_VALID_BOOL_FILE_NAME =
"data-labels-collected-valid-bool.xml";
+ private static final String COLLECTED_EPHEMERAL_FILE_NAME =
+ "data-labels-collected-ephemeral.xml";
+ private static final String COLLECTED_EPHEMERAL_COLLISION_FILE_NAME =
+ "data-labels-collected-ephemeral-collision.xml";
private static final String COLLECTED_INVALID_BOOL_FILE_NAME =
"data-labels-collected-invalid-bool.xml";
private static final String SHARED_VALID_BOOL_FILE_NAME = "data-labels-shared-valid-bool.xml";
@@ -69,21 +73,6 @@
System.out.println("set up.");
}
- /** Test for data labels accessed valid bool. */
- @Test
- public void testDataLabelsAccessedValidBool() throws Exception {
- System.out.println("starting testDataLabelsAccessedValidBool.");
- testHrToOdDataLabels(ACCESSED_VALID_BOOL_FILE_NAME);
- testOdToHrDataLabels(ACCESSED_VALID_BOOL_FILE_NAME);
- }
-
- /** Test for data labels accessed invalid bool. */
- @Test
- public void testDataLabelsAccessedInvalidBool() throws Exception {
- System.out.println("starting testDataLabelsAccessedInvalidBool.");
- hrToOdExpectException(ACCESSED_INVALID_BOOL_FILE_NAME);
- }
-
/** Test for data labels collected valid bool. */
@Test
public void testDataLabelsCollectedValidBool() throws Exception {
@@ -92,6 +81,21 @@
testOdToHrDataLabels(COLLECTED_VALID_BOOL_FILE_NAME);
}
+ /** Test for data labels collected ephemeral. */
+ @Test
+ public void testDataLabelsCollectedEphemeral() throws Exception {
+ System.out.println("starting testDataLabelsCollectedEphemeral.");
+ testHrToOdDataLabels(COLLECTED_EPHEMERAL_FILE_NAME);
+ testOdToHrDataLabels(COLLECTED_EPHEMERAL_FILE_NAME);
+ }
+
+ /** Test for data labels ephemeral collision. */
+ @Test
+ public void testDataLabelsCollectedEphemeralCollision() throws Exception {
+ System.out.println("starting testDataLabelsCollectedEphemeralCollision.");
+ hrToOdExpectException(COLLECTED_EPHEMERAL_COLLISION_FILE_NAME);
+ }
+
/** Test for data labels collected invalid bool. */
@Test
public void testDataLabelsCollectedInvalidBool() throws Exception {
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SystemAppSafetyLabelTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SystemAppSafetyLabelTest.java
index 33c2764..87d3e44 100644
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SystemAppSafetyLabelTest.java
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SystemAppSafetyLabelTest.java
@@ -31,7 +31,7 @@
"com/android/asllib/systemappsafetylabel/od";
private static final String VALID_FILE_NAME = "valid.xml";
- private static final String MISSING_URL_FILE_NAME = "missing-url.xml";
+ private static final String MISSING_BOOL_FILE_NAME = "missing-bool.xml";
/** Logic for setting up tests (empty if not yet needed). */
public static void main(String[] params) throws Exception {}
@@ -49,12 +49,12 @@
testOdToHrSystemAppSafetyLabel(VALID_FILE_NAME);
}
- /** Tests missing url. */
+ /** Tests missing bool. */
@Test
- public void testMissingUrl() throws Exception {
- System.out.println("starting testMissingUrl.");
- hrToOdExpectException(MISSING_URL_FILE_NAME);
- odToHrExpectException(MISSING_URL_FILE_NAME);
+ public void testMissingBool() throws Exception {
+ System.out.println("starting testMissingBool.");
+ hrToOdExpectException(MISSING_BOOL_FILE_NAME);
+ odToHrExpectException(MISSING_BOOL_FILE_NAME);
}
private void hrToOdExpectException(String fileName) {
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/with-system-app-safety-label.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/with-system-app-safety-label.xml
index 7bcde45..afb0486 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/with-system-app-safety-label.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/with-system-app-safety-label.xml
@@ -1,4 +1,4 @@
<app-metadata-bundles version="123456">
-<system-app-safety-label url="www.example.com">
+<system-app-safety-label declaration="true">
</system-app-safety-label>
</app-metadata-bundles>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/with-system-app-safety-label.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/with-system-app-safety-label.xml
index ef0f549..e8640c4 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/with-system-app-safety-label.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/with-system-app-safety-label.xml
@@ -1,6 +1,6 @@
<bundle>
<long name="version" value="123456"/>
<pbundle_as_map name="system_app_safety_label">
- <string name="url" value="www.example.com"/>
+ <boolean name="declaration" value="true"/>
</pbundle_as_map>
</bundle>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-actions-in-app.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-actions-in-app.xml
index 68e191e..680e01a 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-actions-in-app.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-actions-in-app.xml
@@ -1,17 +1,12 @@
<data-labels>
- <data-shared dataCategory="actions_in_app"
- dataType="user_interaction"
+ <data-shared dataType="actions_in_app_data_type_user_interaction"
purposes="analytics" />
- <data-shared dataCategory="actions_in_app"
- dataType="in_app_search_history"
+ <data-shared dataType="actions_in_app_data_type_in_app_search_history"
purposes="analytics" />
- <data-shared dataCategory="actions_in_app"
- dataType="installed_apps"
+ <data-shared dataType="actions_in_app_data_type_installed_apps"
purposes="analytics" />
- <data-shared dataCategory="actions_in_app"
- dataType="user_generated_content"
+ <data-shared dataType="actions_in_app_data_type_user_generated_content"
purposes="analytics" />
- <data-shared dataCategory="actions_in_app"
- dataType="other"
+ <data-shared dataType="actions_in_app_data_type_other"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-app-performance.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-app-performance.xml
index a6bd17d..db114bf 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-app-performance.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-app-performance.xml
@@ -1,11 +1,8 @@
<data-labels>
- <data-shared dataCategory="app_performance"
- dataType="crash_logs"
+ <data-shared dataType="app_performance_data_type_crash_logs"
purposes="analytics" />
- <data-shared dataCategory="app_performance"
- dataType="performance_diagnostics"
+ <data-shared dataType="app_performance_data_type_performance_diagnostics"
purposes="analytics" />
- <data-shared dataCategory="app_performance"
- dataType="other"
+ <data-shared dataType="app_performance_data_type_other"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-audio.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-audio.xml
index 6274604..cf273f4 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-audio.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-audio.xml
@@ -1,11 +1,8 @@
<data-labels>
- <data-shared dataCategory="audio"
- dataType="sound_recordings"
+ <data-shared dataType="audio_data_type_sound_recordings"
purposes="analytics" />
- <data-shared dataCategory="audio"
- dataType="music_files"
+ <data-shared dataType="audio_data_type_music_files"
purposes="analytics" />
- <data-shared dataCategory="audio"
- dataType="other"
+ <data-shared dataType="audio_data_type_other"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-calendar.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-calendar.xml
index f7201f6..16f9d9b6 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-calendar.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-calendar.xml
@@ -1,5 +1,4 @@
<data-labels>
- <data-shared dataCategory="calendar"
- dataType="calendar"
+ <data-shared dataType="calendar_data_type_calendar"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-contacts.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-contacts.xml
index e8d40be..6d7a4e8 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-contacts.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-contacts.xml
@@ -1,5 +1,4 @@
<data-labels>
- <data-shared dataCategory="contacts"
- dataType="contacts"
+ <data-shared dataType="contacts_data_type_contacts"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-email-text-message.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-email-text-message.xml
index 69e9b87..7a9e978 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-email-text-message.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-email-text-message.xml
@@ -1,11 +1,8 @@
<data-labels>
- <data-shared dataCategory="email_text_message"
- dataType="emails"
+ <data-shared dataType="email_text_message_data_type_emails"
purposes="analytics" />
- <data-shared dataCategory="email_text_message"
- dataType="text_messages"
+ <data-shared dataType="email_text_message_data_type_text_messages"
purposes="analytics" />
- <data-shared dataCategory="email_text_message"
- dataType="other"
+ <data-shared dataType="email_text_message_data_type_other"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-financial.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-financial.xml
index fdd8456..24385b6 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-financial.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-financial.xml
@@ -1,14 +1,10 @@
<data-labels>
- <data-shared dataCategory="financial"
- dataType="card_bank_account"
+ <data-shared dataType="financial_data_type_card_bank_account"
purposes="analytics" />
- <data-shared dataCategory="financial"
- dataType="purchase_history"
+ <data-shared dataType="financial_data_type_purchase_history"
purposes="analytics" />
- <data-shared dataCategory="financial"
- dataType="credit_score"
+ <data-shared dataType="financial_data_type_credit_score"
purposes="analytics" />
- <data-shared dataCategory="financial"
- dataType="other"
+ <data-shared dataType="financial_data_type_other"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-health-fitness.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-health-fitness.xml
index bac58e6..faf30b0 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-health-fitness.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-health-fitness.xml
@@ -1,8 +1,6 @@
<data-labels>
- <data-shared dataCategory="health_fitness"
- dataType="health"
+ <data-shared dataType="health_fitness_data_type_health"
purposes="analytics" />
- <data-shared dataCategory="health_fitness"
- dataType="fitness"
+ <data-shared dataType="health_fitness_data_type_fitness"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-identifiers.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-identifiers.xml
index ee45f26..5101906 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-identifiers.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-identifiers.xml
@@ -1,5 +1,4 @@
<data-labels>
- <data-shared dataCategory="identifiers"
- dataType="other"
+ <data-shared dataType="identifiers_data_type_other"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-location.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-location.xml
index e8e5911..72cda7e 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-location.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-location.xml
@@ -1,8 +1,6 @@
<data-labels>
- <data-shared dataCategory="location"
- dataType="approx_location"
+ <data-shared dataType="location_data_type_approx_location"
purposes="analytics" />
- <data-shared dataCategory="location"
- dataType="precise_location"
+ <data-shared dataType="location_data_type_precise_location"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-empty-purpose.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-empty-purpose.xml
index 0b220f4..2558681 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-empty-purpose.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-empty-purpose.xml
@@ -1,5 +1,4 @@
<data-labels>
- <data-shared dataCategory="personal"
- dataType="email_address"
+ <data-shared dataType="personal_data_type_email_address"
purposes="" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-missing-purpose.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-missing-purpose.xml
index ac221f2..c5a5475 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-missing-purpose.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-missing-purpose.xml
@@ -1,4 +1,3 @@
<data-labels>
- <data-shared dataCategory="personal"
- dataType="email_address" />
+ <data-shared dataType="personal_data_type_email_address" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-partial.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-partial.xml
index 11b7368..6ccf336 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-partial.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-partial.xml
@@ -1,8 +1,6 @@
<data-labels>
- <data-shared dataCategory="personal"
- dataType="name"
+ <data-shared dataType="personal_data_type_name"
purposes="analytics|developer_communications" />
- <data-shared dataCategory="personal"
- dataType="email_address"
+ <data-shared dataType="personal_data_type_email_address"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-unrecognized-type.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-unrecognized-type.xml
index f1fbd56..bd88ada 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-unrecognized-type.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-unrecognized-type.xml
@@ -1,5 +1,4 @@
<data-labels>
- <data-shared dataCategory="personal"
- dataType="unrecognized"
+ <data-shared dataType="personal_data_type_unrecognized"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal.xml
index 5907462..742ed86 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal.xml
@@ -1,31 +1,21 @@
<data-labels>
- <data-shared dataCategory="personal"
- dataType="name"
- ephemeral="true"
+ <data-shared dataType="personal_data_type_name"
isSharingOptional="true"
purposes="analytics|developer_communications" />
- <data-shared dataCategory="personal"
- dataType="email_address"
+ <data-shared dataType="personal_data_type_email_address"
purposes="analytics" />
- <data-shared dataCategory="personal"
- dataType="physical_address"
+ <data-shared dataType="personal_data_type_physical_address"
purposes="analytics" />
- <data-shared dataCategory="personal"
- dataType="phone_number"
+ <data-shared dataType="personal_data_type_phone_number"
purposes="analytics" />
- <data-shared dataCategory="personal"
- dataType="race_ethnicity"
+ <data-shared dataType="personal_data_type_race_ethnicity"
purposes="analytics" />
- <data-shared dataCategory="personal"
- dataType="political_or_religious_beliefs"
+ <data-shared dataType="personal_data_type_political_or_religious_beliefs"
purposes="analytics" />
- <data-shared dataCategory="personal"
- dataType="sexual_orientation_or_gender_identity"
+ <data-shared dataType="personal_data_type_sexual_orientation_or_gender_identity"
purposes="analytics" />
- <data-shared dataCategory="personal"
- dataType="personal_identifiers"
+ <data-shared dataType="personal_data_type_personal_identifiers"
purposes="analytics" />
- <data-shared dataCategory="personal"
- dataType="other"
+ <data-shared dataType="personal_data_type_other"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-photo-video.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-photo-video.xml
index 05fe159..d416063 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-photo-video.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-photo-video.xml
@@ -1,8 +1,6 @@
<data-labels>
- <data-shared dataCategory="photo_video"
- dataType="photos"
+ <data-shared dataType="photo_video_data_type_photos"
purposes="analytics" />
- <data-shared dataCategory="photo_video"
- dataType="videos"
+ <data-shared dataType="photo_video_data_type_videos"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-search-and-browsing.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-search-and-browsing.xml
index a5de7be..3d932d6 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-search-and-browsing.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-search-and-browsing.xml
@@ -1,5 +1,4 @@
<data-labels>
- <data-shared dataCategory="search_and_browsing"
- dataType="web_browsing_history"
+ <data-shared dataType="search_and_browsing_data_type_web_browsing_history"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-storage.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-storage.xml
index f01e2df..704cb1c 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-storage.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-storage.xml
@@ -1,5 +1,4 @@
<data-labels>
- <data-shared dataCategory="storage"
- dataType="files_docs"
+ <data-shared dataType="storage_data_type_files_docs"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-unrecognized-type.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-unrecognized-type.xml
index f1fbd56..bd88ada 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-unrecognized-type.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-unrecognized-type.xml
@@ -1,5 +1,4 @@
<data-labels>
- <data-shared dataCategory="personal"
- dataType="unrecognized"
+ <data-shared dataType="personal_data_type_unrecognized"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-unrecognized.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-unrecognized.xml
index c5be684..a578d73 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-unrecognized.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-unrecognized.xml
@@ -1,5 +1,4 @@
<data-labels>
- <data-shared dataCategory="unrecognized"
- dataType="email_address"
+ <data-shared dataType="unrecognized_data_type_email_address"
purposes="analytics" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-collected-shared.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-collected-shared.xml
index 161057a..c0bd652 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-collected-shared.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-collected-shared.xml
@@ -1,11 +1,8 @@
<data-labels>
- <data-accessed dataCategory="location"
- dataType="approx_location"
+ <data-accessed dataType="location_data_type_approx_location"
purposes="app_functionality" />
- <data-collected dataCategory="location"
- dataType="precise_location"
+ <data-collected dataType="location_data_type_precise_location"
purposes="app_functionality" />
- <data-shared dataCategory="personal"
- dataType="name"
+ <data-shared dataType="personal_data_type_name"
purposes="app_functionality" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-invalid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-invalid-bool.xml
index bb45f42..d09fc3b 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-invalid-bool.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-invalid-bool.xml
@@ -1,7 +1,5 @@
<data-labels>
- <data-accessed dataCategory="location"
- dataType="approx_location"
- ephemeral="false"
+ <data-accessed dataType="location_data_type_approx_location"
isSharingOptional="false"
purposes="app_functionality" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-valid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-valid-bool.xml
index f927bba..6e7f812 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-valid-bool.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-valid-bool.xml
@@ -1,6 +1,4 @@
<data-labels>
- <data-accessed dataCategory="location"
- dataType="approx_location"
- ephemeral="false"
+ <data-accessed dataType="location_data_type_approx_location"
purposes="app_functionality" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-ephemeral-collision.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-ephemeral-collision.xml
new file mode 100644
index 0000000..ee362fe
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-ephemeral-collision.xml
@@ -0,0 +1,14 @@
+<data-labels>
+ <data-collected dataType="photo_video_data_type_photos"
+ isCollectionOptional="true"
+ purposes="app_functionality" />
+ <data-collected-ephemeral dataType="location_data_type_approx_location"
+ isCollectionOptional="false"
+ purposes="app_functionality" />
+ <data-collected dataType="location_data_type_approx_location"
+ isCollectionOptional="true"
+ purposes="app_functionality" />
+ <data-collected-ephemeral dataType="contacts_data_type_contacts"
+ isCollectionOptional="true"
+ purposes="app_functionality" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-ephemeral.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-ephemeral.xml
new file mode 100644
index 0000000..79c9000
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-ephemeral.xml
@@ -0,0 +1,14 @@
+<data-labels>
+ <data-collected dataType="photo_video_data_type_photos"
+ isCollectionOptional="true"
+ purposes="app_functionality" />
+ <data-collected dataType="location_data_type_precise_location"
+ isCollectionOptional="true"
+ purposes="app_functionality" />
+ <data-collected-ephemeral dataType="location_data_type_approx_location"
+ isCollectionOptional="false"
+ purposes="app_functionality" />
+ <data-collected-ephemeral dataType="contacts_data_type_contacts"
+ isCollectionOptional="true"
+ purposes="app_functionality" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-invalid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-invalid-bool.xml
index ba11afb..801fada 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-invalid-bool.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-invalid-bool.xml
@@ -1,7 +1,5 @@
<data-labels>
- <data-collected dataCategory="location"
- dataType="approx_location"
- ephemeral="false"
+ <data-collected dataType="location_data_type_approx_location"
isSharingOptional="false"
purposes="app_functionality" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-valid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-valid-bool.xml
index 4b6d3977..1ada12d 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-valid-bool.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-valid-bool.xml
@@ -1,7 +1,5 @@
<data-labels>
- <data-collected dataCategory="location"
- dataType="approx_location"
- ephemeral="false"
+ <data-collected dataType="location_data_type_approx_location"
isCollectionOptional="false"
purposes="app_functionality" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-shared-invalid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-shared-invalid-bool.xml
index 7840b98..b327d88 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-shared-invalid-bool.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-shared-invalid-bool.xml
@@ -1,7 +1,5 @@
<data-labels>
- <data-shared dataCategory="location"
- dataType="approx_location"
- ephemeral="false"
+ <data-shared dataType="location_data_type_approx_location"
isCollectionOptional="false"
purposes="app_functionality" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-shared-valid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-shared-valid-bool.xml
index ccf77b0..34bd0de 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-shared-valid-bool.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-shared-valid-bool.xml
@@ -1,7 +1,5 @@
<data-labels>
- <data-shared dataCategory="location"
- dataType="approx_location"
- ephemeral="false"
+ <data-shared dataType="location_data_type_approx_location"
isSharingOptional="false"
purposes="app_functionality" />
</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal-partial.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal-partial.xml
index 14f9ef2..974ea69 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal-partial.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal-partial.xml
@@ -1,17 +1,17 @@
<pbundle_as_map name="data_labels">
<pbundle_as_map name="data_shared">
<pbundle_as_map name="personal">
- <pbundle_as_map name="name">
- <int-array name="purposes" num="2">
- <item value="2" />
- <item value="3" />
- </int-array>
- </pbundle_as_map>
- <pbundle_as_map name="email_address">
- <int-array name="purposes" num="1">
- <item value="2" />
- </int-array>
- </pbundle_as_map>
-</pbundle_as_map>
+ <pbundle_as_map name="name">
+ <int-array name="purposes" num="2">
+ <item value="2" />
+ <item value="3" />
+ </int-array>
+ </pbundle_as_map>
+ <pbundle_as_map name="email_address">
+ <int-array name="purposes" num="1">
+ <item value="2" />
+ </int-array>
+ </pbundle_as_map>
+ </pbundle_as_map>
</pbundle_as_map>
</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal.xml
index 1c87de9..62c26ab 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal.xml
@@ -7,7 +7,6 @@
<item value="3" />
</int-array>
<boolean name="is_sharing_optional" value="true" />
- <boolean name="ephemeral" value="true" />
</pbundle_as_map>
<pbundle_as_map name="email_address">
<int-array name="purposes" num="1">
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-accessed-valid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-accessed-valid-bool.xml
index ddefc18..df000aa 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-accessed-valid-bool.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-accessed-valid-bool.xml
@@ -5,7 +5,6 @@
<int-array name="purposes" num="1">
<item value="1"/>
</int-array>
- <boolean name="ephemeral" value="false"/>
</pbundle_as_map>
</pbundle_as_map>
</pbundle_as_map>
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-collected-ephemeral.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-collected-ephemeral.xml
new file mode 100644
index 0000000..c671c4b
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-collected-ephemeral.xml
@@ -0,0 +1,38 @@
+<pbundle_as_map name="data_labels">
+ <pbundle_as_map name="data_collected">
+ <pbundle_as_map name="photo_video">
+ <pbundle_as_map name="photos">
+ <int-array name="purposes" num="1">
+ <item value="1"/>
+ </int-array>
+ <boolean name="is_collection_optional" value="true"/>
+ <boolean name="ephemeral" value="false"/>
+ </pbundle_as_map>
+ </pbundle_as_map>
+ <pbundle_as_map name="location">
+ <pbundle_as_map name="precise_location">
+ <int-array name="purposes" num="1">
+ <item value="1"/>
+ </int-array>
+ <boolean name="is_collection_optional" value="true"/>
+ <boolean name="ephemeral" value="false"/>
+ </pbundle_as_map>
+ <pbundle_as_map name="approx_location">
+ <int-array name="purposes" num="1">
+ <item value="1"/>
+ </int-array>
+ <boolean name="is_collection_optional" value="false"/>
+ <boolean name="ephemeral" value="true"/>
+ </pbundle_as_map>
+ </pbundle_as_map>
+ <pbundle_as_map name="contacts">
+ <pbundle_as_map name="contacts">
+ <int-array name="purposes" num="1">
+ <item value="1"/>
+ </int-array>
+ <boolean name="is_collection_optional" value="true"/>
+ <boolean name="ephemeral" value="true"/>
+ </pbundle_as_map>
+ </pbundle_as_map>
+ </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-shared-valid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-shared-valid-bool.xml
index 3864f98..0edd8fa26 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-shared-valid-bool.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-shared-valid-bool.xml
@@ -6,7 +6,6 @@
<item value="1"/>
</int-array>
<boolean name="is_sharing_optional" value="false"/>
- <boolean name="ephemeral" value="false"/>
</pbundle_as_map>
</pbundle_as_map>
</pbundle_as_map>
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-data-labels.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-data-labels.xml
index 8997f4f..84456da 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-data-labels.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-data-labels.xml
@@ -1,9 +1,7 @@
<safety-labels version="12345">
<data-labels>
- <data-shared dataCategory="location"
- dataType="approx_location"
+ <data-shared dataType="location_data_type_approx_location"
isSharingOptional="false"
- ephemeral="false"
purposes="app_functionality" />
</data-labels>
</safety-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-data-labels.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-data-labels.xml
index a966fda..fa2a3f8 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-data-labels.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-data-labels.xml
@@ -8,7 +8,6 @@
<item value="1"/>
</int-array>
<boolean name="is_sharing_optional" value="false"/>
- <boolean name="ephemeral" value="false"/>
</pbundle_as_map>
</pbundle_as_map>
</pbundle_as_map>
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/hr/missing-url.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/hr/missing-bool.xml
similarity index 100%
rename from tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/hr/missing-url.xml
rename to tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/hr/missing-bool.xml
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/hr/valid.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/hr/valid.xml
index 6fe86c3..f01d7d2 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/hr/valid.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/hr/valid.xml
@@ -1 +1 @@
-<system-app-safety-label url="www.example.com"></system-app-safety-label>
\ No newline at end of file
+<system-app-safety-label declaration="true"></system-app-safety-label>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/od/missing-url.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/od/missing-bool.xml
similarity index 100%
rename from tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/od/missing-url.xml
rename to tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/od/missing-bool.xml
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/od/valid.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/od/valid.xml
index f96535b..fad631b 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/od/valid.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/od/valid.xml
@@ -1,3 +1,3 @@
<pbundle_as_map name="system_app_safety_label">
- <string name="url" value="www.example.com"/>
+ <boolean name="declaration" value="true"/>
</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/hr.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/hr.xml
index 8f854ad..41b32b5 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/hr.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/hr.xml
@@ -1,15 +1,13 @@
<app-metadata-bundles version="123">
<safety-labels version="12345">
<data-labels>
- <data-shared dataCategory="location"
- dataType="approx_location"
+ <data-shared
+ dataType="location_data_type_approx_location"
isSharingOptional="false"
- ephemeral="false"
purposes="app_functionality" />
- <data-shared dataCategory="location"
- dataType="precise_location"
+ <data-shared
+ dataType="location_data_type_precise_location"
isSharingOptional="true"
- ephemeral="true"
purposes="app_functionality|analytics" />
</data-labels>
<security-labels
@@ -19,7 +17,7 @@
<third-party-verification url="www.example.com">
</third-party-verification>
</safety-labels>
- <system-app-safety-label url="www.example.com">
+ <system-app-safety-label declaration="true">
</system-app-safety-label>
<transparency-info>
<developer-info
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/od.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/od.xml
index 8f1dc64..c11ac43 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/od.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/od.xml
@@ -10,7 +10,6 @@
<item value="1"/>
</int-array>
<boolean name="is_sharing_optional" value="false"/>
- <boolean name="ephemeral" value="false"/>
</pbundle_as_map>
<pbundle_as_map name="precise_location">
<int-array name="purposes" num="2">
@@ -18,7 +17,6 @@
<item value="2"/>
</int-array>
<boolean name="is_sharing_optional" value="true"/>
- <boolean name="ephemeral" value="true"/>
</pbundle_as_map>
</pbundle_as_map>
</pbundle_as_map>
@@ -32,7 +30,7 @@
</pbundle_as_map>
</pbundle_as_map>
<pbundle_as_map name="system_app_safety_label">
- <string name="url" value="www.example.com"/>
+ <boolean name="declaration" value="true"/>
</pbundle_as_map>
<pbundle_as_map name="transparency_info">
<pbundle_as_map name="developer_info">