diff options
60 files changed, 586 insertions, 280 deletions
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java b/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java index 322bd119b604..81788c243533 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java @@ -45,7 +45,7 @@ import java.util.Objects; import java.util.Random; /** - * Logger Implementation using Westworld. + * Logger Implementation to log to statsd. * * <p>This class is thread-safe. * @@ -95,7 +95,7 @@ public final class PlatformLogger implements AppSearchLogger { private long mLastPushTimeMillisLocked = 0; /** - * Helper class to hold platform specific stats for Westworld. + * Helper class to hold platform specific stats for statsd. */ static final class ExtraStats { // UID for the calling package of the stats. @@ -113,7 +113,7 @@ public final class PlatformLogger implements AppSearchLogger { } /** - * Westworld constructor + * Constructor */ public PlatformLogger( @NonNull Context userContext, diff --git a/core/java/android/service/voice/HotwordDetectedResult.java b/core/java/android/service/voice/HotwordDetectedResult.java index 5c660216065c..72341453a1f4 100644 --- a/core/java/android/service/voice/HotwordDetectedResult.java +++ b/core/java/android/service/voice/HotwordDetectedResult.java @@ -89,6 +89,12 @@ public final class HotwordDetectedResult implements Parcelable { /** Represents unset value for the triggered audio channel. */ public static final int AUDIO_CHANNEL_UNSET = -1; + /** Limits the max value for the hotword offset. */ + private static final int LIMIT_HOTWORD_OFFSET_MAX_VALUE = 60 * 60 * 1000; // 1 hour + + /** Limits the max value for the triggered audio channel. */ + private static final int LIMIT_AUDIO_CHANNEL_MAX_VALUE = 63; + /** Confidence level in the trigger outcome. */ @HotwordConfidenceLevelValue private final int mConfidenceLevel; @@ -107,6 +113,8 @@ public final class HotwordDetectedResult implements Parcelable { /** * Offset in milliseconds the audio stream when the trigger event happened (end of hotword * phrase). + * + * <p>Only value between 0 and 3600000 (inclusive) is accepted. */ private int mHotwordOffsetMillis = HOTWORD_OFFSET_UNSET; @@ -118,7 +126,11 @@ public final class HotwordDetectedResult implements Parcelable { */ private int mHotwordDurationMillis = 0; - /** Audio channel containing the highest-confidence hotword signal. **/ + /** + * Audio channel containing the highest-confidence hotword signal. + * + * <p>Only value between 0 and 63 (inclusive) is accepted. + */ private int mAudioChannel = AUDIO_CHANNEL_UNSET; /** @@ -249,13 +261,13 @@ public final class HotwordDetectedResult implements Parcelable { totalBits += bitCount(CONFIDENCE_LEVEL_VERY_HIGH); } if (hotwordDetectedResult.getHotwordOffsetMillis() != HOTWORD_OFFSET_UNSET) { - totalBits += Integer.SIZE; + totalBits += bitCount(LIMIT_HOTWORD_OFFSET_MAX_VALUE); } if (hotwordDetectedResult.getHotwordDurationMillis() != 0) { totalBits += bitCount(AudioRecord.getMaxSharedAudioHistoryMillis()); } if (hotwordDetectedResult.getAudioChannel() != AUDIO_CHANNEL_UNSET) { - totalBits += Integer.SIZE; + totalBits += bitCount(LIMIT_AUDIO_CHANNEL_MAX_VALUE); } // Add one bit for HotwordDetectionPersonalized @@ -294,6 +306,14 @@ public final class HotwordDetectedResult implements Parcelable { "hotwordPhraseId"); Preconditions.checkArgumentInRange((long) mHotwordDurationMillis, 0, AudioRecord.getMaxSharedAudioHistoryMillis(), "hotwordDurationMillis"); + if (mHotwordOffsetMillis != HOTWORD_OFFSET_UNSET) { + Preconditions.checkArgumentInRange(mHotwordOffsetMillis, 0, + LIMIT_HOTWORD_OFFSET_MAX_VALUE, "hotwordOffsetMillis"); + } + if (mAudioChannel != AUDIO_CHANNEL_UNSET) { + Preconditions.checkArgumentInRange(mAudioChannel, 0, LIMIT_AUDIO_CHANNEL_MAX_VALUE, + "audioChannel"); + } if (!mExtras.isEmpty()) { Preconditions.checkArgumentInRange(getParcelableSize(mExtras), 0, getMaxBundleSize(), "extras"); @@ -351,6 +371,27 @@ public final class HotwordDetectedResult implements Parcelable { } } + /** @hide */ + @IntDef(prefix = "LIMIT_", value = { + LIMIT_HOTWORD_OFFSET_MAX_VALUE, + LIMIT_AUDIO_CHANNEL_MAX_VALUE + }) + @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) + @DataClass.Generated.Member + /* package-private */ @interface Limit {} + + /** @hide */ + @DataClass.Generated.Member + /* package-private */ static String limitToString(@Limit int value) { + switch (value) { + case LIMIT_HOTWORD_OFFSET_MAX_VALUE: + return "LIMIT_HOTWORD_OFFSET_MAX_VALUE"; + case LIMIT_AUDIO_CHANNEL_MAX_VALUE: + return "LIMIT_AUDIO_CHANNEL_MAX_VALUE"; + default: return Integer.toHexString(value); + } + } + @DataClass.Generated.Member /* package-private */ HotwordDetectedResult( @HotwordConfidenceLevelValue int confidenceLevel, @@ -392,6 +433,8 @@ public final class HotwordDetectedResult implements Parcelable { /** * Offset in milliseconds the audio stream when the trigger event happened (end of hotword * phrase). + * + * <p>Only value between 0 and 3600000 (inclusive) is accepted. */ @DataClass.Generated.Member public int getHotwordOffsetMillis() { @@ -410,7 +453,9 @@ public final class HotwordDetectedResult implements Parcelable { } /** - * Audio channel containing the highest-confidence hotword signal. * + * Audio channel containing the highest-confidence hotword signal. + * + * <p>Only value between 0 and 63 (inclusive) is accepted. */ @DataClass.Generated.Member public int getAudioChannel() { @@ -667,6 +712,8 @@ public final class HotwordDetectedResult implements Parcelable { /** * Offset in milliseconds the audio stream when the trigger event happened (end of hotword * phrase). + * + * <p>Only value between 0 and 3600000 (inclusive) is accepted. */ @DataClass.Generated.Member public @NonNull Builder setHotwordOffsetMillis(int value) { @@ -691,7 +738,9 @@ public final class HotwordDetectedResult implements Parcelable { } /** - * Audio channel containing the highest-confidence hotword signal. * + * Audio channel containing the highest-confidence hotword signal. + * + * <p>Only value between 0 and 63 (inclusive) is accepted. */ @DataClass.Generated.Member public @NonNull Builder setAudioChannel(int value) { @@ -833,10 +882,10 @@ public final class HotwordDetectedResult implements Parcelable { } @DataClass.Generated( - time = 1625198973370L, + time = 1625541522353L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/service/voice/HotwordDetectedResult.java", - inputSignatures = "public static final int CONFIDENCE_LEVEL_NONE\npublic static final int CONFIDENCE_LEVEL_LOW\npublic static final int CONFIDENCE_LEVEL_LOW_MEDIUM\npublic static final int CONFIDENCE_LEVEL_MEDIUM\npublic static final int CONFIDENCE_LEVEL_MEDIUM_HIGH\npublic static final int CONFIDENCE_LEVEL_HIGH\npublic static final int CONFIDENCE_LEVEL_VERY_HIGH\npublic static final int HOTWORD_OFFSET_UNSET\npublic static final int AUDIO_CHANNEL_UNSET\nprivate final @android.service.voice.HotwordDetectedResult.HotwordConfidenceLevelValue int mConfidenceLevel\nprivate @android.annotation.Nullable android.media.MediaSyncEvent mMediaSyncEvent\nprivate int mHotwordOffsetMillis\nprivate int mHotwordDurationMillis\nprivate int mAudioChannel\nprivate boolean mHotwordDetectionPersonalized\nprivate final int mScore\nprivate final int mPersonalizedScore\nprivate final int mHotwordPhraseId\nprivate final @android.annotation.NonNull android.os.PersistableBundle mExtras\nprivate static int sMaxBundleSize\nprivate static int defaultConfidenceLevel()\nprivate static int defaultScore()\nprivate static int defaultPersonalizedScore()\npublic static int getMaxScore()\nprivate static int defaultHotwordPhraseId()\npublic static int getMaxHotwordPhraseId()\nprivate static android.os.PersistableBundle defaultExtras()\npublic static int getMaxBundleSize()\npublic @android.annotation.Nullable android.media.MediaSyncEvent getMediaSyncEvent()\npublic static int getParcelableSize(android.os.Parcelable)\npublic static int getUsageSize(android.service.voice.HotwordDetectedResult)\nprivate static int bitCount(long)\nprivate void onConstructed()\nclass HotwordDetectedResult extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genParcelable=true, genToString=true)") + inputSignatures = "public static final int CONFIDENCE_LEVEL_NONE\npublic static final int CONFIDENCE_LEVEL_LOW\npublic static final int CONFIDENCE_LEVEL_LOW_MEDIUM\npublic static final int CONFIDENCE_LEVEL_MEDIUM\npublic static final int CONFIDENCE_LEVEL_MEDIUM_HIGH\npublic static final int CONFIDENCE_LEVEL_HIGH\npublic static final int CONFIDENCE_LEVEL_VERY_HIGH\npublic static final int HOTWORD_OFFSET_UNSET\npublic static final int AUDIO_CHANNEL_UNSET\nprivate static final int LIMIT_HOTWORD_OFFSET_MAX_VALUE\nprivate static final int LIMIT_AUDIO_CHANNEL_MAX_VALUE\nprivate final @android.service.voice.HotwordDetectedResult.HotwordConfidenceLevelValue int mConfidenceLevel\nprivate @android.annotation.Nullable android.media.MediaSyncEvent mMediaSyncEvent\nprivate int mHotwordOffsetMillis\nprivate int mHotwordDurationMillis\nprivate int mAudioChannel\nprivate boolean mHotwordDetectionPersonalized\nprivate final int mScore\nprivate final int mPersonalizedScore\nprivate final int mHotwordPhraseId\nprivate final @android.annotation.NonNull android.os.PersistableBundle mExtras\nprivate static int sMaxBundleSize\nprivate static int defaultConfidenceLevel()\nprivate static int defaultScore()\nprivate static int defaultPersonalizedScore()\npublic static int getMaxScore()\nprivate static int defaultHotwordPhraseId()\npublic static int getMaxHotwordPhraseId()\nprivate static android.os.PersistableBundle defaultExtras()\npublic static int getMaxBundleSize()\npublic @android.annotation.Nullable android.media.MediaSyncEvent getMediaSyncEvent()\npublic static int getParcelableSize(android.os.Parcelable)\npublic static int getUsageSize(android.service.voice.HotwordDetectedResult)\nprivate static int bitCount(long)\nprivate void onConstructed()\nclass HotwordDetectedResult extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genParcelable=true, genToString=true)") @Deprecated private void __metadata() {} diff --git a/core/java/com/android/internal/view/RecyclerViewCaptureHelper.java b/core/java/com/android/internal/view/RecyclerViewCaptureHelper.java index b29cf1c2cb1a..848a5ba77317 100644 --- a/core/java/com/android/internal/view/RecyclerViewCaptureHelper.java +++ b/core/java/com/android/internal/view/RecyclerViewCaptureHelper.java @@ -61,77 +61,128 @@ public class RecyclerViewCaptureHelper implements ScrollCaptureViewHelper<ViewGr @Override public ScrollResult onScrollRequested(@NonNull ViewGroup recyclerView, Rect scrollBounds, Rect requestRect) { - Log.d(TAG, "-----------------------------------------------------------"); - Log.d(TAG, "onScrollRequested(scrollBounds=" + scrollBounds + ", " - + "requestRect=" + requestRect + ")"); - ScrollResult result = new ScrollResult(); result.requestedArea = new Rect(requestRect); result.scrollDelta = mScrollDelta; result.availableArea = new Rect(); // empty + Log.d(TAG, "current scrollDelta: " + mScrollDelta); if (!recyclerView.isVisibleToUser() || recyclerView.getChildCount() == 0) { Log.w(TAG, "recyclerView is empty or not visible, cannot continue"); return result; // result.availableArea == empty Rect } - // Make requestRect relative to RecyclerView (from scrollBounds) - Rect requestedContainerBounds = - transformFromRequestToContainer(mScrollDelta, scrollBounds, requestRect); - - Rect recyclerLocalVisible = new Rect(); - recyclerView.getLocalVisibleRect(recyclerLocalVisible); + // move from scrollBounds-relative to parent-local coordinates + Rect requestedContainerBounds = new Rect(requestRect); + requestedContainerBounds.offset(0, -mScrollDelta); + requestedContainerBounds.offset(scrollBounds.left, scrollBounds.top); - // Expand request rect match visible bounds to center the requested rect vertically - Rect adjustedContainerBounds = new Rect(requestedContainerBounds); - int remainingHeight = recyclerLocalVisible.height() - requestedContainerBounds.height(); - if (remainingHeight > 0) { - adjustedContainerBounds.inset(0, -remainingHeight / 2); - } + // requestedContainerBounds is now in recyclerview-local coordinates + Log.d(TAG, "requestedContainerBounds: " + requestedContainerBounds); - int scrollAmount = computeScrollAmount(recyclerLocalVisible, adjustedContainerBounds); - if (scrollAmount < 0) { - Log.d(TAG, "About to scroll UP (content moves down within parent)"); - } else if (scrollAmount > 0) { - Log.d(TAG, "About to scroll DOWN (content moves up within parent)"); + // Save a copy for later + View anchor = findChildNearestTarget(recyclerView, requestedContainerBounds); + if (anchor == null) { + Log.d(TAG, "Failed to locate anchor view"); + return result; // result.availableArea == null } - Log.d(TAG, "scrollAmount: " + scrollAmount); - - View refView = findScrollingReferenceView(recyclerView, scrollAmount); - int refTop = refView.getTop(); - // Map the request into the child view coords - Rect requestedContentBounds = new Rect(adjustedContainerBounds); - recyclerView.offsetRectIntoDescendantCoords(refView, requestedContentBounds); - Log.d(TAG, "request rect, in child view space = " + requestedContentBounds); + Log.d(TAG, "Anchor view:" + anchor); + Rect requestedContentBounds = new Rect(requestedContainerBounds); + recyclerView.offsetRectIntoDescendantCoords(anchor, requestedContentBounds); + Log.d(TAG, "requestedContentBounds = " + requestedContentBounds); + int prevAnchorTop = anchor.getTop(); // Note: requestChildRectangleOnScreen may modify rectangle, must pass pass in a copy here - Rect request = new Rect(requestedContentBounds); - recyclerView.requestChildRectangleOnScreen(refView, request, true); - - int scrollDistance = refTop - refView.getTop(); - Log.d(TAG, "Parent view scrolled vertically by " + scrollDistance + " px"); - - mScrollDelta += scrollDistance; - result.scrollDelta = mScrollDelta; - if (scrollDistance != 0) { - Log.d(TAG, "Scroll delta is now " + mScrollDelta + " px"); + Rect input = new Rect(requestedContentBounds); + // Expand input rect to get the requested rect to be in the center + int remainingHeight = recyclerView.getHeight() - recyclerView.getPaddingTop() + - recyclerView.getPaddingBottom() - input.height(); + if (remainingHeight > 0) { + input.inset(0, -remainingHeight / 2); + } + Log.d(TAG, "input (post center adjustment) = " + input); + + if (recyclerView.requestChildRectangleOnScreen(anchor, input, true)) { + int scrolled = prevAnchorTop - anchor.getTop(); // inverse of movement + Log.d(TAG, "RecyclerView scrolled by " + scrolled + " px"); + mScrollDelta += scrolled; // view.top-- is equivalent to parent.scrollY++ + result.scrollDelta = mScrollDelta; + Log.d(TAG, "requestedContentBounds, (post-request-rect) = " + requestedContentBounds); } - // Update, post-scroll - requestedContainerBounds = new Rect( - transformFromRequestToContainer(mScrollDelta, scrollBounds, requestRect)); + requestedContainerBounds.set(requestedContentBounds); + recyclerView.offsetDescendantRectToMyCoords(anchor, requestedContainerBounds); + Log.d(TAG, "requestedContainerBounds, (post-scroll): " + requestedContainerBounds); - // in case it might have changed (nested scrolling) + Rect recyclerLocalVisible = new Rect(scrollBounds); recyclerView.getLocalVisibleRect(recyclerLocalVisible); - if (requestedContainerBounds.intersect(recyclerLocalVisible)) { - result.availableArea = transformFromContainerToRequest( - mScrollDelta, scrollBounds, requestedContainerBounds); + Log.d(TAG, "recyclerLocalVisible: " + recyclerLocalVisible); + + if (!requestedContainerBounds.intersect(recyclerLocalVisible)) { + // Requested area is still not visible + Log.d(TAG, "requested bounds not visible!"); + return result; } - Log.d(TAG, "-----------------------------------------------------------"); + Rect available = new Rect(requestedContainerBounds); + available.offset(-scrollBounds.left, -scrollBounds.top); + available.offset(0, mScrollDelta); + result.availableArea = available; + Log.d(TAG, "availableArea: " + result.availableArea); return result; } + /** + * Find a view that is located "closest" to targetRect. Returns the first view to fully + * vertically overlap the target targetRect. If none found, returns the view with an edge + * nearest the target targetRect. + * + * @param parent the parent vertical layout + * @param targetRect a rectangle in local coordinates of <code>parent</code> + * @return a child view within parent matching the criteria or null + */ + static View findChildNearestTarget(ViewGroup parent, Rect targetRect) { + View selected = null; + int minCenterDistance = Integer.MAX_VALUE; + int maxOverlap = 0; + + // allowable center-center distance, relative to targetRect. + // if within this range, taller views are preferred + final float preferredRangeFromCenterPercent = 0.25f; + final int preferredDistance = + (int) (preferredRangeFromCenterPercent * targetRect.height()); + + Rect parentLocalVis = new Rect(); + parent.getLocalVisibleRect(parentLocalVis); + Log.d(TAG, "findChildNearestTarget: parentVis=" + parentLocalVis + + " targetRect=" + targetRect); + + Rect frame = new Rect(); + for (int i = 0; i < parent.getChildCount(); i++) { + final View child = parent.getChildAt(i); + child.getHitRect(frame); + Log.d(TAG, "child #" + i + " hitRect=" + frame); + + if (child.getVisibility() != View.VISIBLE) { + Log.d(TAG, "child #" + i + " is not visible"); + continue; + } + + int centerDistance = Math.abs(targetRect.centerY() - frame.centerY()); + Log.d(TAG, "child #" + i + " : center to center: " + centerDistance + "px"); + + if (centerDistance < minCenterDistance) { + // closer to center + minCenterDistance = centerDistance; + selected = child; + } else if (frame.intersect(targetRect) && (frame.height() > preferredDistance)) { + // within X% pixels of center, but taller + selected = child; + } + } + return selected; + } + @Override public void onPrepareForEnd(@NonNull ViewGroup view) { // Restore original position and state diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml index c7a482909fec..ced155a37286 100644 --- a/packages/SystemUI/res-keyguard/values-ky/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml @@ -85,7 +85,7 @@ <string name="kg_login_too_many_attempts" msgid="4519957179182578690">"Өтө көп графикалык ачкычты тартуу аракети болду"</string> <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="544687656831558971">"PIN-кодуңузду <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тердиңиз. \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> секунддан кийин дагы аракет кылып көрүңүз."</string> <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="190984061975729494">"Сырсөзүңүздү <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тердиңиз. \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> секунддан кийин дагы аракет кылып көрүңүз."</string> - <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"Кулпуну ачуучу графикалык ачкычты <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тарттыңыз. \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> секунддан кийин дагы аракет кылып көрүңүз."</string> + <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"Түзмөктү ачуучу графикалык ачкычты <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тарттыңыз. \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> секунддан кийин дагы аракет кылып көрүңүз."</string> <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"SIM-картанын PIN-коду туура эмес. Эми түзмөктү бөгөттөн чыгаруу үчүн байланыш операторуңузга кайрылышыңыз керек."</string> <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="7030584350995485026"> <item quantity="other">SIM-картанын PIN-коду туура эмес, сизде <xliff:g id="NUMBER_1">%d</xliff:g> аракет калды.</item> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index fe91b68036da..c8aa73c2e33e 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -1170,11 +1170,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"عرض أحدث الرسائل والمكالمات الفائتة والتغييرات في الحالة"</string> <string name="people_tile_title" msgid="6589377493334871272">"محادثة"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"تم إيقاف الإشعار مؤقتًا من خلال ميزة \"عدم الإزعاج\""</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"تم إرسال رسالة من <xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"تم إرسال صورة من <xliff:g id="NAME">%1$s</xliff:g>."</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"تم تعديل حالة <xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"حدثت مشكلة أثناء قراءة مقياس مستوى شحن البطارية."</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"انقر للحصول على مزيد من المعلومات."</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"لم يتم ضبط منبّه."</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index ba6d3f473105..64a466c6d7e8 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"শেহতীয়া বাৰ্তা, মিছড্ কল আৰু স্থিতিৰ আপডে’ট চাওক"</string> <string name="people_tile_title" msgid="6589377493334871272">"বাৰ্তালাপ"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"অসুবিধা নিদিব সুবিধাটোৱে পজ কৰিছে"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g>এ এটা বাৰ্তা পঠিয়াইছে: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g>এ এখন প্ৰতিচ্ছবি পঠিয়াইছে"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g>ৰ এটা স্থিতিৰ আপডে’ট আছে: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"আপোনাৰ বেটাৰী মিটাৰ পঢ়োঁতে সমস্যা হৈছে"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"অধিক তথ্যৰ বাবে টিপক"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"কোনো এলাৰ্ম ছেট কৰা হোৱা নাই"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 5cb4422e6603..414351845844 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"Son mesajlar, buraxılmış zənglər və status güncəlləmələrinə baxın"</string> <string name="people_tile_title" msgid="6589377493334871272">"Söhbət"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"\"Narahat Etməyin\" rejimini tərəfindən durdurulub"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> mesaj göndərdi: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> şəkil göndərdi"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> status güncəlləməsi edib: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Batareya ölçüsünü oxuyarkən problem yarandı"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Ətraflı məlumat üçün toxunun"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Siqnal ayarlanmayıb"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 704c19c6e8b4..83fa2afb0033 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -1158,11 +1158,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"Глядзець нядаўнія паведамленні, прапушчаныя выклікі і абнаўленні стану"</string> <string name="people_tile_title" msgid="6589377493334871272">"Размова"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"Прыпынена функцыяй \"Не турбаваць\""</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"Карыстальнік <xliff:g id="NAME">%1$s</xliff:g> прыслаў паведамленне: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"Карыстальнік <xliff:g id="NAME">%1$s</xliff:g> адправіў відарыс"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"Карыстальнік <xliff:g id="NAME">%1$s</xliff:g> абнавіў стан: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Праблема з чытаннем індыкатара зараду акумулятара"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Націсніце, каб убачыць больш"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Няма будзільнікаў"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 2fc165eca9d5..6886ed4aba7c 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"Преглеждайте скорошни съобщения, пропуснати обаждания и информация за състоянието"</string> <string name="people_tile_title" msgid="6589377493334871272">"Разговор"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"Поставено на пауза от режима „Не безпокойте“"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> изпрати съобщение: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> изпрати изображение"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> има актуализация на състоянието: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Възникна проблем при четенето на данните за нивото на батерията"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Докоснете за още информация"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Няма зададен будилник"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 04a734d0a4c6..e8a7281a49dc 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -669,9 +669,8 @@ <string name="wallet_empty_state_label" msgid="7776761245237530394">"ফোন ব্যবহার করে আরও দ্রুত ও আরও নিরাপদে কেনাকাটা করার জন্য সেট-আপ করুন"</string> <string name="wallet_app_button_label" msgid="7123784239111190992">"সবকটি দেখুন"</string> <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"পেমেন্ট করতে ডিভাইস আনলক করুন"</string> - <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) --> - <skip /> - <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"আপডেট হচ্ছে"</string> + <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"কার্ড যোগ করুন"</string> + <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"আপডেট করা হচ্ছে"</string> <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"ব্যবহার করতে আনলক করুন"</string> <string name="wallet_error_generic" msgid="257704570182963611">"আপনার কার্ড সংক্রান্ত তথ্য পেতে সমস্যা হয়েছে, পরে আবার চেষ্টা করুন"</string> <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"লক স্ক্রিন সেটিংস"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index bac30d8d7e05..b90cff3772ae 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -1158,11 +1158,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"Zobrazit poslední zprávy, zmeškané hovory a aktualizace stavu"</string> <string name="people_tile_title" msgid="6589377493334871272">"Konverzace"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"Pozastaveno funkcí Nerušit"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> posílá zprávu: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> posílá obrázek"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> má aktualizaci stavu: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problém s načtením měřiče baterie"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Klepnutím zobrazíte další informace"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Budík nenastaven"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 682a24f5bcde..d0d33e49e8f7 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"Vaadake hiljutisi sõnumeid, vastamata kõnesid ja olekuvärskendusi"</string> <string name="people_tile_title" msgid="6589377493334871272">"Vestlus"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"Peatas režiim Mitte segada"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> saatis sõnumi: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> saatis pildi"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> värskendas olekut: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Probleem akumõõdiku lugemisel"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Puudutage lisateabe saamiseks"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Äratust pole"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index e85dba260723..d9744768fac3 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"دیدن بهروزرسانیهای وضعیت، تماسهای بیپاسخ، و پیامهای اخیر"</string> <string name="people_tile_title" msgid="6589377493334871272">"مکالمه"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"با «مزاحم نشوید» موقتاً متوقف شده است"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> پیامی ارسال کرد: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> تصویری ارسال کرد"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> وضعیتش را بهروزرسانی کرد: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"مشکلی در خواندن میزان باتری وجود دارد"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"برای اطلاعات بیشتر ضربه بزنید"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"هشداری تنظیم نشده است"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 358d448a8500..e5db4de17f2a 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"Affichez les messages récents, les appels manqués et les mises à jour d\'état"</string> <string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"Interrompue par la fonctionnalité Ne pas déranger"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> a envoyé un message : <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> a envoyé une image"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> a mis à jour son état : <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Un problème est survenu lors de la lecture du niveau de charge de la pile"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Touchez pour en savoir plus"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Aucune alarme définie"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 2236d7d992b0..ad3c6a8d64b5 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -669,8 +669,7 @@ <string name="wallet_empty_state_label" msgid="7776761245237530394">"તમારા ફોન વડે વધુ ઝડપી તેમજ સુરક્ષિત ખરીદીઓ કરવાની રીત સેટઅપ કરી લો"</string> <string name="wallet_app_button_label" msgid="7123784239111190992">"બધું બતાવો"</string> <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"ચુકવણી કરવા માટે અનલૉક કરો"</string> - <!-- no translation found for wallet_secondary_label_no_card (530725155985223497) --> - <skip /> + <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"કોઈ કાર્ડ ઉમેરો"</string> <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"અપડેટ કરી રહ્યાં છીએ"</string> <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"ઉપયોગ કરવા માટે અનલૉક કરો"</string> <string name="wallet_error_generic" msgid="257704570182963611">"તમારા કાર્ડની માહિતી મેળવવામાં સમસ્યા આવી હતી, કૃપા કરીને થોડા સમય પછી ફરી પ્રયાસ કરો"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index a23594cc25b7..3de805a4a428 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -1158,11 +1158,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"ההודעות האחרונות, שיחות שלא נענו ועדכוני סטטוס"</string> <string name="people_tile_title" msgid="6589377493334871272">"שיחה"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"ההתראה הושהתה על ידי \'נא לא להפריע\'"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"התקבלה הודעה מ<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> שלח/ה תמונה"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"הסטטוס של <xliff:g id="NAME">%1$s</xliff:g> עודכן: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"בעיה בקריאת מדדי הסוללה"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"יש להקיש כדי להציג מידע נוסף"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"לא הוגדרה התראה"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index c4545d42a01e..a1a475d12303 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"ბოლოდროინდელი შეტყობინებების, გამოტოვებული ზარების და სტატუსის განახლებების ნახვა"</string> <string name="people_tile_title" msgid="6589377493334871272">"მიმოწერა"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"დაპაუზებულია ფუნქციის „არ შემაწუხოთ“ მიერ"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g>-მა გაგზავნა შეტყობინება: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g>-მ(ა) სურათი გამოგზავნა"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g>-მა განაახლა სტატუსი: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"თქვენი ბატარეის მზომის წაკითხვასთან დაკავშირებით პრობლემა დაფიქსირდა"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"შეეხეთ მეტი ინფორმაციისთვის"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"მაღვიძარა არ არის"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 445483ddd62d..846dea950f91 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"Соңғы хабарларды, өткізіп алған қоңыраулар мен жаңартылған күйлерді көруге болады."</string> <string name="people_tile_title" msgid="6589377493334871272">"Әңгіме"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"Мазаламау режимі арқылы кідіртілді."</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> хабар жіберді: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> сурет жіберді."</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ағымдағы күйін жаңартты: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Батарея зарядының дерегі алынбай жатыр"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Толығырақ ақпарат алу үшін түртіңіз."</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Оятқыш орнатылмаған."</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 87ecbbebbe28..086ddf351bc2 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"មើលព័ត៌មានថ្មីៗអំពីស្ថានភាព ការខកខានទទួល និងសារថ្មីៗ"</string> <string name="people_tile_title" msgid="6589377493334871272">"ការសន្ទនា"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"បានផ្អាកដោយមុខងារកុំរំខាន"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> បានផ្ញើសារ៖ <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> បានផ្ញើរូបភាព"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> មានបច្ចុប្បន្នភាពស្ថានភាព៖ <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"មានបញ្ហាក្នុងការអានឧបករណ៍រង្វាស់កម្រិតថ្មរបស់អ្នក"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ចុចដើម្បីទទួលបានព័ត៌មានបន្ថែម"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"មិនបានកំណត់ម៉ោងរោទ៍ទេ"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 8962ff4d2277..38fc84e79939 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"ಇತ್ತೀಚಿನ ಸಂದೇಶಗಳು, ಮಿಸ್ಡ್ ಕಾಲ್ಗಳು ಮತ್ತು ಸ್ಥಿತಿ ಅಪ್ಡೇಟ್ಗಳು"</string> <string name="people_tile_title" msgid="6589377493334871272">"ಸಂಭಾಷಣೆ"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"\'ಅಡಚಣೆ ಮಾಡಬೇಡಿ\' ನಿಂದ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ಅವರು ಸಂದೇಶವನ್ನು ಕಳುಹಿಸಿದ್ದಾರೆ: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ಅವರು ಚಿತ್ರವನ್ನು ಕಳುಹಿಸಿದ್ದಾರೆ"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ಅವರು ಸ್ಥಿತಿಯ ಅಪ್ಡೇಟ್ ಹೊಂದಿದ್ದಾರೆ: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ನಿಮ್ಮ ಬ್ಯಾಟರಿ ಮೀಟರ್ ಓದುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"ಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"ಅಲಾರಾಂ ಸೆಟ್ ಆಗಿಲ್ಲ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 1d470728d7e6..2d07d946d09f 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -1034,9 +1034,9 @@ <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"전체 화면 확대"</string> <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"화면 일부 확대"</string> <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"전환"</string> - <string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"접근성 동작이 접근성 버튼으로 대체되었습니다\n\n"<annotation id="link">"설정 보기"</annotation></string> + <string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"접근성 동작이 접근성 버튼으로 대체되었습니다.\n\n"<annotation id="link">"설정 보기"</annotation></string> <string name="accessibility_floating_button_switch_migration_tooltip" msgid="6248529129221218770">"접근성 동작을 버튼으로 전환할 수 있습니다.\n\n"<annotation id="link">"설정"</annotation></string> - <string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"버튼을 가장자리로 옮겨서 일시적으로 숨기세요"</string> + <string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"버튼을 가장자리로 옮겨서 일시적으로 숨기세요."</string> <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"왼쪽 상단으로 이동"</string> <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"오른쪽 상단으로 이동"</string> <string name="accessibility_floating_button_action_move_bottom_left" msgid="8063394111137429725">"왼쪽 하단으로 이동"</string> @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"최근 메시지, 부재중 전화, 상태 업데이트 보기"</string> <string name="people_tile_title" msgid="6589377493334871272">"대화"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"방해 금지 모드로 인해 일시중지됨"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g>님이 메시지를 보냈습니다: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g>님이 이미지를 보냈습니다."</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g>님의 상태가 업데이트되었습니다: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"배터리 수준을 읽는 중에 문제가 발생함"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"탭하여 자세한 정보를 확인하세요."</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"설정된 알람 없음"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index c0c42c30b108..ad244f124697 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"Акыркы билдирүүлөрдү, жооп берилбеген чалууларды жана статустардын жаңырганын көрөсүз"</string> <string name="people_tile_title" msgid="6589377493334871272">"Сүйлөшүү"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"\"Тынчымды алба\" режими тындырды"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> билдирүү жөнөттү: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> сүрөт жөнөттү"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> жаңы абалы тууралуу жарыялады: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Батареяңыздын кубаты аныкталбай жатат"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Кеңири маалымат алуу үчүн таптап коюңуз"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ойготкуч коюлган жок"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 3bfc4337e7b9..39db33948e81 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"Видете ги неодамнешните пораки, пропуштени повици и промени на статусот"</string> <string name="people_tile_title" msgid="6589377493334871272">"Разговор"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"Паузирано од „Не вознемирувај“"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> испрати порака: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> испрати слика"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> има ажурирање на статусот: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Проблем при читањето на мерачот на батеријата"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Допрете за повеќе информации"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Не е поставен аларм"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index a18780bb7511..d72466a63f99 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"അടുത്തിടെയുള്ള സന്ദേശങ്ങൾ, മിസ്ഡ് കോൾ, സ്റ്റാറ്റസ് അപ്ഡേറ്റുകൾ എന്നിവ കാണൂ"</string> <string name="people_tile_title" msgid="6589377493334871272">"സംഭാഷണം"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"\'ശല്യപ്പെടുത്തരുത്\' ഓണായതിനാൽ തൽക്കാലം നിർത്തി"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ഒരു സന്ദേശം അയച്ചു: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g>, ഒരു ചിത്രം അയച്ചു"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> എന്നയാൾ സ്റ്റാറ്റസ് അപ്ഡേറ്റ് ചെയ്തു: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"നിങ്ങളുടെ ബാറ്ററി മീറ്റർ വായിക്കുന്നതിൽ പ്രശ്നമുണ്ട്"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"കൂടുതൽ വിവരങ്ങൾക്ക് ടാപ്പ് ചെയ്യുക"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"അലാറം സജ്ജീകരിച്ചിട്ടില്ല"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 9295805f3f80..40913751ef78 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"Lihat mesej terbaharu, panggilan terlepas dan kemaskinian status"</string> <string name="people_tile_title" msgid="6589377493334871272">"Perbualan"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"Dijeda oleh Jangan Ganggu"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> menghantar mesej: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> menghantar imej"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> mempunyai kemaskinian status: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Masalah membaca meter bateri anda"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Ketik untuk mendapatkan maklumat lanjut"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Tiada penggera"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 622d330da443..90c76adc50c9 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -1152,11 +1152,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"Vedeți mesaje recente, apeluri pierdute și actualizări de stare"</string> <string name="people_tile_title" msgid="6589377493334871272">"Conversație"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"Întrerupt de Nu deranja"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> a trimis un mesaj: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> a trimis o imagine"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> are o nouă stare: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problemă la citirea măsurării bateriei"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Atingeți pentru mai multe informații"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nicio alarmă setată"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 30c757e8da96..7f27437e5200 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -1158,11 +1158,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"Будьте в курсе последних сообщений, пропущенных вызовов и обновлений статуса."</string> <string name="people_tile_title" msgid="6589377493334871272">"Чат"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"Приостановлено в режиме \"Не беспокоить\""</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"Пользователь <xliff:g id="NAME">%1$s</xliff:g> отправил сообщение: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"Пользователь <xliff:g id="NAME">%1$s</xliff:g> отправил изображение"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"Пользователь <xliff:g id="NAME">%1$s</xliff:g> обновил статус: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Не удается получить данные об уровне заряда батареи"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Нажмите, чтобы узнать больше."</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Будильников нет"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index ddf054adc8c6..0158d27f549b 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -1158,11 +1158,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"Pozrite si nedávne správy, zmeškané hovory a aktualizácie stavu"</string> <string name="people_tile_title" msgid="6589377493334871272">"Konverzácia"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"Pozastavené režimom bez vyrušení"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> poslal(a) správu: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> poslal(a) obrázok"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> má aktualizáciu statusu: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Pri čítaní meradla batérie sa vyskytol problém"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Klepnutím si zobrazíte ďalšie informácie"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Žiadny budík"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 90cbdd1e18dc..78fbc1a6f573 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"Shiko mesazhet e fundit, telefonatat e humbura dhe përditësimet e statusit"</string> <string name="people_tile_title" msgid="6589377493334871272">"Biseda"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"Vendosur në pauzë nga \"Mos shqetëso\""</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> dërgoi një mesazh: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> dërgoi një imazh"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ka një përditësim të statusit: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem me leximin e matësit të baterisë"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Trokit për më shumë informacione"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nuk është caktuar asnjë alarm"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 9c8ddca9c81d..183b559941c0 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"சமீபத்திய மெசேஜ்களையும் தவறிய அழைப்புகளையும் ஸ்டேட்டஸ் அப்டேட்களையும் பார்க்கலாம்"</string> <string name="people_tile_title" msgid="6589377493334871272">"உரையாடல்"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"தொந்தரவு செய்ய வேண்டாம் அம்சத்தால் இடைநிறுத்தப்பட்டது"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ஒரு மெசேஜ் அனுப்பியுள்ளார்: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ஒரு படம் அனுப்பியுள்ளார்"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> புதிய ஸ்டேட்டஸ் வைத்துள்ளார்: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"பேட்டரி அளவை அறிவதில் சிக்கல்"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"மேலும் தகவல்களுக்கு தட்டவும்"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"அலாரம் எதுவுமில்லை"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index d4375a57ad3b..778ed6471c3b 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"ఇటీవలి మెసేజ్లు, మిస్డ్ కాల్లు, అలాగే స్టేటస్ అప్డేట్లను చూడండి"</string> <string name="people_tile_title" msgid="6589377493334871272">"సంభాషణ"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"అంతరాయం కలిగించవద్దు ద్వారా పాజ్ చేయబడింది"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> మెసేజ్ను పంపారు: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ఇమేజ్ను పంపారు"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g>, స్టేటస్ను గురించిన అప్డేట్ను కలిగి ఉన్నారు: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"మీ బ్యాటరీ మీటర్ను చదవడంలో సమస్య"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"మరింత సమాచారం కోసం ట్యాప్ చేయండి"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"అలారం సెట్ చేయలేదు"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 3910d4b8bb61..bc62ea0f6eb2 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -676,7 +676,7 @@ <string name="wallet_app_button_label" msgid="7123784239111190992">"Показати все"</string> <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"Розблокувати, щоб сплатити"</string> <string name="wallet_secondary_label_no_card" msgid="530725155985223497">"Додати картку"</string> - <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Триває оновлення"</string> + <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Оновлення"</string> <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Розблокувати, щоб використовувати"</string> <string name="wallet_error_generic" msgid="257704570182963611">"Не вдалось отримати ваші картки. Повторіть спробу пізніше."</string> <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Параметри блокування екрана"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 0612014b7e15..4baffd25f8d1 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"حالیہ پیغامات، چھوٹی ہوئی کالز اور اسٹیٹس اپ ڈیٹس دیکھیں"</string> <string name="people_tile_title" msgid="6589377493334871272">"گفتگو"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"\'ڈسٹرب نہ کریں\' کے ذریعے موقوف کیا گیا"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> نے ایک پیغام بھیجا: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> نے ایک تصویر بھیجی"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> نے اسٹیٹس کو اپ ڈیٹ کر دیا ہے: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"آپ کے بیٹری میٹر کو پڑھنے میں دشواری"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"مزید معلومات کے لیے تھپتھپائیں"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"کوئی الارم سیٹ نہیں ہے"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 3cf2b55cf44e..46ebcb398eb6 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"Xem các tin nhắn, cuộc gọi nhỡ và thông tin cập nhật trạng thái gần đây"</string> <string name="people_tile_title" msgid="6589377493334871272">"Cuộc trò chuyện"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"Đã tạm dừng do chế độ Không làm phiền"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> đã gửi một tin nhắn: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> đã gửi một hình ảnh"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> đã cập nhật trạng thái: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Đã xảy ra vấn đề khi đọc dung lượng pin của bạn"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Nhấn để biết thêm thông tin"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Chưa đặt chuông báo"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 7cb429b49906..f3fb2cff5460 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"查看近期的消息、未接电话和状态更新"</string> <string name="people_tile_title" msgid="6589377493334871272">"对话"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"勿扰模式已暂停通知"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g>发送了一条消息:<xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g>发送了一张图片"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g>更新了状态:<xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"读取电池计量器时出现问题"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"点按即可了解详情"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"未设置闹钟"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 787e7b09ebed..e70a91135b73 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -1146,11 +1146,9 @@ <string name="people_tile_description" msgid="8154966188085545556">"查看最近的訊息、未接來電和狀態更新"</string> <string name="people_tile_title" msgid="6589377493334871272">"對話"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"零打擾模式已將通知暫停"</string> - <!-- no translation found for new_notification_text_content_description (2915029960094389291) --> - <skip /> + <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g>傳送了一則訊息:<xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g>傳送了一張圖片"</string> - <!-- no translation found for new_status_content_description (6046637888641308327) --> - <skip /> + <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g>更新了狀態:<xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"讀取電池計量器時發生問題"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"輕觸即可瞭解詳情"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"未設定鬧鐘"</string> diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintView.java index c4f58806c26c..205054d68280 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintView.java @@ -90,6 +90,7 @@ public class AuthBiometricFaceToFingerprintView extends AuthBiometricFaceView { } @Modality private int mActiveSensorType = TYPE_FACE; + @Nullable private ModalityListener mModalityListener; @Nullable private FingerprintSensorPropertiesInternal mFingerprintSensorProps; @Nullable private UdfpsDialogMeasureAdapter mUdfpsMeasureAdapter; @@ -115,6 +116,10 @@ public class AuthBiometricFaceToFingerprintView extends AuthBiometricFaceView { return mFingerprintSensorProps.isAnyUdfpsType(); } + void setModalityListener(@NonNull ModalityListener listener) { + mModalityListener = listener; + } + void setFingerprintSensorProps(@NonNull FingerprintSensorPropertiesInternal sensorProps) { mFingerprintSensorProps = sensorProps; } @@ -182,11 +187,16 @@ public class AuthBiometricFaceToFingerprintView extends AuthBiometricFaceView { @Override public void updateState(@BiometricState int newState) { if (mState == STATE_HELP || mState == STATE_ERROR) { + @Modality final int currentType = mActiveSensorType; mActiveSensorType = TYPE_FINGERPRINT; setRequireConfirmation(false); mConfirmButton.setEnabled(false); mConfirmButton.setVisibility(View.GONE); + + if (mModalityListener != null && currentType != mActiveSensorType) { + mModalityListener.onModalitySwitched(currentType, mActiveSensorType); + } } super.updateState(newState); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java index d5f74951c6f7..bebf813e1833 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java @@ -759,6 +759,9 @@ public abstract class AuthBiometricView extends LinearLayout { // Restore positive button(s) state mConfirmButton.setVisibility( mSavedState.getInt(AuthDialog.KEY_BIOMETRIC_CONFIRM_VISIBILITY)); + if (mConfirmButton.getVisibility() == View.GONE) { + setRequireConfirmation(false); + } mTryAgainButton.setVisibility( mSavedState.getInt(AuthDialog.KEY_BIOMETRIC_TRY_AGAIN_VISIBILITY)); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java index fd1313fc9d1d..3f61d3c6af9a 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java @@ -24,7 +24,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.graphics.PixelFormat; -import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricAuthenticator.Modality; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.PromptInfo; @@ -37,6 +36,7 @@ import android.os.IBinder; import android.os.Looper; import android.os.UserManager; import android.util.Log; +import android.view.Display; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -356,6 +356,12 @@ public class AuthContainerView extends LinearLayout (AuthBiometricFaceToFingerprintView) factory.inflate( R.layout.auth_biometric_face_to_fingerprint_view, null, false); faceToFingerprintView.setFingerprintSensorProps(fingerprintSensorProps); + faceToFingerprintView.setModalityListener(new ModalityListener() { + @Override + public void onModalitySwitched(int oldModality, int newModality) { + maybeUpdatePositionForUdfps(true /* invalidate */); + } + }); mBiometricView = faceToFingerprintView; } else { Log.e(TAG, "Fingerprint props not found for sensor ID: " + fingerprintSensorId); @@ -471,6 +477,11 @@ public class AuthContainerView extends LinearLayout } @Override + public void onOrientationChanged() { + maybeUpdatePositionForUdfps(true /* invalidate */); + } + + @Override public void onAttachedToWindow() { super.onAttachedToWindow(); onAttachedToWindowInternal(); @@ -489,9 +500,7 @@ public class AuthContainerView extends LinearLayout + mConfig.mPromptInfo.getAuthenticators()); } - if (shouldUpdatePositionForUdfps()) { - updatePositionForUdfps(); - } + maybeUpdatePositionForUdfps(false /* invalidate */); if (mConfig.mSkipIntro) { mContainerState = STATE_SHOWING; @@ -536,14 +545,14 @@ public class AuthContainerView extends LinearLayout } } - private boolean shouldUpdatePositionForUdfps() { - if (mBiometricView instanceof AuthBiometricUdfpsView) { + private static boolean shouldUpdatePositionForUdfps(@NonNull View view) { + if (view instanceof AuthBiometricUdfpsView) { return true; } - if (mBiometricView instanceof AuthBiometricFaceToFingerprintView) { + if (view instanceof AuthBiometricFaceToFingerprintView) { AuthBiometricFaceToFingerprintView faceToFingerprintView = - (AuthBiometricFaceToFingerprintView) mBiometricView; + (AuthBiometricFaceToFingerprintView) view; return faceToFingerprintView.getActiveSensorType() == TYPE_FINGERPRINT && faceToFingerprintView.isFingerprintUdfps(); } @@ -551,8 +560,16 @@ public class AuthContainerView extends LinearLayout return false; } - private void updatePositionForUdfps() { - final int displayRotation = getDisplay().getRotation(); + private boolean maybeUpdatePositionForUdfps(boolean invalidate) { + final Display display = getDisplay(); + if (display == null) { + return false; + } + if (!shouldUpdatePositionForUdfps(mBiometricView)) { + return false; + } + + final int displayRotation = display.getRotation(); switch (displayRotation) { case Surface.ROTATION_0: mPanelController.setPosition(AuthPanelController.POSITION_BOTTOM); @@ -576,6 +593,13 @@ public class AuthContainerView extends LinearLayout setScrollViewGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM); break; } + + if (invalidate) { + mPanelView.invalidateOutline(); + mBiometricView.requestLayout(); + } + + return true; } private void setScrollViewGravity(int gravity) { @@ -626,13 +650,6 @@ public class AuthContainerView extends LinearLayout @Override public void onAuthenticationFailed(@Modality int modality, String failureReason) { mBiometricView.onAuthenticationFailed(modality, failureReason); - if (mBiometricView instanceof AuthBiometricFaceToFingerprintView - && ((AuthBiometricFaceToFingerprintView) mBiometricView).isFingerprintUdfps() - && modality == BiometricAuthenticator.TYPE_FACE) { - updatePositionForUdfps(); - mPanelView.invalidateOutline(); - mBiometricView.requestLayout(); - } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java index 7947241ff794..2a18055da232 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java @@ -30,7 +30,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; import android.graphics.PointF; -import android.graphics.RectF; import android.hardware.biometrics.BiometricAuthenticator.Modality; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricManager.Authenticators; @@ -49,7 +48,10 @@ import android.os.Handler; import android.os.Looper; import android.os.RemoteException; import android.util.Log; +import android.view.Display; import android.view.MotionEvent; +import android.view.OrientationEventListener; +import android.view.Surface; import android.view.WindowManager; import com.android.internal.R; @@ -97,17 +99,15 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, @VisibleForTesting AuthDialog mCurrentDialog; - private WindowManager mWindowManager; - @Nullable - private UdfpsController mUdfpsController; - @Nullable - private IUdfpsHbmListener mUdfpsHbmListener; - @Nullable - private SidefpsController mSidefpsController; + @NonNull private final WindowManager mWindowManager; + @Nullable private UdfpsController mUdfpsController; + @Nullable private IUdfpsHbmListener mUdfpsHbmListener; + @Nullable private SidefpsController mSidefpsController; @VisibleForTesting TaskStackListener mTaskStackListener; @VisibleForTesting IBiometricSysuiReceiver mReceiver; + @NonNull private final BiometricOrientationEventListener mOrientationListener; @Nullable private final List<FaceSensorPropertiesInternal> mFaceProps; @Nullable private List<FingerprintSensorPropertiesInternal> mFpProps; @Nullable private List<FingerprintSensorPropertiesInternal> mUdfpsProps; @@ -120,6 +120,42 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, } } + private class BiometricOrientationEventListener extends OrientationEventListener { + @Surface.Rotation private int mLastRotation; + + BiometricOrientationEventListener(Context context) { + super(context); + mLastRotation = context.getDisplay().getRotation(); + } + + @Override + public void onOrientationChanged(int orientation) { + if (orientation == ORIENTATION_UNKNOWN) { + return; + } + + final Display display = mContext.getDisplay(); + if (display == null) { + return; + } + + final int rotation = display.getRotation(); + if (mLastRotation != rotation) { + mLastRotation = rotation; + + if (mCurrentDialog != null) { + mCurrentDialog.onOrientationChanged(); + } + if (mUdfpsController != null) { + mUdfpsController.onOrientationChanged(); + } + if (mSidefpsController != null) { + mSidefpsController.onOrientationChanged(); + } + } + } + } + @NonNull private final IFingerprintAuthenticatorsRegisteredCallback mFingerprintAuthenticatorsRegisteredCallback = @@ -164,6 +200,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, Log.w(TAG, "ACTION_CLOSE_SYSTEM_DIALOGS received"); mCurrentDialog.dismissWithoutCallback(true /* animate */); mCurrentDialog = null; + mOrientationListener.disable(); try { if (mReceiver != null) { @@ -192,6 +229,8 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, Log.w(TAG, "Evicting client due to: " + topPackage); mCurrentDialog.dismissWithoutCallback(true /* animate */); mCurrentDialog = null; + mOrientationListener.disable(); + if (mReceiver != null) { mReceiver.onDialogDismissed( BiometricPrompt.DISMISSED_REASON_USER_CANCEL, @@ -342,15 +381,6 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, /** * @return where the UDFPS exists on the screen in pixels in portrait mode. */ - @Nullable public RectF getUdfpsRegion() { - return mUdfpsController == null - ? null - : mUdfpsController.getSensorLocation(); - } - - /** - * @return where the UDFPS exists on the screen in pixels in portrait mode. - */ @Nullable public PointF getUdfpsSensorLocation() { if (mUdfpsController == null) { return null; @@ -422,8 +452,10 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, } @Inject - public AuthController(Context context, CommandQueue commandQueue, + public AuthController(Context context, + CommandQueue commandQueue, ActivityTaskManager activityTaskManager, + @NonNull WindowManager windowManager, @Nullable FingerprintManager fingerprintManager, @Nullable FaceManager faceManager, Provider<UdfpsController> udfpsControllerFactory, @@ -435,6 +467,8 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, mFaceManager = faceManager; mUdfpsControllerFactory = udfpsControllerFactory; mSidefpsControllerFactory = sidefpsControllerFactory; + mWindowManager = windowManager; + mOrientationListener = new BiometricOrientationEventListener(context); mFaceProps = mFaceManager != null ? mFaceManager.getSensorPropertiesInternal() : null; @@ -462,7 +496,6 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, @Override public void start() { mCommandQueue.addCallback(this); - mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); if (mFingerprintManager != null) { mFingerprintManager.addAuthenticatorsRegisteredCallback( @@ -630,6 +663,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, // BiometricService will have already sent the callback to the client in this case. // This avoids a round trip to SystemUI. So, just dismiss the dialog and we're done. mCurrentDialog = null; + mOrientationListener.disable(); } /** @@ -701,6 +735,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, mReceiver = (IBiometricSysuiReceiver) args.arg2; mCurrentDialog = newDialog; mCurrentDialog.show(mWindowManager, savedState); + mOrientationListener.enable(); } private void onDialogDismissed(@DismissedReason int reason) { @@ -710,20 +745,12 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, } mReceiver = null; mCurrentDialog = null; + mOrientationListener.disable(); } @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); - // UdfpsController is not BiometricPrompt-specific. It can be active for keyguard or - // enrollment. - if (mUdfpsController != null) { - mUdfpsController.onConfigurationChanged(); - } - - if (mSidefpsController != null) { - mSidefpsController.onConfigurationChanged(); - } // Save the state of the current dialog (buttons showing, etc) if (mCurrentDialog != null) { @@ -731,6 +758,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, mCurrentDialog.onSaveState(savedState); mCurrentDialog.dismissWithoutCallback(false /* animate */); mCurrentDialog = null; + mOrientationListener.disable(); // Only show the dialog if necessary. If it was animating out, the dialog is supposed // to send its pending callback immediately. diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java index ff31e499f6e8..fa5213e94081 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java @@ -156,4 +156,12 @@ public interface AuthDialog { * @return true if device credential is allowed. */ boolean isAllowDeviceCredentials(); + + /** + * Called when the device's orientation changed and the dialog may need to do another + * layout. This is most relevant to UDFPS since configuration changes are not sent by + * the framework in equivalent cases (landscape to reverse landscape) but the dialog + * must remain fixed on the physical sensor location. + */ + void onOrientationChanged(); } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ModalityListener.java b/packages/SystemUI/src/com/android/systemui/biometrics/ModalityListener.java new file mode 100644 index 000000000000..c162f7dec452 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ModalityListener.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.biometrics; + +import android.hardware.biometrics.BiometricAuthenticator.Modality; + +/** + * Listener for events related to modality changes during operations. + * + * Used by views such as {@link AuthBiometricFaceToFingerprintView} that support fallback style + * authentication. + */ +public interface ModalityListener { + + /** + * The modality has changed. Called after the transition has been fully completed. + * + * @param oldModality original modality + * @param newModality current modality + */ + default void onModalitySwitched(@Modality int oldModality, @Modality int newModality) {} +} diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.java index a52296a71960..436e1e4e3116 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.java @@ -137,8 +137,7 @@ public class SidefpsController { } } - - void onConfigurationChanged() { + void onOrientationChanged() { // If mView is null or if view is hidden, then return. if (mView == null || !mIsVisible) { return; diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index c5a0dfb45eda..81e60f316bbd 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -650,7 +650,7 @@ public class UdfpsController implements DozeReceiver { return mCoreLayoutParams; } - void onConfigurationChanged() { + void onOrientationChanged() { // When the configuration changes it's almost always necessary to destroy and re-create // the overlay's window to pass it the new LayoutParams. // Hiding the overlay will destroy its window. It's safe to hide the overlay regardless @@ -663,6 +663,7 @@ public class UdfpsController implements DozeReceiver { private void showUdfpsOverlay(@NonNull ServerRequest request) { mExecution.assertIsMainThread(); + final int reason = request.mRequestReason; if (mView == null) { try { @@ -751,22 +752,22 @@ public class UdfpsController implements DozeReceiver { } private void hideUdfpsOverlay() { - mFgExecutor.execute(() -> { - if (mView != null) { - Log.v(TAG, "hideUdfpsOverlay | removing window"); - // Reset the controller back to its starting state. - onFingerUp(); - mWindowManager.removeView(mView); - mView.setOnTouchListener(null); - mView.setOnHoverListener(null); - mView.setAnimationViewController(null); - mAccessibilityManager.removeTouchExplorationStateChangeListener( - mTouchExplorationStateChangeListener); - mView = null; - } else { - Log.v(TAG, "hideUdfpsOverlay | the overlay is already hidden"); - } - }); + mExecution.assertIsMainThread(); + + if (mView != null) { + Log.v(TAG, "hideUdfpsOverlay | removing window"); + // Reset the controller back to its starting state. + onFingerUp(); + mWindowManager.removeView(mView); + mView.setOnTouchListener(null); + mView.setOnHoverListener(null); + mView.setAnimationViewController(null); + mAccessibilityManager.removeTouchExplorationStateChangeListener( + mTouchExplorationStateChangeListener); + mView = null; + } else { + Log.v(TAG, "hideUdfpsOverlay | the overlay is already hidden"); + } } /** diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 15f7a1219f3f..75f77bffa4a0 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -175,7 +175,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, private static final int KEYGUARD_DISPLAY_TIMEOUT_DELAY_DEFAULT = 30000; private static final long KEYGUARD_DONE_PENDING_TIMEOUT_MS = 3000; - private static final boolean DEBUG = true; + private static final boolean DEBUG = KeyguardConstants.DEBUG; private static final boolean DEBUG_SIM_STATES = KeyguardConstants.DEBUG_SIM_STATES; private final static String TAG = "KeyguardViewMediator"; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java index 8c2c373fae64..a3180738fa60 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java @@ -140,9 +140,11 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha updateAnimators(); } - - public void onQsScrollingChanged() { - // Lazily update animators whenever the scrolling changes + /** + * Request an update to the animators. This will update them lazily next time the position + * is changed. + */ + public void requestAnimatorUpdate() { mNeedsAnimatorUpdate = true; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index 0d91f29b5b2e..36b4ee987d99 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -173,7 +173,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca mQSPanelScrollView.setOnScrollChangeListener( (v, scrollX, scrollY, oldScrollX, oldScrollY) -> { // Lazily update animators whenever the scrolling changes - mQSAnimator.onQsScrollingChanged(); + mQSAnimator.requestAnimatorUpdate(); mHeader.setExpandedScrollAmount(scrollY); if (mScrollListener != null) { mScrollListener.onQsPanelScrollChanged(scrollY); @@ -215,6 +215,14 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca setQsExpansion(mLastQSExpansion, mLastHeaderTranslation); } }); + mQSPanelController.setUsingHorizontalLayoutChangeListener( + () -> { + // The hostview may be faded out in the horizontal layout. Let's make sure to + // reset the alpha when switching layouts. This is fine since the animator will + // update the alpha if it's not supposed to be 1.0f + mQSPanelController.getMediaHost().getHostView().setAlpha(1.0f); + mQSAnimator.requestAnimatorUpdate(); + }); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java index 7a0982688b49..4739a3f4c7d6 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java @@ -103,6 +103,9 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr private boolean mUsingHorizontalLayout; + @Nullable + private Runnable mUsingHorizontalLayoutChangedListener; + protected QSPanelControllerBase( T view, QSTileHost host, @@ -135,6 +138,13 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr mQSLogger.logAllTilesChangeListening(mView.isListening(), mView.getDumpableTag(), ""); } + /** + * @return the media host for this panel + */ + public MediaHost getMediaHost() { + return mMediaHost; + } + @Override protected void onViewAttached() { mQsTileRevealController = createTileRevealController(); @@ -303,6 +313,9 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr mUsingHorizontalLayout = horizontal; mView.setUsingHorizontalLayout(mUsingHorizontalLayout, mMediaHost.getHostView(), force); updateMediaDisappearParameters(); + if (mUsingHorizontalLayoutChangedListener != null) { + mUsingHorizontalLayoutChangedListener.run(); + } return true; } return false; @@ -386,6 +399,13 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr mMediaVisibilityChangedListener = listener; } + /** + * Add a listener when the horizontal layout changes + */ + public void setUsingHorizontalLayoutChangeListener(Runnable listener) { + mUsingHorizontalLayoutChangedListener = listener; + } + /** */ public static final class TileRecord extends QSPanel.Record { public QSTile tile; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 0b6884bcdfa4..a6613d0b8d3d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -50,6 +50,7 @@ import com.android.systemui.DejankUtils; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dock.DockManager; import com.android.systemui.keyguard.FaceAuthScreenBrightnessController; +import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shared.system.QuickStepContract; @@ -80,7 +81,7 @@ import javax.inject.Inject; public class StatusBarKeyguardViewManager implements RemoteInputController.Callback, StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener, PanelExpansionListener, NavigationModeController.ModeChangedListener, - KeyguardViewController { + KeyguardViewController, WakefulnessLifecycle.Observer { // When hiding the Keyguard with timing supplied from WindowManager, better be early than late. private static final long HIDE_TIMING_CORRECTION_MS = - 16 * 3; @@ -104,6 +105,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private final NotificationShadeWindowController mNotificationShadeWindowController; private final Optional<FaceAuthScreenBrightnessController> mFaceAuthScreenBrightnessController; private final KeyguardBouncer.Factory mKeyguardBouncerFactory; + private final WakefulnessLifecycle mWakefulnessLifecycle; + private final UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; private final BouncerExpansionCallback mExpansionCallback = new BouncerExpansionCallback() { @Override public void onFullyShown() { @@ -189,6 +192,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private boolean mLastPulsing; private int mLastBiometricMode; private boolean mQsExpanded; + private boolean mAnimatedToSleep; private OnDismissAction mAfterKeyguardGoneAction; private Runnable mKeyguardGoneCancelAction; @@ -232,7 +236,9 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb KeyguardStateController keyguardStateController, Optional<FaceAuthScreenBrightnessController> faceAuthScreenBrightnessController, NotificationMediaManager notificationMediaManager, - KeyguardBouncer.Factory keyguardBouncerFactory) { + KeyguardBouncer.Factory keyguardBouncerFactory, + WakefulnessLifecycle wakefulnessLifecycle, + UnlockedScreenOffAnimationController unlockedScreenOffAnimationController) { mContext = context; mViewMediatorCallback = callback; mLockPatternUtils = lockPatternUtils; @@ -246,6 +252,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mDockManager = dockManager; mFaceAuthScreenBrightnessController = faceAuthScreenBrightnessController; mKeyguardBouncerFactory = keyguardBouncerFactory; + mWakefulnessLifecycle = wakefulnessLifecycle; + mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController; } @Override @@ -301,6 +309,20 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mDockManager.addListener(mDockEventListener); mIsDocked = mDockManager.isDocked(); } + mWakefulnessLifecycle.addObserver(new WakefulnessLifecycle.Observer() { + @Override + public void onFinishedWakingUp() { + mAnimatedToSleep = false; + updateStates(); + } + + @Override + public void onFinishedGoingToSleep() { + mAnimatedToSleep = + mUnlockedScreenOffAnimationController.isScreenOffAnimationPlaying(); + updateStates(); + } + }); } @Override @@ -495,6 +517,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @Override public void reset(boolean hideBouncerWhenShowing) { if (mShowing) { + mNotificationPanelViewController.closeQs(); if (mOccluded && !mDozing) { mStatusBar.hideKeyguard(); if (hideBouncerWhenShowing || mBouncer.needsFullscreenBouncer()) { @@ -981,7 +1004,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb boolean hideWhileDozing = mDozing && biometricMode != MODE_WAKE_AND_UNLOCK_PULSING; boolean keyguardWithGestureNav = (keyguardShowing && !mDozing || mPulsing && !mIsDocked) && mGesturalNav; - return (!keyguardShowing && !hideWhileDozing || mBouncer.isShowing() + return (!mAnimatedToSleep && !keyguardShowing && !hideWhileDozing || mBouncer.isShowing() || mRemoteInputActive || keyguardWithGestureNav || mGlobalActionsVisible); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintViewTest.java index fcdf702495d2..5cd781085b15 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintViewTest.java @@ -138,6 +138,31 @@ public class AuthBiometricFaceToFingerprintViewTest extends SysuiTestCase { } @Test + public void testStateUpdated_whenSwitchToFingerprint_invokesCallbacks() { + class TestModalityListener implements ModalityListener { + public int switchCount = 0; + + @Override + public void onModalitySwitched(int oldModality, int newModality) { + assertEquals(TYPE_FINGERPRINT, newModality); + assertEquals(TYPE_FACE, oldModality); + switchCount++; + } + } + final TestModalityListener modalityListener = new TestModalityListener(); + + mFaceToFpView.onDialogAnimatedIn(); + mFaceToFpView.setModalityListener(modalityListener); + + assertEquals(0, modalityListener.switchCount); + + mFaceToFpView.updateState(AuthBiometricFaceToFingerprintView.STATE_ERROR); + mFaceToFpView.updateState(AuthBiometricFaceToFingerprintView.STATE_AUTHENTICATING); + + assertEquals(1, modalityListener.switchCount); + } + + @Test public void testModeUpdated_onSoftError_whenSwitchToFingerprint() { mFaceToFpView.onDialogAnimatedIn(); mFaceToFpView.onAuthenticationFailed(TYPE_FACE, "no face"); diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java index 9774ea98ff0d..bfcd1310acc2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java @@ -59,6 +59,7 @@ import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableContext; import android.testing.TestableLooper.RunWithLooper; +import android.view.WindowManager; import com.android.internal.R; import com.android.systemui.SysuiTestCase; @@ -97,6 +98,8 @@ public class AuthControllerTest extends SysuiTestCase { @Mock private ActivityTaskManager mActivityTaskManager; @Mock + private WindowManager mWindowManager; + @Mock private FingerprintManager mFingerprintManager; @Mock private FaceManager mFaceManager; @@ -149,7 +152,7 @@ public class AuthControllerTest extends SysuiTestCase { when(mFingerprintManager.getSensorPropertiesInternal()).thenReturn(props); mAuthController = new TestableAuthController(context, mCommandQueue, - mActivityTaskManager, mFingerprintManager, mFaceManager, + mActivityTaskManager, mWindowManager, mFingerprintManager, mFaceManager, () -> mUdfpsController, () -> mSidefpsController); mAuthController.start(); @@ -576,13 +579,15 @@ public class AuthControllerTest extends SysuiTestCase { private int mBuildCount = 0; private PromptInfo mLastBiometricPromptInfo; - TestableAuthController(Context context, CommandQueue commandQueue, + TestableAuthController(Context context, + CommandQueue commandQueue, ActivityTaskManager activityTaskManager, + WindowManager windowManager, FingerprintManager fingerprintManager, FaceManager faceManager, Provider<UdfpsController> udfpsControllerFactory, Provider<SidefpsController> sidefpsControllerFactory) { - super(context, commandQueue, activityTaskManager, + super(context, commandQueue, activityTaskManager, windowManager, fingerprintManager, faceManager, udfpsControllerFactory, sidefpsControllerFactory); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java index 1d4cbdc959c1..d293bb64552e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java @@ -16,11 +16,14 @@ package com.android.systemui.statusbar.phone; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; @@ -41,6 +44,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.dock.DockManager; import com.android.systemui.keyguard.DismissCallbackRegistry; import com.android.systemui.keyguard.FaceAuthScreenBrightnessController; +import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.statusbar.NotificationMediaManager; @@ -90,7 +94,10 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { private KeyguardBouncer.Factory mKeyguardBouncerFactory; @Mock private KeyguardBouncer mBouncer; + @Mock + private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; + private WakefulnessLifecycle mWakefulnessLifecycle; private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; @Before @@ -101,6 +108,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { any(KeyguardBouncer.BouncerExpansionCallback.class))) .thenReturn(mBouncer); + mWakefulnessLifecycle = new WakefulnessLifecycle(getContext(), null); mStatusBarKeyguardViewManager = new StatusBarKeyguardViewManager( getContext(), mViewMediatorCallback, @@ -114,7 +122,9 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { mKeyguardStateController, Optional.of(mFaceAuthScreenBrightnessController), mock(NotificationMediaManager.class), - mKeyguardBouncerFactory); + mKeyguardBouncerFactory, + mWakefulnessLifecycle, + mUnlockedScreenOffAnimationController); mStatusBarKeyguardViewManager.registerStatusBar(mStatusBar, mContainer, mNotificationPanelView, mBiometrucUnlockController, mNotificationContainer, mBypassController); @@ -280,4 +290,18 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { verify(mBouncer).updateKeyguardPosition(1.0f); } + + @Test + public void testNavBarHiddenWhenSleepAnimationStarts() { + mStatusBarKeyguardViewManager.hide(0 /* startTime */, 0 /* fadeoutDuration */); + assertTrue(mStatusBarKeyguardViewManager.isNavBarVisible()); + + // Verify that the nav bar is hidden when the screen off animation starts + doReturn(true).when(mUnlockedScreenOffAnimationController).isScreenOffAnimationPlaying(); + mWakefulnessLifecycle.dispatchFinishedGoingToSleep(); + assertFalse(mStatusBarKeyguardViewManager.isNavBarVisible()); + + mWakefulnessLifecycle.dispatchFinishedWakingUp(); + assertTrue(mStatusBarKeyguardViewManager.isNavBarVisible()); + } } diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index f7ddd2922b25..95186ee444e4 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -566,6 +566,12 @@ public abstract class PackageManagerInternal implements PackageSettingsSnapshotP public abstract ProviderInfo resolveContentProvider(String name, int flags, int userId); /** + * Resolves a content provider intent. + */ + public abstract ProviderInfo resolveContentProvider(String name, int flags, int userId, + int callingUid); + + /** * Track the creator of a new isolated uid. * @param isolatedUid The newly created isolated uid. * @param ownerUid The uid of the app that created the isolated process. diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java index 530f918833ad..ccdc3f8c8e3f 100644 --- a/services/core/java/com/android/server/am/ActivityManagerConstants.java +++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java @@ -489,7 +489,7 @@ final class ActivityManagerConstants extends ContentObserver { volatile long mFgsStartForegroundTimeoutMs = DEFAULT_FGS_START_FOREGROUND_TIMEOUT_MS; /** - * Sample rate for the FGS westworld atom. + * Sample rate for the FGS atom. * * If the value is 0.1, 10% of the installed packages would be sampled. */ diff --git a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java index ea0107ecfd23..26a63120d793 100644 --- a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java +++ b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java @@ -594,6 +594,7 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin private final int mSession; private final int mSource; private final String mPackName; + private final boolean mSilenced; RecordingEvent(int event, int riid, AudioRecordingConfiguration config) { mRecEvent = event; @@ -603,11 +604,13 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin mSession = config.getClientAudioSessionId(); mSource = config.getClientAudioSource(); mPackName = config.getClientPackageName(); + mSilenced = config.isClientSilenced(); } else { mClientUid = -1; mSession = -1; mSource = -1; mPackName = null; + mSilenced = false; } } @@ -633,6 +636,7 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin .append(" uid:").append(mClientUid) .append(" session:").append(mSession) .append(" src:").append(MediaRecorder.toLogFriendlyAudioSource(mSource)) + .append(mSilenced ? " silenced" : " not silenced") .append(mPackName == null ? "" : " pack:" + mPackName).toString(); } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index faa37a03c971..ccb3c974d7ba 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -11608,9 +11608,17 @@ public class PackageManagerService extends IPackageManager.Stub return resolveContentProviderInternal(name, flags, userId); } + public ProviderInfo resolveContentProvider(String name, int flags, int userId, int callingUid) { + return resolveContentProviderInternal(name, flags, userId, callingUid); + } + private ProviderInfo resolveContentProviderInternal(String name, int flags, int userId) { + return resolveContentProviderInternal(name, flags, userId, Binder.getCallingUid()); + } + + private ProviderInfo resolveContentProviderInternal(String name, int flags, int userId, + int callingUid) { if (!mUserManager.exists(userId)) return null; - final int callingUid = Binder.getCallingUid(); flags = updateFlagsForComponent(flags, userId); final ProviderInfo providerInfo = mComponentResolver.queryProvider(name, flags, userId); boolean checkedGrants = false; @@ -27778,6 +27786,13 @@ public class PackageManagerService extends IPackageManager.Stub } @Override + public ProviderInfo resolveContentProvider(String name, int flags, int userId, + int callingUid) { + return PackageManagerService.this.resolveContentProviderInternal( + name, flags, userId, callingUid); + } + + @Override public void addIsolatedUid(int isolatedUid, int ownerUid) { synchronized (mLock) { mIsolatedOwners.put(isolatedUid, ownerUid); diff --git a/services/core/java/com/android/server/uri/UriGrantsManagerService.java b/services/core/java/com/android/server/uri/UriGrantsManagerService.java index 44545ed4898a..4e453f378cbc 100644 --- a/services/core/java/com/android/server/uri/UriGrantsManagerService.java +++ b/services/core/java/com/android/server/uri/UriGrantsManagerService.java @@ -1061,6 +1061,12 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { PackageManager.GET_URI_PERMISSION_PATTERNS | pmFlags, userHandle); } + private ProviderInfo getProviderInfo(String authority, int userHandle, int pmFlags, + int callingUid) { + return mPmInternal.resolveContentProvider(authority, + PackageManager.GET_URI_PERMISSION_PATTERNS | pmFlags, userHandle, callingUid); + } + /** * Check if the targetPkg can be granted permission to access uri by * the callingUid using the given modeFlags. Throws a security exception @@ -1106,7 +1112,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { final String authority = grantUri.uri.getAuthority(); final ProviderInfo pi = getProviderInfo(authority, grantUri.sourceUserId, - MATCH_DEBUG_TRIAGED_MISSING); + MATCH_DEBUG_TRIAGED_MISSING, callingUid); if (pi == null) { Slog.w(TAG, "No content provider found for permission check: " + grantUri.uri.toSafeString()); diff --git a/services/core/java/com/android/server/wm/DisplayHashController.java b/services/core/java/com/android/server/wm/DisplayHashController.java index 0cf4379da02a..64a57588113c 100644 --- a/services/core/java/com/android/server/wm/DisplayHashController.java +++ b/services/core/java/com/android/server/wm/DisplayHashController.java @@ -47,7 +47,6 @@ import android.os.Looper; import android.os.Message; import android.os.RemoteCallback; import android.os.RemoteException; -import android.os.UserHandle; import android.service.displayhash.DisplayHashParams; import android.service.displayhash.DisplayHashingService; import android.service.displayhash.IDisplayHashingService; @@ -380,8 +379,7 @@ public class DisplayHashController { intent.setComponent(component); final long token = Binder.clearCallingIdentity(); try { - mContext.bindServiceAsUser(intent, mServiceConnection, - Context.BIND_AUTO_CREATE, UserHandle.CURRENT); + mContext.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE); if (DEBUG) Slog.v(TAG, "bound"); } finally { Binder.restoreCallingIdentity(token); @@ -404,8 +402,15 @@ public class DisplayHashController { final Intent intent = new Intent(DisplayHashingService.SERVICE_INTERFACE); intent.setPackage(packageName); - final ResolveInfo resolveInfo = mContext.getPackageManager().resolveService(intent, - PackageManager.GET_SERVICES | PackageManager.GET_META_DATA); + final ResolveInfo resolveInfo; + final long token = Binder.clearCallingIdentity(); + try { + resolveInfo = mContext.getPackageManager().resolveService(intent, + PackageManager.GET_SERVICES | PackageManager.GET_META_DATA); + } finally { + Binder.restoreCallingIdentity(token); + } + if (resolveInfo == null || resolveInfo.serviceInfo == null) { Slog.w(TAG, "No valid components found."); return null; diff --git a/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java index 614949c91b9a..69f006568c8e 100644 --- a/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java @@ -292,23 +292,29 @@ public class UriGrantsManagerServiceTest { intent.setClipData(clip); { - // When granting towards primary, persistable can't be honored so - // the entire grant fails - try { - mService.checkGrantUriPermissionFromIntent( - intent, UID_PRIMARY_CAMERA, PKG_SOCIAL, USER_PRIMARY); - fail(); - } catch (SecurityException expected) { + // The camera package shouldn't be able to see other packages or their providers, + // so make sure the grant only succeeds for the camera's URIs. + final NeededUriGrants nug = mService.checkGrantUriPermissionFromIntent( + intent, UID_PRIMARY_CAMERA, PKG_SOCIAL, USER_PRIMARY); + if (nug != null && nug.uris != null) { + for (GrantUri gu : nug.uris) { + if (!gu.uri.getAuthority().equals(PKG_CAMERA)) { + fail(); + } + } } } { - // When granting towards secondary, persistable can't be honored so - // the entire grant fails - try { - mService.checkGrantUriPermissionFromIntent( - intent, UID_PRIMARY_CAMERA, PKG_SOCIAL, USER_SECONDARY); - fail(); - } catch (SecurityException expected) { + // The camera package shouldn't be able to see other packages or their providers, + // so make sure the grant only succeeds for the camera's URIs. + final NeededUriGrants nug = mService.checkGrantUriPermissionFromIntent( + intent, UID_PRIMARY_CAMERA, PKG_SOCIAL, USER_SECONDARY); + if (nug != null && nug.uris != null) { + for (GrantUri gu : nug.uris) { + if (!gu.uri.getAuthority().equals(PKG_CAMERA)) { + fail(); + } + } } } } diff --git a/services/tests/servicestests/src/com/android/server/uri/UriGrantsMockContext.java b/services/tests/servicestests/src/com/android/server/uri/UriGrantsMockContext.java index 2c719ff9e8b3..a6307b38f6a5 100644 --- a/services/tests/servicestests/src/com/android/server/uri/UriGrantsMockContext.java +++ b/services/tests/servicestests/src/com/android/server/uri/UriGrantsMockContext.java @@ -135,14 +135,29 @@ public class UriGrantsMockContext extends ContextWrapper { when(mPmInternal.resolveContentProvider(eq(PKG_CAMERA), anyInt(), eq(userId))) .thenReturn(buildCameraProvider(userId)); + when(mPmInternal.resolveContentProvider(eq(PKG_CAMERA), anyInt(), eq(userId), + eq(UserHandle.getUid(userId, UID_CAMERA)))) + .thenReturn(buildCameraProvider(userId)); when(mPmInternal.resolveContentProvider(eq(PKG_PRIVATE), anyInt(), eq(userId))) .thenReturn(buildPrivateProvider(userId)); + when(mPmInternal.resolveContentProvider(eq(PKG_PRIVATE), anyInt(), eq(userId), + eq(UserHandle.getUid(userId, UID_PRIVATE)))) + .thenReturn(buildPrivateProvider(userId)); when(mPmInternal.resolveContentProvider(eq(PKG_PUBLIC), anyInt(), eq(userId))) .thenReturn(buildPublicProvider(userId)); + when(mPmInternal.resolveContentProvider(eq(PKG_PUBLIC), anyInt(), eq(userId), + eq(UserHandle.getUid(userId, UID_PUBLIC)))) + .thenReturn(buildPublicProvider(userId)); when(mPmInternal.resolveContentProvider(eq(PKG_FORCE), anyInt(), eq(userId))) .thenReturn(buildForceProvider(userId)); + when(mPmInternal.resolveContentProvider(eq(PKG_FORCE), anyInt(), eq(userId), + eq(UserHandle.getUid(userId, UID_FORCE)))) + .thenReturn(buildForceProvider(userId)); when(mPmInternal.resolveContentProvider(eq(PKG_COMPLEX), anyInt(), eq(userId))) .thenReturn(buildComplexProvider(userId)); + when(mPmInternal.resolveContentProvider(eq(PKG_COMPLEX), anyInt(), eq(userId), + eq(UserHandle.getUid(userId, UID_COMPLEX)))) + .thenReturn(buildComplexProvider(userId)); } } |