Merge "[temp fix] Stop broadcasting onProcessStarted." into main
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index cd991c7..9ee74e3 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -36,6 +36,7 @@
":android.hardware.radio.flags-aconfig-java{.generated_srcjars}",
":android.hardware.usb.flags-aconfig-java{.generated_srcjars}",
":android.location.flags-aconfig-java{.generated_srcjars}",
+ ":android.media.codec-aconfig-java{.generated_srcjars}",
":android.media.tv.flags-aconfig-java{.generated_srcjars}",
":android.multiuser.flags-aconfig-java{.generated_srcjars}",
":android.net.platform.flags-aconfig-java{.generated_srcjars}",
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 66e03db..a90ce42 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -4504,6 +4504,7 @@
method @NonNull public android.credentials.selection.RequestToken getRequestToken();
method @NonNull public String getType();
method public boolean hasPermissionToOverrideDefault();
+ method public boolean isShowAllOptionsRequested();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.credentials.selection.RequestInfo> CREATOR;
field @NonNull public static final String TYPE_CREATE = "android.credentials.selection.TYPE_CREATE";
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index a21d7c4..4a048bd 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -1347,8 +1347,8 @@
}
@FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class RequestInfo implements android.os.Parcelable {
- method @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") @NonNull public static android.credentials.selection.RequestInfo newCreateRequestInfo(@NonNull android.os.IBinder, @NonNull android.credentials.CreateCredentialRequest, @NonNull String, boolean, @NonNull java.util.List<java.lang.String>);
- method @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") @NonNull public static android.credentials.selection.RequestInfo newGetRequestInfo(@NonNull android.os.IBinder, @NonNull android.credentials.GetCredentialRequest, @NonNull String, boolean);
+ method @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") @NonNull public static android.credentials.selection.RequestInfo newCreateRequestInfo(@NonNull android.os.IBinder, @NonNull android.credentials.CreateCredentialRequest, @NonNull String, boolean, @NonNull java.util.List<java.lang.String>, boolean);
+ method @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") @NonNull public static android.credentials.selection.RequestInfo newGetRequestInfo(@NonNull android.os.IBinder, @NonNull android.credentials.GetCredentialRequest, @NonNull String, boolean, boolean);
}
@FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class RequestToken {
diff --git a/core/java/android/credentials/selection/RequestInfo.java b/core/java/android/credentials/selection/RequestInfo.java
index 2fd322a..60bbae6 100644
--- a/core/java/android/credentials/selection/RequestInfo.java
+++ b/core/java/android/credentials/selection/RequestInfo.java
@@ -110,6 +110,8 @@
private final boolean mHasPermissionToOverrideDefault;
+ private final boolean mIsShowAllOptionsRequested;
+
/**
* Creates new {@code RequestInfo} for a create-credential flow.
*
@@ -121,10 +123,10 @@
public static RequestInfo newCreateRequestInfo(
@NonNull IBinder token, @NonNull CreateCredentialRequest createCredentialRequest,
@NonNull String appPackageName, boolean hasPermissionToOverrideDefault,
- @NonNull List<String> defaultProviderIds) {
+ @NonNull List<String> defaultProviderIds, boolean isShowAllOptionsRequested) {
return new RequestInfo(
token, TYPE_CREATE, appPackageName, createCredentialRequest, null,
- hasPermissionToOverrideDefault, defaultProviderIds);
+ hasPermissionToOverrideDefault, defaultProviderIds, isShowAllOptionsRequested);
}
/**
@@ -137,11 +139,12 @@
@NonNull
public static RequestInfo newGetRequestInfo(
@NonNull IBinder token, @NonNull GetCredentialRequest getCredentialRequest,
- @NonNull String appPackageName, boolean hasPermissionToOverrideDefault) {
+ @NonNull String appPackageName, boolean hasPermissionToOverrideDefault,
+ boolean isShowAllOptionsRequested) {
return new RequestInfo(
token, TYPE_GET, appPackageName, null, getCredentialRequest,
hasPermissionToOverrideDefault,
- /*defaultProviderIds=*/ new ArrayList<>());
+ /*defaultProviderIds=*/ new ArrayList<>(), isShowAllOptionsRequested);
}
@@ -218,12 +221,31 @@
return mGetCredentialRequest;
}
+ /**
+ * Returns true if all options should be immediately displayed in the UI, and false otherwise.
+ *
+ * Normally this bit is set to false, upon which the selection UI should first display a
+ * condensed view of popular, deduplicated options that is determined based on signals like
+ * last-used timestamps, credential type priorities, and preferred providers configured from the
+ * user settings {@link #getDefaultProviderIds()}; at the same time, the UI should offer an
+ * option (button) that navigates the user to viewing all options from this condensed view.
+ *
+ * In some special occasions, e.g. when a request is initiated from the autofill drop-down
+ * suggestion, this bit will be set to true to indicate that the selection UI should immediately
+ * render the all option UI. This means that the request initiator has collected a user signal
+ * to confirm that the user wants to view all the available options at once.
+ */
+ public boolean isShowAllOptionsRequested() {
+ return mIsShowAllOptionsRequested;
+ }
+
private RequestInfo(@NonNull IBinder token, @NonNull @RequestType String type,
@NonNull String appPackageName,
@Nullable CreateCredentialRequest createCredentialRequest,
@Nullable GetCredentialRequest getCredentialRequest,
boolean hasPermissionToOverrideDefault,
- @NonNull List<String> defaultProviderIds) {
+ @NonNull List<String> defaultProviderIds,
+ boolean isShowAllOptionsRequested) {
mToken = token;
mType = type;
mAppPackageName = appPackageName;
@@ -232,6 +254,7 @@
mHasPermissionToOverrideDefault = hasPermissionToOverrideDefault;
mDefaultProviderIds = defaultProviderIds == null ? new ArrayList<>() : defaultProviderIds;
mRegistryProviderIds = new ArrayList<>();
+ mIsShowAllOptionsRequested = isShowAllOptionsRequested;
}
private RequestInfo(@NonNull Parcel in) {
@@ -254,6 +277,7 @@
mHasPermissionToOverrideDefault = in.readBoolean();
mDefaultProviderIds = in.createStringArrayList();
mRegistryProviderIds = in.createStringArrayList();
+ mIsShowAllOptionsRequested = in.readBoolean();
}
@Override
@@ -266,6 +290,7 @@
dest.writeBoolean(mHasPermissionToOverrideDefault);
dest.writeStringList(mDefaultProviderIds);
dest.writeStringList(mRegistryProviderIds);
+ dest.writeBoolean(mIsShowAllOptionsRequested);
}
@Override
diff --git a/core/java/android/hardware/input/KeyboardLayoutPreviewDrawable.java b/core/java/android/hardware/input/KeyboardLayoutPreviewDrawable.java
index d943c37..1cc910c 100644
--- a/core/java/android/hardware/input/KeyboardLayoutPreviewDrawable.java
+++ b/core/java/android/hardware/input/KeyboardLayoutPreviewDrawable.java
@@ -219,26 +219,22 @@
if (!glyphData.hasBaseText()) {
return;
}
- if (glyphData.hasValidShiftText() && glyphData.hasValidAltGrText()) {
- mGlyphDrawables.add(new GlyphDrawable(glyphData.getBaseText(), new RectF(),
- GRAVITY_BOTTOM | GRAVITY_LEFT, mBaseTextPaint));
+ boolean isCenter = !glyphData.hasValidAltGrText() && !glyphData.hasValidAltShiftText();
+ mGlyphDrawables.add(new GlyphDrawable(glyphData.getBaseText(), new RectF(),
+ GRAVITY_BOTTOM | (isCenter ? GRAVITY_CENTER_HORIZONTAL : GRAVITY_LEFT),
+ mBaseTextPaint));
+ if (glyphData.hasValidShiftText()) {
mGlyphDrawables.add(new GlyphDrawable(glyphData.getShiftText(), new RectF(),
- GRAVITY_TOP | GRAVITY_LEFT, mModifierTextPaint));
+ GRAVITY_TOP | (isCenter ? GRAVITY_CENTER_HORIZONTAL : GRAVITY_LEFT),
+ mModifierTextPaint));
+ }
+ if (glyphData.hasValidAltGrText()) {
mGlyphDrawables.add(new GlyphDrawable(glyphData.getAltGrText(), new RectF(),
GRAVITY_BOTTOM | GRAVITY_RIGHT, mModifierTextPaint));
- } else if (glyphData.hasValidShiftText()) {
- mGlyphDrawables.add(new GlyphDrawable(glyphData.getBaseText(), new RectF(),
- GRAVITY_BOTTOM | GRAVITY_CENTER_HORIZONTAL, mBaseTextPaint));
- mGlyphDrawables.add(new GlyphDrawable(glyphData.getShiftText(), new RectF(),
- GRAVITY_TOP | GRAVITY_CENTER_HORIZONTAL, mModifierTextPaint));
- } else if (glyphData.hasValidAltGrText()) {
- mGlyphDrawables.add(new GlyphDrawable(glyphData.getBaseText(), new RectF(),
- GRAVITY_BOTTOM | GRAVITY_LEFT, mBaseTextPaint));
- mGlyphDrawables.add(new GlyphDrawable(glyphData.getAltGrText(), new RectF(),
- GRAVITY_BOTTOM | GRAVITY_RIGHT, mModifierTextPaint));
- } else {
- mGlyphDrawables.add(new GlyphDrawable(glyphData.getBaseText(), new RectF(),
- GRAVITY_CENTER, mBaseTextPaint));
+ }
+ if (glyphData.hasValidAltShiftText()) {
+ mGlyphDrawables.add(new GlyphDrawable(glyphData.getAltGrShiftText(), new RectF(),
+ GRAVITY_TOP | GRAVITY_RIGHT, mModifierTextPaint));
}
}
diff --git a/core/java/android/hardware/input/PhysicalKeyLayout.java b/core/java/android/hardware/input/PhysicalKeyLayout.java
index 3454c39..844e02f 100644
--- a/core/java/android/hardware/input/PhysicalKeyLayout.java
+++ b/core/java/android/hardware/input/PhysicalKeyLayout.java
@@ -396,6 +396,7 @@
private final String mBaseText;
private final String mShiftText;
private final String mAltGrText;
+ private final String mAltGrShiftText;
public KeyGlyph(KeyCharacterMap kcm, int keyCode) {
mBaseText = getKeyText(kcm, keyCode, KeyEvent.META_CAPS_LOCK_ON);
@@ -403,6 +404,9 @@
KeyEvent.META_SHIFT_ON | KeyEvent.META_SHIFT_LEFT_ON);
mAltGrText = getKeyText(kcm, keyCode,
KeyEvent.META_ALT_ON | KeyEvent.META_ALT_RIGHT_ON | KeyEvent.META_CAPS_LOCK_ON);
+ mAltGrShiftText = getKeyText(kcm, keyCode,
+ KeyEvent.META_ALT_ON | KeyEvent.META_ALT_RIGHT_ON | KeyEvent.META_SHIFT_LEFT_ON
+ | KeyEvent.META_SHIFT_ON);
}
public String getBaseText() {
@@ -417,6 +421,10 @@
return mAltGrText;
}
+ public String getAltGrShiftText() {
+ return mAltGrShiftText;
+ }
+
public boolean hasBaseText() {
return !TextUtils.isEmpty(mBaseText);
}
@@ -428,5 +436,12 @@
public boolean hasValidAltGrText() {
return !TextUtils.isEmpty(mAltGrText) && !TextUtils.equals(mBaseText, mAltGrText);
}
+
+ public boolean hasValidAltShiftText() {
+ return !TextUtils.isEmpty(mAltGrShiftText)
+ && !TextUtils.equals(mBaseText, mAltGrShiftText)
+ && !TextUtils.equals(mAltGrText, mAltGrShiftText)
+ && !TextUtils.equals(mShiftText, mAltGrShiftText);
+ }
}
}
diff --git a/core/java/android/service/autofill/AutofillService.java b/core/java/android/service/autofill/AutofillService.java
index 298bdb8..e6a84df 100644
--- a/core/java/android/service/autofill/AutofillService.java
+++ b/core/java/android/service/autofill/AutofillService.java
@@ -600,6 +600,14 @@
*/
public static final String EXTRA_ERROR = "error";
+ /**
+ * Name of the key used to mark whether the fill response is for a webview.
+ *
+ * @hide
+ */
+ public static final String WEBVIEW_REQUESTED_CREDENTIAL_KEY = "webview_requested_credential";
+
+
private final IAutoFillService mInterface = new IAutoFillService.Stub() {
@Override
public void onConnectedStateChanged(boolean connected) {
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 2366ff7..5c5817f 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -15868,20 +15868,7 @@
}
if (onFilterTouchEventForSecurity(event)) {
- if ((mViewFlags & ENABLED_MASK) == ENABLED && handleScrollBarDragging(event)) {
- result = true;
- }
- //noinspection SimplifiableIfStatement
- ListenerInfo li = mListenerInfo;
- if (li != null && li.mOnTouchListener != null
- && (mViewFlags & ENABLED_MASK) == ENABLED
- && li.mOnTouchListener.onTouch(this, event)) {
- result = true;
- }
-
- if (!result && onTouchEvent(event)) {
- result = true;
- }
+ result = performOnTouchCallback(event);
}
if (!result && mInputEventConsistencyVerifier != null) {
@@ -15900,6 +15887,36 @@
return result;
}
+ /**
+ * Returns {@code true} if the {@link MotionEvent} from {@link #dispatchTouchEvent} was
+ * handled by this view.
+ */
+ private boolean performOnTouchCallback(MotionEvent event) {
+ boolean handled = false;
+ if ((mViewFlags & ENABLED_MASK) == ENABLED && handleScrollBarDragging(event)) {
+ handled = true;
+ }
+ //noinspection SimplifiableIfStatement
+ ListenerInfo li = mListenerInfo;
+ if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED) {
+ try {
+ Trace.traceBegin(Trace.TRACE_TAG_VIEW, "View.onTouchListener#onTouch");
+ handled = li.mOnTouchListener.onTouch(this, event);
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_VIEW);
+ }
+ }
+ if (handled) {
+ return true;
+ }
+ try {
+ Trace.traceBegin(Trace.TRACE_TAG_VIEW, "View#onTouchEvent");
+ return onTouchEvent(event);
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_VIEW);
+ }
+ }
+
boolean isAccessibilityFocusedViewOrHost() {
return isAccessibilityFocused() || (getViewRootImpl() != null && getViewRootImpl()
.getAccessibilityFocusedHost() == this);
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 6534354..e03f857 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -11550,15 +11550,6 @@
event.setContentChangeTypes(mChangeTypes);
if (mAction.isPresent()) event.setAction(mAction.getAsInt());
if (AccessibilityEvent.DEBUG_ORIGIN) event.originStackTrace = mOrigin;
-
- if (fixMergedContentChangeEvent()) {
- if ((mChangeTypes & AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE) != 0) {
- final View importantParent = source.getSelfOrParentImportantForA11y();
- if (importantParent != null) {
- source = importantParent;
- }
- }
- }
source.sendAccessibilityEventUnchecked(event);
} else {
mLastEventTimeMillis = 0;
@@ -11595,6 +11586,9 @@
if (mSource != null) {
if (fixMergedContentChangeEvent()) {
View newSource = getCommonPredecessor(mSource, source);
+ if (newSource != null) {
+ newSource = newSource.getSelfOrParentImportantForA11y();
+ }
if (newSource == null) {
// If there is no common predecessor, then mSource points to
// a removed view, hence in this case always prefer the source.
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 951625e..d4e727e 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -5385,19 +5385,20 @@
and a second time clipped to the fill level to indicate charge -->
<bool name="config_batterymeterDualTone">false</bool>
- <!-- The default refresh rate for a given device. This value is used to set the
- global refresh rate vote, and when set to zero it has no effect on the vote.
- If this value is non-zero but the hardware composer on the device supports
- display modes with higher refresh rates, the framework may use those higher
- refresh rate modes if an app chooses one by setting preferredDisplayModeId
- or calling setFrameRate().-->
- <integer name="config_defaultRefreshRate">0</integer>
+ <!-- The default refresh rate for a given device. Change this value to set a higher default
+ refresh rate. If the hardware composer on the device supports display modes with a higher
+ refresh rate than the default value specified here, the framework may use those higher
+ refresh rate modes if an app chooses one by setting preferredDisplayModeId or calling
+ setFrameRate().
+ If a non-zero value is set for config_defaultPeakRefreshRate, then
+ config_defaultRefreshRate may be set to 0, in which case the value set for
+ config_defaultPeakRefreshRate will act as the default frame rate. -->
+ <integer name="config_defaultRefreshRate">60</integer>
- <!-- The default peak refresh rate for a given device. This value is used to set the
- global peak refresh rate vote, and when set to zero it has no effect on the vote.
- Change this value to non-zero if you want to prevent the framework from using higher
- refresh rates, even if display modes with higher refresh rates are available from
- hardware composer. -->
+ <!-- The default peak refresh rate for a given device. Change this value if you want to prevent
+ the framework from using higher refresh rates, even if display modes with higher refresh
+ rates are available from hardware composer. Only has an effect if the value is
+ non-zero. -->
<integer name="config_defaultPeakRefreshRate">0</integer>
<!-- External display peak refresh rate for the given device. Change this value if you want to
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt
index 30681f3..0ccb07a 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt
@@ -108,7 +108,8 @@
isReqForAllOptions = intent.getBooleanExtra(
Constants.EXTRA_REQ_FOR_ALL_OPTIONS,
/*defaultValue=*/ false
- )
+ ) || (requestInfo?.isShowAllOptionsRequested ?: false) // TODO(b/323552850) - Remove
+ // usage on Constants.EXTRA_REQ_FOR_ALL_OPTIONS once it is deprecated.
val cancellationRequest = getCancelUiRequest(intent)
val cancelUiRequestState = cancellationRequest?.let {
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt b/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
index 07f1fa3..f496c1f 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
@@ -116,8 +116,10 @@
return
}
+ val responseClientState = Bundle()
+ responseClientState.putBoolean(WEBVIEW_REQUESTED_CREDENTIAL_KEY, false)
val getCredRequest: GetCredentialRequest? = getCredManRequest(structure, sessionId,
- requestId)
+ requestId, responseClientState)
if (getCredRequest == null) {
Log.i(TAG, "No credential manager request found")
callback.onFailure("No credential manager request found")
@@ -153,7 +155,8 @@
return
}
- val fillResponse = convertToFillResponse(result, request)
+ val fillResponse = convertToFillResponse(result, request,
+ responseClientState)
if (fillResponse != null) {
callback.onSuccess(fillResponse)
} else {
@@ -260,7 +263,8 @@
private fun convertToFillResponse(
getCredResponse: GetCandidateCredentialsResponse,
- filLRequest: FillRequest
+ filLRequest: FillRequest,
+ responseClientState: Bundle
): FillResponse? {
val candidateProviders = getCredResponse.candidateProviderDataList
if (candidateProviders.isEmpty()) {
@@ -281,6 +285,7 @@
if (!validFillResponse) {
return null
}
+ fillResponseBuilder.setClientState(responseClientState)
return fillResponseBuilder.build()
}
@@ -578,10 +583,11 @@
private fun getCredManRequest(
structure: AssistStructure,
sessionId: Int,
- requestId: Int
+ requestId: Int,
+ responseClientState: Bundle
): GetCredentialRequest? {
val credentialOptions: MutableList<CredentialOption> = mutableListOf()
- traverseStructure(structure, credentialOptions)
+ traverseStructure(structure, credentialOptions, responseClientState)
if (credentialOptions.isNotEmpty()) {
val dataBundle = Bundle()
@@ -596,7 +602,8 @@
private fun traverseStructure(
structure: AssistStructure,
- cmRequests: MutableList<CredentialOption>
+ cmRequests: MutableList<CredentialOption>,
+ responseClientState: Bundle
) {
val windowNodes: List<AssistStructure.WindowNode> =
structure.run {
@@ -604,16 +611,17 @@
}
windowNodes.forEach { windowNode: AssistStructure.WindowNode ->
- traverseNode(windowNode.rootViewNode, cmRequests)
+ traverseNode(windowNode.rootViewNode, cmRequests, responseClientState)
}
}
private fun traverseNode(
viewNode: AssistStructure.ViewNode,
- cmRequests: MutableList<CredentialOption>
+ cmRequests: MutableList<CredentialOption>,
+ responseClientState: Bundle
) {
viewNode.autofillId?.let {
- val options = getCredentialOptionsFromViewNode(viewNode, it)
+ val options = getCredentialOptionsFromViewNode(viewNode, it, responseClientState)
cmRequests.addAll(options)
}
@@ -623,13 +631,14 @@
}
children.forEach { childNode: AssistStructure.ViewNode ->
- traverseNode(childNode, cmRequests)
+ traverseNode(childNode, cmRequests, responseClientState)
}
}
private fun getCredentialOptionsFromViewNode(
viewNode: AssistStructure.ViewNode,
- autofillId: AutofillId
+ autofillId: AutofillId,
+ responseClientState: Bundle
): List<CredentialOption> {
// TODO(b/293945193) Replace with isCredential check from viewNode
val credentialHints: MutableList<String> = mutableListOf()
@@ -637,6 +646,9 @@
for (hint in viewNode.autofillHints!!) {
if (hint.startsWith(CRED_HINT_PREFIX)) {
credentialHints.add(hint.substringAfter(CRED_HINT_PREFIX))
+ if (viewNode.webDomain != null) {
+ responseClientState.putBoolean(WEBVIEW_REQUESTED_CREDENTIAL_KEY, true)
+ }
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/smartspace/data/repository/SmartspaceRepository.kt b/packages/SystemUI/src/com/android/systemui/smartspace/data/repository/SmartspaceRepository.kt
index 52a1c15..095d30e 100644
--- a/packages/SystemUI/src/com/android/systemui/smartspace/data/repository/SmartspaceRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/smartspace/data/repository/SmartspaceRepository.kt
@@ -21,9 +21,7 @@
import android.widget.RemoteViews
import com.android.systemui.communal.smartspace.CommunalSmartspaceController
import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.plugins.BcSmartspaceDataPlugin
-import java.util.concurrent.Executor
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
@@ -43,7 +41,6 @@
@Inject
constructor(
private val communalSmartspaceController: CommunalSmartspaceController,
- @Main private val uiExecutor: Executor,
) : SmartspaceRepository, BcSmartspaceDataPlugin.SmartspaceTargetListener {
override val isSmartspaceRemoteViewsEnabled: Boolean
@@ -54,18 +51,12 @@
override val communalSmartspaceTargets: Flow<List<SmartspaceTarget>> =
_communalSmartspaceTargets
.onStart {
- uiExecutor.execute {
- communalSmartspaceController.addListener(
- listener = this@SmartspaceRepositoryImpl
- )
- }
+ communalSmartspaceController.addListener(listener = this@SmartspaceRepositoryImpl)
}
.onCompletion {
- uiExecutor.execute {
- communalSmartspaceController.removeListener(
- listener = this@SmartspaceRepositoryImpl
- )
- }
+ communalSmartspaceController.removeListener(
+ listener = this@SmartspaceRepositoryImpl
+ )
}
override fun onSmartspaceTargetsUpdated(targetsNullable: MutableList<out Parcelable>?) {
diff --git a/services/autofill/java/com/android/server/autofill/PresentationStatsEventLogger.java b/services/autofill/java/com/android/server/autofill/PresentationStatsEventLogger.java
index cf414d1..3645c40 100644
--- a/services/autofill/java/com/android/server/autofill/PresentationStatsEventLogger.java
+++ b/services/autofill/java/com/android/server/autofill/PresentationStatsEventLogger.java
@@ -254,6 +254,14 @@
mEventInternal.ifPresent(event -> event.mIsCredentialRequest = isCredentialRequest);
}
+ /**
+ * Set webview_requested_credential
+ */
+ public void maybeSetWebviewRequestedCredential(boolean webviewRequestedCredential) {
+ mEventInternal.ifPresent(event ->
+ event.mWebviewRequestedCredential = webviewRequestedCredential);
+ }
+
public void maybeSetNoPresentationEventReason(@NotShownReason int reason) {
mEventInternal.ifPresent(event -> {
if (event.mCountShown == 0) {
@@ -578,7 +586,8 @@
+ " mDetectionPreference=" + event.mDetectionPreference
+ " mFieldClassificationRequestId=" + event.mFieldClassificationRequestId
+ " mAppPackageUid=" + mCallingAppUid
- + " mIsCredentialRequest=" + event.mIsCredentialRequest);
+ + " mIsCredentialRequest=" + event.mIsCredentialRequest
+ + " mWebviewRequestedCredential=" + event.mWebviewRequestedCredential);
}
// TODO(b/234185326): Distinguish empty responses from other no presentation reasons.
@@ -618,7 +627,8 @@
event.mDetectionPreference,
event.mFieldClassificationRequestId,
mCallingAppUid,
- event.mIsCredentialRequest);
+ event.mIsCredentialRequest,
+ event.mWebviewRequestedCredential);
mEventInternal = Optional.empty();
}
@@ -653,6 +663,7 @@
@DetectionPreference int mDetectionPreference = DETECTION_PREFER_UNKNOWN;
int mFieldClassificationRequestId = -1;
boolean mIsCredentialRequest = false;
+ boolean mWebviewRequestedCredential = false;
PresentationStatsEventInternal() {}
}
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 049feee..83d9cdb 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -18,6 +18,7 @@
import static android.service.autofill.AutofillFieldClassificationService.EXTRA_SCORES;
import static android.service.autofill.AutofillService.EXTRA_FILL_RESPONSE;
+import static android.service.autofill.AutofillService.WEBVIEW_REQUESTED_CREDENTIAL_KEY;
import static android.service.autofill.Dataset.PICK_REASON_NO_PCC;
import static android.service.autofill.Dataset.PICK_REASON_PCC_DETECTION_ONLY;
import static android.service.autofill.Dataset.PICK_REASON_PCC_DETECTION_PREFERRED_WITH_PROVIDER;
@@ -5516,8 +5517,11 @@
mResponses.put(requestId, newResponse);
mClientState = newClientState != null ? newClientState : newResponse.getClientState();
+ boolean webviewRequestedCredman = newClientState != null && newClientState.getBoolean(
+ WEBVIEW_REQUESTED_CREDENTIAL_KEY, false);
List<Dataset> datasetList = newResponse.getDatasets();
+ mPresentationStatsEventLogger.maybeSetWebviewRequestedCredential(webviewRequestedCredman);
mPresentationStatsEventLogger.maybeSetFieldClassificationRequestId(sIdCounterForPcc.get());
mPresentationStatsEventLogger.maybeSetAvailableCount(datasetList, mCurrentViewId);
mFillResponseEventLogger.maybeSetDatasetsCountAfterPotentialPccFiltering(datasetList);
diff --git a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java
index 3dcf42d..b6f7eb3 100644
--- a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java
@@ -103,14 +103,16 @@
flattenedPrimaryProviders.add(cn.flattenToString());
}
+ final boolean isShowAllOptionsRequested = false;
mPendingIntent = mCredentialManagerUi.createPendingIntent(
RequestInfo.newCreateRequestInfo(
mRequestId, mClientRequest,
mClientAppInfo.getPackageName(),
PermissionUtils.hasPermission(mContext, mClientAppInfo.getPackageName(),
Manifest.permission.CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS),
- /*defaultProviderId=*/flattenedPrimaryProviders),
- providerDataList, /*isRequestForAllOptions=*/ false);
+ /*defaultProviderId=*/flattenedPrimaryProviders,
+ isShowAllOptionsRequested),
+ providerDataList, /*isRequestForAllOptions=*/ isShowAllOptionsRequested);
mClientCallback.onPendingIntent(mPendingIntent);
} catch (RemoteException e) {
mRequestSessionMetric.collectUiReturnedFinalPhase(/*uiReturned=*/ false);
diff --git a/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java b/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java
index 1a9a0e6..9e362b3 100644
--- a/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java
@@ -111,13 +111,15 @@
}
cancelExistingPendingIntent();
+ final boolean isShowAllOptionsRequested = true;
mPendingIntent = mCredentialManagerUi.createPendingIntent(
RequestInfo.newGetRequestInfo(
mRequestId, mClientRequest, mClientAppInfo.getPackageName(),
PermissionUtils.hasPermission(mContext, mClientAppInfo.getPackageName(),
- Manifest.permission.CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS)),
+ Manifest.permission.CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS),
+ isShowAllOptionsRequested),
/*providerDataList=*/ null,
- /*isRequestForAllOptions=*/ true);
+ /*isRequestForAllOptions=*/ isShowAllOptionsRequested);
List<GetCredentialProviderData> candidateProviderDataList = new ArrayList<>();
for (ProviderData providerData : providerDataList) {
diff --git a/services/credentials/java/com/android/server/credentials/GetRequestSession.java b/services/credentials/java/com/android/server/credentials/GetRequestSession.java
index b33f531..4068d7b 100644
--- a/services/credentials/java/com/android/server/credentials/GetRequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/GetRequestSession.java
@@ -102,15 +102,17 @@
Binder.withCleanCallingIdentity(() -> {
try {
cancelExistingPendingIntent();
+ final boolean isShowAllOptionsRequested = false;
mPendingIntent = mCredentialManagerUi.createPendingIntent(
RequestInfo.newGetRequestInfo(
mRequestId, mClientRequest, mClientAppInfo.getPackageName(),
PermissionUtils.hasPermission(mContext,
mClientAppInfo.getPackageName(),
Manifest.permission
- .CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS)),
+ .CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS),
+ isShowAllOptionsRequested),
providerDataList,
- /*isRequestForAllOptions=*/ false);
+ /*isRequestForAllOptions=*/ isShowAllOptionsRequested);
mClientCallback.onPendingIntent(mPendingIntent);
} catch (RemoteException e) {
mRequestSessionMetric.collectUiReturnedFinalPhase(/*uiReturned=*/ false);
diff --git a/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java b/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java
index 30af567..6b313fd 100644
--- a/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java
@@ -187,12 +187,14 @@
}
}
if (!providerDataList.isEmpty()) {
+ final boolean isShowAllOptionsRequested = false;
return mCredentialManagerUi.createPendingIntent(
RequestInfo.newGetRequestInfo(
mRequestId, mClientRequest, mClientAppInfo.getPackageName(),
PermissionUtils.hasPermission(mContext, mClientAppInfo.getPackageName(),
- Manifest.permission.CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS)),
- providerDataList, /*isRequestForAllOptions=*/ false);
+ Manifest.permission.CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS),
+ isShowAllOptionsRequested),
+ providerDataList, /*isRequestForAllOptions=*/ isShowAllOptionsRequested);
} else {
return null;
}
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp
index 938a5ed..b054a57 100644
--- a/tools/aapt2/Android.bp
+++ b/tools/aapt2/Android.bp
@@ -262,6 +262,23 @@
"$(genDir)/aapt2_tests " +
"--gtest_output=xml:$(out) " +
">/dev/null 2>&1 ; true",
+ dist: {
+ targets: ["aapt2_run_host_unit_tests"],
+ dir: "gtest",
+ dest: "aapt2_host_unit_tests_result.xml",
+ },
+ arch: {
+ x86: {
+ dist: {
+ suffix: "_x86",
+ },
+ },
+ x86_64: {
+ dist: {
+ suffix: "_x86_64",
+ },
+ },
+ },
}
phony_rule {