Merge "[conflict] Merge changes Ie810d37d,I6947e1f7 into tm-qpr-dev am: 33b100711a am: 9e708c9958"
diff --git a/core/api/current.txt b/core/api/current.txt
index 3174c28..e2f2fae 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -18434,7 +18434,7 @@
method public android.graphics.Point getLeftEyePosition();
method public android.graphics.Point getMouthPosition();
method public android.graphics.Point getRightEyePosition();
- method public int getScore();
+ method @IntRange(from=android.hardware.camera2.params.Face.SCORE_MIN, to=android.hardware.camera2.params.Face.SCORE_MAX) public int getScore();
field public static final int ID_UNSUPPORTED = -1; // 0xffffffff
field public static final int SCORE_MAX = 100; // 0x64
field public static final int SCORE_MIN = 1; // 0x1
@@ -18449,7 +18449,7 @@
method @NonNull public android.hardware.camera2.params.Face.Builder setLeftEyePosition(@NonNull android.graphics.Point);
method @NonNull public android.hardware.camera2.params.Face.Builder setMouthPosition(@NonNull android.graphics.Point);
method @NonNull public android.hardware.camera2.params.Face.Builder setRightEyePosition(@NonNull android.graphics.Point);
- method @NonNull public android.hardware.camera2.params.Face.Builder setScore(int);
+ method @NonNull public android.hardware.camera2.params.Face.Builder setScore(@IntRange(from=android.hardware.camera2.params.Face.SCORE_MIN, to=android.hardware.camera2.params.Face.SCORE_MAX) int);
}
public final class InputConfiguration {
@@ -50112,7 +50112,7 @@
method public void dispatchCreateViewTranslationRequest(@NonNull java.util.Map<android.view.autofill.AutofillId,long[]>, @NonNull int[], @NonNull android.view.translation.TranslationCapability, @NonNull java.util.List<android.view.translation.ViewTranslationRequest>);
method public void dispatchDisplayHint(int);
method public boolean dispatchDragEvent(android.view.DragEvent);
- method protected void dispatchDraw(android.graphics.Canvas);
+ method protected void dispatchDraw(@NonNull android.graphics.Canvas);
method public void dispatchDrawableHotspotChanged(float, float);
method @CallSuper public void dispatchFinishTemporaryDetach();
method protected boolean dispatchGenericFocusedEvent(android.view.MotionEvent);
@@ -50150,7 +50150,7 @@
method @NonNull public android.view.WindowInsetsAnimation.Bounds dispatchWindowInsetsAnimationStart(@NonNull android.view.WindowInsetsAnimation, @NonNull android.view.WindowInsetsAnimation.Bounds);
method @Deprecated public void dispatchWindowSystemUiVisiblityChanged(int);
method public void dispatchWindowVisibilityChanged(int);
- method @CallSuper public void draw(android.graphics.Canvas);
+ method @CallSuper public void draw(@NonNull android.graphics.Canvas);
method @CallSuper public void drawableHotspotChanged(float, float);
method @CallSuper protected void drawableStateChanged();
method public android.view.View findFocus();
@@ -50443,9 +50443,9 @@
method @CallSuper protected void onDetachedFromWindow();
method protected void onDisplayHint(int);
method public boolean onDragEvent(android.view.DragEvent);
- method protected void onDraw(android.graphics.Canvas);
- method public void onDrawForeground(android.graphics.Canvas);
- method protected final void onDrawScrollBars(android.graphics.Canvas);
+ method protected void onDraw(@NonNull android.graphics.Canvas);
+ method public void onDrawForeground(@NonNull android.graphics.Canvas);
+ method protected final void onDrawScrollBars(@NonNull android.graphics.Canvas);
method public boolean onFilterTouchEventForSecurity(android.view.MotionEvent);
method @CallSuper protected void onFinishInflate();
method public void onFinishTemporaryDetach();
@@ -50931,7 +50931,7 @@
ctor public View.DragShadowBuilder(android.view.View);
ctor public View.DragShadowBuilder();
method public final android.view.View getView();
- method public void onDrawShadow(android.graphics.Canvas);
+ method public void onDrawShadow(@NonNull android.graphics.Canvas);
method public void onProvideShadowMetrics(android.graphics.Point, android.graphics.Point);
}
@@ -51161,7 +51161,7 @@
method public void dispatchSetActivated(boolean);
method public void dispatchSetSelected(boolean);
method protected void dispatchThawSelfOnly(android.util.SparseArray<android.os.Parcelable>);
- method protected boolean drawChild(android.graphics.Canvas, android.view.View, long);
+ method protected boolean drawChild(@NonNull android.graphics.Canvas, android.view.View, long);
method public void endViewTransition(android.view.View);
method public android.view.View focusSearch(android.view.View, int);
method public void focusableViewAvailable(android.view.View);
diff --git a/core/java/android/content/AttributionSource.java b/core/java/android/content/AttributionSource.java
index b0c6cbc..e981581 100644
--- a/core/java/android/content/AttributionSource.java
+++ b/core/java/android/content/AttributionSource.java
@@ -29,6 +29,7 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Process;
+import android.os.UserHandle;
import android.permission.PermissionManager;
import android.util.ArraySet;
@@ -297,7 +298,7 @@
public boolean checkCallingUid() {
final int callingUid = Binder.getCallingUid();
if (callingUid != Process.ROOT_UID
- && callingUid != Process.SYSTEM_UID
+ && UserHandle.getAppId(callingUid) != Process.SYSTEM_UID
&& callingUid != mAttributionSourceState.uid) {
return false;
}
diff --git a/core/java/android/hardware/camera2/params/DeviceStateSensorOrientationMap.java b/core/java/android/hardware/camera2/params/DeviceStateSensorOrientationMap.java
index b9a327b..d9ee561 100644
--- a/core/java/android/hardware/camera2/params/DeviceStateSensorOrientationMap.java
+++ b/core/java/android/hardware/camera2/params/DeviceStateSensorOrientationMap.java
@@ -204,7 +204,7 @@
*
*/
@SuppressLint("MissingGetterMatchingBuilder")
- public @NonNull Builder addOrientationForState(long deviceState, long angle) {
+ public @NonNull Builder addOrientationForState(@DeviceState long deviceState, long angle) {
if (angle % 90 != 0) {
throw new IllegalArgumentException("Sensor orientation not divisible by 90: "
+ angle);
diff --git a/core/java/android/hardware/camera2/params/Face.java b/core/java/android/hardware/camera2/params/Face.java
index 1d9a5a3a..32688a72 100644
--- a/core/java/android/hardware/camera2/params/Face.java
+++ b/core/java/android/hardware/camera2/params/Face.java
@@ -17,6 +17,7 @@
package android.hardware.camera2.params;
+import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.graphics.Point;
@@ -173,6 +174,7 @@
* @see #SCORE_MAX
* @see #SCORE_MIN
*/
+ @IntRange(from = SCORE_MIN, to = SCORE_MAX)
public int getScore() {
return mScore;
}
@@ -377,7 +379,7 @@
* @param score Confidence level between {@value #SCORE_MIN}-{@value #SCORE_MAX}.
* @return This builder.
*/
- public @NonNull Builder setScore(int score) {
+ public @NonNull Builder setScore(@IntRange(from = SCORE_MIN, to = SCORE_MAX) int score) {
checkNotUsed();
checkScore(score);
mBuilderFieldsSet |= FIELD_SCORE;
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 49d9e67..2b071db 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -17434,7 +17434,7 @@
* (but after its own view has been drawn).
* @param canvas the canvas on which to draw the view
*/
- protected void dispatchDraw(Canvas canvas) {
+ protected void dispatchDraw(@NonNull Canvas canvas) {
}
@@ -20719,7 +20719,7 @@
out.bottom = mScrollY + mBottom - mTop;
}
- private void onDrawScrollIndicators(Canvas c) {
+ private void onDrawScrollIndicators(@NonNull Canvas c) {
if ((mPrivateFlags3 & SCROLL_INDICATORS_PFLAG3_MASK) == 0) {
// No scroll indicators enabled.
return;
@@ -20903,7 +20903,7 @@
*
* @see #awakenScrollBars(int)
*/
- protected final void onDrawScrollBars(Canvas canvas) {
+ protected final void onDrawScrollBars(@NonNull Canvas canvas) {
// scrollbars are drawn only when the animation is running
final ScrollabilityCache cache = mScrollCache;
@@ -21015,7 +21015,7 @@
* @hide
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- protected void onDrawHorizontalScrollBar(Canvas canvas, Drawable scrollBar,
+ protected void onDrawHorizontalScrollBar(@NonNull Canvas canvas, Drawable scrollBar,
int l, int t, int r, int b) {
scrollBar.setBounds(l, t, r, b);
scrollBar.draw(canvas);
@@ -21035,7 +21035,7 @@
* @hide
*/
@UnsupportedAppUsage
- protected void onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar,
+ protected void onDrawVerticalScrollBar(@NonNull Canvas canvas, Drawable scrollBar,
int l, int t, int r, int b) {
scrollBar.setBounds(l, t, r, b);
scrollBar.draw(canvas);
@@ -21046,7 +21046,7 @@
*
* @param canvas the canvas on which the background will be drawn
*/
- protected void onDraw(Canvas canvas) {
+ protected void onDraw(@NonNull Canvas canvas) {
}
/*
@@ -23161,7 +23161,7 @@
*
* @hide
*/
- protected final boolean drawsWithRenderNode(Canvas canvas) {
+ protected final boolean drawsWithRenderNode(@NonNull Canvas canvas) {
return mAttachInfo != null
&& mAttachInfo.mHardwareAccelerated
&& canvas.isHardwareAccelerated();
@@ -23173,7 +23173,7 @@
* This is where the View specializes rendering behavior based on layer type,
* and hardware acceleration.
*/
- boolean draw(Canvas canvas, ViewGroup parent, long drawingTime) {
+ boolean draw(@NonNull Canvas canvas, ViewGroup parent, long drawingTime) {
final boolean hardwareAcceleratedCanvas = canvas.isHardwareAccelerated();
@@ -23461,7 +23461,7 @@
return (int) (dips * scale + 0.5f);
}
- final private void debugDrawFocus(Canvas canvas) {
+ private void debugDrawFocus(@NonNull Canvas canvas) {
if (isFocused()) {
final int cornerSquareSize = dipsToPixels(DEBUG_CORNERS_SIZE_DIP);
final int l = mScrollX;
@@ -23496,7 +23496,7 @@
* @param canvas The Canvas to which the View is rendered.
*/
@CallSuper
- public void draw(Canvas canvas) {
+ public void draw(@NonNull Canvas canvas) {
final int privateFlags = mPrivateFlags;
mPrivateFlags = (privateFlags & ~PFLAG_DIRTY_MASK) | PFLAG_DRAWN;
@@ -23731,7 +23731,7 @@
* @param canvas Canvas on which to draw the background
*/
@UnsupportedAppUsage
- private void drawBackground(Canvas canvas) {
+ private void drawBackground(@NonNull Canvas canvas) {
final Drawable background = mBackground;
if (background == null) {
return;
@@ -24631,7 +24631,7 @@
* Draw the default focus highlight onto the canvas if there is one and this view is focused.
* @param canvas the canvas where we're drawing the highlight.
*/
- private void drawDefaultFocusHighlight(Canvas canvas) {
+ private void drawDefaultFocusHighlight(@NonNull Canvas canvas) {
if (mDefaultFocusHighlight != null && isFocused()) {
if (mDefaultFocusHighlightSizeChanged) {
mDefaultFocusHighlightSizeChanged = false;
@@ -25429,7 +25429,7 @@
*
* @param canvas canvas to draw into
*/
- public void onDrawForeground(Canvas canvas) {
+ public void onDrawForeground(@NonNull Canvas canvas) {
onDrawScrollIndicators(canvas);
onDrawScrollBars(canvas);
@@ -27487,7 +27487,7 @@
*
* @param canvas A {@link android.graphics.Canvas} object in which to draw the shadow image.
*/
- public void onDrawShadow(Canvas canvas) {
+ public void onDrawShadow(@NonNull Canvas canvas) {
final View view = mView.get();
if (view != null) {
view.draw(canvas);
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index c4f20dc..46b2cfc 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -4166,7 +4166,7 @@
/**
* @hide
*/
- protected void onDebugDrawMargins(Canvas canvas, Paint paint) {
+ protected void onDebugDrawMargins(@NonNull Canvas canvas, Paint paint) {
for (int i = 0; i < getChildCount(); i++) {
View c = getChildAt(i);
c.getLayoutParams().onDebugDraw(c, canvas, paint);
@@ -4176,7 +4176,7 @@
/**
* @hide
*/
- protected void onDebugDraw(Canvas canvas) {
+ protected void onDebugDraw(@NonNull Canvas canvas) {
Paint paint = getDebugPaint();
// Draw optical bounds
@@ -4224,7 +4224,7 @@
}
@Override
- protected void dispatchDraw(Canvas canvas) {
+ protected void dispatchDraw(@NonNull Canvas canvas) {
final int childrenCount = mChildrenCount;
final View[] children = mChildren;
int flags = mGroupFlags;
@@ -4533,7 +4533,7 @@
* @param drawingTime The time at which draw is occurring
* @return True if an invalidate() was issued
*/
- protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
+ protected boolean drawChild(@NonNull Canvas canvas, View child, long drawingTime) {
return child.draw(canvas, this, drawingTime);
}
@@ -9208,7 +9208,8 @@
}
}
- private static void drawRect(Canvas canvas, Paint paint, int x1, int y1, int x2, int y2) {
+ private static void drawRect(@NonNull Canvas canvas, Paint paint, int x1, int y1,
+ int x2, int y2) {
if (sDebugLines== null) {
// TODO: This won't work with multiple UI threads in a single process
sDebugLines = new float[16];
diff --git a/core/java/android/view/inputmethod/RemoteInputConnectionImpl.java b/core/java/android/view/inputmethod/RemoteInputConnectionImpl.java
index a927765..c01c310 100644
--- a/core/java/android/view/inputmethod/RemoteInputConnectionImpl.java
+++ b/core/java/android/view/inputmethod/RemoteInputConnectionImpl.java
@@ -1015,27 +1015,6 @@
});
}
- /**
- * Dispatches {@link InputConnection#requestCursorUpdates(int)}.
- *
- * <p>This method is intended to be called only from {@link InputMethodManager}.</p>
- * @param cursorUpdateMode the mode for {@link InputConnection#requestCursorUpdates(int, int)}
- * @param cursorUpdateFilter the filter for
- * {@link InputConnection#requestCursorUpdates(int, int)}
- * @param imeDisplayId displayId on which IME is displayed.
- */
- @Dispatching(cancellable = true)
- public void requestCursorUpdatesFromImm(int cursorUpdateMode, int cursorUpdateFilter,
- int imeDisplayId) {
- final int currentSessionId = mCurrentSessionId.get();
- dispatchWithTracing("requestCursorUpdatesFromImm", () -> {
- if (currentSessionId != mCurrentSessionId.get()) {
- return; // cancelled
- }
- requestCursorUpdatesInternal(cursorUpdateMode, cursorUpdateFilter, imeDisplayId);
- });
- }
-
@Dispatching(cancellable = true)
@Override
public void requestCursorUpdates(InputConnectionCommandHeader header, int cursorUpdateMode,
diff --git a/core/java/android/window/IWindowOrganizerController.aidl b/core/java/android/window/IWindowOrganizerController.aidl
index 36eaf49..57e0ce8 100644
--- a/core/java/android/window/IWindowOrganizerController.aidl
+++ b/core/java/android/window/IWindowOrganizerController.aidl
@@ -105,4 +105,7 @@
/** @return An interface enabling the transition players to report its metrics. */
ITransitionMetricsReporter getTransitionMetricsReporter();
+
+ /** @return The transaction queue token used by WM. */
+ IBinder getApplyToken();
}
diff --git a/core/java/android/window/WindowOrganizer.java b/core/java/android/window/WindowOrganizer.java
index 2a80d02..930aaa2 100644
--- a/core/java/android/window/WindowOrganizer.java
+++ b/core/java/android/window/WindowOrganizer.java
@@ -26,6 +26,7 @@
import android.os.RemoteException;
import android.util.Singleton;
import android.view.RemoteAnimationAdapter;
+import android.view.SurfaceControl;
/**
* Base class for organizing specific types of windows like Tasks and DisplayAreas
@@ -184,6 +185,26 @@
}
}
+ /**
+ * Use WM's transaction-queue instead of Shell's independent one. This is necessary
+ * if WM and Shell need to coordinate transactions (eg. for shell transitions).
+ * @return true if successful, false otherwise.
+ * @hide
+ */
+ public boolean shareTransactionQueue() {
+ final IBinder wmApplyToken;
+ try {
+ wmApplyToken = getWindowOrganizerController().getApplyToken();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ if (wmApplyToken == null) {
+ return false;
+ }
+ SurfaceControl.Transaction.setDefaultApplyToken(wmApplyToken);
+ return true;
+ }
+
static IWindowOrganizerController getWindowOrganizerController() {
return IWindowOrganizerControllerSingleton.get();
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 16e0a59..f0fbff1 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -7211,6 +7211,10 @@
</intent-filter>
</service>
+ <service android:name="com.android.server.art.BackgroundDexOptJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE" >
+ </service>
+
<provider
android:name="com.android.server.textclassifier.IconsContentProvider"
android:authorities="com.android.textclassifier.icons"
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
index 89205a6..519ec14 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
@@ -175,6 +175,9 @@
}
private void onInit() {
+ if (Transitions.ENABLE_SHELL_TRANSITIONS) {
+ mOrganizer.shareTransactionQueue();
+ }
mShellController.addExternalInterface(KEY_EXTRA_SHELL_SHELL_TRANSITIONS,
this::createExternalInterface, this);
diff --git a/packages/CredentialManager/res/drawable/ic_profile.xml b/packages/CredentialManager/res/drawable/ic_profile.xml
new file mode 100644
index 0000000..ae65940
--- /dev/null
+++ b/packages/CredentialManager/res/drawable/ic_profile.xml
@@ -0,0 +1,11 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"
+ android:viewportWidth="46"
+ android:viewportHeight="46"
+ android:width="46dp"
+ android:height="46dp">
+ <path
+ android:pathData="M45.4247 22.9953C45.4247 35.0229 35.4133 44.7953 23.0359 44.7953C10.6585 44.7953 0.646973 35.0229 0.646973 22.9953C0.646973 10.9677 10.6585 1.19531 23.0359 1.19531C35.4133 1.19531 45.4247 10.9677 45.4247 22.9953Z"
+ android:strokeColor="#202124"
+ android:strokeAlpha="0.13"
+ android:strokeWidth="1" />
+</vector>
\ No newline at end of file
diff --git a/packages/CredentialManager/res/values/strings.xml b/packages/CredentialManager/res/values/strings.xml
index c6779fa..08ab1b4 100644
--- a/packages/CredentialManager/res/values/strings.xml
+++ b/packages/CredentialManager/res/values/strings.xml
@@ -22,4 +22,9 @@
<string name="choose_create_option_description">You can use saved <xliff:g id="type">%1$s</xliff:g> on any device. It will be saved to <xliff:g id="providerInfoDisplayName">%2$s</xliff:g> for <xliff:g id="createInfoDisplayName">%3$s</xliff:g></string>
<string name="more_options_title_multiple_options"><xliff:g id="providerInfoDisplayName">%1$s</xliff:g> for <xliff:g id="createInfoTitle">%2$s</xliff:g></string>
<string name="more_options_title_one_option"><xliff:g id="providerInfoDisplayName">%1$s</xliff:g></string>
+ <string name="more_options_usage_data"><xliff:g id="passwordsNumber">%1$s</xliff:g> passwords and <xliff:g id="passkeyssNumber">%2$s</xliff:g> passkeys saved</string>
+ <string name="passkeys">passkeys</string>
+ <string name="passwords">passwords</string>
+ <string name="sign_ins">sign-ins</string>
+ <string name="createOptionInfo_icon_description">CreateOptionInfo credentialType icon</string>
</resources>
\ No newline at end of file
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt
index 01348e4..3d1fc92 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt
@@ -33,8 +33,10 @@
import android.os.Binder
import android.os.Bundle
import android.os.ResultReceiver
+import com.android.credentialmanager.createflow.ActiveEntry
import com.android.credentialmanager.createflow.CreatePasskeyUiState
import com.android.credentialmanager.createflow.CreateScreenState
+import com.android.credentialmanager.createflow.ProviderInfo
import com.android.credentialmanager.createflow.RequestDisplayInfo
import com.android.credentialmanager.getflow.GetCredentialUiState
import com.android.credentialmanager.getflow.GetScreenState
@@ -119,6 +121,10 @@
val providerList = CreateFlowUtils.toProviderList(
// Handle runtime cast error
providerList as List<CreateCredentialProviderData>, context)
+ var hasDefault = false
+ var defaultProvider: ProviderInfo = providerList.first()
+ providerList.forEach{providerInfo ->
+ if (providerInfo.isDefault) {hasDefault = true; defaultProvider = providerInfo} }
// TODO: covert from real requestInfo
val requestDisplayInfo = RequestDisplayInfo(
"Elisa Beckett",
@@ -127,8 +133,12 @@
"tribank")
return CreatePasskeyUiState(
providers = providerList,
- currentScreenState = CreateScreenState.PASSKEY_INTRO,
+ if (hasDefault)
+ {CreateScreenState.CREATION_OPTION_SELECTION} else {CreateScreenState.PASSKEY_INTRO},
requestDisplayInfo,
+ if (hasDefault) {
+ ActiveEntry(defaultProvider, defaultProvider.createOptions.first())
+ } else null
)
}
@@ -150,38 +160,39 @@
// TODO: below are prototype functionalities. To be removed for productionization.
private fun testCreateCredentialProviderList(): List<CreateCredentialProviderData> {
return listOf(
- CreateCredentialProviderData.Builder("com.google/com.google.CredentialManagerService")
+ CreateCredentialProviderData
+ .Builder("com.google/com.google.CredentialManagerService")
.setSaveEntries(
listOf<Entry>(
newEntry("key1", "subkey-1", "elisa.beckett@gmail.com",
- "Elisa Backett", "20 passwords and 7 passkeys saved"),
+ 20, 7, 27, 10000),
newEntry("key1", "subkey-2", "elisa.work@google.com",
- "Elisa Backett Work", "20 passwords and 7 passkeys saved"),
+ 20, 7, 27, 11000),
)
)
.setActionChips(
listOf<Entry>(
- newEntry("key2", "subkey-1", "Go to Settings", "",
- "20 passwords and 7 passkeys saved"),
- newEntry("key2", "subkey-2", "Switch Account", "",
- "20 passwords and 7 passkeys saved"),
+ newEntry("key2", "subkey-1", "Go to Settings",
+ 20, 7, 27, 20000),
+ newEntry("key2", "subkey-2", "Switch Account",
+ 20, 7, 27, 21000),
),
)
- .setIsDefaultProvider(true)
+ .setIsDefaultProvider(false)
.build(),
- CreateCredentialProviderData.Builder("com.dashlane/com.dashlane.CredentialManagerService")
+ CreateCredentialProviderData
+ .Builder("com.dashlane/com.dashlane.CredentialManagerService")
.setSaveEntries(
listOf<Entry>(
newEntry("key1", "subkey-3", "elisa.beckett@dashlane.com",
- "Elisa Backett", "20 passwords and 7 passkeys saved"),
+ 20, 7, 27, 30000),
newEntry("key1", "subkey-4", "elisa.work@dashlane.com",
- "Elisa Backett Work", "20 passwords and 7 passkeys saved"),
+ 20, 7, 27, 31000),
)
).setActionChips(
listOf<Entry>(
newEntry("key2", "subkey-3", "Manage Accounts",
- "Manage your accounts in the dashlane app",
- "20 passwords and 7 passkeys saved"),
+ 20, 7, 27, 32000),
),
).build(),
)
@@ -193,31 +204,30 @@
.setCredentialEntries(
listOf<Entry>(
newEntry("key1", "subkey-1", "elisa.beckett@gmail.com",
- "Elisa Backett", "20 passwords and 7 passkeys saved"),
+ 20, 7, 27, 10000),
newEntry("key1", "subkey-2", "elisa.work@google.com",
- "Elisa Backett Work", "20 passwords and 7 passkeys saved"),
+ 20, 7, 27, 11000),
)
).setActionChips(
listOf<Entry>(
- newEntry("key2", "subkey-1", "Go to Settings", "",
- "20 passwords and 7 passkeys saved"),
- newEntry("key2", "subkey-2", "Switch Account", "",
- "20 passwords and 7 passkeys saved"),
+ newEntry("key2", "subkey-1", "Go to Settings",
+ 20, 7, 27, 20000),
+ newEntry("key2", "subkey-2", "Switch Account",
+ 20, 7, 27, 21000),
),
).build(),
GetCredentialProviderData.Builder("com.dashlane/com.dashlane.CredentialManagerService")
.setCredentialEntries(
listOf<Entry>(
newEntry("key1", "subkey-3", "elisa.beckett@dashlane.com",
- "Elisa Backett", "20 passwords and 7 passkeys saved"),
+ 20, 7, 27, 30000),
newEntry("key1", "subkey-4", "elisa.work@dashlane.com",
- "Elisa Backett Work", "20 passwords and 7 passkeys saved"),
+ 20, 7, 27, 31000),
)
).setActionChips(
listOf<Entry>(
newEntry("key2", "subkey-3", "Manage Accounts",
- "Manage your accounts in the dashlane app",
- "20 passwords and 7 passkeys saved"),
+ 20, 7, 27, 40000),
),
).build(),
)
@@ -226,20 +236,32 @@
private fun newEntry(
key: String,
subkey: String,
- title: String,
- subtitle: String,
- usageData: String
+ providerDisplayName: String,
+ passwordCount: Int,
+ passkeyCount: Int,
+ totalCredentialCount: Int,
+ lastUsedTimeMillis: Long,
): Entry {
val slice = Slice.Builder(
Entry.CREDENTIAL_MANAGER_ENTRY_URI, SliceSpec(Entry.VERSION, 1)
)
- .addText(title, null, listOf(Entry.HINT_TITLE))
- .addText(subtitle, null, listOf(Entry.HINT_SUBTITLE))
+ .addText(
+ providerDisplayName, null, listOf(Entry.HINT_USER_PROVIDER_ACCOUNT_NAME))
.addIcon(
Icon.createWithResource(context, R.drawable.ic_passkey),
null,
- listOf(Entry.HINT_ICON))
- .addText(usageData, Slice.SUBTYPE_MESSAGE, listOf(Entry.HINT_SUBTITLE))
+ listOf(Entry.HINT_CREDENTIAL_TYPE_ICON))
+ .addIcon(
+ Icon.createWithResource(context, R.drawable.ic_profile),
+ null,
+ listOf(Entry.HINT_PROFILE_ICON))
+ .addInt(
+ passwordCount, null, listOf(Entry.HINT_PASSWORD_COUNT))
+ .addInt(
+ passkeyCount, null, listOf(Entry.HINT_PASSKEY_COUNT))
+ .addInt(
+ totalCredentialCount, null, listOf(Entry.HINT_TOTAL_CREDENTIAL_COUNT))
+ .addLong(lastUsedTimeMillis, null, listOf(Entry.HINT_LAST_USED_TIME_MILLIS))
.build()
return Entry(
key,
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt b/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt
index bf0dba2..3a8e975 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt
@@ -23,6 +23,7 @@
import com.android.credentialmanager.createflow.CreateOptionInfo
import com.android.credentialmanager.getflow.CredentialOptionInfo
import com.android.credentialmanager.getflow.ProviderInfo
+import com.android.credentialmanager.jetpack.provider.SaveEntryUi
/** Utility functions for converting CredentialManager data structures to or from UI formats. */
class GetFlowUtils {
@@ -59,8 +60,6 @@
// TODO: remove fallbacks
icon = credentialEntryUi.icon?.loadDrawable(context)
?: context.getDrawable(R.drawable.ic_passkey)!!,
- title = credentialEntryUi.userName.toString(),
- subtitle = credentialEntryUi.displayName?.toString() ?: "Unknown display name",
entryKey = it.key,
entrySubkey = it.subkey,
usageData = credentialEntryUi.usageData?.toString() ?: "Unknown usageData",
@@ -82,9 +81,7 @@
// TODO: replace to extract from the service data structure when available
icon = context.getDrawable(R.drawable.ic_passkey)!!,
name = it.providerFlattenedComponentName,
- // TODO: get the service display name and icon from the component name.
displayName = it.providerFlattenedComponentName,
- credentialTypeIcon = context.getDrawable(R.drawable.ic_passkey)!!,
createOptions = toCreationOptionInfoList(it.saveEntries, context),
isDefault = it.isDefaultProvider,
)
@@ -100,13 +97,17 @@
return@map CreateOptionInfo(
// TODO: remove fallbacks
- icon = saveEntryUi.icon?.loadDrawable(context)
- ?: context.getDrawable(R.drawable.ic_passkey)!!,
- title = saveEntryUi.title.toString(),
- subtitle = saveEntryUi.subTitle?.toString() ?: "Unknown subtitle",
entryKey = it.key,
entrySubkey = it.subkey,
- usageData = saveEntryUi.usageData?.toString() ?: "Unknown usageData",
+ userProviderDisplayName = saveEntryUi.userProviderAccountName as String,
+ credentialTypeIcon = saveEntryUi.credentialTypeIcon?.loadDrawable(context)
+ ?: context.getDrawable(R.drawable.ic_passkey)!!,
+ profileIcon = saveEntryUi.profileIcon?.loadDrawable(context)
+ ?: context.getDrawable(R.drawable.ic_profile)!!,
+ passwordCount = saveEntryUi.passwordCount ?: 0,
+ passkeyCount = saveEntryUi.passkeyCount ?: 0,
+ totalCredentialCount = saveEntryUi.totalCredentialCount ?: 0,
+ lastUsedTimeMillis = saveEntryUi.lastUsedTimeMillis ?: 0,
)
}
}
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/SaveEntryUi.kt b/packages/CredentialManager/src/com/android/credentialmanager/SaveEntryUi.kt
deleted file mode 100644
index cd52197..0000000
--- a/packages/CredentialManager/src/com/android/credentialmanager/SaveEntryUi.kt
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.credentialmanager
-
-import android.app.slice.Slice
-import android.credentials.ui.Entry
-import android.graphics.drawable.Icon
-
-/**
- * UI representation for a save entry used during the create credential flow.
- *
- * TODO: move to jetpack.
- */
-class SaveEntryUi(
- val title: CharSequence,
- val subTitle: CharSequence?,
- val icon: Icon?,
- val usageData: CharSequence?,
- // TODO: add
-) {
- companion object {
- fun fromSlice(slice: Slice): SaveEntryUi {
- val items = slice.items
-
- var title: String? = null
- var subTitle: String? = null
- var icon: Icon? = null
- var usageData: String? = null
-
- items.forEach {
- if (it.hasHint(Entry.HINT_ICON)) {
- icon = it.icon
- } else if (it.hasHint(Entry.HINT_SUBTITLE) && it.subType == null) {
- subTitle = it.text.toString()
- } else if (it.hasHint(Entry.HINT_TITLE)) {
- title = it.text.toString()
- } else if (it.hasHint(Entry.HINT_SUBTITLE) && it.subType == Slice.SUBTYPE_MESSAGE) {
- usageData = it.text.toString()
- }
- }
- // TODO: fail NPE more elegantly.
- return SaveEntryUi(title!!, subTitle, icon, usageData)
- }
- }
-}
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt
index db0f337e..d7e5ee8 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt
@@ -22,20 +22,27 @@
val icon: Drawable,
val name: String,
val displayName: String,
- val credentialTypeIcon: Drawable,
val createOptions: List<CreateOptionInfo>,
val isDefault: Boolean,
)
-data class CreateOptionInfo(
- val icon: Drawable,
- val title: String,
- val subtitle: String,
+open class EntryInfo (
val entryKey: String,
val entrySubkey: String,
- val usageData: String
)
+class CreateOptionInfo(
+ entryKey: String,
+ entrySubkey: String,
+ val userProviderDisplayName: String,
+ val credentialTypeIcon: Drawable,
+ val profileIcon: Drawable,
+ val passwordCount: Int,
+ val passkeyCount: Int,
+ val totalCredentialCount: Int,
+ val lastUsedTimeMillis: Long?,
+) : EntryInfo(entryKey, entrySubkey)
+
data class RequestDisplayInfo(
val userName: String,
val displayName: String,
@@ -49,7 +56,7 @@
*/
data class ActiveEntry (
val activeProvider: ProviderInfo,
- val activeCreateOptionInfo: CreateOptionInfo,
+ val activeEntryInfo: EntryInfo,
)
/** The name of the current screen. */
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreatePasskeyComponents.kt b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreatePasskeyComponents.kt
index aeea46a..13a892f 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreatePasskeyComponents.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreatePasskeyComponents.kt
@@ -74,7 +74,7 @@
CreateScreenState.CREATION_OPTION_SELECTION -> CreationSelectionCard(
requestDisplayInfo = uiState.requestDisplayInfo,
providerInfo = uiState.activeEntry?.activeProvider!!,
- createOptionInfo = uiState.activeEntry.activeCreateOptionInfo,
+ createOptionInfo = uiState.activeEntry.activeEntryInfo as CreateOptionInfo,
onOptionSelected = viewModel::onPrimaryCreateOptionInfoSelected,
onConfirm = viewModel::onPrimaryCreateOptionInfoSelected,
onCancel = viewModel::onCancel,
@@ -408,7 +408,7 @@
) {
Column() {
Icon(
- bitmap = providerInfo.credentialTypeIcon.toBitmap().asImageBitmap(),
+ bitmap = createOptionInfo.credentialTypeIcon.toBitmap().asImageBitmap(),
contentDescription = null,
tint = Color.Unspecified,
modifier = Modifier.align(alignment = Alignment.CenterHorizontally).padding(all = 24.dp)
@@ -436,12 +436,12 @@
text = stringResource(
R.string.choose_create_option_description,
when (requestDisplayInfo.type) {
- TYPE_PUBLIC_KEY_CREDENTIAL -> "passkeys"
- TYPE_PASSWORD_CREDENTIAL -> "passwords"
- else -> "sign-ins"
+ TYPE_PUBLIC_KEY_CREDENTIAL -> stringResource(R.string.passkeys)
+ TYPE_PASSWORD_CREDENTIAL -> stringResource(R.string.passwords)
+ else -> stringResource(R.string.sign_ins)
},
providerInfo.displayName,
- createOptionInfo.title),
+ createOptionInfo.userProviderDisplayName),
style = Typography.body1,
modifier = Modifier.padding(all = 24.dp).align(alignment = Alignment.CenterHorizontally)
)
@@ -455,8 +455,11 @@
verticalArrangement = Arrangement.spacedBy(2.dp)
) {
item {
- PrimaryCreateOptionRow(requestDisplayInfo = requestDisplayInfo,
- onOptionSelected = onOptionSelected)
+ PrimaryCreateOptionRow(
+ requestDisplayInfo = requestDisplayInfo,
+ createOptionInfo = createOptionInfo,
+ onOptionSelected = onOptionSelected
+ )
}
}
}
@@ -506,12 +509,17 @@
@Composable
fun PrimaryCreateOptionRow(
requestDisplayInfo: RequestDisplayInfo,
+ createOptionInfo: CreateOptionInfo,
onOptionSelected: () -> Unit
) {
Chip(
modifier = Modifier.fillMaxWidth(),
onClick = onOptionSelected,
- // TODO: Add an icon generated by provider according to requestDisplayInfo type
+ leadingIcon = {
+ Image(modifier = Modifier.size(24.dp, 24.dp).padding(start = 10.dp),
+ bitmap = createOptionInfo.credentialTypeIcon.toBitmap().asImageBitmap(),
+ contentDescription = stringResource(R.string.createOptionInfo_icon_description))
+ },
colors = ChipDefaults.chipColors(
backgroundColor = Grey100,
leadingIconContentColor = Grey100
@@ -545,7 +553,7 @@
onClick = onOptionSelected,
leadingIcon = {
Image(modifier = Modifier.size(24.dp, 24.dp).padding(start = 10.dp),
- bitmap = createOptionInfo.icon.toBitmap().asImageBitmap(),
+ bitmap = createOptionInfo.profileIcon.toBitmap().asImageBitmap(),
// painter = painterResource(R.drawable.ic_passkey),
// TODO: add description.
contentDescription = "")
@@ -561,14 +569,15 @@
text =
if (providerInfo.createOptions.size > 1)
{stringResource(R.string.more_options_title_multiple_options,
- providerInfo.displayName, createOptionInfo.title)} else {
+ providerInfo.displayName, createOptionInfo.userProviderDisplayName)} else {
stringResource(R.string.more_options_title_one_option,
providerInfo.displayName)},
style = Typography.h6,
modifier = Modifier.padding(top = 16.dp)
)
Text(
- text = createOptionInfo.usageData,
+ text = stringResource(R.string.more_options_usage_data,
+ createOptionInfo.passwordCount, createOptionInfo.passkeyCount),
style = Typography.body2,
modifier = Modifier.padding(bottom = 16.dp)
)
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreatePasskeyViewModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreatePasskeyViewModel.kt
index 615da4e..2e9758a 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreatePasskeyViewModel.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreatePasskeyViewModel.kt
@@ -73,21 +73,6 @@
)
}
- fun onCreateOptionSelected(entryKey: String, entrySubkey: String) {
- Log.d(
- "Account Selector",
- "Option selected for creation: {key = $entryKey, subkey = $entrySubkey}"
- )
- CredentialManagerRepo.getInstance().onOptionSelected(
- uiState.activeEntry?.activeProvider!!.name,
- entryKey,
- entrySubkey
- )
- dialogResult.value = DialogResult(
- ResultState.COMPLETE,
- )
- }
-
fun getProviderInfoByName(providerName: String): ProviderInfo {
return uiState.providers.single {
it.name.equals(providerName)
@@ -126,18 +111,18 @@
}
fun onPrimaryCreateOptionInfoSelected() {
- var createOptionEntryKey = uiState.activeEntry?.activeCreateOptionInfo?.entryKey
- var createOptionEntrySubkey = uiState.activeEntry?.activeCreateOptionInfo?.entrySubkey
+ val entryKey = uiState.activeEntry?.activeEntryInfo?.entryKey
+ val entrySubkey = uiState.activeEntry?.activeEntryInfo?.entrySubkey
Log.d(
"Account Selector",
"Option selected for creation: " +
- "{key = $createOptionEntryKey, subkey = $createOptionEntrySubkey}"
+ "{key = $entryKey, subkey = $entrySubkey}"
)
- if (createOptionEntryKey != null && createOptionEntrySubkey != null) {
+ if (entryKey != null && entrySubkey != null) {
CredentialManagerRepo.getInstance().onOptionSelected(
uiState.activeEntry?.activeProvider!!.name,
- createOptionEntryKey,
- createOptionEntrySubkey
+ entryKey,
+ entrySubkey
)
} else {
TODO("Gracefully handle illegal state.")
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt
index e3398c0..8b81083 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt
@@ -184,12 +184,12 @@
) {
Column() {
Text(
- text = credentialOptionInfo.title,
+ text = credentialOptionInfo.entryKey,
style = Typography.h6,
modifier = Modifier.padding(top = 16.dp)
)
Text(
- text = credentialOptionInfo.subtitle,
+ text = credentialOptionInfo.entrySubkey,
style = Typography.body2,
modifier = Modifier.padding(bottom = 16.dp)
)
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt
index b6ecd37..b427de6 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt
@@ -24,17 +24,21 @@
val displayName: String,
val credentialTypeIcon: Drawable,
val credentialOptions: List<CredentialOptionInfo>,
+ // TODO: Add the authenticationOption
)
-data class CredentialOptionInfo(
- val icon: Drawable,
- val title: String,
- val subtitle: String,
+open class EntryInfo (
val entryKey: String,
val entrySubkey: String,
- val usageData: String
)
+class CredentialOptionInfo(
+ entryKey: String,
+ entrySubkey: String,
+ val icon: Drawable,
+ val usageData: String,
+) : EntryInfo(entryKey, entrySubkey)
+
data class RequestDisplayInfo(
val userName: String,
val displayName: String,
diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java
index 83d86cd..953e850 100644
--- a/services/core/java/com/android/server/SystemServiceManager.java
+++ b/services/core/java/com/android/server/SystemServiceManager.java
@@ -371,6 +371,7 @@
// 2. When a user is switched from bg to fg, the onUserVisibilityChanged() callback is
// called onUserSwitching(), so calling it before onUserStarting() make it more
// consistent with that
+ EventLog.writeEvent(EventLogTags.SSM_USER_VISIBILITY_CHANGED, userId, /* visible= */ 1);
onUser(t, USER_VISIBLE, /* prevUser= */ null, targetUser);
}
onUser(t, USER_STARTING, /* prevUser= */ null, targetUser);
@@ -381,14 +382,30 @@
*
* <p><b>NOTE: </b>this method should only be called when a user that is already running become
* visible; if the user is starting visible, callers should call
- * {@link #onUserStarting(TimingsTraceAndSlog, int, boolean)} instead
+ * {@link #onUserStarting(TimingsTraceAndSlog, int, boolean)} instead.
*/
public void onUserVisible(@UserIdInt int userId) {
- EventLog.writeEvent(EventLogTags.SSM_USER_VISIBLE, userId);
+ EventLog.writeEvent(EventLogTags.SSM_USER_VISIBILITY_CHANGED, userId, /* visible= */ 1);
onUser(USER_VISIBLE, userId);
}
/**
+ * Updates the visibility of the system user.
+ *
+ * <p>Since the system user never stops, this method must be called when it's switched from / to
+ * foreground.
+ */
+ public void onSystemUserVisibilityChanged(boolean visible) {
+ int userId = UserHandle.USER_SYSTEM;
+ EventLog.writeEvent(EventLogTags.SSM_USER_VISIBILITY_CHANGED, userId, visible ? 1 : 0);
+ if (visible) {
+ onUser(USER_VISIBLE, userId);
+ } else {
+ onUser(USER_INVISIBLE, userId);
+ }
+ }
+
+ /**
* Unlocks the given user.
*/
public void onUserUnlocking(@UserIdInt int userId) {
diff --git a/services/core/java/com/android/server/am/EventLogTags.logtags b/services/core/java/com/android/server/am/EventLogTags.logtags
index dec8b62..60e6754 100644
--- a/services/core/java/com/android/server/am/EventLogTags.logtags
+++ b/services/core/java/com/android/server/am/EventLogTags.logtags
@@ -116,7 +116,7 @@
30086 ssm_user_stopping (userId|1|5),(visibilityChanged|1)
30087 ssm_user_stopped (userId|1|5)
30088 ssm_user_completed_event (userId|1|5),(eventFlag|1|5)
-30089 ssm_user_visible (userId|1|5)
+30089 ssm_user_visibility_changed (userId|1|5),(visible|1)
# Foreground service start/stop events.
30100 am_foreground_service_start (User|1|5),(Component Name|3),(allowWhileInUse|1),(startReasonCode|3),(targetSdk|1|1),(callerTargetSdk|1|1),(notificationWasDeferred|1),(notificationShown|1),(durationMs|1|3),(startForegroundCount|1|1),(stopReason|3)
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index 8d3890c..af55980 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -2190,7 +2190,7 @@
if (oldUserId == UserHandle.USER_SYSTEM) {
// System user is never stopped, but its visibility is changed (as it is brought to the
// background)
- updateSystemUserVisibility(/* visible= */ false);
+ updateSystemUserVisibility(t, /* visible= */ false);
}
t.traceEnd(); // end continueUserSwitch
@@ -2549,10 +2549,15 @@
// TODO(b/242195409): remove this method if initial system user boot logic is refactored?
void onSystemUserStarting() {
- updateSystemUserVisibility(/* visible= */ !UserManager.isHeadlessSystemUserMode());
+ if (!UserManager.isHeadlessSystemUserMode()) {
+ // Don't need to call on HSUM because it will be called when the system user is
+ // restarted on background
+ mInjector.onUserStarting(UserHandle.USER_SYSTEM, /* visible= */ true);
+ }
}
- private void updateSystemUserVisibility(boolean visible) {
+ private void updateSystemUserVisibility(TimingsTraceAndSlog t, boolean visible) {
+ t.traceBegin("update-system-userVisibility-" + visible);
if (DEBUG_MU) {
Slogf.d(TAG, "updateSystemUserVisibility(): visible=%b", visible);
}
@@ -2564,7 +2569,8 @@
mVisibleUsers.delete(userId);
}
}
- mInjector.onUserStarting(userId, visible);
+ mInjector.notifySystemUserVisibilityChanged(visible);
+ t.traceEnd();
}
/**
@@ -3673,5 +3679,8 @@
getSystemServiceManager().onUserStarting(TimingsTraceAndSlog.newAsyncLog(), userId,
visible);
}
+ void notifySystemUserVisibilityChanged(boolean visible) {
+ getSystemServiceManager().onSystemUserVisibilityChanged(visible);
+ }
}
}
diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java
index bb37e0e..3421eb7 100644
--- a/services/core/java/com/android/server/om/OverlayManagerService.java
+++ b/services/core/java/com/android/server/om/OverlayManagerService.java
@@ -60,6 +60,7 @@
import android.content.res.ApkAssets;
import android.net.Uri;
import android.os.Binder;
+import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.FabricatedOverlayInternal;
@@ -881,7 +882,7 @@
}
Slog.d(TAG, "commit failed: " + e.getMessage(), e);
throw new SecurityException("commit failed"
- + (DEBUG ? ": " + e.getMessage() : ""));
+ + (DEBUG || Build.IS_DEBUGGABLE ? ": " + e.getMessage() : ""));
}
} finally {
traceEnd(TRACE_TAG_RRO);
diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
index 8772de3..a7d4cea 100644
--- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
+++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
@@ -20,7 +20,6 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
-import android.apex.ApexInfo;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.Attribution;
@@ -79,11 +78,8 @@
import com.android.server.pm.pkg.parsing.ParsingPackageUtils;
import com.android.server.pm.pkg.parsing.ParsingUtils;
-import libcore.util.EmptyArray;
-
import java.io.File;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -109,21 +105,9 @@
public static PackageInfo generate(AndroidPackage pkg, int[] gids,
@PackageManager.PackageInfoFlagsBits long flags, long firstInstallTime,
long lastUpdateTime, Set<String> grantedPermissions, PackageUserStateInternal state,
- @UserIdInt int userId, @Nullable PackageStateInternal pkgSetting) {
+ @UserIdInt int userId, @NonNull PackageStateInternal pkgSetting) {
return generateWithComponents(pkg, gids, flags, firstInstallTime, lastUpdateTime,
- grantedPermissions, state, userId, null, pkgSetting);
- }
-
- /**
- * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage.
- * @deprecated Once ENABLE_FEATURE_SCAN_APEX is removed, this should also be removed.
- */
- @Deprecated
- @Nullable
- public static PackageInfo generate(AndroidPackage pkg, ApexInfo apexInfo, long flags,
- @Nullable PackageStateInternal pkgSetting, @UserIdInt int userId) {
- return generateWithComponents(pkg, EmptyArray.INT, flags, 0, 0, Collections.emptySet(),
- PackageUserStateInternal.DEFAULT, userId, apexInfo, pkgSetting);
+ grantedPermissions, state, userId, pkgSetting);
}
/**
@@ -132,8 +116,7 @@
private static PackageInfo generateWithComponents(AndroidPackage pkg, int[] gids,
@PackageManager.PackageInfoFlagsBits long flags, long firstInstallTime,
long lastUpdateTime, Set<String> grantedPermissions, PackageUserStateInternal state,
- @UserIdInt int userId, @Nullable ApexInfo apexInfo,
- @Nullable PackageStateInternal pkgSetting) {
+ @UserIdInt int userId, @NonNull PackageStateInternal pkgSetting) {
ApplicationInfo applicationInfo = generateApplicationInfo(pkg, flags, state, userId,
pkgSetting);
if (applicationInfo == null) {
@@ -247,22 +230,6 @@
&= ~ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE;
}
- if (apexInfo != null) {
- File apexFile = new File(apexInfo.modulePath);
-
- info.applicationInfo.sourceDir = apexFile.getPath();
- info.applicationInfo.publicSourceDir = apexFile.getPath();
- info.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
- info.applicationInfo.flags |= ApplicationInfo.FLAG_INSTALLED;
- if (apexInfo.isFactory) {
- info.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
- } else {
- info.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
- }
- info.isApex = true;
- info.isActiveApex = apexInfo.isActive;
- }
-
final SigningDetails signingDetails = pkg.getSigningDetails();
// deprecated method of getting signing certificates
if ((flags & PackageManager.GET_SIGNATURES) != 0) {
@@ -294,7 +261,7 @@
info.coreApp = pkg.isCoreApp();
info.isApex = pkg.isApex();
- if (pkgSetting != null && !pkgSetting.hasSharedUser()) {
+ if (!pkgSetting.hasSharedUser()) {
// It is possible that this shared UID app has left
info.sharedUserId = null;
info.sharedUserLabel = 0;
@@ -452,7 +419,7 @@
public static ApplicationInfo generateApplicationInfo(AndroidPackage pkg,
@PackageManager.ApplicationInfoFlagsBits long flags,
@NonNull PackageUserStateInternal state, @UserIdInt int userId,
- @Nullable PackageStateInternal pkgSetting) {
+ @NonNull PackageStateInternal pkgSetting) {
if (pkg == null) {
return null;
}
@@ -463,35 +430,31 @@
}
// Make shallow copy so we can store the metadata/libraries safely
- ApplicationInfo info = AndroidPackageUtils.toAppInfoWithoutState(pkg);
+ ApplicationInfo info = AndroidPackageUtils.generateAppInfoWithoutState(pkg);
updateApplicationInfo(info, flags, state);
initForUser(info, pkg, userId);
- if (pkgSetting != null) {
- // TODO(b/135203078): Remove PackageParser1/toAppInfoWithoutState and clean all this up
- PackageStateUnserialized pkgState = pkgSetting.getTransientState();
- info.hiddenUntilInstalled = pkgState.isHiddenUntilInstalled();
- List<String> usesLibraryFiles = pkgState.getUsesLibraryFiles();
- var usesLibraries = pkgState.getUsesLibraryInfos();
- var usesLibraryInfos = new ArrayList<SharedLibraryInfo>();
- for (int index = 0; index < usesLibraries.size(); index++) {
- usesLibraryInfos.add(usesLibraries.get(index).getInfo());
- }
- info.sharedLibraryFiles = usesLibraryFiles.isEmpty()
- ? null : usesLibraryFiles.toArray(new String[0]);
- info.sharedLibraryInfos = usesLibraryInfos.isEmpty() ? null : usesLibraryInfos;
- if (info.category == ApplicationInfo.CATEGORY_UNDEFINED) {
- info.category = pkgSetting.getCategoryOverride();
- }
+ // TODO(b/135203078): Remove PackageParser1/toAppInfoWithoutState and clean all this up
+ PackageStateUnserialized pkgState = pkgSetting.getTransientState();
+ info.hiddenUntilInstalled = pkgState.isHiddenUntilInstalled();
+ List<String> usesLibraryFiles = pkgState.getUsesLibraryFiles();
+ var usesLibraries = pkgState.getUsesLibraryInfos();
+ var usesLibraryInfos = new ArrayList<SharedLibraryInfo>();
+ for (int index = 0; index < usesLibraries.size(); index++) {
+ usesLibraryInfos.add(usesLibraries.get(index).getInfo());
+ }
+ info.sharedLibraryFiles = usesLibraryFiles.isEmpty()
+ ? null : usesLibraryFiles.toArray(new String[0]);
+ info.sharedLibraryInfos = usesLibraryInfos.isEmpty() ? null : usesLibraryInfos;
+ if (info.category == ApplicationInfo.CATEGORY_UNDEFINED) {
+ info.category = pkgSetting.getCategoryOverride();
}
info.seInfo = AndroidPackageUtils.getSeInfo(pkg, pkgSetting);
- info.primaryCpuAbi = pkgSetting == null ? AndroidPackageUtils.getRawPrimaryCpuAbi(pkg)
- : pkgSetting.getPrimaryCpuAbi();
- info.secondaryCpuAbi = pkgSetting == null ? AndroidPackageUtils.getRawSecondaryCpuAbi(pkg)
- : pkgSetting.getSecondaryCpuAbi();
+ info.primaryCpuAbi = pkgSetting.getPrimaryCpuAbi();
+ info.secondaryCpuAbi = pkgSetting.getSecondaryCpuAbi();
info.flags |= appInfoFlags(info.flags, pkgSetting);
info.privateFlags |= appInfoPrivateFlags(info.privateFlags, pkgSetting);
@@ -508,7 +471,7 @@
public static ActivityInfo generateActivityInfo(AndroidPackage pkg, ParsedActivity a,
@PackageManager.ComponentInfoFlagsBits long flags,
@NonNull PackageUserStateInternal state, @UserIdInt int userId,
- @Nullable PackageStateInternal pkgSetting) {
+ @NonNull PackageStateInternal pkgSetting) {
return generateActivityInfo(pkg, a, flags, state, null, userId, pkgSetting);
}
@@ -520,7 +483,7 @@
public static ActivityInfo generateActivityInfo(AndroidPackage pkg, ParsedActivity a,
@PackageManager.ComponentInfoFlagsBits long flags,
@NonNull PackageUserStateInternal state, @Nullable ApplicationInfo applicationInfo,
- @UserIdInt int userId, @Nullable PackageStateInternal pkgSetting) {
+ @UserIdInt int userId, @NonNull PackageStateInternal pkgSetting) {
if (a == null) return null;
if (!checkUseInstalledOrHidden(pkg, pkgSetting, state, flags)) {
return null;
@@ -597,7 +560,7 @@
@Nullable
public static ServiceInfo generateServiceInfo(AndroidPackage pkg, ParsedService s,
@PackageManager.ComponentInfoFlagsBits long flags, PackageUserStateInternal state,
- @UserIdInt int userId, @Nullable PackageStateInternal pkgSetting) {
+ @UserIdInt int userId, @NonNull PackageStateInternal pkgSetting) {
return generateServiceInfo(pkg, s, flags, state, null, userId, pkgSetting);
}
@@ -609,7 +572,7 @@
public static ServiceInfo generateServiceInfo(AndroidPackage pkg, ParsedService s,
@PackageManager.ComponentInfoFlagsBits long flags, PackageUserStateInternal state,
@Nullable ApplicationInfo applicationInfo, int userId,
- @Nullable PackageStateInternal pkgSetting) {
+ @NonNull PackageStateInternal pkgSetting) {
if (s == null) return null;
if (!checkUseInstalledOrHidden(pkg, pkgSetting, state, flags)) {
return null;
@@ -647,7 +610,7 @@
public static ProviderInfo generateProviderInfo(AndroidPackage pkg, ParsedProvider p,
@PackageManager.ComponentInfoFlagsBits long flags, PackageUserStateInternal state,
@NonNull ApplicationInfo applicationInfo, int userId,
- @Nullable PackageStateInternal pkgSetting) {
+ @NonNull PackageStateInternal pkgSetting) {
if (p == null) return null;
if (!checkUseInstalledOrHidden(pkg, pkgSetting, state, flags)) {
return null;
@@ -696,7 +659,7 @@
@Nullable
public static InstrumentationInfo generateInstrumentationInfo(ParsedInstrumentation i,
AndroidPackage pkg, @PackageManager.ComponentInfoFlagsBits long flags,
- PackageUserStateInternal state, int userId, @Nullable PackageStateInternal pkgSetting) {
+ PackageUserStateInternal state, int userId, @NonNull PackageStateInternal pkgSetting) {
if (i == null) return null;
if (!checkUseInstalledOrHidden(pkg, pkgSetting, state, flags)) {
return null;
@@ -719,10 +682,8 @@
initForUser(info, pkg, userId);
- info.primaryCpuAbi = pkgSetting == null ? AndroidPackageUtils.getRawPrimaryCpuAbi(pkg)
- : pkgSetting.getPrimaryCpuAbi();
- info.secondaryCpuAbi = pkgSetting == null ? AndroidPackageUtils.getRawSecondaryCpuAbi(pkg)
- : pkgSetting.getSecondaryCpuAbi();
+ info.primaryCpuAbi = pkgSetting.getPrimaryCpuAbi();
+ info.secondaryCpuAbi = pkgSetting.getSecondaryCpuAbi();
info.nativeLibraryDir = pkg.getNativeLibraryDir();
info.secondaryNativeLibraryDir = pkg.getSecondaryNativeLibraryDir();
@@ -820,12 +781,11 @@
* all uninstalled and hidden packages as well.
*/
public static boolean checkUseInstalledOrHidden(AndroidPackage pkg,
- PackageStateInternal pkgSetting, PackageUserStateInternal state,
+ @NonNull PackageStateInternal pkgSetting, PackageUserStateInternal state,
@PackageManager.PackageInfoFlagsBits long flags) {
// Returns false if the package is hidden system app until installed.
if ((flags & PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS) == 0
&& !state.isInstalled()
- && pkgSetting != null
&& pkgSetting.getTransientState().isHiddenUntilInstalled()) {
return false;
}
@@ -878,7 +838,7 @@
private static void assignFieldsComponentInfoParsedMainComponent(
@NonNull ComponentInfo info, @NonNull ParsedMainComponent component,
- @Nullable PackageStateInternal pkgSetting, int userId) {
+ @NonNull PackageStateInternal pkgSetting, @UserIdInt int userId) {
assignFieldsComponentInfoParsedMainComponent(info, component);
Pair<CharSequence, Integer> labelAndIcon =
ParsedComponentStateUtils.getNonLocalizedLabelAndIcon(component, pkgSetting,
@@ -889,7 +849,7 @@
private static void assignFieldsPackageItemInfoParsedComponent(
@NonNull PackageItemInfo info, @NonNull ParsedComponent component,
- @Nullable PackageStateInternal pkgSetting, int userId) {
+ @NonNull PackageStateInternal pkgSetting, @UserIdInt int userId) {
assignFieldsPackageItemInfoParsedComponent(info, component);
Pair<CharSequence, Integer> labelAndIcon =
ParsedComponentStateUtils.getNonLocalizedLabelAndIcon(component, pkgSetting,
@@ -1141,7 +1101,7 @@
@Nullable
public ApplicationInfo generate(AndroidPackage pkg,
@PackageManager.ApplicationInfoFlagsBits long flags, PackageUserStateInternal state,
- int userId, @Nullable PackageStateInternal pkgSetting) {
+ int userId, @NonNull PackageStateInternal pkgSetting) {
ApplicationInfo appInfo = mCache.get(pkg.getPackageName());
if (appInfo != null) {
return appInfo;
diff --git a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java
index a6f1b29..5b0cc51 100644
--- a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java
+++ b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java
@@ -321,8 +321,4 @@
info.versionCode = ((ParsingPackageHidden) pkg).getVersionCode();
info.versionCodeMajor = ((ParsingPackageHidden) pkg).getVersionCodeMajor();
}
-
- public static ApplicationInfo toAppInfoWithoutState(AndroidPackage pkg) {
- return ((ParsingPackageHidden) pkg).toAppInfoWithoutState();
- }
}
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index 3590e9c2..7415376 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -1547,6 +1547,12 @@
return mTransitionController.mTransitionMetricsReporter;
}
+ @Override
+ public IBinder getApplyToken() {
+ enforceTaskPermission("getApplyToken()");
+ return SurfaceControl.Transaction.getDefaultApplyToken();
+ }
+
/** Whether the configuration changes are important to report back to an organizer. */
static boolean configurationsAreEqualForOrganizer(
Configuration newConfig, @Nullable Configuration oldConfig) {
diff --git a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
index fe92a1d..935d1d8 100644
--- a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
@@ -24,7 +24,6 @@
import static android.app.ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE;
import static android.app.ActivityManagerInternal.ALLOW_PROFILES_OR_NON_FULL;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-import static android.os.UserHandle.USER_SYSTEM;
import static android.testing.DexmakerShareClassLoaderRule.runWithDexmakerShareClassLoader;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
@@ -403,7 +402,7 @@
verify(mInjector, times(0)).dismissKeyguard(any(), anyString());
verify(mInjector.getWindowManager(), times(1)).stopFreezingScreen();
continueUserSwitchAssertions(TEST_USER_ID, false);
- verifyOnUserStarting(USER_SYSTEM, /* visible= */ false);
+ verifySystemUserVisibilityChangedNotified(/* visible= */ false);
}
@Test
@@ -424,7 +423,7 @@
verify(mInjector, times(1)).dismissKeyguard(any(), anyString());
verify(mInjector.getWindowManager(), times(1)).stopFreezingScreen();
continueUserSwitchAssertions(TEST_USER_ID, false);
- verifyOnUserStarting(USER_SYSTEM, /* visible= */ false);
+ verifySystemUserVisibilityChangedNotified(/* visible= */ false);
}
@Test
@@ -531,7 +530,7 @@
assertFalse(mUserController.canStartMoreUsers());
assertEquals(Arrays.asList(new Integer[] {0, TEST_USER_ID1, TEST_USER_ID2}),
mUserController.getRunningUsersLU());
- verifyOnUserStarting(USER_SYSTEM, /* visible= */ false);
+ verifySystemUserVisibilityChangedNotified(/* visible= */ false);
}
/**
@@ -964,8 +963,8 @@
verify(mInjector.getUserManagerInternal(), never()).unassignUserFromDisplay(userId);
}
- private void verifyOnUserStarting(@UserIdInt int userId, boolean visible) {
- verify(mInjector).onUserStarting(userId, visible);
+ private void verifySystemUserVisibilityChangedNotified(boolean visible) {
+ verify(mInjector).notifySystemUserVisibilityChanged(visible);
}
// Should be public to allow mocking
@@ -1108,6 +1107,11 @@
void onUserStarting(@UserIdInt int userId, boolean visible) {
Log.i(TAG, "onUserStarting(" + userId + ", " + visible + ")");
}
+
+ @Override
+ void notifySystemUserVisibilityChanged(boolean visible) {
+ Log.i(TAG, "notifySystemUserVisibilityChanged(" + visible + ")");
+ }
}
private static class TestHandler extends Handler {
diff --git a/services/tests/servicestests/src/com/android/server/pm/CompatibilityModeTest.java b/services/tests/servicestests/src/com/android/server/pm/CompatibilityModeTest.java
index eaa0e9b..f0d389b 100644
--- a/services/tests/servicestests/src/com/android/server/pm/CompatibilityModeTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/CompatibilityModeTest.java
@@ -34,6 +34,7 @@
import com.android.server.pm.parsing.PackageInfoUtils;
import com.android.server.pm.parsing.pkg.PackageImpl;
+import com.android.server.pm.pkg.PackageStateUnserialized;
import com.android.server.pm.pkg.PackageUserStateImpl;
import com.android.server.pm.pkg.parsing.ParsingPackageUtils;
@@ -46,12 +47,16 @@
private boolean mCompatibilityModeEnabled;;
private PackageImpl mMockAndroidPackage;
+ private PackageSetting mMockPackageState;
private PackageUserStateImpl mMockUserState;
@Before
public void setUp() {
mCompatibilityModeEnabled = ParsingPackageUtils.sCompatibilityModeEnabled;
mMockAndroidPackage = mock(PackageImpl.class);
+ mMockPackageState = mock(PackageSetting.class);
+ when(mMockPackageState.getTransientState())
+ .thenReturn(new PackageStateUnserialized(mMockPackageState));
mMockUserState = new PackageUserStateImpl();
mMockUserState.setInstalled(true);
}
@@ -221,7 +226,7 @@
info.flags |= flags;
when(mMockAndroidPackage.toAppInfoWithoutState()).thenReturn(info);
return PackageInfoUtils.generateApplicationInfo(mMockAndroidPackage,
- 0 /*flags*/, mMockUserState, 0 /*userId*/, null);
+ 0 /*flags*/, mMockUserState, 0 /*userId*/, mMockPackageState);
}
private void setGlobalCompatibilityMode(boolean enabled) {
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
index 9ce99d6..59f27ec 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
@@ -676,27 +676,32 @@
final File testFile = extractFile(TEST_APP4_APK);
try {
final ParsedPackage pkg = new TestPackageParser2().parsePackage(testFile, 0, false);
+ var pkgSetting = mockPkgSetting(pkg);
ApplicationInfo appInfo = PackageInfoUtils.generateApplicationInfo(pkg, 0,
- PackageUserStateInternal.DEFAULT, 0, null);
+ PackageUserStateInternal.DEFAULT, 0, pkgSetting);
for (ParsedActivity activity : pkg.getActivities()) {
assertNotNull(activity.getMetaData());
assertNull(PackageInfoUtils.generateActivityInfo(pkg, activity, 0,
- PackageUserStateInternal.DEFAULT, appInfo, 0, null).metaData);
+ PackageUserStateInternal.DEFAULT, appInfo, 0, pkgSetting)
+ .metaData);
}
for (ParsedProvider provider : pkg.getProviders()) {
assertNotNull(provider.getMetaData());
assertNull(PackageInfoUtils.generateProviderInfo(pkg, provider, 0,
- PackageUserStateInternal.DEFAULT, appInfo, 0, null).metaData);
+ PackageUserStateInternal.DEFAULT, appInfo, 0, pkgSetting)
+ .metaData);
}
for (ParsedActivity receiver : pkg.getReceivers()) {
assertNotNull(receiver.getMetaData());
assertNull(PackageInfoUtils.generateActivityInfo(pkg, receiver, 0,
- PackageUserStateInternal.DEFAULT, appInfo, 0, null).metaData);
+ PackageUserStateInternal.DEFAULT, appInfo, 0, pkgSetting)
+ .metaData);
}
for (ParsedService service : pkg.getServices()) {
assertNotNull(service.getMetaData());
assertNull(PackageInfoUtils.generateServiceInfo(pkg, service, 0,
- PackageUserStateInternal.DEFAULT, appInfo, 0, null).metaData);
+ PackageUserStateInternal.DEFAULT, appInfo, 0, pkgSetting)
+ .metaData);
}
} finally {
testFile.delete();
diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java
index 9cd97ff3..699601b 100644
--- a/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java
@@ -20,21 +20,16 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
-import android.apex.ApexInfo;
import android.content.Context;
import android.content.IntentFilter;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
-import android.content.pm.SigningDetails;
import android.content.pm.parsing.FrameworkParsingPackageUtils;
import android.content.pm.parsing.result.ParseResult;
import android.content.pm.parsing.result.ParseTypeImpl;
import android.os.Build;
import android.os.Bundle;
import android.os.FileUtils;
-import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
import android.util.Pair;
import android.util.SparseIntArray;
@@ -53,7 +48,6 @@
import com.android.server.pm.pkg.component.ParsedIntentInfo;
import com.android.server.pm.pkg.component.ParsedPermission;
import com.android.server.pm.pkg.component.ParsedPermissionUtils;
-import com.android.server.pm.pkg.parsing.ParsingPackageUtils;
import com.google.common.truth.Expect;
@@ -63,7 +57,6 @@
import java.io.File;
import java.io.InputStream;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -567,54 +560,6 @@
}
@Test
- public void testApexPackageInfoGeneration() throws Exception {
- String apexModuleName = "com.android.tzdata.apex";
- File apexFile = copyRawResourceToFile(apexModuleName,
- R.raw.com_android_tzdata);
- ApexInfo apexInfo = new ApexInfo();
- apexInfo.isActive = true;
- apexInfo.isFactory = false;
- apexInfo.moduleName = apexModuleName;
- apexInfo.modulePath = apexFile.getPath();
- apexInfo.versionCode = 191000070;
- int flags = PackageManager.GET_META_DATA | PackageManager.GET_SIGNING_CERTIFICATES;
-
- ParseResult<ParsedPackage> result = ParsingPackageUtils.parseDefaultOneTime(apexFile,
- flags, Collections.emptyList(), false /*collectCertificates*/);
- if (result.isError()) {
- throw new IllegalStateException(result.getErrorMessage(), result.getException());
- }
-
- ParseTypeImpl input = ParseTypeImpl.forDefaultParsing();
- ParsedPackage pkg = result.getResult();
- ParseResult<SigningDetails> ret = ParsingPackageUtils.getSigningDetails(
- input, pkg, false /*skipVerify*/);
- if (ret.isError()) {
- throw new IllegalStateException(ret.getErrorMessage(), ret.getException());
- }
- pkg.setSigningDetails(ret.getResult());
- PackageInfo pi = PackageInfoUtils.generate(pkg.setApex(true).hideAsFinal(), apexInfo,
- flags, null, UserHandle.USER_SYSTEM);
-
- assertEquals("com.google.android.tzdata", pi.applicationInfo.packageName);
- assertTrue(pi.applicationInfo.enabled);
- assertEquals(28, pi.applicationInfo.targetSdkVersion);
- assertEquals(191000070, pi.applicationInfo.longVersionCode);
- assertNotNull(pi.applicationInfo.metaData);
- assertEquals(apexFile.getPath(), pi.applicationInfo.sourceDir);
- assertEquals("Bundle[{com.android.vending.derived.apk.id=1}]",
- pi.applicationInfo.metaData.toString());
-
- assertEquals("com.google.android.tzdata", pi.packageName);
- assertEquals(191000070, pi.getLongVersionCode());
- assertNotNull(pi.signingInfo);
- assertTrue(pi.signingInfo.getApkContentsSigners().length > 0);
- assertTrue(pi.isApex);
- assertTrue((pi.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0);
- assertTrue((pi.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) != 0);
- }
-
- @Test
public void testUsesSdk() throws Exception {
ParsedPackage pkg;
SparseIntArray minExtVers;